diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 2f52c6187c..f93b887ed2 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -142,16 +142,23 @@ gboolean gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) { gboolean res; - GstPad *target; g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); g_return_val_if_fail (GST_IS_QUERY (query), FALSE); - if (!(target = gst_proxy_pad_get_target (pad))) - goto no_target; + switch (GST_QUERY_TYPE (query)) { + default: + { + GstPad *target; - res = gst_pad_query (target, query); - gst_object_unref (target); + if (!(target = gst_proxy_pad_get_target (pad))) + goto no_target; + + res = gst_pad_query (target, query); + gst_object_unref (target); + break; + } + } return res; diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index b9ece3310f..b4729c923b 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -181,6 +181,7 @@ static void gst_selector_pad_reset (GstSelectorPad * pad); static gboolean gst_selector_pad_event (GstPad * pad, GstEvent * event); static GstCaps *gst_selector_pad_getcaps (GstPad * pad, GstCaps * filter); static gboolean gst_selector_pad_acceptcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_selector_pad_query (GstPad * pad, GstQuery * query); static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad); static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf); @@ -491,6 +492,33 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event) return res; } +static gboolean +gst_selector_pad_query (GstPad * pad, GstQuery * query) +{ + gboolean res = FALSE; + GstInputSelector *sel; + GstPad *otherpad; + + sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad)); + if (G_UNLIKELY (sel == NULL)) + return FALSE; + + otherpad = gst_input_selector_get_linked_pad (sel, pad, TRUE); + + switch (GST_QUERY_TYPE (query)) { + default: + if (otherpad) + res = gst_pad_peer_query (otherpad, query); + break; + } + if (otherpad) + gst_object_unref (otherpad); + + gst_object_unref (sel); + + return res; +} + static GstCaps * gst_selector_pad_getcaps (GstPad * pad, GstCaps * filter) { @@ -1126,7 +1154,7 @@ gst_input_selector_event (GstPad * pad, GstEvent * event) static gboolean gst_input_selector_query (GstPad * pad, GstQuery * query) { - gboolean res = TRUE; + gboolean res = FALSE; GstInputSelector *sel; GstPad *otherpad; @@ -1147,9 +1175,6 @@ gst_input_selector_query (GstPad * pad, GstQuery * query) resmax = -1; reslive = FALSE; - /* assume FALSE, we become TRUE if one query succeeds */ - res = FALSE; - /* perform the query on all sinkpads and combine the results. We take the * max of min and the min of max for the result latency. */ GST_INPUT_SELECTOR_LOCK (sel); @@ -1201,6 +1226,7 @@ gst_input_selector_query (GstPad * pad, GstQuery * query) } if (otherpad) gst_object_unref (otherpad); + gst_object_unref (sel); return res; @@ -1299,6 +1325,8 @@ gst_input_selector_request_new_pad (GstElement * element, GST_DEBUG_FUNCPTR (gst_selector_pad_getcaps)); gst_pad_set_acceptcaps_function (sinkpad, GST_DEBUG_FUNCPTR (gst_selector_pad_acceptcaps)); + gst_pad_set_query_function (sinkpad, + GST_DEBUG_FUNCPTR (gst_selector_pad_query)); gst_pad_set_chain_function (sinkpad, GST_DEBUG_FUNCPTR (gst_selector_pad_chain)); gst_pad_set_iterate_internal_links_function (sinkpad, diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index ed5cc70f0b..5ff83767d6 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -1518,6 +1518,21 @@ was_eos: } } +static gboolean +gst_multi_queue_sink_query (GstPad * pad, GstQuery * query) +{ + GstSingleQueue *sq = gst_pad_get_element_private (pad); + gboolean res; + + switch (GST_QUERY_TYPE (query)) { + default: + /* default handling */ + res = gst_pad_peer_query (sq->srcpad, query); + break; + } + return res; +} + static GstCaps * gst_multi_queue_getcaps (GstPad * pad, GstCaps * filter) { @@ -1586,27 +1601,16 @@ static gboolean gst_multi_queue_src_query (GstPad * pad, GstQuery * query) { GstSingleQueue *sq = gst_pad_get_element_private (pad); - GstPad *peerpad; gboolean res; /* FIXME, Handle position offset depending on queue size */ - - /* default handling */ - if (!(peerpad = gst_pad_get_peer (sq->sinkpad))) - goto no_peer; - - res = gst_pad_query (peerpad, query); - - gst_object_unref (peerpad); - - return res; - - /* ERRORS */ -no_peer: - { - GST_LOG_OBJECT (sq->sinkpad, "Couldn't send query because we have no peer"); - return FALSE; + switch (GST_QUERY_TYPE (query)) { + default: + /* default handling */ + res = gst_pad_peer_query (sq->sinkpad, query); + break; } + return res; } /* @@ -1951,6 +1955,8 @@ gst_single_queue_new (GstMultiQueue * mqueue, guint id) GST_DEBUG_FUNCPTR (gst_multi_queue_getcaps)); gst_pad_set_acceptcaps_function (sq->sinkpad, GST_DEBUG_FUNCPTR (gst_multi_queue_acceptcaps)); + gst_pad_set_query_function (sq->sinkpad, + GST_DEBUG_FUNCPTR (gst_multi_queue_sink_query)); gst_pad_set_iterate_internal_links_function (sq->sinkpad, GST_DEBUG_FUNCPTR (gst_multi_queue_iterate_internal_links));