summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorThijs Vermeir <thijsvermeir@gmail.com>2008-01-10 14:34:30 +0000
committerThijs Vermeir <thijsvermeir@gmail.com>2008-01-10 14:34:30 +0000
commit7c08d2ad763502a0c60ce8a5107a4d63b31c85d4 (patch)
tree0c94a9c1ee2c6c907317ca77a7e9d893f8dd6bc4 /gst
parent868b72c9a3b624231fd36fb6fe68ecac8584f9af (diff)
downloadgst-plugins-bad-7c08d2ad763502a0c60ce8a5107a4d63b31c85d4.tar.gz
gst-plugins-bad-7c08d2ad763502a0c60ce8a5107a4d63b31c85d4.tar.bz2
gst-plugins-bad-7c08d2ad763502a0c60ce8a5107a4d63b31c85d4.zip
gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515)
Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515)
Diffstat (limited to 'gst')
-rw-r--r--gst/rtpmanager/gstrtpbin.c50
1 files changed, 46 insertions, 4 deletions
diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c
index 9d6689d2..2d1a9b9c 100644
--- a/gst/rtpmanager/gstrtpbin.c
+++ b/gst/rtpmanager/gstrtpbin.c
@@ -2082,6 +2082,35 @@ pad_failed:
}
}
+/* If the requested name is NULL we should create a name with
+ * the session number assuming we want the lowest posible session
+ * with a free pad like the template */
+static gchar *
+gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ)
+{
+ gboolean name_found = FALSE;
+ gint session = 0;
+ GstPad *pad = NULL;
+ GstIterator *pad_it = NULL;
+ gchar *pad_name = NULL;
+
+ GST_DEBUG_OBJECT (element, "find a free pad name for template");
+ while (!name_found) {
+ g_free (pad_name);
+ pad_name = g_strdup_printf (templ->name_template, session++);
+ pad_it = gst_element_iterate_pads (GST_ELEMENT (element));
+ name_found = TRUE;
+ while (gst_iterator_next (pad_it, (gpointer) & pad) == GST_ITERATOR_OK) {
+ if (strcmp (gst_pad_get_name (pad), pad_name) == 0)
+ name_found = FALSE;
+ }
+ gst_iterator_free (pad_it);
+ }
+
+ GST_DEBUG_OBJECT (element, "free pad name found: '%s'", pad_name);
+ return pad_name;
+}
+
/*
*/
static GstPad *
@@ -2091,6 +2120,7 @@ gst_rtp_bin_request_new_pad (GstElement * element,
GstRtpBin *rtpbin;
GstElementClass *klass;
GstPad *result;
+ gchar *pad_name = NULL;
g_return_val_if_fail (templ != NULL, NULL);
g_return_val_if_fail (GST_IS_RTP_BIN (element), NULL);
@@ -2100,21 +2130,32 @@ gst_rtp_bin_request_new_pad (GstElement * element,
GST_RTP_BIN_LOCK (rtpbin);
+ if (name == NULL) {
+ /* use a free pad name */
+ pad_name = gst_rtp_bin_get_free_pad_name (element, templ);
+ } else {
+ /* use the provided name */
+ pad_name = g_strdup (name);
+ }
+
+ GST_DEBUG ("Trying to request a pad with name %s", pad_name);
+
/* figure out the template */
if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%d")) {
- result = create_recv_rtp (rtpbin, templ, name);
+ result = create_recv_rtp (rtpbin, templ, pad_name);
} else if (templ == gst_element_class_get_pad_template (klass,
"recv_rtcp_sink_%d")) {
- result = create_recv_rtcp (rtpbin, templ, name);
+ result = create_recv_rtcp (rtpbin, templ, pad_name);
} else if (templ == gst_element_class_get_pad_template (klass,
"send_rtp_sink_%d")) {
- result = create_send_rtp (rtpbin, templ, name);
+ result = create_send_rtp (rtpbin, templ, pad_name);
} else if (templ == gst_element_class_get_pad_template (klass,
"send_rtcp_src_%d")) {
- result = create_rtcp (rtpbin, templ, name);
+ result = create_rtcp (rtpbin, templ, pad_name);
} else
goto wrong_template;
+ g_free (pad_name);
GST_RTP_BIN_UNLOCK (rtpbin);
return result;
@@ -2122,6 +2163,7 @@ gst_rtp_bin_request_new_pad (GstElement * element,
/* ERRORS */
wrong_template:
{
+ g_free (pad_name);
GST_RTP_BIN_UNLOCK (rtpbin);
g_warning ("gstrtpbin: this is not our template");
return NULL;