From 9a903c994f099d36520977d85d445713e57cc38b Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 10 Dec 2014 17:39:17 +0100 Subject: [PATCH] qtdemux: Fix rounding errors in duration update Make sure we store updated segment stop/duration with the same granularity as the duration timescale. And add more debug --- gst/isomp4/qtdemux.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index c46e7c2..f603d28 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -2461,18 +2461,27 @@ check_update_duration (GstQTDemux * qtdemux, GstClockTime duration) movdur = gst_util_uint64_scale (duration, qtdemux->timescale, GST_SECOND); if (movdur > qtdemux->duration) { - GST_DEBUG_OBJECT (qtdemux, "Updating total duration to %" GST_TIME_FORMAT, - GST_TIME_ARGS (duration)); prevdur = gst_util_uint64_scale (qtdemux->duration, GST_SECOND, qtdemux->timescale); + GST_DEBUG_OBJECT (qtdemux, + "Updating total duration to %" GST_TIME_FORMAT " was %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration), GST_TIME_ARGS (prevdur)); qtdemux->duration = movdur; + GST_DEBUG_OBJECT (qtdemux, + "qtdemux->segment.duration: %" GST_TIME_FORMAT " .stop: %" + GST_TIME_FORMAT, GST_TIME_ARGS (qtdemux->segment.duration), + GST_TIME_ARGS (qtdemux->segment.stop)); if (qtdemux->segment.duration == prevdur) { /* If the current segment has duration/stop identical to previous duration * update them also (because they were set at that point in time with * the wrong duration */ - qtdemux->segment.duration = duration; - qtdemux->segment.stop = duration; + /* We convert the value *from* the timescale version to avoid rounding errors */ + GstClockTime fixeddur = + gst_util_uint64_scale (movdur, GST_SECOND, qtdemux->timescale); + GST_DEBUG_OBJECT (qtdemux, "Updated segment.duration and segment.stop"); + qtdemux->segment.duration = fixeddur; + qtdemux->segment.stop = fixeddur; } } for (i = 0; i < qtdemux->n_streams; i++) { -- 2.7.4