From ee9906672b7857ea38b3160112f95ebf503b1ef2 Mon Sep 17 00:00:00 2001 From: Olivier Crete Date: Wed, 19 Dec 2007 00:57:39 +0000 Subject: [MOVED FROM GST-P-FARSIGHT] Use do the alloc_buffer function in the valve 20071219005739-3e2dc-2a0fdfa2f38f03ab4791fe5c4ab85e8790113683.gz --- gst/valve/gstvalve.c | 43 +++++++++++++++++++++++++++++++++++++++---- gst/valve/gstvalve.h | 2 ++ 2 files changed, 41 insertions(+), 4 deletions(-) (limited to 'gst') diff --git a/gst/valve/gstvalve.c b/gst/valve/gstvalve.c index 4ff7f347..5b765c65 100644 --- a/gst/valve/gstvalve.c +++ b/gst/valve/gstvalve.c @@ -74,10 +74,11 @@ static void gst_valve_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void gst_valve_dispose (GObject *object); -static GstFlowReturn -gst_valve_transform_ip (GstBaseTransform *trans, GstBuffer *buf); -static gboolean -gst_valve_event (GstBaseTransform *trans, GstEvent *event); +static GstFlowReturn gst_valve_transform_ip (GstBaseTransform *trans, + GstBuffer *buf); +static gboolean gst_valve_event (GstBaseTransform *trans, GstEvent *event); +static GstFlowReturn gst_valve_buffer_alloc (GstPad * pad, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf); static void @@ -139,6 +140,14 @@ gst_valve_init (GstValve *valve, GstValveClass *klass) valve->drop = 0; + valve->original_allocfunc = + GST_BASE_TRANSFORM (valve)->sinkpad->bufferallocfunc; + + gst_pad_set_bufferalloc_function ( + GST_BASE_TRANSFORM (valve)->sinkpad, + GST_DEBUG_FUNCPTR(gst_valve_buffer_alloc)); + + #if GST_VERSION_MINOR >= 10 && GST_VERSION_MICRO >= 13 gst_base_transform_set_passthrough ((GstBaseTransform *)valve, TRUE); #endif @@ -223,6 +232,32 @@ gst_valve_event (GstBaseTransform *trans, GstEvent *event) return ret; } +static GstFlowReturn +gst_valve_buffer_alloc (GstPad * pad, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstValve *valve = GST_VALVE (gst_pad_get_parent_element (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + GST_OBJECT_LOCK (GST_OBJECT (valve)); + if (valve->drop) + { + *buf = gst_buffer_new_and_alloc (size); + GST_BUFFER_OFFSET (*buf) = offset; + gst_buffer_set_caps (*buf, caps); + } + else + { + ret = valve->original_allocfunc (pad, offset, size, caps, buf); + } + GST_OBJECT_UNLOCK (GST_OBJECT (valve)); + + gst_object_unref (valve); + + return ret; +} + + gboolean gst_valve_plugin_init (GstPlugin *plugin) { diff --git a/gst/valve/gstvalve.h b/gst/valve/gstvalve.h index 60f683f4..f60d7e18 100644 --- a/gst/valve/gstvalve.h +++ b/gst/valve/gstvalve.h @@ -54,6 +54,8 @@ struct _GstValve gboolean drop; + GstPadBufferAllocFunction original_allocfunc; + /*< private > */ gpointer _gst_reserved[GST_PADDING]; }; -- cgit v1.2.1