diff options
author | Edward Hervey <bilboed@bilboed.com> | 2014-12-10 17:39:17 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2014-12-10 17:39:17 +0100 |
commit | 9a903c994f099d36520977d85d445713e57cc38b (patch) | |
tree | f30dadad95f79d2c6e4c766443ee1e69722d2dd2 /gst/isomp4 | |
parent | b40cfcfffb659138ed341badd6b76b02df4190b1 (diff) | |
download | gstreamer-plugins-good-9a903c994f099d36520977d85d445713e57cc38b.tar.gz |
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
Diffstat (limited to 'gst/isomp4')
-rw-r--r-- | gst/isomp4/qtdemux.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index c46e7c2a0..f603d2869 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++) { |