mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-20 07:16:55 +00:00
pad: install query probes
Fire query probes according to updated design doc.
This commit is contained in:
parent
4660beaba8
commit
642a4697fe
3 changed files with 202 additions and 101 deletions
|
@ -243,3 +243,39 @@ If there is a valid DATA item, the DATA probes are called for the item.
|
||||||
| O - - - - - - - - - - >
|
| O - - - - - - - - - - >
|
||||||
| |
|
| |
|
||||||
|
|
||||||
|
|
||||||
|
Queries
|
||||||
|
-------
|
||||||
|
|
||||||
|
Query probes have the GST_PAD_PROBE_TYPE_QUERY_* flag set in the callbacks.
|
||||||
|
|
||||||
|
|
||||||
|
pad peerpad
|
||||||
|
| |
|
||||||
|
gst_pad_peer_query() | |
|
||||||
|
-------------------->O |
|
||||||
|
O |
|
||||||
|
O-> do BLOCK probes |
|
||||||
|
O |
|
||||||
|
O-> do QUERY | PUSH probes |
|
||||||
|
no peer? O |
|
||||||
|
FALSE O |
|
||||||
|
< - - - - - - O |
|
||||||
|
O gst_pad_query() |
|
||||||
|
O------------------------------>O
|
||||||
|
O O-> do BLOCK probes
|
||||||
|
O O
|
||||||
|
O O-> do QUERY | PUSH probes
|
||||||
|
O O
|
||||||
|
O O---> queryfunc
|
||||||
|
O error O
|
||||||
|
<- - - - - - - - - - - - - - - - - - - - - - -O
|
||||||
|
O O
|
||||||
|
O O-> do QUERY | PULL probes
|
||||||
|
O< - - - - - - - - - - - - - - -O
|
||||||
|
O |
|
||||||
|
O-> do QUERY | PULL probes |
|
||||||
|
O |
|
||||||
|
< - - - - - - O |
|
||||||
|
| |
|
||||||
|
|
||||||
|
|
263
gst/gstpad.c
263
gst/gstpad.c
|
@ -1075,8 +1075,8 @@ gst_pad_add_probe (GstPad * pad, GstPadProbeType mask,
|
||||||
|
|
||||||
/* when no contraints are given for the types, assume all types are
|
/* when no contraints are given for the types, assume all types are
|
||||||
* acceptable */
|
* acceptable */
|
||||||
if ((mask & GST_PAD_PROBE_TYPE_DATA_BOTH) == 0)
|
if ((mask & GST_PAD_PROBE_TYPE_ALL_BOTH) == 0)
|
||||||
mask |= GST_PAD_PROBE_TYPE_DATA_BOTH;
|
mask |= GST_PAD_PROBE_TYPE_ALL_BOTH;
|
||||||
if ((mask & GST_PAD_PROBE_TYPE_SCHEDULING) == 0)
|
if ((mask & GST_PAD_PROBE_TYPE_SCHEDULING) == 0)
|
||||||
mask |= GST_PAD_PROBE_TYPE_SCHEDULING;
|
mask |= GST_PAD_PROBE_TYPE_SCHEDULING;
|
||||||
|
|
||||||
|
@ -3178,104 +3178,6 @@ gst_pad_event_default (GstPad * pad, GstEvent * event)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_pad_query:
|
|
||||||
* @pad: a #GstPad to invoke the default query on.
|
|
||||||
* @query: (transfer none): the #GstQuery to perform.
|
|
||||||
*
|
|
||||||
* Dispatches a query to a pad. The query should have been allocated by the
|
|
||||||
* caller via one of the type-specific allocation functions. The element that
|
|
||||||
* the pad belongs to is responsible for filling the query with an appropriate
|
|
||||||
* response, which should then be parsed with a type-specific query parsing
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* Again, the caller is responsible for both the allocation and deallocation of
|
|
||||||
* the query structure.
|
|
||||||
*
|
|
||||||
* Please also note that some queries might need a running pipeline to work.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the query could be performed.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_pad_query (GstPad * pad, GstQuery * query)
|
|
||||||
{
|
|
||||||
gboolean res;
|
|
||||||
GstPadQueryFunction func;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
||||||
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "sending query %p (%s)", query,
|
|
||||||
GST_QUERY_TYPE_NAME (query));
|
|
||||||
|
|
||||||
if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
|
|
||||||
goto no_func;
|
|
||||||
|
|
||||||
res = func (pad, query);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
|
|
||||||
GST_QUERY_TYPE_NAME (query), res);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
|
|
||||||
no_func:
|
|
||||||
{
|
|
||||||
GST_DEBUG_OBJECT (pad, "had no query function");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_pad_peer_query:
|
|
||||||
* @pad: a #GstPad to invoke the peer query on.
|
|
||||||
* @query: (transfer none): the #GstQuery to perform.
|
|
||||||
*
|
|
||||||
* Performs gst_pad_query() on the peer of @pad.
|
|
||||||
*
|
|
||||||
* The caller is responsible for both the allocation and deallocation of
|
|
||||||
* the query structure.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the query could be performed. This function returns %FALSE
|
|
||||||
* if @pad has no peer.
|
|
||||||
*
|
|
||||||
* Since: 0.10.15
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_pad_peer_query (GstPad * pad, GstQuery * query)
|
|
||||||
{
|
|
||||||
GstPad *peerpad;
|
|
||||||
gboolean result;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
||||||
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
|
||||||
|
|
||||||
GST_OBJECT_LOCK (pad);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "peer query %p (%s)", query,
|
|
||||||
GST_QUERY_TYPE_NAME (query));
|
|
||||||
|
|
||||||
peerpad = GST_PAD_PEER (pad);
|
|
||||||
if (G_UNLIKELY (peerpad == NULL))
|
|
||||||
goto no_peer;
|
|
||||||
|
|
||||||
gst_object_ref (peerpad);
|
|
||||||
GST_OBJECT_UNLOCK (pad);
|
|
||||||
|
|
||||||
result = gst_pad_query (peerpad, query);
|
|
||||||
|
|
||||||
gst_object_unref (peerpad);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
|
|
||||||
/* ERRORS */
|
|
||||||
no_peer:
|
|
||||||
{
|
|
||||||
GST_WARNING_OBJECT (pad, "pad has no peer");
|
|
||||||
GST_OBJECT_UNLOCK (pad);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_pad_query_default:
|
* gst_pad_query_default:
|
||||||
* @pad: a #GstPad to call the default query handler on.
|
* @pad: a #GstPad to call the default query handler on.
|
||||||
|
@ -3343,7 +3245,7 @@ probe_hook_marshal (GHook * hook, ProbeMarshall * data)
|
||||||
type = info->type;
|
type = info->type;
|
||||||
|
|
||||||
/* one of the data types */
|
/* one of the data types */
|
||||||
if ((flags & GST_PAD_PROBE_TYPE_DATA_BOTH & type) == 0)
|
if ((flags & GST_PAD_PROBE_TYPE_ALL_BOTH & type) == 0)
|
||||||
goto no_match;
|
goto no_match;
|
||||||
/* one of the scheduling types */
|
/* one of the scheduling types */
|
||||||
if ((flags & GST_PAD_PROBE_TYPE_SCHEDULING & type) == 0)
|
if ((flags & GST_PAD_PROBE_TYPE_SCHEDULING & type) == 0)
|
||||||
|
@ -3628,6 +3530,163 @@ done:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_query:
|
||||||
|
* @pad: a #GstPad to invoke the default query on.
|
||||||
|
* @query: (transfer none): the #GstQuery to perform.
|
||||||
|
*
|
||||||
|
* Dispatches a query to a pad. The query should have been allocated by the
|
||||||
|
* caller via one of the type-specific allocation functions. The element that
|
||||||
|
* the pad belongs to is responsible for filling the query with an appropriate
|
||||||
|
* response, which should then be parsed with a type-specific query parsing
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* Again, the caller is responsible for both the allocation and deallocation of
|
||||||
|
* the query structure.
|
||||||
|
*
|
||||||
|
* Please also note that some queries might need a running pipeline to work.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the query could be performed.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_pad_query (GstPad * pad, GstQuery * query)
|
||||||
|
{
|
||||||
|
gboolean res;
|
||||||
|
GstPadQueryFunction func;
|
||||||
|
GstPadProbeType type;
|
||||||
|
GstFlowReturn ret;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
||||||
|
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "sending query %p (%s)", query,
|
||||||
|
GST_QUERY_TYPE_NAME (query));
|
||||||
|
|
||||||
|
if (GST_PAD_IS_SRC (pad))
|
||||||
|
type = GST_PAD_PROBE_TYPE_QUERY_UPSTREAM;
|
||||||
|
else
|
||||||
|
type = GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (pad);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH |
|
||||||
|
GST_PAD_PROBE_TYPE_BLOCK, query, probe_stopped);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, query, probe_stopped);
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
|
if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
|
||||||
|
goto no_func;
|
||||||
|
|
||||||
|
res = func (pad, query);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
|
||||||
|
GST_QUERY_TYPE_NAME (query), res);
|
||||||
|
|
||||||
|
if (res != TRUE)
|
||||||
|
goto query_failed;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (pad);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PULL, query, probe_stopped);
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
|
||||||
|
no_func:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (pad, "had no query function");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
query_failed:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (pad, "query failed");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
probe_stopped:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (pad, "probe stopped: %s", gst_flow_get_name (ret));
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_peer_query:
|
||||||
|
* @pad: a #GstPad to invoke the peer query on.
|
||||||
|
* @query: (transfer none): the #GstQuery to perform.
|
||||||
|
*
|
||||||
|
* Performs gst_pad_query() on the peer of @pad.
|
||||||
|
*
|
||||||
|
* The caller is responsible for both the allocation and deallocation of
|
||||||
|
* the query structure.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the query could be performed. This function returns %FALSE
|
||||||
|
* if @pad has no peer.
|
||||||
|
*
|
||||||
|
* Since: 0.10.15
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_pad_peer_query (GstPad * pad, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstPad *peerpad;
|
||||||
|
GstPadProbeType type;
|
||||||
|
gboolean res;
|
||||||
|
GstFlowReturn ret;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
||||||
|
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
||||||
|
|
||||||
|
if (GST_PAD_IS_SRC (pad))
|
||||||
|
type = GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM;
|
||||||
|
else
|
||||||
|
type = GST_PAD_PROBE_TYPE_QUERY_UPSTREAM;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "peer query %p (%s)", query,
|
||||||
|
GST_QUERY_TYPE_NAME (query));
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (pad);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH |
|
||||||
|
GST_PAD_PROBE_TYPE_BLOCK, query, probe_stopped);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, query, probe_stopped);
|
||||||
|
|
||||||
|
peerpad = GST_PAD_PEER (pad);
|
||||||
|
if (G_UNLIKELY (peerpad == NULL))
|
||||||
|
goto no_peer;
|
||||||
|
|
||||||
|
gst_object_ref (peerpad);
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
|
res = gst_pad_query (peerpad, query);
|
||||||
|
|
||||||
|
gst_object_unref (peerpad);
|
||||||
|
|
||||||
|
if (res != TRUE)
|
||||||
|
goto query_failed;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (pad);
|
||||||
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PULL, query, probe_stopped);
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
no_peer:
|
||||||
|
{
|
||||||
|
GST_WARNING_OBJECT (pad, "pad has no peer");
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
query_failed:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (pad, "query failed");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
probe_stopped:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (pad, "probe stopped: %s", gst_flow_get_name (ret));
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Data passing functions
|
* Data passing functions
|
||||||
*/
|
*/
|
||||||
|
@ -4701,6 +4760,8 @@ update_failed:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_pad_set_element_private:
|
* gst_pad_set_element_private:
|
||||||
* @pad: the #GstPad to set the private data of.
|
* @pad: the #GstPad to set the private data of.
|
||||||
|
|
|
@ -511,6 +511,10 @@ typedef enum
|
||||||
GST_PAD_PROBE_TYPE_DATA_UPSTREAM)
|
GST_PAD_PROBE_TYPE_DATA_UPSTREAM)
|
||||||
#define GST_PAD_PROBE_TYPE_EVENT_BOTH (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | \
|
#define GST_PAD_PROBE_TYPE_EVENT_BOTH (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | \
|
||||||
GST_PAD_PROBE_TYPE_EVENT_UPSTREAM)
|
GST_PAD_PROBE_TYPE_EVENT_UPSTREAM)
|
||||||
|
#define GST_PAD_PROBE_TYPE_QUERY_BOTH (GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM | \
|
||||||
|
GST_PAD_PROBE_TYPE_QUERY_UPSTREAM)
|
||||||
|
#define GST_PAD_PROBE_TYPE_ALL_BOTH (GST_PAD_PROBE_TYPE_DATA_BOTH | \
|
||||||
|
GST_PAD_PROBE_TYPE_QUERY_BOTH)
|
||||||
#define GST_PAD_PROBE_TYPE_SCHEDULING (GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_PULL)
|
#define GST_PAD_PROBE_TYPE_SCHEDULING (GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_PULL)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue