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
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);
}
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)