diff --git a/gst/elements/gstaggregator.c b/gst/elements/gstaggregator.c index eb6c3013d9..49ec28f167 100644 --- a/gst/elements/gstaggregator.c +++ b/gst/elements/gstaggregator.c @@ -76,7 +76,8 @@ gst_aggregator_sched_get_type (void) static void gst_aggregator_class_init (GstAggregatorClass *klass); static void gst_aggregator_init (GstAggregator *aggregator); -static GstPad* gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *temp); +static GstPad* gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *temp, const + gchar *unused); static void gst_aggregator_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -150,7 +151,7 @@ gst_aggregator_init (GstAggregator *aggregator) } static GstPad* -gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *sinkpad; diff --git a/gst/elements/gstfakesink.c b/gst/elements/gstfakesink.c index 70e60c9439..5cd5453d7c 100644 --- a/gst/elements/gstfakesink.c +++ b/gst/elements/gstfakesink.c @@ -58,7 +58,8 @@ GST_PADTEMPLATE_FACTORY (fakesink_sink_factory, static void gst_fakesink_class_init (GstFakeSinkClass *klass); static void gst_fakesink_init (GstFakeSink *fakesink); -static GstPad* gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ); +static GstPad* gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const + gchar *unused); static void gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -137,7 +138,7 @@ gst_fakesink_init (GstFakeSink *fakesink) } static GstPad* -gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *sinkpad; diff --git a/gst/elements/gsttee.c b/gst/elements/gsttee.c index 729b95ec03..d7e0544bb0 100644 --- a/gst/elements/gsttee.c +++ b/gst/elements/gsttee.c @@ -56,7 +56,7 @@ GST_PADTEMPLATE_FACTORY (tee_src_factory, static void gst_tee_class_init (GstTeeClass *klass); static void gst_tee_init (GstTee *tee); -static GstPad* gst_tee_request_new_pad (GstElement *element, GstPadTemplate *temp); +static GstPad* gst_tee_request_new_pad (GstElement *element, GstPadTemplate *temp, const gchar *unused); static void gst_tee_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -127,7 +127,7 @@ gst_tee_init (GstTee *tee) } static GstPad* -gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *srcpad; diff --git a/gst/gstelement.c b/gst/gstelement.c index 2122a11fb7..dd7799d5ef 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -604,14 +604,14 @@ gst_element_get_padtemplate_by_compatible (GstElement *element, GstPadTemplate * } static GstPad* -gst_element_request_pad (GstElement *element, GstPadTemplate *templ) +gst_element_request_pad (GstElement *element, GstPadTemplate *templ, const gchar* name) { GstPad *newpad = NULL; GstElementClass *oclass; oclass = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS(element)); if (oclass->request_new_pad) - newpad = (oclass->request_new_pad)(element, templ); + newpad = (oclass->request_new_pad)(element, templ, name); return newpad; } @@ -640,7 +640,7 @@ gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ) templ_new = gst_element_get_padtemplate_by_compatible (element, templ); if (templ_new != NULL) - pad = gst_element_request_pad (element, templ_new); + pad = gst_element_request_pad (element, templ_new, NULL); return pad; } @@ -660,19 +660,40 @@ gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ) GstPad* gst_element_request_pad_by_name (GstElement *element, const gchar *name) { - GstPadTemplate *templ; + GstPadTemplate *templ = NULL; GstPad *pad; + const gchar *req_name = NULL; + gboolean templ_found = FALSE; + GList *list; + gint n; g_return_val_if_fail (element != NULL, NULL); g_return_val_if_fail (GST_IS_ELEMENT (element), NULL); g_return_val_if_fail (name != NULL, NULL); - templ = gst_element_get_padtemplate_by_name (element, name); + if (strstr (name, "%d")) { + templ = gst_element_get_padtemplate_by_name (element, name); + req_name = NULL; + } else { + list = gst_element_get_padtemplate_list(element); + while (!templ_found && list) { + templ = (GstPadTemplate*) list->data; + if (strstr (templ->name_template, "%d")) { + if (sscanf(name, templ->name_template, &n)) { + templ_found = TRUE; + req_name = name; + break; + } + } + list = list->next; + } + } + if (templ == NULL) - return NULL; - - pad = gst_element_request_pad (element, templ); - + return NULL; + + pad = gst_element_request_pad (element, templ, req_name); + return pad; } diff --git a/gst/gstelement.h b/gst/gstelement.h index 31eaf43fe0..c1eede0baa 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -178,7 +178,7 @@ struct _GstElementClass { /* change the element state */ GstElementStateReturn (*change_state) (GstElement *element); /* request a new pad */ - GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ); + GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ, const gchar* name); }; void gst_element_class_add_padtemplate (GstElementClass *element, GstPadTemplate *templ); diff --git a/plugins/elements/gstaggregator.c b/plugins/elements/gstaggregator.c index eb6c3013d9..49ec28f167 100644 --- a/plugins/elements/gstaggregator.c +++ b/plugins/elements/gstaggregator.c @@ -76,7 +76,8 @@ gst_aggregator_sched_get_type (void) static void gst_aggregator_class_init (GstAggregatorClass *klass); static void gst_aggregator_init (GstAggregator *aggregator); -static GstPad* gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *temp); +static GstPad* gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *temp, const + gchar *unused); static void gst_aggregator_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -150,7 +151,7 @@ gst_aggregator_init (GstAggregator *aggregator) } static GstPad* -gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *sinkpad; diff --git a/plugins/elements/gstfakesink.c b/plugins/elements/gstfakesink.c index 70e60c9439..5cd5453d7c 100644 --- a/plugins/elements/gstfakesink.c +++ b/plugins/elements/gstfakesink.c @@ -58,7 +58,8 @@ GST_PADTEMPLATE_FACTORY (fakesink_sink_factory, static void gst_fakesink_class_init (GstFakeSinkClass *klass); static void gst_fakesink_init (GstFakeSink *fakesink); -static GstPad* gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ); +static GstPad* gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const + gchar *unused); static void gst_fakesink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -137,7 +138,7 @@ gst_fakesink_init (GstFakeSink *fakesink) } static GstPad* -gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_fakesink_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *sinkpad; diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c index 729b95ec03..d7e0544bb0 100644 --- a/plugins/elements/gsttee.c +++ b/plugins/elements/gsttee.c @@ -56,7 +56,7 @@ GST_PADTEMPLATE_FACTORY (tee_src_factory, static void gst_tee_class_init (GstTeeClass *klass); static void gst_tee_init (GstTee *tee); -static GstPad* gst_tee_request_new_pad (GstElement *element, GstPadTemplate *temp); +static GstPad* gst_tee_request_new_pad (GstElement *element, GstPadTemplate *temp, const gchar *unused); static void gst_tee_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); @@ -127,7 +127,7 @@ gst_tee_init (GstTee *tee) } static GstPad* -gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ) +gst_tee_request_new_pad (GstElement *element, GstPadTemplate *templ, const gchar *unused) { gchar *name; GstPad *srcpad;