qtdemux: Fix rounding errors in duration update
authorEdward Hervey <bilboed@bilboed.com>
Wed, 10 Dec 2014 16:39:17 +0000 (17:39 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Wed, 10 Dec 2014 16:39:17 +0000 (17:39 +0100)
Make sure we store updated segment stop/duration with the same
granularity as the duration timescale.

And add more debug

gst/isomp4/qtdemux.c

index c46e7c2..f603d28 100644 (file)
@@ -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++) {