From bdefe22b8e8c5c1cbcb20595b8eedc052aa8e6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sat, 11 Aug 2012 21:24:40 +0300 Subject: [PATCH] lavf: Detect discontinuities in timestamps for framerate/analyzeduration calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the dts difference is more than 1000 times the average dts difference, restart the analysis. Signed-off-by: Martin Storsjö --- libavformat/utils.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libavformat/utils.c b/libavformat/utils.c index 34177fbdba..8bf688d1cc 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2393,6 +2393,19 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts); st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE; } + /* check for a discontinuity in dts - if the difference in dts + * is more than 1000 times the average packet duration in the sequence, + * we treat it as a discontinuity */ + if (st->info->fps_last_dts != AV_NOPTS_VALUE && + st->info->fps_last_dts_idx > st->info->fps_first_dts_idx && + (pkt->dts - st->info->fps_last_dts) / 1000 > + (st->info->fps_last_dts - st->info->fps_first_dts) / (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) { + av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: " + "packet %d with DTS %"PRId64", packet %d with DTS " + "%"PRId64"\n", st->index, st->info->fps_last_dts_idx, + st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts); + st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE; + } /* update stored dts values */ if (st->info->fps_first_dts == AV_NOPTS_VALUE) {