rndbuffersize: add support for seeks
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 8 May 2012 18:07:04 +0000 (19:07 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 9 May 2012 10:39:34 +0000 (11:39 +0100)
Useful for e.g. filesrc ! rndbuffersize ! queue2 ! ...

gst/debugutils/rndbuffersize.c

index b23e687..2443ace 100644 (file)
@@ -93,6 +93,7 @@ static gboolean gst_rnd_buffer_size_activate_mode (GstPad * pad,
 static void gst_rnd_buffer_size_loop (GstRndBufferSize * self);
 static GstStateChangeReturn gst_rnd_buffer_size_change_state (GstElement *
     element, GstStateChange transition);
+static gboolean gst_rnd_buffer_size_src_event (GstPad * pad, GstEvent * event);
 
 GType gst_rnd_buffer_size_get_type (void);
 #define gst_rnd_buffer_size_parent_class parent_class
@@ -152,6 +153,8 @@ gst_rnd_buffer_size_init (GstRndBufferSize * self)
   gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
 
   self->srcpad = gst_pad_new_from_static_template (&src_template, "src");
+  gst_pad_set_event_function (self->srcpad,
+      GST_DEBUG_FUNCPTR (gst_rnd_buffer_size_src_event));
   gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
 }
 
@@ -274,6 +277,55 @@ gst_rnd_buffer_size_activate_mode (GstPad * pad, GstObject * parent,
   return res;
 }
 
+static gboolean
+gst_rnd_buffer_size_src_event (GstPad * pad, GstEvent * event)
+{
+  GstRndBufferSize *self;
+  GstSeekType start_type;
+  GstSeekFlags flags;
+  GstFormat format;
+  gint64 start;
+
+  if (GST_EVENT_TYPE (event) != GST_EVENT_SEEK) {
+    GST_WARNING_OBJECT (pad, "dropping %s event", GST_EVENT_TYPE_NAME (event));
+    return FALSE;
+  }
+
+  self = GST_RND_BUFFER_SIZE (GST_OBJECT_PARENT (pad));
+  gst_event_parse_seek (event, NULL, &format, &flags, &start_type, &start,
+      NULL, NULL);
+
+  if (format != GST_FORMAT_BYTES) {
+    GST_WARNING_OBJECT (pad, "only BYTE format supported");
+    return FALSE;
+  }
+  if (start_type != GST_SEEK_TYPE_SET) {
+    GST_WARNING_OBJECT (pad, "only SEEK_TYPE_SET supported");
+    return FALSE;
+  }
+
+  if ((flags & GST_SEEK_FLAG_FLUSH)) {
+    gst_pad_push_event (self->srcpad, gst_event_new_flush_start ());
+    gst_pad_push_event (self->sinkpad, gst_event_new_flush_start ());
+    gst_pad_push_event (self->srcpad, gst_event_new_flush_stop ());
+    gst_pad_push_event (self->sinkpad, gst_event_new_flush_stop ());
+  } else {
+    gst_pad_pause_task (self->sinkpad);
+  }
+
+  GST_PAD_STREAM_LOCK (self->sinkpad);
+
+  GST_INFO_OBJECT (pad, "seeking to offset %" G_GINT64_FORMAT, start);
+
+  self->offset = start;
+  self->need_newsegment = TRUE;
+
+  gst_pad_start_task (self->sinkpad, (GstTaskFunction) gst_rnd_buffer_size_loop,
+      self);
+
+  GST_PAD_STREAM_UNLOCK (self->sinkpad);
+  return TRUE;
+}
 
 static void
 gst_rnd_buffer_size_loop (GstRndBufferSize * self)