From f3e16deaad7829bf0c9dda3a2aeaa0f98257aa11 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Thu, 13 Jan 2022 00:45:25 +0100 Subject: [PATCH] aggregator: improve parsing in create_new_pad The previous implementation was a bit primitive, assuming the subclass had registered a template name starting with sink_ . Instead make the effort of parsing the actual template name, and use that to generate the final pad name. Part-of: --- .../tests/check/elements/mpegtsmux.c | 4 +- .../gstreamer/libs/gst/base/gstaggregator.c | 72 ++++++++++++++----- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/subprojects/gst-plugins-bad/tests/check/elements/mpegtsmux.c b/subprojects/gst-plugins-bad/tests/check/elements/mpegtsmux.c index dc6b0f6658..1296b293f0 100644 --- a/subprojects/gst-plugins-bad/tests/check/elements/mpegtsmux.c +++ b/subprojects/gst-plugins-bad/tests/check/elements/mpegtsmux.c @@ -22,9 +22,9 @@ #include #include -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink_%d", GST_PAD_SINK, - GST_PAD_ALWAYS, + GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate video_src_template = GST_STATIC_PAD_TEMPLATE ("src", diff --git a/subprojects/gstreamer/libs/gst/base/gstaggregator.c b/subprojects/gstreamer/libs/gst/base/gstaggregator.c index e930b861d4..fc5c336224 100644 --- a/subprojects/gstreamer/libs/gst/base/gstaggregator.c +++ b/subprojects/gstreamer/libs/gst/base/gstaggregator.c @@ -2048,6 +2048,8 @@ gst_aggregator_default_create_new_pad (GstAggregator * self, GstAggregatorPrivate *priv = self->priv; gint serial = 0; gchar *name = NULL; + gchar *percent_str; + GType pad_type = GST_PAD_TEMPLATE_GTYPE (templ) == G_TYPE_NONE ? GST_TYPE_AGGREGATOR_PAD : GST_PAD_TEMPLATE_GTYPE (templ); @@ -2058,34 +2060,56 @@ gst_aggregator_default_create_new_pad (GstAggregator * self, if (templ->presence != GST_PAD_REQUEST) goto not_request; - GST_OBJECT_LOCK (self); - if (req_name == NULL || strlen (req_name) < 6 - || !g_str_has_prefix (req_name, "sink_") - || strrchr (req_name, '%') != NULL) { - /* no name given when requesting the pad, use next available int */ - serial = ++priv->max_padserial; - } else { - gchar *endptr = NULL; + percent_str = strrchr (templ->name_template, '%'); - /* parse serial number from requested padname */ - serial = g_ascii_strtoull (&req_name[5], &endptr, 10); - if (endptr != NULL && *endptr == '\0') { - if (serial > priv->max_padserial) { - priv->max_padserial = serial; + if (percent_str == NULL) { + if (req_name) + name = g_strdup (req_name); + else + name = g_strdup (templ->name_template); + } else if (g_strcmp0 (percent_str, "%u") == 0 + || g_strcmp0 (percent_str, "%d") == 0) { + guint percent_index = percent_str - templ->name_template; + gchar *template_str = g_strndup (templ->name_template, percent_index); + + GST_OBJECT_LOCK (self); + if (req_name == NULL || g_strcmp0 (templ->name_template, req_name) == 0) { + /* no name given when requesting the pad, use next available int */ + serial = ++priv->max_padserial; + } else if (g_str_has_prefix (req_name, template_str)) { + gchar *endptr = NULL; + + /* parse serial number from requested padname */ + serial = g_ascii_strtoull (&req_name[percent_index], &endptr, 10); + + if (endptr != NULL && *endptr == '\0') { + if (serial > priv->max_padserial) { + priv->max_padserial = serial; + } + } else { + g_free (template_str); + GST_OBJECT_UNLOCK (self); + goto invalid_request_name; } } else { - serial = ++priv->max_padserial; + g_free (template_str); + GST_OBJECT_UNLOCK (self); + goto invalid_request_name; } + + name = g_strdup_printf ("%s%u", template_str, serial); + g_free (template_str); + + GST_OBJECT_UNLOCK (self); + } else { + goto invalid_template_name; } - name = g_strdup_printf ("sink_%u", serial); g_assert (g_type_is_a (pad_type, GST_TYPE_AGGREGATOR_PAD)); agg_pad = g_object_new (pad_type, "name", name, "direction", GST_PAD_SINK, "template", templ, NULL); g_free (name); - GST_OBJECT_UNLOCK (self); - return agg_pad; /* errors */ @@ -2099,6 +2123,20 @@ not_request: GST_WARNING_OBJECT (self, "request new pad that is not a REQUEST pad"); return NULL; } +invalid_template_name: + { + GST_WARNING_OBJECT (self, + "template name %s is invalid, must be in the form name_%%u (%s)", + templ->name_template, percent_str); + return NULL; + } +invalid_request_name: + { + GST_WARNING_OBJECT (self, + "requested name %s is invalid, must be in the form %s", req_name, + templ->name_template); + return NULL; + } } static GstPad *