From fdea095e349a2236f4d4a2b6e6a83b2cf001d373 Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Sun, 14 Nov 2010 11:53:27 +0200 Subject: demux_lavf: mark AVI timestamps non-pts to avoid messages Playing AVI files containing B-frames with demux_lavf printed two "decreasing pts" info messages at the start of the file. We know the timestamps from AVI won't be valid pts, so add a demuxer field to convey that information to the timing code and make that not even try to use the timestamps as valid pts. --- libmpdemux/demux_lavf.c | 1 + libmpdemux/demuxer.h | 6 ++++++ mplayer.c | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 14869be61d..b2577d75a9 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -521,6 +521,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ /* for avi libavformat returns the avi timestamps in .dts, * some made-up stuff that's not really pts in .pts */ priv->use_dts = true; + demuxer->timestamp_type = TIMESTAMP_TYPE_SORT; } else { if (opts->user_correct_pts != 0) avfc->flags |= AVFMT_FLAG_GENPTS; diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index e8878e3bed..0e28dbfb6b 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -99,6 +99,11 @@ struct MPOpts; #define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly +enum timestamp_type { + TIMESTAMP_TYPE_PTS, + TIMESTAMP_TYPE_SORT, +}; + // DEMUXER control commands/answers #define DEMUXER_CTRL_NOTIMPL -1 @@ -249,6 +254,7 @@ typedef struct demuxer { /* Set if using absolute seeks for small movements is OK (no pts resets * that would make pts ambigious, preferably supports back/forward flags */ bool accurate_seek; + enum timestamp_type timestamp_type; // demux_stream_t *audio; // audio buffer/demuxer demux_stream_t *video; // video buffer/demuxer diff --git a/mplayer.c b/mplayer.c index 7adde18740..2acd7e672e 100644 --- a/mplayer.c +++ b/mplayer.c @@ -2526,7 +2526,8 @@ static void determine_frame_pts(struct MPContext *mpctx) if (opts->user_pts_assoc_mode) { sh_video->pts_assoc_mode = opts->user_pts_assoc_mode; } else if (sh_video->pts_assoc_mode == 0) { - if (sh_video->codec_reordered_pts != MP_NOPTS_VALUE) + if (mpctx->d_video->demuxer->timestamp_type == TIMESTAMP_TYPE_PTS + && sh_video->codec_reordered_pts != MP_NOPTS_VALUE) sh_video->pts_assoc_mode = 1; else sh_video->pts_assoc_mode = 2; -- cgit v1.2.3