fsvalve: Use do the alloc_buffer function in the valve
authorOlivier Crete <olivier.crete@collabora.co.uk>
Wed, 19 Dec 2007 00:57:39 +0000 (00:57 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 31 Dec 2010 00:51:09 +0000 (00:51 +0000)
20071219005739-3e2dc-2a0fdfa2f38f03ab4791fe5c4ab85e8790113683.gz

plugins/elements/gstvalve.c
plugins/elements/gstvalve.h

index 4ff7f34..5b765c6 100644 (file)
@@ -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)
 {
index 60f683f..f60d7e1 100644 (file)
@@ -54,6 +54,8 @@ struct _GstValve
 
   gboolean      drop;
 
+  GstPadBufferAllocFunction original_allocfunc;
+
   /*< private > */
   gpointer _gst_reserved[GST_PADDING];
 };