mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 07:38:16 +00:00
gst/gstutils.c: Check if the caps of the pads are compatible before returning a pad and claiming it is compatible. Th...
Original commit message from CVS: * gst/gstutils.c: (gst_element_get_compatible_pad): Check if the caps of the pads are compatible before returning a pad and claiming it is compatible. This, among other things, fixes a bug with gst-launch where an incompatible pad is chosen and linking fails. Fixes bug #544003.
This commit is contained in:
parent
4e0529af25
commit
629b2a910b
2 changed files with 37 additions and 14 deletions
|
@ -1,3 +1,11 @@
|
|||
2008-12-09 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
* gst/gstutils.c: (gst_element_get_compatible_pad):
|
||||
Check if the caps of the pads are compatible before returning
|
||||
a pad and claiming it is compatible. This, among other things,
|
||||
fixes a bug with gst-launch where an incompatible pad is chosen
|
||||
and linking fails. Fixes bug #544003.
|
||||
|
||||
2008-12-09 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
* libs/gst/check/gstcheck.c: (gst_check_init):
|
||||
|
|
|
@ -941,8 +941,6 @@ gst_element_get_compatible_pad (GstElement * element, GstPad * pad,
|
|||
GstPad *foundpad = NULL;
|
||||
gboolean done;
|
||||
|
||||
/* FIXME check for caps compatibility */
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
||||
|
||||
|
@ -972,21 +970,38 @@ gst_element_get_compatible_pad (GstElement * element, GstPad * pad,
|
|||
peer = gst_pad_get_peer (current);
|
||||
|
||||
if (peer == NULL && gst_pad_can_link (pad, current)) {
|
||||
GstCaps *temp, *temp2, *intersection;
|
||||
|
||||
/* Now check if the two pads' caps are compatible */
|
||||
temp = gst_pad_get_caps (pad);
|
||||
if (caps) {
|
||||
intersection = gst_caps_intersect (temp, caps);
|
||||
gst_caps_unref (temp);
|
||||
} else {
|
||||
intersection = temp;
|
||||
}
|
||||
|
||||
temp = gst_pad_get_caps (current);
|
||||
temp2 = gst_caps_intersect (temp, intersection);
|
||||
gst_caps_unref (temp);
|
||||
gst_caps_unref (intersection);
|
||||
|
||||
intersection = temp2;
|
||||
|
||||
if (!gst_caps_is_empty (intersection)) {
|
||||
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
|
||||
"found existing unlinked pad %s:%s",
|
||||
"found existing unlinked compatible pad %s:%s",
|
||||
GST_DEBUG_PAD_NAME (current));
|
||||
|
||||
gst_iterator_free (pads);
|
||||
|
||||
return current;
|
||||
} else {
|
||||
}
|
||||
}
|
||||
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unreffing pads");
|
||||
|
||||
gst_object_unref (current);
|
||||
if (peer)
|
||||
gst_object_unref (peer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GST_ITERATOR_DONE:
|
||||
|
@ -1145,8 +1160,8 @@ gst_element_factory_can_src_caps (GstElementFactory * factory,
|
|||
GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
|
||||
|
||||
if (template->direction == GST_PAD_SRC) {
|
||||
if (gst_caps_is_always_compatible (gst_static_caps_get (&template->
|
||||
static_caps), caps))
|
||||
if (gst_caps_is_always_compatible (gst_static_caps_get
|
||||
(&template->static_caps), caps))
|
||||
return TRUE;
|
||||
}
|
||||
templates = g_list_next (templates);
|
||||
|
|
Loading…
Reference in a new issue