plugins/elements/gstfakesrc.c: Fix broken sync option, fixes #323259
authorWim Taymans <wim.taymans@gmail.com>
Wed, 7 Dec 2005 15:33:42 +0000 (15:33 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Wed, 7 Dec 2005 15:33:42 +0000 (15:33 +0000)
Original commit message from CVS:
* plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
(gst_fake_src_get_times), (gst_fake_src_create):
Fix broken sync option, fixes #323259

ChangeLog
plugins/elements/gstfakesrc.c

index bd9c27a..ccd373f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2005-12-07  Wim Taymans  <wim@fluendo.com>
 
+       * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+       (gst_fake_src_get_times), (gst_fake_src_create):
+       Fix broken sync option, fixes #323259
+
+2005-12-07  Wim Taymans  <wim@fluendo.com>
+
        * gst/gstbuffer.c:
        Small docs update.
 
index 32fa8d1..cc3b2e4 100644 (file)
@@ -23,7 +23,7 @@
  * SECTION:element-fakesrc
  * @short_description: Generate (meaningless) buffers
  * @see_also: #GstFakeSink
- * 
+ *
  * <refsect2>
  * <para>
  * The fakesrc element is a multipurpose element that can generate
@@ -225,6 +225,8 @@ static gboolean gst_fake_src_stop (GstBaseSrc * basesrc);
 static gboolean gst_fake_src_is_seekable (GstBaseSrc * basesrc);
 
 static gboolean gst_fake_src_event_handler (GstBaseSrc * src, GstEvent * event);
+static void gst_fake_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+    GstClockTime * start, GstClockTime * end);
 static GstFlowReturn gst_fake_src_create (GstBaseSrc * src, guint64 offset,
     guint length, GstBuffer ** buf);
 
@@ -340,6 +342,7 @@ gst_fake_src_class_init (GstFakeSrcClass * klass)
   gstbase_src_class->start = GST_DEBUG_FUNCPTR (gst_fake_src_start);
   gstbase_src_class->stop = GST_DEBUG_FUNCPTR (gst_fake_src_stop);
   gstbase_src_class->event = GST_DEBUG_FUNCPTR (gst_fake_src_event_handler);
+  gstbase_src_class->get_times = GST_DEBUG_FUNCPTR (gst_fake_src_get_times);
   gstbase_src_class->create = GST_DEBUG_FUNCPTR (gst_fake_src_create);
 }
 
@@ -698,6 +701,33 @@ gst_fake_src_create_buffer (GstFakeSrc * src)
   return buf;
 }
 
+static void
+gst_fake_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+    GstClockTime * start, GstClockTime * end)
+{
+  GstFakeSrc *src;
+
+  src = GST_FAKE_SRC (basesrc);
+
+  /* sync on the timestamp of the buffer if requested. */
+  if (src->sync) {
+    GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+    if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+      /* get duration to calculate end time */
+      GstClockTime duration = GST_BUFFER_DURATION (buffer);
+
+      if (GST_CLOCK_TIME_IS_VALID (duration)) {
+        *end = timestamp + duration;
+      }
+      *start = timestamp;
+    }
+  } else {
+    *start = -1;
+    *end = -1;
+  }
+}
+
 static GstFlowReturn
 gst_fake_src_create (GstBaseSrc * basesrc, guint64 offset, guint length,
     GstBuffer ** ret)
@@ -713,9 +743,6 @@ gst_fake_src_create (GstBaseSrc * basesrc, guint64 offset, guint length,
 
   if (src->datarate > 0) {
     time = (src->bytes_sent * GST_SECOND) / src->datarate;
-    if (src->sync) {
-      /* gst_element_wait (GST_ELEMENT (src), time); */
-    }
 
     GST_BUFFER_DURATION (buf) =
         GST_BUFFER_SIZE (buf) * GST_SECOND / src->datarate;