mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
gst/elements/: Use gst_pad_proxy_getcaps().
Original commit message from CVS: * gst/elements/gstaggregator.c: * gst/elements/gsttee.c: Use gst_pad_proxy_getcaps(). * gst/gstpad.c: * gst/gstpad.h: Add gst_pad_proxy_getcaps(), which filter elements can use as a generic getcaps implementation. Fix gst_pad_get_allowed_caps(). It just wasn't doing what was advertised.
This commit is contained in:
parent
91954ff66b
commit
778c24a58a
7 changed files with 73 additions and 83 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2003-12-23 David Schleef <ds@schleef.org>
|
||||||
|
|
||||||
|
* gst/elements/gstaggregator.c:
|
||||||
|
* gst/elements/gsttee.c:
|
||||||
|
Use gst_pad_proxy_getcaps().
|
||||||
|
* gst/gstpad.c:
|
||||||
|
* gst/gstpad.h:
|
||||||
|
Add gst_pad_proxy_getcaps(), which filter elements can use
|
||||||
|
as a generic getcaps implementation.
|
||||||
|
Fix gst_pad_get_allowed_caps(). It just wasn't doing what
|
||||||
|
was advertised.
|
||||||
|
|
||||||
2003-12-23 David Schleef <ds@schleef.org>
|
2003-12-23 David Schleef <ds@schleef.org>
|
||||||
|
|
||||||
* gst/gstpad.c:
|
* gst/gstpad.c:
|
||||||
|
|
|
@ -162,6 +162,7 @@ static void
|
||||||
gst_aggregator_init (GstAggregator *aggregator)
|
gst_aggregator_init (GstAggregator *aggregator)
|
||||||
{
|
{
|
||||||
aggregator->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
aggregator->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||||
|
gst_pad_set_getcaps_function (aggregator->srcpad, gst_pad_proxy_getcaps);
|
||||||
gst_element_add_pad (GST_ELEMENT (aggregator), aggregator->srcpad);
|
gst_element_add_pad (GST_ELEMENT (aggregator), aggregator->srcpad);
|
||||||
|
|
||||||
aggregator->numsinkpads = 0;
|
aggregator->numsinkpads = 0;
|
||||||
|
@ -196,6 +197,7 @@ gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, cons
|
||||||
if (!AGGREGATOR_IS_LOOP_BASED (aggregator)) {
|
if (!AGGREGATOR_IS_LOOP_BASED (aggregator)) {
|
||||||
gst_pad_set_chain_function (sinkpad, gst_aggregator_chain);
|
gst_pad_set_chain_function (sinkpad, gst_aggregator_chain);
|
||||||
}
|
}
|
||||||
|
gst_pad_set_getcaps_function (sinkpad, gst_pad_proxy_getcaps);
|
||||||
gst_element_add_pad (GST_ELEMENT (aggregator), sinkpad);
|
gst_element_add_pad (GST_ELEMENT (aggregator), sinkpad);
|
||||||
|
|
||||||
aggregator->sinkpads = g_list_prepend (aggregator->sinkpads, sinkpad);
|
aggregator->sinkpads = g_list_prepend (aggregator->sinkpads, sinkpad);
|
||||||
|
|
|
@ -181,41 +181,6 @@ gst_tee_srclink (GstPad *pad, const GstCaps *caps)
|
||||||
return gst_pad_proxy_link (tee->sinkpad, caps);
|
return gst_pad_proxy_link (tee->sinkpad, caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps*
|
|
||||||
gst_tee_getcaps (GstPad *pad)
|
|
||||||
{
|
|
||||||
GstCaps *caps = GST_CAPS_ANY;
|
|
||||||
GstTee *tee;
|
|
||||||
const GList *pads;
|
|
||||||
|
|
||||||
GST_DEBUG ( "gst_tee_getcaps");
|
|
||||||
|
|
||||||
tee = GST_TEE (gst_pad_get_parent (pad));
|
|
||||||
|
|
||||||
pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
|
||||||
|
|
||||||
while (pads) {
|
|
||||||
GstPad *srcpad = GST_PAD (pads->data);
|
|
||||||
GstPad *peer;
|
|
||||||
const GstCaps *peercaps;
|
|
||||||
GstCaps *newcaps;
|
|
||||||
|
|
||||||
pads = g_list_next (pads);
|
|
||||||
|
|
||||||
peer = gst_pad_get_peer(srcpad);
|
|
||||||
if(!peer){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
peercaps = gst_pad_get_caps (peer);
|
|
||||||
newcaps = gst_caps_intersect (caps, peercaps);
|
|
||||||
gst_caps_free (caps);
|
|
||||||
caps = newcaps;
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_tee_init (GstTee *tee)
|
gst_tee_init (GstTee *tee)
|
||||||
{
|
{
|
||||||
|
@ -223,7 +188,7 @@ gst_tee_init (GstTee *tee)
|
||||||
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
||||||
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
||||||
gst_pad_set_link_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_sinklink));
|
gst_pad_set_link_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_sinklink));
|
||||||
gst_pad_set_getcaps_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
gst_pad_set_getcaps_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||||
|
|
||||||
tee->silent = FALSE;
|
tee->silent = FALSE;
|
||||||
tee->last_message = NULL;
|
tee->last_message = NULL;
|
||||||
|
@ -282,7 +247,7 @@ gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar
|
||||||
srcpad = gst_pad_new_from_template (templ, name);
|
srcpad = gst_pad_new_from_template (templ, name);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_srclink));
|
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_srclink));
|
||||||
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||||
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
||||||
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
||||||
|
|
||||||
|
|
61
gst/gstpad.c
61
gst/gstpad.c
|
@ -1739,6 +1739,47 @@ gst_pad_relink_filtered (GstPad *srcpad, GstPad *sinkpad,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_pad_proxy_getcaps:
|
||||||
|
* @pad: a #GstPad to proxy.
|
||||||
|
*
|
||||||
|
* Calls gst_pad_get_allowed_caps() for every other pad belonging to the
|
||||||
|
* same element as @pad, and returns the intersection of the results.
|
||||||
|
*
|
||||||
|
* This function is useful as a default getcaps function for an element
|
||||||
|
* that can handle any stream format, but requires all its pads to have
|
||||||
|
* the same caps. Two such elements are tee and aggregator.
|
||||||
|
*
|
||||||
|
* Returns: the intersection of the other pads' allowed caps.
|
||||||
|
*/
|
||||||
|
GstCaps *
|
||||||
|
gst_pad_proxy_getcaps (GstPad *pad)
|
||||||
|
{
|
||||||
|
GstElement *element;
|
||||||
|
const GList *pads;
|
||||||
|
GstCaps *caps;
|
||||||
|
|
||||||
|
element = gst_pad_get_parent (pad);
|
||||||
|
|
||||||
|
pads = gst_element_get_pad_list (element);
|
||||||
|
|
||||||
|
caps = gst_caps_new_any ();
|
||||||
|
while (pads) {
|
||||||
|
GstPad *otherpad = GST_PAD (pads->data);
|
||||||
|
GstCaps *temp;
|
||||||
|
|
||||||
|
if (otherpad != pad) {
|
||||||
|
temp = gst_caps_intersect (caps, gst_pad_get_allowed_caps (pad));
|
||||||
|
gst_caps_free (caps);
|
||||||
|
caps = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
pads = g_list_next (pads);
|
||||||
|
}
|
||||||
|
|
||||||
|
return caps;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_pad_proxy_link:
|
* gst_pad_proxy_link:
|
||||||
* @pad: a #GstPad to proxy to.
|
* @pad: a #GstPad to proxy to.
|
||||||
|
@ -1928,10 +1969,11 @@ GstCaps*
|
||||||
gst_pad_get_allowed_caps (GstPad *pad)
|
gst_pad_get_allowed_caps (GstPad *pad)
|
||||||
{
|
{
|
||||||
GstRealPad *realpad;
|
GstRealPad *realpad;
|
||||||
GstCaps *mycaps;
|
const GstCaps *mycaps;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstCaps *filtercaps;
|
|
||||||
GstCaps *peercaps;
|
GstCaps *peercaps;
|
||||||
|
GstCaps *icaps;
|
||||||
|
GstPadLink *link;
|
||||||
|
|
||||||
g_return_val_if_fail (pad != NULL, NULL);
|
g_return_val_if_fail (pad != NULL, NULL);
|
||||||
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
||||||
|
@ -1941,21 +1983,22 @@ gst_pad_get_allowed_caps (GstPad *pad)
|
||||||
GST_CAT_DEBUG (GST_CAT_PROPERTIES, "get allowed caps of %s:%s",
|
GST_CAT_DEBUG (GST_CAT_PROPERTIES, "get allowed caps of %s:%s",
|
||||||
GST_DEBUG_PAD_NAME (pad));
|
GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
mycaps = gst_pad_get_caps (pad);
|
mycaps = gst_pad_get_pad_template_caps (pad);
|
||||||
if (GST_RPAD_PEER (realpad) == NULL) {
|
if (GST_RPAD_PEER (realpad) == NULL) {
|
||||||
return mycaps;
|
return gst_caps_copy (mycaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
peercaps = gst_pad_get_caps (GST_PAD_PEER (realpad));
|
peercaps = gst_pad_get_caps (GST_PAD_PEER (realpad));
|
||||||
caps = gst_caps_intersect (mycaps, peercaps);
|
caps = gst_caps_intersect (mycaps, peercaps);
|
||||||
gst_caps_free (mycaps);
|
|
||||||
gst_caps_free (peercaps);
|
gst_caps_free (peercaps);
|
||||||
|
|
||||||
filtercaps = GST_RPAD_APPFILTER (realpad);
|
link = GST_RPAD_LINK (realpad);
|
||||||
if (filtercaps) {
|
if (link->filtercaps) {
|
||||||
return gst_caps_intersect (caps, filtercaps);
|
icaps = gst_caps_intersect (caps, link->filtercaps);
|
||||||
|
gst_caps_free (caps);
|
||||||
|
return icaps;
|
||||||
} else {
|
} else {
|
||||||
return gst_caps_copy (caps);
|
return caps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -408,6 +408,7 @@ gboolean gst_pad_check_compatibility (GstPad *srcpad, GstPad *sinkpad);
|
||||||
|
|
||||||
void gst_pad_set_getcaps_function (GstPad *pad, GstPadGetCapsFunction getcaps);
|
void gst_pad_set_getcaps_function (GstPad *pad, GstPadGetCapsFunction getcaps);
|
||||||
void gst_pad_set_fixate_function (GstPad *pad, GstPadFixateFunction fixate);
|
void gst_pad_set_fixate_function (GstPad *pad, GstPadFixateFunction fixate);
|
||||||
|
GstCaps * gst_pad_proxy_getcaps (GstPad *pad);
|
||||||
GstPadLinkReturn gst_pad_proxy_link (GstPad *pad, const GstCaps *caps);
|
GstPadLinkReturn gst_pad_proxy_link (GstPad *pad, const GstCaps *caps);
|
||||||
gboolean gst_pad_relink_filtered (GstPad *srcpad, GstPad *sinkpad, const GstCaps *filtercaps);
|
gboolean gst_pad_relink_filtered (GstPad *srcpad, GstPad *sinkpad, const GstCaps *filtercaps);
|
||||||
gboolean gst_pad_perform_negotiate (GstPad *srcpad, GstPad *sinkpad);
|
gboolean gst_pad_perform_negotiate (GstPad *srcpad, GstPad *sinkpad);
|
||||||
|
|
|
@ -162,6 +162,7 @@ static void
|
||||||
gst_aggregator_init (GstAggregator *aggregator)
|
gst_aggregator_init (GstAggregator *aggregator)
|
||||||
{
|
{
|
||||||
aggregator->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
aggregator->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||||
|
gst_pad_set_getcaps_function (aggregator->srcpad, gst_pad_proxy_getcaps);
|
||||||
gst_element_add_pad (GST_ELEMENT (aggregator), aggregator->srcpad);
|
gst_element_add_pad (GST_ELEMENT (aggregator), aggregator->srcpad);
|
||||||
|
|
||||||
aggregator->numsinkpads = 0;
|
aggregator->numsinkpads = 0;
|
||||||
|
@ -196,6 +197,7 @@ gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, cons
|
||||||
if (!AGGREGATOR_IS_LOOP_BASED (aggregator)) {
|
if (!AGGREGATOR_IS_LOOP_BASED (aggregator)) {
|
||||||
gst_pad_set_chain_function (sinkpad, gst_aggregator_chain);
|
gst_pad_set_chain_function (sinkpad, gst_aggregator_chain);
|
||||||
}
|
}
|
||||||
|
gst_pad_set_getcaps_function (sinkpad, gst_pad_proxy_getcaps);
|
||||||
gst_element_add_pad (GST_ELEMENT (aggregator), sinkpad);
|
gst_element_add_pad (GST_ELEMENT (aggregator), sinkpad);
|
||||||
|
|
||||||
aggregator->sinkpads = g_list_prepend (aggregator->sinkpads, sinkpad);
|
aggregator->sinkpads = g_list_prepend (aggregator->sinkpads, sinkpad);
|
||||||
|
|
|
@ -181,41 +181,6 @@ gst_tee_srclink (GstPad *pad, const GstCaps *caps)
|
||||||
return gst_pad_proxy_link (tee->sinkpad, caps);
|
return gst_pad_proxy_link (tee->sinkpad, caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps*
|
|
||||||
gst_tee_getcaps (GstPad *pad)
|
|
||||||
{
|
|
||||||
GstCaps *caps = GST_CAPS_ANY;
|
|
||||||
GstTee *tee;
|
|
||||||
const GList *pads;
|
|
||||||
|
|
||||||
GST_DEBUG ( "gst_tee_getcaps");
|
|
||||||
|
|
||||||
tee = GST_TEE (gst_pad_get_parent (pad));
|
|
||||||
|
|
||||||
pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
|
||||||
|
|
||||||
while (pads) {
|
|
||||||
GstPad *srcpad = GST_PAD (pads->data);
|
|
||||||
GstPad *peer;
|
|
||||||
const GstCaps *peercaps;
|
|
||||||
GstCaps *newcaps;
|
|
||||||
|
|
||||||
pads = g_list_next (pads);
|
|
||||||
|
|
||||||
peer = gst_pad_get_peer(srcpad);
|
|
||||||
if(!peer){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
peercaps = gst_pad_get_caps (peer);
|
|
||||||
newcaps = gst_caps_intersect (caps, peercaps);
|
|
||||||
gst_caps_free (caps);
|
|
||||||
caps = newcaps;
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_tee_init (GstTee *tee)
|
gst_tee_init (GstTee *tee)
|
||||||
{
|
{
|
||||||
|
@ -223,7 +188,7 @@ gst_tee_init (GstTee *tee)
|
||||||
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
||||||
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
||||||
gst_pad_set_link_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_sinklink));
|
gst_pad_set_link_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_sinklink));
|
||||||
gst_pad_set_getcaps_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
gst_pad_set_getcaps_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||||
|
|
||||||
tee->silent = FALSE;
|
tee->silent = FALSE;
|
||||||
tee->last_message = NULL;
|
tee->last_message = NULL;
|
||||||
|
@ -282,7 +247,7 @@ gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar
|
||||||
srcpad = gst_pad_new_from_template (templ, name);
|
srcpad = gst_pad_new_from_template (templ, name);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_srclink));
|
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_srclink));
|
||||||
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||||
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
||||||
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue