audioresample: corrected buffer duration calculation to account for nonzero initial...
authorLeo Singer <leo.singer@ligo.org>
Fri, 17 Dec 2010 08:49:26 +0000 (00:49 -0800)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 17 Dec 2010 18:34:42 +0000 (19:34 +0100)
Since we calculate timestamps by:

  timestamp = t0 + (out samples) / (out rate)

and durations by:

  duration = ((out samples) + (processed samples)) / (out rate) - timestamp

if t0 is nonzero, this would simplify to

  duration = t0 + (processed samples) / (out rate).

This duration is too large by the amount t0.  We should have done:

  duration = t0 + ((out samples) + (processed samples)) / (out rate) - timestamp

so that

  duration = (processed samples) / (out rate).

gst/audioresample/gstaudioresample.c

index a9222a6..90967c2 100644 (file)
@@ -889,7 +889,7 @@ gst_audio_resample_push_drain (GstAudioResample * resample, guint history_len)
     GST_BUFFER_TIMESTAMP (outbuf) = resample->t0 +
         gst_util_uint64_scale_int_round (resample->samples_out, GST_SECOND,
         resample->outrate);
-    GST_BUFFER_DURATION (outbuf) =
+    GST_BUFFER_DURATION (outbuf) = resample->t0 +
         gst_util_uint64_scale_int_round (resample->samples_out + out_processed,
         GST_SECOND, resample->outrate) - GST_BUFFER_TIMESTAMP (outbuf);
   } else {
@@ -1137,7 +1137,7 @@ gst_audio_resample_process (GstAudioResample * resample, GstBuffer * inbuf,
     GST_BUFFER_TIMESTAMP (outbuf) = resample->t0 +
         gst_util_uint64_scale_int_round (resample->samples_out, GST_SECOND,
         resample->outrate);
-    GST_BUFFER_DURATION (outbuf) =
+    GST_BUFFER_DURATION (outbuf) = resample->t0 +
         gst_util_uint64_scale_int_round (resample->samples_out + out_processed,
         GST_SECOND, resample->outrate) - GST_BUFFER_TIMESTAMP (outbuf);
   } else {