summaryrefslogtreecommitdiff
path: root/gst/isomp4
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2014-12-10 17:39:17 +0100
committerEdward Hervey <bilboed@bilboed.com>2014-12-10 17:39:17 +0100
commit9a903c994f099d36520977d85d445713e57cc38b (patch)
treef30dadad95f79d2c6e4c766443ee1e69722d2dd2 /gst/isomp4
parentb40cfcfffb659138ed341badd6b76b02df4190b1 (diff)
downloadgstreamer-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.c17
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++) {