diff options
author | Edward Hervey <bilboed@bilboed.com> | 2005-12-11 20:27:06 +0000 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2005-12-11 20:27:06 +0000 |
commit | be73a9282d5aaa30eb8059ed978953db469c1150 (patch) | |
tree | 816821ba455cae7c8f6b1df9befcdc6c9e17971d /gst/debug/efence.c | |
parent | 945cf26c5ac336b2383dd57fc42dc0850e805db9 (diff) |
gst/debug/efence.c: Added pull mode.
Original commit message from CVS:
* gst/debug/efence.c: (gst_efence_init), (gst_efence_getrange),
(gst_efence_checkgetrange), (gst_efence_activate_src_pull):
Added pull mode.
Diffstat (limited to 'gst/debug/efence.c')
-rw-r--r-- | gst/debug/efence.c | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/gst/debug/efence.c b/gst/debug/efence.c index 702f5603..078a0e32 100644 --- a/gst/debug/efence.c +++ b/gst/debug/efence.c @@ -88,6 +88,10 @@ static void gst_efence_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstFlowReturn gst_efence_chain (GstPad * pad, GstBuffer * buf); +static GstFlowReturn gst_efence_getrange (GstPad * pad, guint64 offset, + guint length, GstBuffer ** buffer); +static gboolean gst_efence_checkgetrange (GstPad * pad); +static gboolean gst_efence_activate_src_pull (GstPad * pad, gboolean active); static GstElementClass *parent_class = NULL; @@ -184,6 +188,10 @@ gst_efence_init (GstEFence * filter) GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_pad_set_setcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_efence_chain)); + gst_pad_set_bufferalloc_function (filter->sinkpad, + GST_DEBUG_FUNCPTR (gst_efence_buffer_alloc)); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_object_unref (tmpl); @@ -193,10 +201,13 @@ gst_efence_init (GstEFence * filter) GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); gst_pad_set_setcaps_function (filter->srcpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); - gst_pad_set_chain_function (filter->sinkpad, - GST_DEBUG_FUNCPTR (gst_efence_chain)); - gst_pad_set_bufferalloc_function (filter->sinkpad, - GST_DEBUG_FUNCPTR (gst_efence_buffer_alloc)); + gst_pad_set_checkgetrange_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_checkgetrange)); + gst_pad_set_getrange_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_getrange)); + gst_pad_set_activatepull_function (filter->srcpad, + GST_DEBUG_FUNCPTR (gst_efence_activate_src_pull)); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); gst_object_unref (tmpl); @@ -234,6 +245,49 @@ gst_efence_chain (GstPad * pad, GstBuffer * buffer) } static GstFlowReturn +gst_efence_getrange (GstPad * pad, guint64 offset, + guint length, GstBuffer ** buffer) +{ + GstEFence *efence; + GstFlowReturn ret; + GstBuffer *ownbuf; + GstPad *peer; + + efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + peer = gst_pad_get_peer (efence->sinkpad); + if (!peer) + return GST_FLOW_NOT_LINKED; + + if ((ret = gst_pad_get_range (peer, offset, length, buffer)) != GST_FLOW_OK) + goto beach; + + ownbuf = (GstBuffer *) gst_fenced_buffer_copy (*buffer); + gst_buffer_unref ((GstBuffer *) * buffer); + *buffer = ownbuf; + +beach: + gst_object_unref (peer); + return ret; +} + +static gboolean +gst_efence_checkgetrange (GstPad * pad) +{ + GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + return gst_pad_check_pull_range (efence->sinkpad); +} + +static gboolean +gst_efence_activate_src_pull (GstPad * pad, gboolean active) +{ + GstEFence *efence = GST_EFENCE (GST_OBJECT_PARENT (pad)); + + return gst_pad_activate_pull (efence->sinkpad, active); +} + +static GstFlowReturn gst_efence_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { |