[FFmpeg-cvslog] lavf: Detect discontinuities in timestamps for framerate/ analyzeduration calculation

Martin Storsjö git at videolan.org
Sun Aug 12 13:48:49 CEST 2012


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Sat Aug 11 21:24:40 2012 +0300| [bdefe22b8e8c5c1cbcb20595b8eedc052aa8e6e9] | committer: Martin Storsjö

lavf: Detect discontinuities in timestamps for framerate/analyzeduration calculation

If the dts difference is more than 1000 times the average dts
difference, restart the analysis.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=bdefe22b8e8c5c1cbcb20595b8eedc052aa8e6e9
---

 libavformat/utils.c |   13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 34177fb..8bf688d 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) {



More information about the ffmpeg-cvslog mailing list