Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
GStreamer
gstreamer
Commits
642a4697
Commit
642a4697
authored
Nov 08, 2011
by
Wim Taymans
Browse files
pad: install query probes
Fire query probes according to updated design doc.
parent
4660beab
Changes
3
Hide whitespace changes
Inline
Side-by-side
docs/design/part-probes.txt
View file @
642a4697
...
...
@@ -243,3 +243,39 @@ If there is a valid DATA item, the DATA probes are called for the item.
| 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 |
| |
gst/gstpad.c
View file @
642a4697
...
...
@@ -1075,8 +1075,8 @@ gst_pad_add_probe (GstPad * pad, GstPadProbeType mask,
/* when no contraints are given for the types, assume all types are
* acceptable */
if
((
mask
&
GST_PAD_PROBE_TYPE_
DATA
_BOTH
)
==
0
)
mask
|=
GST_PAD_PROBE_TYPE_
DATA
_BOTH
;
if
((
mask
&
GST_PAD_PROBE_TYPE_
ALL
_BOTH
)
==
0
)
mask
|=
GST_PAD_PROBE_TYPE_
ALL
_BOTH
;
if
((
mask
&
GST_PAD_PROBE_TYPE_SCHEDULING
)
==
0
)
mask
|=
GST_PAD_PROBE_TYPE_SCHEDULING
;
...
...
@@ -3178,104 +3178,6 @@ gst_pad_event_default (GstPad * pad, GstEvent * event)
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:
* @pad: a #GstPad to call the default query handler on.
...
...
@@ -3343,7 +3245,7 @@ probe_hook_marshal (GHook * hook, ProbeMarshall * data)
type
=
info
->
type
;
/* 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
;
/* one of the scheduling types */
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
*/
...
...
@@ -4701,6 +4760,8 @@ update_failed:
}
}
/**
* gst_pad_set_element_private:
* @pad: the #GstPad to set the private data of.
...
...
gst/gstpad.h
View file @
642a4697
...
...
@@ -511,6 +511,10 @@ typedef enum
GST_PAD_PROBE_TYPE_DATA_UPSTREAM)
#define GST_PAD_PROBE_TYPE_EVENT_BOTH (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | \
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)
/**
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment