gst/gstutils.c: fix a bug in the case where neither element has a pad

Original commit message from CVS:
* gst/gstutils.c: (gst_element_link_pads):
fix a bug in the case where neither element has a pad
* check/gst/gstelement.c: (GST_START_TEST), (gst_element_suite):
add a test for that case
This commit is contained in:
Thomas Vander Stichele 2005-10-05 21:34:42 +00:00
parent d186bc1644
commit 8b0f1ffe11
4 changed files with 61 additions and 9 deletions

View file

@ -1,3 +1,10 @@
2005-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gstutils.c: (gst_element_link_pads):
fix a bug in the case where neither element has a pad
* check/gst/gstelement.c: (GST_START_TEST), (gst_element_suite):
add a test for that case
2005-10-05 Thomas Vander Stichele <thomas at apestaart dot org> 2005-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gstpad.c: (gst_pad_push), (gst_pad_push_event): * gst/gstpad.c: (gst_pad_push), (gst_pad_push_event):

View file

@ -94,8 +94,7 @@ GST_START_TEST (test_error_no_bus)
GST_END_TEST; GST_END_TEST;
/* link and run two elements without putting them in a /* link and run two elements without putting them in a pipeline */
* pipeline */
GST_START_TEST (test_link) GST_START_TEST (test_link)
{ {
GstElement *src, *sink; GstElement *src, *sink;
@ -131,6 +130,22 @@ GST_START_TEST (test_link)
GST_END_TEST; GST_END_TEST;
/* linking two elements without pads should fail */
GST_START_TEST (test_link_no_pads)
{
GstElement *src, *sink;
src = gst_bin_new ("src");
sink = gst_bin_new ("sink");
fail_if (gst_element_link (src, sink));
gst_object_unref (src);
gst_object_unref (sink);
}
GST_END_TEST;
Suite * Suite *
gst_element_suite (void) gst_element_suite (void)
{ {
@ -142,6 +157,7 @@ gst_element_suite (void)
tcase_add_test (tc_chain, test_add_pad_unref_element); tcase_add_test (tc_chain, test_add_pad_unref_element);
tcase_add_test (tc_chain, test_error_no_bus); tcase_add_test (tc_chain, test_error_no_bus);
tcase_add_test (tc_chain, test_link); tcase_add_test (tc_chain, test_link);
tcase_add_test (tc_chain, test_link_no_pads);
return s; return s;
} }

View file

@ -1024,7 +1024,8 @@ pad_link_maybe_ghosting (GstPad * src, GstPad * sink)
* @src: a #GstElement containing the source pad. * @src: a #GstElement containing the source pad.
* @srcpadname: the name of the #GstPad in source element or NULL for any pad. * @srcpadname: the name of the #GstPad in source element or NULL for any pad.
* @dest: the #GstElement containing the destination pad. * @dest: the #GstElement containing the destination pad.
* @destpadname: the name of the #GstPad in destination element or NULL for any pad. * @destpadname: the name of the #GstPad in destination element,
* or NULL for any pad.
* *
* Links the two named pads of the source and destination elements. * Links the two named pads of the source and destination elements.
* Side effect is that if one of the pads has no parent, it becomes a * Side effect is that if one of the pads has no parent, it becomes a
@ -1054,8 +1055,9 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
srcpadname ? srcpadname : "(any)", GST_ELEMENT_NAME (dest), srcpadname ? srcpadname : "(any)", GST_ELEMENT_NAME (dest),
destpadname ? destpadname : "(any)"); destpadname ? destpadname : "(any)");
/* now get the pads we're trying to link and a list of all remaining pads */ /* get a src pad */
if (srcpadname) { if (srcpadname) {
/* name specified, look it up */
srcpad = gst_element_get_pad (src, srcpadname); srcpad = gst_element_get_pad (src, srcpadname);
if (!srcpad) { if (!srcpad) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s", GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
@ -1077,6 +1079,7 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
} }
srcpads = NULL; srcpads = NULL;
} else { } else {
/* no name given, get the first available pad */
GST_LOCK (src); GST_LOCK (src);
srcpads = GST_ELEMENT_PADS (src); srcpads = GST_ELEMENT_PADS (src);
srcpad = srcpads ? GST_PAD_CAST (srcpads->data) : NULL; srcpad = srcpads ? GST_PAD_CAST (srcpads->data) : NULL;
@ -1084,7 +1087,10 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
gst_object_ref (srcpad); gst_object_ref (srcpad);
GST_UNLOCK (src); GST_UNLOCK (src);
} }
/* get a destination pad */
if (destpadname) { if (destpadname) {
/* name specified, look it up */
destpad = gst_element_get_pad (dest, destpadname); destpad = gst_element_get_pad (dest, destpadname);
if (!destpad) { if (!destpad) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s", GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
@ -1106,6 +1112,7 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
} }
destpads = NULL; destpads = NULL;
} else { } else {
/* no name given, get the first available pad */
GST_LOCK (dest); GST_LOCK (dest);
destpads = GST_ELEMENT_PADS (dest); destpads = GST_ELEMENT_PADS (dest);
destpad = destpads ? GST_PAD_CAST (destpads->data) : NULL; destpad = destpads ? GST_PAD_CAST (destpads->data) : NULL;
@ -1125,6 +1132,7 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
return result; return result;
} }
if (srcpad) { if (srcpad) {
/* loop through the allowed pads in the source, trying to find a /* loop through the allowed pads in the source, trying to find a
* compatible destination pad */ * compatible destination pad */
@ -1172,15 +1180,18 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
if (srcpadname) { if (srcpadname) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s:%s to %s", GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s:%s to %s",
GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (dest)); GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (dest));
if (srcpad)
gst_object_unref (srcpad); gst_object_unref (srcpad);
srcpad = NULL;
if (destpad) if (destpad)
gst_object_unref (destpad); gst_object_unref (destpad);
return FALSE; destpad = NULL;
} else { } else {
if (srcpad) if (srcpad)
gst_object_unref (srcpad); gst_object_unref (srcpad);
srcpad = NULL; srcpad = NULL;
} }
if (destpad) { if (destpad) {
/* loop through the existing pads in the destination */ /* loop through the existing pads in the destination */
do { do {
@ -1213,6 +1224,7 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
} }
} while (destpads); } while (destpads);
} }
if (destpadname) { if (destpadname) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s:%s", GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s:%s",
GST_ELEMENT_NAME (src), GST_DEBUG_PAD_NAME (destpad)); GST_ELEMENT_NAME (src), GST_DEBUG_PAD_NAME (destpad));
@ -1221,10 +1233,11 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname,
gst_object_unref (srcpad); gst_object_unref (srcpad);
return FALSE; return FALSE;
} else { } else {
gst_object_unref (destpad);
if (srcpad) if (srcpad)
gst_object_unref (srcpad); gst_object_unref (srcpad);
srcpad = NULL; srcpad = NULL;
if (destpad)
gst_object_unref (destpad);
destpad = NULL; destpad = NULL;
} }

