mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
Fix a few logic bugs in gst_element_get_compatible_pad_filtered() caused by new pad negotiation. Add some debugging,...
Original commit message from CVS: Fix a few logic bugs in gst_element_get_compatible_pad_filtered() caused by new pad negotiation. Add some debugging, and fix logic bug in gstpad.c.
This commit is contained in:
parent
e73192ddb4
commit
686e3f1805
2 changed files with 33 additions and 21 deletions
|
@ -1442,6 +1442,9 @@ gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad,
|
||||||
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);
|
||||||
|
|
||||||
|
GST_DEBUG ("finding pad in %s compatible with %s:%s",
|
||||||
|
GST_ELEMENT_NAME (element), GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
/* let's use the real pad */
|
/* let's use the real pad */
|
||||||
pad = (GstPad *) GST_PAD_REALIZE (pad);
|
pad = (GstPad *) GST_PAD_REALIZE (pad);
|
||||||
g_return_val_if_fail (pad != NULL, NULL);
|
g_return_val_if_fail (pad != NULL, NULL);
|
||||||
|
@ -1460,30 +1463,37 @@ gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad,
|
||||||
|
|
||||||
/* try to create a new one */
|
/* try to create a new one */
|
||||||
/* requesting is a little crazy, we need a template. Let's create one */
|
/* requesting is a little crazy, we need a template. Let's create one */
|
||||||
|
templcaps = gst_pad_get_caps (pad);
|
||||||
if (filtercaps != NULL) {
|
if (filtercaps != NULL) {
|
||||||
templcaps = gst_caps_intersect (filtercaps, (GstCaps *) GST_RPAD_CAPS (pad));
|
GstCaps *temp;
|
||||||
/* FIXME */
|
temp = gst_caps_intersect (filtercaps, templcaps);
|
||||||
if (templcaps == NULL)
|
gst_caps_free (templcaps);
|
||||||
return NULL;
|
templcaps = temp;
|
||||||
} else {
|
|
||||||
templcaps = gst_caps_copy (gst_pad_get_caps (pad));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad), GST_RPAD_DIRECTION (pad),
|
templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad),
|
||||||
GST_PAD_ALWAYS, templcaps);
|
GST_RPAD_DIRECTION (pad), GST_PAD_ALWAYS, templcaps);
|
||||||
foundpad = gst_element_request_compatible_pad (element, templ);
|
|
||||||
gst_object_unref (GST_OBJECT (templ)); /* this will take care of the caps too */
|
|
||||||
|
|
||||||
/* FIXME: this is broken, but it's in here so autoplugging elements that don't
|
|
||||||
have caps on their source padtemplates (spider) can link... */
|
|
||||||
if (!foundpad && !filtercaps) {
|
|
||||||
templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad), GST_RPAD_DIRECTION (pad),
|
|
||||||
GST_PAD_ALWAYS, gst_caps_new_any());
|
|
||||||
foundpad = gst_element_request_compatible_pad (element, templ);
|
foundpad = gst_element_request_compatible_pad (element, templ);
|
||||||
gst_object_unref (GST_OBJECT (templ));
|
gst_object_unref (GST_OBJECT (templ));
|
||||||
}
|
|
||||||
|
|
||||||
return foundpad;
|
if (foundpad) return foundpad;
|
||||||
|
|
||||||
|
/* FIXME: this is broken, but it's in here so autoplugging elements
|
||||||
|
* that don't have caps on their source padtemplates (spider) can
|
||||||
|
* link... */
|
||||||
|
//g_warning("got here");
|
||||||
|
//if (filtercaps == NULL) {
|
||||||
|
templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad),
|
||||||
|
GST_RPAD_DIRECTION (pad), GST_PAD_ALWAYS, gst_caps_new_any());
|
||||||
|
foundpad = gst_element_request_compatible_pad (element, templ);
|
||||||
|
gst_object_unref (GST_OBJECT (templ));
|
||||||
|
|
||||||
|
if (foundpad) return foundpad;
|
||||||
|
//}
|
||||||
|
|
||||||
|
g_critical("could not find a compatible pad");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
12
gst/gstpad.c
12
gst/gstpad.c
|
@ -1052,11 +1052,14 @@ gst_pad_link_fixate (GstPadLink *link)
|
||||||
g_return_if_fail (caps != NULL);
|
g_return_if_fail (caps != NULL);
|
||||||
g_return_if_fail (!gst_caps_is_empty(caps));
|
g_return_if_fail (!gst_caps_is_empty(caps));
|
||||||
|
|
||||||
|
GST_DEBUG_CAPS ("trying to fixate caps", caps);
|
||||||
|
|
||||||
while (!gst_caps_is_fixed (caps)) {
|
while (!gst_caps_is_fixed (caps)) {
|
||||||
if (link->app_fixate) {
|
if (link->app_fixate) {
|
||||||
newcaps = (link->app_fixate) (GST_PAD (link->srcpad), caps, NULL);
|
newcaps = (link->app_fixate) (GST_PAD (link->srcpad), caps, NULL);
|
||||||
if (newcaps) {
|
if (newcaps) {
|
||||||
caps = newcaps;
|
caps = newcaps;
|
||||||
|
GST_DEBUG_CAPS ("app fixated to", caps);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1065,6 +1068,7 @@ gst_pad_link_fixate (GstPadLink *link)
|
||||||
caps, NULL);
|
caps, NULL);
|
||||||
if (newcaps) {
|
if (newcaps) {
|
||||||
caps = newcaps;
|
caps = newcaps;
|
||||||
|
GST_DEBUG_CAPS ("src pad fixated to", caps);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1073,10 +1077,12 @@ gst_pad_link_fixate (GstPadLink *link)
|
||||||
caps, NULL);
|
caps, NULL);
|
||||||
if (newcaps) {
|
if (newcaps) {
|
||||||
caps = newcaps;
|
caps = newcaps;
|
||||||
|
GST_DEBUG_CAPS ("sink pad fixated to", caps);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
caps = _gst_pad_default_fixate_func (GST_PAD(link->srcpad), caps, NULL);
|
caps = _gst_pad_default_fixate_func (GST_PAD(link->srcpad), caps, NULL);
|
||||||
|
GST_DEBUG_CAPS ("core fixated to", caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG_CAPS ("fixate decided on", caps);
|
GST_DEBUG_CAPS ("fixate decided on", caps);
|
||||||
|
@ -1296,7 +1302,7 @@ gst_pad_can_link_filtered (GstPad *srcpad, GstPad *sinkpad,
|
||||||
GstRealPad *realsrc, *realsink;
|
GstRealPad *realsrc, *realsink;
|
||||||
GstPadLink *link;
|
GstPadLink *link;
|
||||||
|
|
||||||
/* FIXME This function is gosss. It's almost a direct copy of
|
/* FIXME This function is gross. It's almost a direct copy of
|
||||||
* gst_pad_link_filtered(). Any decent programmer would attempt
|
* gst_pad_link_filtered(). Any decent programmer would attempt
|
||||||
* to merge the two functions, which I will do some day. --ds
|
* to merge the two functions, which I will do some day. --ds
|
||||||
*/
|
*/
|
||||||
|
@ -1376,10 +1382,6 @@ gst_pad_can_link_filtered (GstPad *srcpad, GstPad *sinkpad,
|
||||||
link->sinkcaps = gst_pad_get_caps (link->sinkpad);
|
link->sinkcaps = gst_pad_get_caps (link->sinkpad);
|
||||||
if (filtercaps) link->filtercaps = gst_caps_copy (filtercaps);
|
if (filtercaps) link->filtercaps = gst_caps_copy (filtercaps);
|
||||||
|
|
||||||
if (!gst_pad_link_ready_for_negotiation (link)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_pad_link_intersect (link);
|
gst_pad_link_intersect (link);
|
||||||
if (gst_caps_is_empty (link->caps))
|
if (gst_caps_is_empty (link->caps))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in a new issue