From 09a8294d3681f5ab57d7b8978d3c55bda078243f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 16 Nov 2011 17:22:56 +0100 Subject: [PATCH] pad: add parent to the query function --- gst/gstghostpad.c | 3 ++- gst/gstghostpad.h | 3 ++- gst/gstpad.c | 5 +++-- gst/gstpad.h | 9 ++++++-- libs/gst/base/gstbaseparse.c | 25 +++++++++++----------- libs/gst/base/gstbasesink.c | 22 ++++++++------------ libs/gst/base/gstbasesrc.c | 12 ++++------- libs/gst/base/gstbasetransform.c | 12 ++++------- plugins/elements/gstfdsink.c | 39 ++++++++++++++++++++--------------- plugins/elements/gstfunnel.c | 7 ++++--- plugins/elements/gstinputselector.c | 16 +++++++------- plugins/elements/gstmultiqueue.c | 10 ++++----- plugins/elements/gstoutputselector.c | 9 ++++---- plugins/elements/gstqueue.c | 22 ++++++++------------ plugins/elements/gstqueue2.c | 22 +++++++++++++------- plugins/elements/gsttee.c | 16 +++++++------- plugins/elements/gsttypefindelement.c | 16 ++++++-------- plugins/elements/gstvalve.c | 9 ++++---- tests/check/elements/multiqueue.c | 4 ++-- 19 files changed, 133 insertions(+), 128 deletions(-) diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index cf8f0ca..6b7fcf4 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -176,6 +176,7 @@ done: /** * gst_proxy_pad_query_default: * @pad: a #GstPad to invoke the default query on. + * @parent: the parent of @pad or NULL * @query: (transfer none): the #GstQuery to perform. * * Invoke the default query function of the proxy pad. @@ -185,7 +186,7 @@ done: * Since: 0.10.36 */ gboolean -gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) +gst_proxy_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; GstPad *target; diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index 29f0e45..ab1c3a1 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -63,7 +63,8 @@ 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, GstQuery *query); +gboolean gst_proxy_pad_query_default (GstPad *pad, GstObject *parent, + GstQuery *query); GstIterator* gst_proxy_pad_iterate_internal_links_default (GstPad *pad); GstFlowReturn gst_proxy_pad_chain_default (GstPad *pad, GstBuffer *buffer); GstFlowReturn gst_proxy_pad_chain_list_default (GstPad *pad, GstBufferList *list); diff --git a/gst/gstpad.c b/gst/gstpad.c index 76fab43..a415288 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -2776,6 +2776,7 @@ done: /** * gst_pad_query_default: * @pad: a #GstPad to call the default query handler on. + * @parent: the parent of @pad or NULL * @query: (transfer none): the #GstQuery to handle. * * Invokes the default query handler for the given pad. @@ -2787,7 +2788,7 @@ done: * Returns: TRUE if the query was performed successfully. */ gboolean -gst_pad_query_default (GstPad * pad, GstQuery * query) +gst_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean forward = TRUE, ret = FALSE; @@ -3182,7 +3183,7 @@ gst_pad_query (GstPad * pad, GstQuery * query) if ((func = GST_PAD_QUERYFUNC (pad)) == NULL) goto no_func; - res = func (pad, query); + res = func (pad, parent, query); RELEASE_PARENT (parent); diff --git a/gst/gstpad.h b/gst/gstpad.h index a8bdad1..f377631 100644 --- a/gst/gstpad.h +++ b/gst/gstpad.h @@ -369,13 +369,17 @@ typedef GstIterator* (*GstPadIterIntLinkFunction) (GstPad *pad); /** * GstPadQueryFunction: * @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. * @query: the #GstQuery object to execute * * The signature of the query function. * * Returns: TRUE if the query could be performed. */ -typedef gboolean (*GstPadQueryFunction) (GstPad *pad, GstQuery *query); +typedef gboolean (*GstPadQueryFunction) (GstPad *pad, GstObject *parent, + GstQuery *query); /* linking */ @@ -879,7 +883,8 @@ GstIterator * gst_pad_iterate_internal_links_default (GstPad * pad); gboolean gst_pad_query (GstPad *pad, GstQuery *query); gboolean gst_pad_peer_query (GstPad *pad, GstQuery *query); void gst_pad_set_query_function (GstPad *pad, GstPadQueryFunction query); -gboolean gst_pad_query_default (GstPad *pad, GstQuery *query); +gboolean gst_pad_query_default (GstPad *pad, GstObject *parent, + GstQuery *query); /* misc helper functions */ gboolean gst_pad_forward (GstPad *pad, GstPadForwardFunction forward, diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 5625b72..6eea011 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -384,10 +384,12 @@ static gboolean gst_base_parse_handle_seek (GstBaseParse * parse, static void gst_base_parse_handle_tag (GstBaseParse * parse, GstEvent * event); static gboolean gst_base_parse_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_base_parse_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_parse_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_base_parse_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_base_parse_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_parse_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstFlowReturn gst_base_parse_chain (GstPad * pad, GstBuffer * buffer); static void gst_base_parse_loop (GstPad * pad); @@ -1119,13 +1121,13 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event) } static gboolean -gst_base_parse_sink_query (GstPad * pad, GstQuery * query) +gst_base_parse_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstBaseParse *parse; GstBaseParseClass *bclass; gboolean res; - parse = GST_BASE_PARSE (gst_pad_get_parent (pad)); + parse = GST_BASE_PARSE (parent); bclass = GST_BASE_PARSE_GET_CLASS (parse); switch (GST_QUERY_TYPE (query)) { @@ -1148,11 +1150,10 @@ gst_base_parse_sink_query (GstPad * pad, GstQuery * query) } default: { - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } } - gst_object_unref (parse); return res; } @@ -3310,12 +3311,12 @@ gst_base_parse_get_duration (GstBaseParse * parse, GstFormat format, } static gboolean -gst_base_parse_src_query (GstPad * pad, GstQuery * query) +gst_base_parse_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstBaseParse *parse; gboolean res = FALSE; - parse = GST_BASE_PARSE (GST_PAD_PARENT (pad)); + parse = GST_BASE_PARSE (parent); GST_LOG_OBJECT (parse, "handling query: %" GST_PTR_FORMAT, query); @@ -3329,7 +3330,7 @@ gst_base_parse_src_query (GstPad * pad, GstQuery * query) gst_query_parse_position (query, &format, NULL); /* try upstream first */ - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); if (!res) { /* Fall back on interpreting segment */ GST_OBJECT_LOCK (parse); @@ -3363,7 +3364,7 @@ gst_base_parse_src_query (GstPad * pad, GstQuery * query) gst_query_parse_duration (query, &format, NULL); /* consult upstream */ - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); /* otherwise best estimate from us */ if (!res) { @@ -3383,7 +3384,7 @@ gst_base_parse_src_query (GstPad * pad, GstQuery * query) gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); /* consult upstream */ - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); /* we may be able to help if in TIME */ if (fmt == GST_FORMAT_TIME && gst_base_parse_is_seekable (parse)) { @@ -3452,7 +3453,7 @@ gst_base_parse_src_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } return res; diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 3d6741e..716e7c3 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -385,7 +385,8 @@ static gboolean gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink, static GstStateChangeReturn gst_base_sink_change_state (GstElement * element, GstStateChange transition); -static gboolean gst_base_sink_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_sink_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstFlowReturn gst_base_sink_chain (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_base_sink_chain_list (GstPad * pad, GstBufferList * list); @@ -2056,8 +2057,8 @@ gst_base_sink_wait_clock (GstBaseSink * sink, GstClockTime time, /* FIXME: Casting to GstClockEntry only works because the types * are the same */ if (G_LIKELY (sink->priv->cached_clock_id != NULL - && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink-> - priv->cached_clock_id) == clock)) { + && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->priv-> + cached_clock_id) == clock)) { if (!gst_clock_single_shot_id_reinit (clock, sink->priv->cached_clock_id, time)) { gst_clock_id_unref (sink->priv->cached_clock_id); @@ -4860,25 +4861,22 @@ default_sink_query (GstBaseSink * basesink, GstQuery * query) break; } default: - res = gst_pad_query_default (basesink->sinkpad, query); + res = + gst_pad_query_default (basesink->sinkpad, GST_OBJECT_CAST (basesink), + query); break; } return res; } static gboolean -gst_base_sink_sink_query (GstPad * pad, GstQuery * query) +gst_base_sink_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstBaseSink *basesink; GstBaseSinkClass *bclass; gboolean res; - basesink = GST_BASE_SINK_CAST (gst_pad_get_parent (pad)); - if (G_UNLIKELY (basesink == NULL)) { - gst_query_unref (query); - return FALSE; - } - + basesink = GST_BASE_SINK_CAST (parent); bclass = GST_BASE_SINK_GET_CLASS (basesink); if (bclass->query) @@ -4886,8 +4884,6 @@ gst_base_sink_sink_query (GstPad * pad, GstQuery * query) else res = FALSE; - gst_object_unref (basesink); - return res; } diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index e8801e7..ea501cd 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -294,7 +294,8 @@ static gboolean gst_base_src_event_handler (GstPad * pad, GstEvent * event); static gboolean gst_base_src_send_event (GstElement * elem, GstEvent * event); static gboolean gst_base_src_default_event (GstBaseSrc * src, GstEvent * event); -static gboolean gst_base_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_base_src_activate_pool (GstBaseSrc * basesrc, gboolean active); @@ -1145,23 +1146,18 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query) } static gboolean -gst_base_src_query (GstPad * pad, GstQuery * query) +gst_base_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstBaseSrc *src; GstBaseSrcClass *bclass; gboolean result = FALSE; - src = GST_BASE_SRC (gst_pad_get_parent (pad)); - if (G_UNLIKELY (src == NULL)) - return FALSE; - + src = GST_BASE_SRC (parent); bclass = GST_BASE_SRC_GET_CLASS (src); if (bclass->query) result = bclass->query (src, query); - gst_object_unref (src); - return result; } diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index 9ff590e..45267ea 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -327,7 +327,8 @@ static gboolean gst_base_transform_acceptcaps_default (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps); static gboolean gst_base_transform_setcaps (GstBaseTransform * trans, GstPad * pad, GstCaps * caps); -static gboolean gst_base_transform_query (GstPad * pad, GstQuery * query); +static gboolean gst_base_transform_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_base_transform_default_query (GstBaseTransform * trans, GstPadDirection direction, GstQuery * query); static gboolean gst_base_transform_default_transform_size (GstBaseTransform * @@ -1380,23 +1381,18 @@ done: } static gboolean -gst_base_transform_query (GstPad * pad, GstQuery * query) +gst_base_transform_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstBaseTransform *trans; GstBaseTransformClass *bclass; gboolean ret = FALSE; - trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad)); - if (G_UNLIKELY (trans == NULL)) - return FALSE; - + trans = GST_BASE_TRANSFORM (parent); bclass = GST_BASE_TRANSFORM_GET_CLASS (trans); if (bclass->query) ret = bclass->query (trans, GST_PAD_DIRECTION (pad), query); - gst_object_unref (trans); - return ret; } diff --git a/plugins/elements/gstfdsink.c b/plugins/elements/gstfdsink.c index 6e0036c..9ad257e 100644 --- a/plugins/elements/gstfdsink.c +++ b/plugins/elements/gstfdsink.c @@ -106,7 +106,7 @@ static void gst_fd_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_fd_sink_dispose (GObject * obj); -static gboolean gst_fd_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_fd_sink_query (GstBaseSink * bsink, GstQuery * query); static GstFlowReturn gst_fd_sink_render (GstBaseSink * sink, GstBuffer * buffer); static gboolean gst_fd_sink_start (GstBaseSink * basesink); @@ -145,6 +145,7 @@ gst_fd_sink_class_init (GstFdSinkClass * klass) gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_fd_sink_unlock); gstbasesink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_fd_sink_unlock_stop); gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_fd_sink_event); + gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_fd_sink_query); g_object_class_install_property (gobject_class, ARG_FD, g_param_spec_int ("fd", "fd", "An open file descriptor to write to", @@ -154,11 +155,6 @@ gst_fd_sink_class_init (GstFdSinkClass * klass) static void gst_fd_sink_init (GstFdSink * fdsink) { - GstPad *pad; - - pad = GST_BASE_SINK_PAD (fdsink); - gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_fd_sink_query)); - fdsink->fd = 1; fdsink->uri = g_strdup_printf ("fd://%d", fdsink->fd); fdsink->bytes_written = 0; @@ -179,36 +175,45 @@ gst_fd_sink_dispose (GObject * obj) } static gboolean -gst_fd_sink_query (GstPad * pad, GstQuery * query) +gst_fd_sink_query (GstBaseSink * bsink, GstQuery * query) { + gboolean res = FALSE; GstFdSink *fdsink; - GstFormat format; - fdsink = GST_FD_SINK (GST_PAD_PARENT (pad)); + fdsink = GST_FD_SINK (bsink); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: + { + GstFormat format; + gst_query_parse_position (query, &format, NULL); + switch (format) { case GST_FORMAT_DEFAULT: case GST_FORMAT_BYTES: gst_query_set_position (query, GST_FORMAT_BYTES, fdsink->current_pos); - return TRUE; + res = TRUE; + break; default: - return FALSE; + break; } - + break; + } case GST_QUERY_FORMATS: gst_query_set_formats (query, 2, GST_FORMAT_DEFAULT, GST_FORMAT_BYTES); - return TRUE; - + res = TRUE; + break; case GST_QUERY_URI: gst_query_set_uri (query, fdsink->uri); - return TRUE; - + res = TRUE; + break; default: - return gst_pad_query_default (pad, query); + res = GST_BASE_SINK_CLASS (parent_class)->query (bsink, query); + break; + } + return res; } static GstFlowReturn diff --git a/plugins/elements/gstfunnel.c b/plugins/elements/gstfunnel.c index 12ede11..45e5bec 100644 --- a/plugins/elements/gstfunnel.c +++ b/plugins/elements/gstfunnel.c @@ -118,7 +118,8 @@ static void gst_funnel_release_pad (GstElement * element, GstPad * pad); static GstFlowReturn gst_funnel_sink_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_funnel_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_funnel_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_funnel_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_funnel_src_event (GstPad * pad, GstEvent * event); @@ -318,9 +319,9 @@ gst_funnel_sink_event (GstPad * pad, GstEvent * event) } static gboolean -gst_funnel_sink_query (GstPad * pad, GstQuery * query) +gst_funnel_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { - GstFunnel *funnel = GST_FUNNEL (GST_PAD_PARENT (pad)); + GstFunnel *funnel = GST_FUNNEL (parent); gboolean forward = TRUE; gboolean res = TRUE; diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index 81a7c86..2bade08 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -179,7 +179,8 @@ static void gst_selector_pad_set_property (GObject * object, static gint64 gst_selector_pad_get_running_time (GstSelectorPad * pad); 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, GstQuery * query); +static gboolean gst_selector_pad_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad); static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf); @@ -482,13 +483,13 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event) } static gboolean -gst_selector_pad_query (GstPad * pad, GstQuery * query) +gst_selector_pad_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } @@ -753,7 +754,8 @@ static GstStateChangeReturn gst_input_selector_change_state (GstElement * element, GstStateChange transition); static gboolean gst_input_selector_event (GstPad * pad, GstEvent * event); -static gboolean gst_input_selector_query (GstPad * pad, GstQuery * query); +static gboolean gst_input_selector_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gint64 gst_input_selector_block (GstInputSelector * self); /* FIXME: create these marshallers using glib-genmarshal */ @@ -1083,12 +1085,12 @@ gst_input_selector_event (GstPad * pad, GstEvent * event) /* query on the srcpad. We override this function because by default it will * only forward the query to one random sinkpad */ static gboolean -gst_input_selector_query (GstPad * pad, GstQuery * query) +gst_input_selector_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = FALSE; GstInputSelector *sel; - sel = GST_INPUT_SELECTOR (GST_PAD_PARENT (pad)); + sel = GST_INPUT_SELECTOR (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY: @@ -1146,7 +1148,7 @@ gst_input_selector_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index bb52771..ca1c45b 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -1503,7 +1503,7 @@ was_eos: } static gboolean -gst_multi_queue_sink_query (GstPad * pad, GstQuery * query) +gst_multi_queue_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; @@ -1512,7 +1512,7 @@ gst_multi_queue_sink_query (GstPad * pad, GstQuery * query) case GST_QUERY_CAPS: default: /* default handling */ - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } return res; @@ -1549,17 +1549,15 @@ gst_multi_queue_src_event (GstPad * pad, GstEvent * event) } static gboolean -gst_multi_queue_src_query (GstPad * pad, GstQuery * query) +gst_multi_queue_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; /* FIXME, Handle position offset depending on queue size */ switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_ACCEPT_CAPS: - case GST_QUERY_CAPS: default: /* default handling */ - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } return res; diff --git a/plugins/elements/gstoutputselector.c b/plugins/elements/gstoutputselector.c index b4414b6..ddf07ce 100644 --- a/plugins/elements/gstoutputselector.c +++ b/plugins/elements/gstoutputselector.c @@ -106,7 +106,8 @@ static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf); static GstStateChangeReturn gst_output_selector_change_state (GstElement * element, GstStateChange transition); static gboolean gst_output_selector_event (GstPad * pad, GstEvent * event); -static gboolean gst_output_selector_query (GstPad * pad, GstQuery * query); +static gboolean gst_output_selector_query (GstPad * pad, GstObject * parent, + GstQuery * query); static void gst_output_selector_switch_pad_negotiation_mode (GstOutputSelector * sel, gint mode); @@ -563,13 +564,13 @@ gst_output_selector_event (GstPad * pad, GstEvent * event) } static gboolean -gst_output_selector_query (GstPad * pad, GstQuery * query) +gst_output_selector_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res = TRUE; GstOutputSelector *sel; GstPad *active = NULL; - sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad)); + sel = GST_OUTPUT_SELECTOR (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: @@ -595,8 +596,8 @@ gst_output_selector_query (GstPad * pad, GstQuery * query) break; } default: + res = gst_pad_query_default (pad, parent, query); break; } - return res; } diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index d5db7b5..0a05c11 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -197,10 +197,12 @@ static GstFlowReturn gst_queue_push_one (GstQueue * queue); static void gst_queue_loop (GstPad * pad); static gboolean gst_queue_handle_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_queue_handle_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_queue_handle_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_queue_handle_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_queue_handle_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_queue_handle_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static GstPadLinkReturn gst_queue_link_sink (GstPad * pad, GstPad * peer); static GstPadLinkReturn gst_queue_link_src (GstPad * pad, GstPad * peer); @@ -810,20 +812,15 @@ out_eos: } static gboolean -gst_queue_handle_sink_query (GstPad * pad, GstQuery * query) +gst_queue_handle_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { - GstQueue *queue = GST_QUEUE (GST_PAD_PARENT (pad)); gboolean res; switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_ACCEPT_CAPS: - case GST_QUERY_CAPS: default: - if (!(res = gst_pad_peer_query (queue->srcpad, query))) - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } - return res; } @@ -1214,15 +1211,14 @@ gst_queue_handle_src_event (GstPad * pad, GstEvent * event) } static gboolean -gst_queue_handle_src_query (GstPad * pad, GstQuery * query) +gst_queue_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { - GstQueue *queue = GST_QUEUE (GST_PAD_PARENT (pad)); + GstQueue *queue = GST_QUEUE (parent); gboolean res; res = gst_pad_peer_query (queue->sinkpad, query); - if (!res) { + if (!res) return FALSE; - } switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 424f1c5..aa9dc3c 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -228,10 +228,12 @@ static GstFlowReturn gst_queue2_push_one (GstQueue2 * queue); static void gst_queue2_loop (GstPad * pad); static gboolean gst_queue2_handle_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_queue2_handle_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_queue2_handle_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_queue2_handle_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_queue2_handle_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_queue2_handle_query (GstElement * element, GstQuery * query); @@ -2014,13 +2016,14 @@ out_eos: } static gboolean -gst_queue2_handle_sink_query (GstPad * pad, GstQuery * query) +gst_queue2_handle_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } return res; @@ -2377,11 +2380,11 @@ gst_queue2_handle_src_event (GstPad * pad, GstEvent * event) } static gboolean -gst_queue2_handle_src_query (GstPad * pad, GstQuery * query) +gst_queue2_handle_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstQueue2 *queue; - queue = GST_QUEUE2 (GST_PAD_PARENT (pad)); + queue = GST_QUEUE2 (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: @@ -2555,7 +2558,7 @@ gst_queue2_handle_src_query (GstPad * pad, GstQuery * query) } default: /* peer handled other queries */ - if (!gst_pad_query_default (pad, query)) + if (!gst_pad_query_default (pad, parent, query)) goto peer_failed; break; } @@ -2573,8 +2576,11 @@ peer_failed: static gboolean gst_queue2_handle_query (GstElement * element, GstQuery * query) { + GstQueue2 *queue = GST_QUEUE2 (element); + /* simply forward to the srcpad query function */ - return gst_queue2_handle_src_query (GST_QUEUE2_CAST (element)->srcpad, query); + return gst_queue2_handle_src_query (queue->srcpad, GST_OBJECT_CAST (element), + query); } static void diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c index 20bf142..d910377 100644 --- a/plugins/elements/gsttee.c +++ b/plugins/elements/gsttee.c @@ -139,9 +139,11 @@ static void gst_tee_dispose (GObject * object); static GstFlowReturn gst_tee_chain (GstPad * pad, GstBuffer * buffer); static GstFlowReturn gst_tee_chain_list (GstPad * pad, GstBufferList * list); static gboolean gst_tee_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_tee_sink_query (GstPad * pad, GstQuery * query); +static gboolean gst_tee_sink_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_tee_sink_activate_push (GstPad * pad, gboolean active); -static gboolean gst_tee_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_tee_src_query (GstPad * pad, GstObject * parent, + GstQuery * query); static gboolean gst_tee_src_activate_pull (GstPad * pad, gboolean active); static GstFlowReturn gst_tee_src_get_range (GstPad * pad, guint64 offset, guint length, GstBuffer ** buf); @@ -492,13 +494,13 @@ gst_tee_sink_event (GstPad * pad, GstEvent * event) } static gboolean -gst_tee_sink_query (GstPad * pad, GstQuery * query) +gst_tee_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) { gboolean res; switch (GST_QUERY_TYPE (query)) { default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } return res; @@ -809,13 +811,13 @@ sink_activate_failed: } static gboolean -gst_tee_src_query (GstPad * pad, GstQuery * query) +gst_tee_src_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstTee *tee; gboolean res; GstPad *sinkpad; - tee = GST_TEE (GST_PAD_PARENT (pad)); + tee = GST_TEE (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_SCHEDULING: @@ -847,7 +849,7 @@ gst_tee_src_query (GstPad * pad, GstQuery * query) break; } default: - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; } diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c index 27e73f3..844e962 100644 --- a/plugins/elements/gsttypefindelement.c +++ b/plugins/elements/gsttypefindelement.c @@ -142,7 +142,8 @@ static const GstEventMask *gst_type_find_element_src_event_mask (GstPad * pad); static gboolean gst_type_find_element_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_type_find_handle_src_query (GstPad * pad, GstQuery * query); +static gboolean gst_type_find_handle_src_query (GstPad * pad, + GstObject * parent, GstQuery * query); static gboolean gst_type_find_element_sink_event (GstPad * pad, GstEvent * event); @@ -366,19 +367,15 @@ gst_type_find_element_get_property (GObject * object, guint prop_id, } static gboolean -gst_type_find_handle_src_query (GstPad * pad, GstQuery * query) +gst_type_find_handle_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) { GstTypeFindElement *typefind; gboolean res = FALSE; - GstPad *peer; - typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad)); - - peer = gst_pad_get_peer (typefind->sink); - if (peer == NULL) - return FALSE; + typefind = GST_TYPE_FIND_ELEMENT (parent); - res = gst_pad_query (peer, query); + res = gst_pad_peer_query (typefind->sink, query); if (!res) goto out; @@ -409,7 +406,6 @@ gst_type_find_handle_src_query (GstPad * pad, GstQuery * query) } out: - gst_object_unref (peer); return res; } diff --git a/plugins/elements/gstvalve.c b/plugins/elements/gstvalve.c index 1a04061..7e18792 100644 --- a/plugins/elements/gstvalve.c +++ b/plugins/elements/gstvalve.c @@ -74,7 +74,8 @@ static void gst_valve_get_property (GObject * object, static GstFlowReturn gst_valve_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_valve_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_valve_query (GstPad * pad, GstQuery * query); +static gboolean gst_valve_query (GstPad * pad, GstObject * parent, + GstQuery * query); #define _do_init \ GST_DEBUG_CATEGORY_INIT (valve_debug, "valve", 0, "Valve"); @@ -215,20 +216,20 @@ gst_valve_sink_event (GstPad * pad, GstEvent * event) } static gboolean -gst_valve_query (GstPad * pad, GstQuery * query) +gst_valve_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstValve *valve; gboolean res; GstPad *otherpad; - valve = GST_VALVE (GST_PAD_PARENT (pad)); + valve = GST_VALVE (parent); otherpad = (pad == valve->sinkpad ? valve->srcpad : valve->sinkpad); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS: if (!(res = gst_pad_peer_query (otherpad, query))) - res = gst_pad_query_default (pad, query); + res = gst_pad_query_default (pad, parent, query); break; default: res = gst_pad_peer_query (otherpad, query); diff --git a/tests/check/elements/multiqueue.c b/tests/check/elements/multiqueue.c index 4739004..2d1f543 100644 --- a/tests/check/elements/multiqueue.c +++ b/tests/check/elements/multiqueue.c @@ -290,7 +290,7 @@ GST_START_TEST (test_request_pads_named) GST_END_TEST; static gboolean -mq_dummypad_query (GstPad * sinkpad, GstQuery * query) +mq_dummypad_query (GstPad * sinkpad, GstObject * parent, GstQuery * query) { gboolean res = TRUE; @@ -306,7 +306,7 @@ mq_dummypad_query (GstPad * sinkpad, GstQuery * query) break; } default: - res = gst_pad_query_default (sinkpad, query); + res = gst_pad_query_default (sinkpad, parent, query); break; } return res; -- 2.7.4