View file

@ -94,8 +94,7 @@ GST_START_TEST (test_error_no_bus)
GST_END_TEST; GST_END_TEST;
/* link and run two elements without putting them in a /* link and run two elements without putting them in a pipeline */
* pipeline */
GST_START_TEST (test_link) GST_START_TEST (test_link)
{ {
GstElement *src, *sink; GstElement *src, *sink;
@ -131,6 +130,22 @@ GST_START_TEST (test_link)
GST_END_TEST; GST_END_TEST;
/* linking two elements without pads should fail */
GST_START_TEST (test_link_no_pads)
{
GstElement *src, *sink;
src = gst_bin_new ("src");
sink = gst_bin_new ("sink");
fail_if (gst_element_link (src, sink));
gst_object_unref (src);
gst_object_unref (sink);
}
GST_END_TEST;
Suite * Suite *
gst_element_suite (void) gst_element_suite (void)
{ {
@ -142,6 +157,7 @@ gst_element_suite (void)
tcase_add_test (tc_chain, test_add_pad_unref_element); tcase_add_test (tc_chain, test_add_pad_unref_element);
tcase_add_test (tc_chain, test_error_no_bus); tcase_add_test (tc_chain, test_error_no_bus);
tcase_add_test (tc_chain, test_link); tcase_add_test (tc_chain, test_link);
tcase_add_test (tc_chain, test_link_no_pads);
return s; return s;
} }