gst-libs/gst/audio/gstbaseaudiosrc.c: Fix duration when no clock was provided. Fixes...
authorWim Taymans <wim.taymans@gmail.com>
Mon, 10 Mar 2008 17:19:56 +0000 (17:19 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 10 Mar 2008 17:19:56 +0000 (17:19 +0000)
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Fix duration when no clock was provided. Fixes #520300.

ChangeLog
common
gst-libs/gst/audio/gstbaseaudiosrc.c

index 16ed6b7d04d46c70aa04c3501e10f774204dc9d5..730c0257d66beb7662d08743f7e87611e2498ddb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-03-10  Wim Taymans  <wim.taymans@collabora.co.uk>
+
+       * gst-libs/gst/audio/gstbaseaudiosrc.c:
+       (gst_base_audio_src_create):
+       Fix duration when no clock was provided. Fixes #520300.
+
 2008-03-07  Wim Taymans  <wim.taymans@collabora.co.uk>
 
        Patch by: Olivier Crete  <tester at tester ca>
diff --git a/common b/common
index e02bd43fe6b9e45536eccbf5b7a5f9eae62030fd..170f8e91adc7157f6e708ffa58ca22d10e4e45da 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit e02bd43fe6b9e45536eccbf5b7a5f9eae62030fd
+Subproject commit 170f8e91adc7157f6e708ffa58ca22d10e4e45da
index 5716984b1fbf250603cc015d22b57058064c1a02..0ab03c1c87ca737d2bc50549d4f5b8be3437141d 100644 (file)
@@ -598,7 +598,7 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
   GstRingBuffer *ringbuffer;
   GstRingBufferSpec *spec;
   guint read;
-  GstClockTime timestamp;
+  GstClockTime timestamp, duration;
   GstClock *clock;
 
   ringbuffer = src->ringbuffer;
@@ -669,18 +669,21 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
     GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
   }
 
+  src->next_sample = sample + samples;
+
+  /* get the normal timestamp to get the duration. */
+  timestamp = gst_util_uint64_scale_int (sample, GST_SECOND, spec->rate);
+  duration = gst_util_uint64_scale_int (src->next_sample, GST_SECOND,
+      spec->rate) - timestamp;
+
   GST_OBJECT_LOCK (src);
   clock = GST_ELEMENT_CLOCK (src);
-  if (clock == NULL || clock == src->clock) {
-    /* timestamp against our own clock. We do this also when no external clock
-     * was provided to us. */
-    timestamp = gst_util_uint64_scale_int (sample, GST_SECOND, spec->rate);
-  } else {
+  if (clock != NULL && clock != src->clock) {
     GstClockTime base_time, latency;
 
     /* We are slaved to another clock, take running time of the clock and just
      * timestamp against it. Somebody else in the pipeline should figure out the
-     * clock drift, for now. */
+     * clock drift, for now. We keep the duration we calculated above. */
     timestamp = gst_clock_get_time (clock);
     base_time = GST_ELEMENT_CAST (src)->base_time;
 
@@ -699,9 +702,7 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
   GST_OBJECT_UNLOCK (src);
 
   GST_BUFFER_TIMESTAMP (buf) = timestamp;
-  src->next_sample = sample + samples;
-  GST_BUFFER_DURATION (buf) = gst_util_uint64_scale_int (src->next_sample,
-      GST_SECOND, spec->rate) - GST_BUFFER_TIMESTAMP (buf);
+  GST_BUFFER_DURATION (buf) = duration;
   GST_BUFFER_OFFSET (buf) = sample;
   GST_BUFFER_OFFSET_END (buf) = sample + samples;