pad: add more queries

Add more query functions to prepare for doing more with queries
This commit is contained in:
Wim Taymans 2011-11-09 11:22:36 +01:00
parent 642a4697fe
commit ac9e5533b5
3 changed files with 67 additions and 26 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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));