summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Crete <olivier.crete@collabora.co.uk>2007-12-19 00:57:39 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2010-12-31 00:51:09 +0000
commit6db2a426c108dc5c83f6c569482af679c2458c35 (patch)
tree5efdb65becbe114af3983081f1c9820e65cfb10c
parent67c6adaf31db28d6f90cefc4fb762031dd14b152 (diff)
fsvalve: Use do the alloc_buffer function in the valve
-rw-r--r--plugins/elements/gstvalve.c43
-rw-r--r--plugins/elements/gstvalve.h2
2 files changed, 41 insertions, 4 deletions
diff --git a/plugins/elements/gstvalve.c b/plugins/elements/gstvalve.c
index 4ff7f347a9..5b765c65f6 100644
--- a/plugins/elements/gstvalve.c
+++ b/plugins/elements/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/plugins/elements/gstvalve.h b/plugins/elements/gstvalve.h
index 60f683f49f..f60d7e1812 100644
--- a/plugins/elements/gstvalve.h
+++ b/plugins/elements/gstvalve.h
@@ -54,6 +54,8 @@ struct _GstValve
gboolean drop;
+ GstPadBufferAllocFunction original_allocfunc;
+
/*< private > */
gpointer _gst_reserved[GST_PADDING];
};