Compensate for timestamp/duration rounding errors
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 29 Jan 2009 18:42:09 +0000 (19:42 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 31 Jan 2009 10:02:25 +0000 (11:02 +0100)
gst/mxf/mxfdemux.c
gst/mxf/mxfdemux.h

index 63cd1ac9bd4ed740ef18e9ea55d2e2e6f1faf857..64bbf7fb12c898d11b0063a9bcacb1276e5b32e1 100644 (file)
@@ -1534,6 +1534,18 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
     GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
     GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
 
+    /* Update accumulated error and compensate */
+    {
+      guint64 abs_error = (GST_SECOND * pad->material_track->edit_rate.d) %
+          pad->material_track->edit_rate.n;
+      pad->last_stop_accumulated_error +=
+          ((gdouble) abs_error) / ((gdouble) pad->material_track->edit_rate.n);
+    }
+    if (pad->last_stop_accumulated_error >= 1.0) {
+      GST_BUFFER_DURATION (outbuf) += 1;
+      pad->last_stop_accumulated_error -= 1.0;
+    }
+
     if (pad->need_segment) {
       gst_pad_push_event (GST_PAD_CAST (pad),
           gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1,
index e431e3067dae277a77db2f9a4f0dd4f05110bf32..0a4f8b8359b20a127669ef5c010dbbf4cbb535f0 100644 (file)
@@ -93,6 +93,7 @@ struct _GstMXFDemuxPad
   gboolean need_segment;
 
   GstClockTime last_stop;
+  gdouble last_stop_accumulated_error;
   GstFlowReturn last_flow;
   gboolean eos, discont;