element: Fix requesting of pads with string templates

Previously it was only possible to request them with the exact template
name, e.g. 'src_%s', but not with "instantiated" names that would match
this template, e.g.'src_foo_bar'.

This is now possible and a test was added for this, in addition to
fixing a previously invalid test.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2635>
This commit is contained in:
Sebastian Dröge 2022-06-20 16:45:19 +03:00 committed by GStreamer Marge Bot
parent a040450685
commit a3cbaa8209
2 changed files with 36 additions and 30 deletions

View file

@ -1052,7 +1052,7 @@ gst_element_is_valid_request_template_name (const gchar * templ_name,
/* %s is not allowed for multiple specifiers, just a single specifier can be /* %s is not allowed for multiple specifiers, just a single specifier can be
* accepted in gst_pad_template_new() and can not be mixed with other * accepted in gst_pad_template_new() and can not be mixed with other
* specifier '%u' and '%d' */ * specifier '%u' and '%d' */
if (*(templ_name_ptr + 1) == 's' && g_strcmp0 (templ_name, name) == 0) { if (*(templ_name_ptr + 1) == 's') {
return TRUE; return TRUE;
} }

View file

@ -654,7 +654,6 @@ GST_START_TEST (test_request_pad_templates)
GHashTableIter iter; GHashTableIter iter;
gpointer key, value; gpointer key, value;
const gchar *pad_name, *templ_name; const gchar *pad_name, *templ_name;
GSList *padname_blacklists = NULL, *item;
GError *err = NULL; GError *err = NULL;
padnames = g_hash_table_new (g_str_hash, g_str_equal); padnames = g_hash_table_new (g_str_hash, g_str_equal);
@ -703,23 +702,7 @@ GST_START_TEST (test_request_pad_templates)
g_hash_table_insert (padnames, (gpointer) "src_%s", (gpointer) "src_%s"); g_hash_table_insert (padnames, (gpointer) "src_%s", (gpointer) "src_%s");
g_hash_table_insert (padnames, (gpointer) "src_%u_%s", g_hash_table_insert (padnames, (gpointer) "src_%u_%s",
(gpointer) "src_%u_%s"); (gpointer) "src_%u_%s");
g_hash_table_insert (padnames, (gpointer) "src_foo_bar", (gpointer) "src_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u%u");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u_%d");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u_%u_");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%u");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_blah");
test = g_object_new (gst_test_element3_get_type (), NULL); test = g_object_new (gst_test_element3_get_type (), NULL);
@ -742,16 +725,6 @@ GST_START_TEST (test_request_pad_templates)
gst_object_unref (pad); gst_object_unref (pad);
} }
item = padname_blacklists;
/* check invalid request pad name */
while (item) {
pad_name = (const gchar *) (item->data);
item = g_slist_next (item);
pad = gst_element_request_pad_simple (GST_ELEMENT (test), pad_name);
fail_unless (pad == NULL);
}
/* check it working with some APIs /* check it working with some APIs
* gst_element_link/link_pads */ * gst_element_link/link_pads */
sink = gst_element_factory_make ("fakesink", "sink"); sink = gst_element_factory_make ("fakesink", "sink");
@ -782,13 +755,45 @@ GST_START_TEST (test_request_pad_templates)
if (err) { if (err) {
g_error_free (err); g_error_free (err);
} }
g_slist_free (padname_blacklists);
g_hash_table_unref (padnames); g_hash_table_unref (padnames);
gst_object_unref (pipeline); gst_object_unref (pipeline);
} }
GST_END_TEST; GST_END_TEST;
GST_START_TEST (test_forbidden_pad_template_names)
{
const gchar *pad_name;
GSList *padname_blacklists = NULL, *item;
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u%u");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%u_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%u");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_%s_%s");
padname_blacklists =
g_slist_append (padname_blacklists, (gpointer) "src_%s_blah");
item = padname_blacklists;
/* check invalid request pad name */
while (item) {
pad_name = (const gchar *) (item->data);
item = g_slist_next (item);
ASSERT_WARNING (gst_pad_template_new (pad_name, GST_PAD_SRC,
GST_PAD_REQUEST, GST_CAPS_ANY));
}
g_slist_free (padname_blacklists);
}
GST_END_TEST;
static gboolean run_foreach_thread; static gboolean run_foreach_thread;
/* thread function that just adds/removes pads while main thread iterates pads */ /* thread function that just adds/removes pads while main thread iterates pads */
@ -922,6 +927,7 @@ gst_element_suite (void)
tcase_add_test (tc_chain, test_pad_templates); tcase_add_test (tc_chain, test_pad_templates);
tcase_add_test (tc_chain, test_property_notify_message); tcase_add_test (tc_chain, test_property_notify_message);
tcase_add_test (tc_chain, test_request_pad_templates); tcase_add_test (tc_chain, test_request_pad_templates);
tcase_add_test (tc_chain, test_forbidden_pad_template_names);
tcase_add_test (tc_chain, test_foreach_pad); tcase_add_test (tc_chain, test_foreach_pad);
return s; return s;