qtmux: replace _scale with _scale_round
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Thu, 26 Nov 2009 00:41:27 +0000 (21:41 -0300)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 12 Apr 2011 19:32:14 +0000 (20:32 +0100)
Use the rounding version for improved sync between streams.
Small variations in the duration when muxing might lead to
cumullative wrong timestamping when demuxing.

Fixes #602936

gst/quicktime/gstqtmux.c

index f7aeeb5..cbfac0e 100644 (file)
@@ -1326,7 +1326,7 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
 
   gst_buffer_replace (&pad->last_buf, buf);
 
-  last_dts = gst_util_uint64_scale (pad->last_dts,
+  last_dts = gst_util_uint64_scale_round (pad->last_dts,
       atom_trak_get_timescale (pad->trak), GST_SECOND);
 
   /* raw audio has many samples per buffer (= chunk) */
@@ -1348,10 +1348,10 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
       gint64 scaled_dts;
       pad->last_dts = GST_BUFFER_OFFSET_END (last_buf);
       if ((gint64) (pad->last_dts) < 0) {
-        scaled_dts = -gst_util_uint64_scale (-pad->last_dts,
+        scaled_dts = -gst_util_uint64_scale_round (-pad->last_dts,
             atom_trak_get_timescale (pad->trak), GST_SECOND);
       } else {
-        scaled_dts = gst_util_uint64_scale (pad->last_dts,
+        scaled_dts = gst_util_uint64_scale_round (pad->last_dts,
             atom_trak_get_timescale (pad->trak), GST_SECOND);
       }
       scaled_duration = scaled_dts - last_dts;
@@ -1361,7 +1361,7 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
        * trak timescale, then derive delta;
        * this ensures sums of (scale)delta add up to converted timestamp,
        * which only deviates at most 1/scale from timestamp itself */
-      scaled_duration = gst_util_uint64_scale (pad->last_dts + duration,
+      scaled_duration = gst_util_uint64_scale_round (pad->last_dts + duration,
           atom_trak_get_timescale (pad->trak), GST_SECOND) - last_dts;
       pad->last_dts += duration;
     }
@@ -1396,7 +1396,7 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
   if ((pad->have_dts || qtmux->guess_pts) && pad->is_out_of_order) {
     guint64 pts;
 
-    pts = gst_util_uint64_scale (GST_BUFFER_TIMESTAMP (last_buf),
+    pts = gst_util_uint64_scale_round (GST_BUFFER_TIMESTAMP (last_buf),
         atom_trak_get_timescale (pad->trak), GST_SECOND);
     pts_offset = (gint64) (pts - last_dts);
     do_pts = TRUE;