diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 6b7fcf4705..13a113ad20 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -234,6 +234,7 @@ gst_proxy_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query) /** * gst_proyx_pad_iterate_internal_links_default: * @pad: the #GstPad to get the internal links of. + * @parent: the parent of @pad or NULL * * Invoke the default iterate internal links function of the proxy pad. * @@ -243,7 +244,7 @@ gst_proxy_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query) * Since: 0.10.36 */ GstIterator * -gst_proxy_pad_iterate_internal_links_default (GstPad * pad) +gst_proxy_pad_iterate_internal_links_default (GstPad * pad, GstObject * parent) { GstIterator *res = NULL; GstPad *internal; diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index ab1c3a19cc..fa8950c629 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -65,7 +65,7 @@ GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad); gboolean gst_proxy_pad_event_default (GstPad *pad, GstEvent *event); gboolean gst_proxy_pad_query_default (GstPad *pad, GstObject *parent, GstQuery *query); -GstIterator* gst_proxy_pad_iterate_internal_links_default (GstPad *pad); +GstIterator* gst_proxy_pad_iterate_internal_links_default (GstPad *pad, GstObject *parent); GstFlowReturn gst_proxy_pad_chain_default (GstPad *pad, GstBuffer *buffer); GstFlowReturn gst_proxy_pad_chain_list_default (GstPad *pad, GstBufferList *list); GstFlowReturn gst_proxy_pad_getrange_default (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer); diff --git a/gst/gstpad.c b/gst/gstpad.c index a415288ead..fc2c5b6924 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -2390,6 +2390,7 @@ no_peer: /** * gst_pad_iterate_internal_links_default: * @pad: the #GstPad to get the internal links of. + * @parent: the parent of @pad or NULL * * Iterate the list of pads to which the given pad is linked to inside of * the parent element. @@ -2404,39 +2405,40 @@ no_peer: * Since: 0.10.21 */ GstIterator * -gst_pad_iterate_internal_links_default (GstPad * pad) +gst_pad_iterate_internal_links_default (GstPad * pad, GstObject * parent) { GstIterator *res; GList **padlist; guint32 *cookie; GMutex *lock; gpointer owner; + GstElement *eparent; g_return_val_if_fail (GST_IS_PAD (pad), NULL); - { - GstElement *parent; - + if (parent != NULL && GST_IS_ELEMENT (parent)) { + eparent = GST_ELEMENT_CAST (gst_object_ref (parent)); + } else { GST_OBJECT_LOCK (pad); - parent = GST_PAD_PARENT (pad); - if (!parent || !GST_IS_ELEMENT (parent)) + eparent = GST_PAD_PARENT (pad); + if (!eparent || !GST_IS_ELEMENT (eparent)) goto no_parent; - gst_object_ref (parent); + gst_object_ref (eparent); GST_OBJECT_UNLOCK (pad); - - if (pad->direction == GST_PAD_SRC) - padlist = &parent->sinkpads; - else - padlist = &parent->srcpads; - - GST_DEBUG_OBJECT (pad, "Making iterator"); - - cookie = &parent->pads_cookie; - owner = parent; - lock = GST_OBJECT_GET_LOCK (parent); } + if (pad->direction == GST_PAD_SRC) + padlist = &eparent->sinkpads; + else + padlist = &eparent->srcpads; + + GST_DEBUG_OBJECT (pad, "Making iterator"); + + cookie = &eparent->pads_cookie; + owner = eparent; + lock = GST_OBJECT_GET_LOCK (eparent); + res = gst_iterator_new_list (GST_TYPE_PAD, lock, cookie, padlist, (GObject *) owner, NULL); @@ -2484,7 +2486,7 @@ gst_pad_iterate_internal_links (GstPad * pad) GST_OBJECT_UNLOCK (pad); if (GST_PAD_ITERINTLINKFUNC (pad)) - res = GST_PAD_ITERINTLINKFUNC (pad) (pad); + res = GST_PAD_ITERINTLINKFUNC (pad) (pad, parent); RELEASE_PARENT (parent); diff --git a/gst/gstpad.h b/gst/gstpad.h index f377631f61..749b14dc22 100644 --- a/gst/gstpad.h +++ b/gst/gstpad.h @@ -353,6 +353,9 @@ typedef gboolean (*GstPadEventFunction) (GstPad *pad, GstEvent *event); /** * GstPadIterIntLinkFunction: * @pad: The #GstPad to query. + * @parent: the parent of @pad. If the #GST_PAD_FLAG_NEED_PARENT flag is set, + * @parent is guaranteed to be not-NULL and remain valid during the + * execution of this function. * * The signature of the internal pad link iterator function. * @@ -363,7 +366,7 @@ typedef gboolean (*GstPadEventFunction) (GstPad *pad, GstEvent *event); * * Since 0.10.21 */ -typedef GstIterator* (*GstPadIterIntLinkFunction) (GstPad *pad); +typedef GstIterator* (*GstPadIterIntLinkFunction) (GstPad *pad, GstObject *parent); /* generic query function */ /** @@ -876,7 +879,7 @@ gboolean gst_pad_stop_task (GstPad *pad); void gst_pad_set_iterate_internal_links_function (GstPad * pad, GstPadIterIntLinkFunction iterintlink); GstIterator * gst_pad_iterate_internal_links (GstPad * pad); -GstIterator * gst_pad_iterate_internal_links_default (GstPad * pad); +GstIterator * gst_pad_iterate_internal_links_default (GstPad * pad, GstObject *parent); /* generic query function */ diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index 2bade08ce9..1b9c439079 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -181,7 +181,8 @@ static void gst_selector_pad_reset (GstSelectorPad * pad); static gboolean gst_selector_pad_event (GstPad * pad, GstEvent * event); static gboolean gst_selector_pad_query (GstPad * pad, GstObject * parent, GstQuery * query); -static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad); +static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad, + GstObject * parent); static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf); G_DEFINE_TYPE (GstSelectorPad, gst_selector_pad, GST_TYPE_PAD); @@ -330,14 +331,14 @@ gst_selector_pad_reset (GstSelectorPad * pad) /* strictly get the linked pad from the sinkpad. If the pad is active we return * the srcpad else we return NULL */ static GstIterator * -gst_selector_pad_iterate_linked_pads (GstPad * pad) +gst_selector_pad_iterate_linked_pads (GstPad * pad, GstObject * parent) { GstInputSelector *sel; GstPad *otherpad; GstIterator *it = NULL; GValue val = { 0, }; - sel = GST_INPUT_SELECTOR (GST_PAD_PARENT (pad)); + sel = GST_INPUT_SELECTOR (parent); otherpad = gst_input_selector_get_linked_pad (sel, pad, TRUE); if (otherpad) { diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index ca1c45bedc..3a14394d22 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -575,12 +575,12 @@ gst_multi_queue_get_property (GObject * object, guint prop_id, } static GstIterator * -gst_multi_queue_iterate_internal_links (GstPad * pad) +gst_multi_queue_iterate_internal_links (GstPad * pad, GstObject * parent) { GstIterator *it = NULL; GstPad *opad; GstSingleQueue *squeue; - GstMultiQueue *mq = GST_MULTI_QUEUE (GST_PAD_PARENT (pad)); + GstMultiQueue *mq = GST_MULTI_QUEUE (parent); GValue val = { 0, }; GST_MULTI_QUEUE_MUTEX_LOCK (mq);