mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
Make sure we don't set caps that violate the (app)filter
Original commit message from CVS: Make sure we don't set caps that violate the (app)filter
This commit is contained in:
parent
a58c54c2ee
commit
0539bc2b87
1 changed files with 23 additions and 6 deletions
29
gst/gstpad.c
29
gst/gstpad.c
|
@ -1233,7 +1233,7 @@ gst_pad_get_ghost_pad_list (GstPad *pad)
|
||||||
static GstPadConnectReturn
|
static GstPadConnectReturn
|
||||||
gst_pad_try_set_caps_func (GstRealPad *pad, GstCaps *caps, gboolean notify)
|
gst_pad_try_set_caps_func (GstRealPad *pad, GstCaps *caps, gboolean notify)
|
||||||
{
|
{
|
||||||
GstCaps *oldcaps;
|
GstCaps *oldcaps, *allowed = NULL;
|
||||||
GstPadTemplate *template;
|
GstPadTemplate *template;
|
||||||
GstElement *parent = GST_PAD_PARENT (pad);
|
GstElement *parent = GST_PAD_PARENT (pad);
|
||||||
|
|
||||||
|
@ -1251,16 +1251,33 @@ gst_pad_try_set_caps_func (GstRealPad *pad, GstCaps *caps, gboolean notify)
|
||||||
|
|
||||||
GST_INFO (GST_CAT_CAPS, "trying to set caps %p on pad %s:%s",
|
GST_INFO (GST_CAT_CAPS, "trying to set caps %p on pad %s:%s",
|
||||||
caps, GST_DEBUG_PAD_NAME (pad));
|
caps, GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
|
/* first see if we have to check against a filter */
|
||||||
|
if (!(allowed = GST_RPAD_FILTER (pad))) {
|
||||||
|
/* no filter, make sure we check against the padtemplate then */
|
||||||
|
if ((template = gst_pad_get_pad_template (GST_PAD_CAST (pad)))) {
|
||||||
|
allowed = gst_pad_template_get_caps (template);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((template = gst_pad_get_pad_template (GST_PAD_CAST (pad)))) {
|
/* do we have to check the caps against something? */
|
||||||
if (!gst_caps_intersect (caps, gst_pad_template_get_caps (template))) {
|
if (allowed) {
|
||||||
GST_INFO (GST_CAT_CAPS, "caps did not intersect with %s:%s's padtemplate",
|
GstCaps *intersection;
|
||||||
|
|
||||||
|
/* check against calculated caps */
|
||||||
|
intersection = gst_caps_intersect (caps, allowed);
|
||||||
|
|
||||||
|
/* oops, empty intersection, caps don"t have anything in common */
|
||||||
|
if (!intersection) {
|
||||||
|
GST_INFO (GST_CAT_CAPS, "caps did not intersect with %s:%s's allowed caps",
|
||||||
GST_DEBUG_PAD_NAME (pad));
|
GST_DEBUG_PAD_NAME (pad));
|
||||||
gst_caps_debug (caps, "caps themselves (attemped to set)");
|
gst_caps_debug (caps, "caps themselves (attemped to set)");
|
||||||
gst_caps_debug (gst_pad_template_get_caps (template),
|
gst_caps_debug (allowed,
|
||||||
"pad template caps that did not agree with caps");
|
"allowed caps that did not agree with caps");
|
||||||
return GST_PAD_CONNECT_REFUSED;
|
return GST_PAD_CONNECT_REFUSED;
|
||||||
}
|
}
|
||||||
|
/* caps checks out fine, we can unref the intersection now */
|
||||||
|
gst_caps_unref (intersection);
|
||||||
/* given that the caps are fixed, we know that their intersection with the
|
/* given that the caps are fixed, we know that their intersection with the
|
||||||
* padtemplate caps is the same as caps itself */
|
* padtemplate caps is the same as caps itself */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue