gst/gstpad.c: refuse to link if the link is not possible

Original commit message from CVS:
* gst/gstpad.c: (gst_pad_link_negotiate):
refuse to link if the link is not possible
* configure.ac:
* testsuite/Makefile.am:
* testsuite/negotiation/.cvsignore:
* testsuite/negotiation/Makefile.am:
* testsuite/negotiation/pad_link.c: (main):
add test that checks the above behaviour
This commit is contained in:
Benjamin Otte 2004-04-21 19:12:51 +00:00
parent 4d0762842a
commit a3cb86522a
11 changed files with 108 additions and 8 deletions

View file

@ -1,3 +1,14 @@
2004-04-21 Benjamin Otte <in7y118@public.uni-hamburg.de>
* gst/gstpad.c: (gst_pad_link_negotiate):
refuse to link if the link is not possible
* configure.ac:
* testsuite/Makefile.am:
* testsuite/negotiation/.cvsignore:
* testsuite/negotiation/Makefile.am:
* testsuite/negotiation/pad_link.c: (main):
add test that checks the above behaviour
2004-04-21 Thomas Vander Stichele <thomas at apestaart dot org> 2004-04-21 Thomas Vander Stichele <thomas at apestaart dot org>
* docs/gst/gstreamer-sections.txt: * docs/gst/gstreamer-sections.txt:

View file

@ -662,6 +662,7 @@ testsuite/dynparams/Makefile
testsuite/elements/Makefile testsuite/elements/Makefile
testsuite/ghostpads/Makefile testsuite/ghostpads/Makefile
testsuite/indexers/Makefile testsuite/indexers/Makefile
testsuite/negotiation/Makefile
testsuite/parse/Makefile testsuite/parse/Makefile
testsuite/plugin/Makefile testsuite/plugin/Makefile
testsuite/refcounting/Makefile testsuite/refcounting/Makefile

View file

@ -1308,10 +1308,6 @@ gst_pad_link_negotiate (GstPadLink * link)
GST_DEBUG ("negotiating link from pad %s:%s to pad %s:%s", GST_DEBUG ("negotiating link from pad %s:%s to pad %s:%s",
GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad)); GST_DEBUG_PAD_NAME (link->srcpad), GST_DEBUG_PAD_NAME (link->sinkpad));
if (!gst_pad_link_ready_for_negotiation (link)) {
return GST_PAD_LINK_DELAYED;
}
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 GST_PAD_LINK_REFUSED; return GST_PAD_LINK_REFUSED;
@ -1320,6 +1316,10 @@ gst_pad_link_negotiate (GstPadLink * link)
if (gst_caps_is_empty (link->caps)) if (gst_caps_is_empty (link->caps))
return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_REFUSED;
if (!gst_pad_link_ready_for_negotiation (link)) {
return GST_PAD_LINK_DELAYED;
}
return gst_pad_link_call_link_functions (link); return gst_pad_link_call_link_functions (link);
} }

View file

@ -16,11 +16,11 @@ endif
SUBDIRS = bins bytestream cleanup dynparams ghostpads \ SUBDIRS = bins bytestream cleanup dynparams ghostpads \
caps plugin elements clock refcounting tags threads \ caps plugin elements clock refcounting tags threads \
indexers debug $(GST_PARSE_DIRS) $(GST_DEBUG_DIRS) \ indexers debug $(GST_PARSE_DIRS) $(GST_DEBUG_DIRS) \
dlopen dlopen negotiation
DIST_SUBDIRS = bins bytestream caps cleanup clock dynparams elements indexers \ DIST_SUBDIRS = bins bytestream caps cleanup clock dynparams elements indexers \
plugin refcounting tags threads parse debug ghostpads \ plugin refcounting tags threads parse debug ghostpads \
dlopen dlopen negotiation
tests_pass = test_gst_init tests_pass = test_gst_init
tests_fail = tests_fail =

View file

@ -0,0 +1,2 @@
pad_link

View file

@ -0,0 +1,7 @@
include ../Rules
tests_pass = pad_link
tests_fail =
tests_ignore =

View file

@ -0,0 +1,35 @@
#include <gst/gst.h>
/* this test checks that gst_pad_link takes into account all available
* information when trying to link two pads.
* Because identity proxies caps, the caps in the first and second link
* must be compatible for this pipeline to work.
* Since they are not, the second linkig attempt should fail.
*/
gint
main (int argc, gchar ** argv)
{
GstElement *src, *identity, *sink;
GstCaps *one, *two;
gst_init (&argc, &argv);
/* create incompatible caps */
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
identity = gst_element_factory_make ("identity", NULL);
g_assert (identity);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
one = gst_caps_from_string ("some/mime");
two = gst_caps_from_string ("other/mime");
g_assert (GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(src, "src"), gst_element_get_pad (identity, "sink"), one)));
g_assert (!GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(identity, "src"), gst_element_get_pad (sink, "sink"), two)));
return 0;
}

View file

@ -16,11 +16,11 @@ endif
SUBDIRS = bins bytestream cleanup dynparams ghostpads \ SUBDIRS = bins bytestream cleanup dynparams ghostpads \
caps plugin elements clock refcounting tags threads \ caps plugin elements clock refcounting tags threads \
indexers debug $(GST_PARSE_DIRS) $(GST_DEBUG_DIRS) \ indexers debug $(GST_PARSE_DIRS) $(GST_DEBUG_DIRS) \
dlopen dlopen negotiation
DIST_SUBDIRS = bins bytestream caps cleanup clock dynparams elements indexers \ DIST_SUBDIRS = bins bytestream caps cleanup clock dynparams elements indexers \
plugin refcounting tags threads parse debug ghostpads \ plugin refcounting tags threads parse debug ghostpads \
dlopen dlopen negotiation
tests_pass = test_gst_init tests_pass = test_gst_init
tests_fail = tests_fail =

2
testsuite/negotiation/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
pad_link

View file

@ -0,0 +1,7 @@
include ../Rules
tests_pass = pad_link
tests_fail =
tests_ignore =

View file

@ -0,0 +1,35 @@
#include <gst/gst.h>
/* this test checks that gst_pad_link takes into account all available
* information when trying to link two pads.
* Because identity proxies caps, the caps in the first and second link
* must be compatible for this pipeline to work.
* Since they are not, the second linkig attempt should fail.
*/
gint
main (int argc, gchar ** argv)
{
GstElement *src, *identity, *sink;
GstCaps *one, *two;
gst_init (&argc, &argv);
/* create incompatible caps */
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
identity = gst_element_factory_make ("identity", NULL);
g_assert (identity);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
one = gst_caps_from_string ("some/mime");
two = gst_caps_from_string ("other/mime");
g_assert (GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(src, "src"), gst_element_get_pad (identity, "sink"), one)));
g_assert (!GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(identity, "src"), gst_element_get_pad (sink, "sink"), two)));
return 0;
}