summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Buhler <pascal.buhler@tandberg.com>2010-04-12 09:49:14 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2010-09-24 14:10:26 +0200
commitbd8d80a8e4df1da1f9acd6b4d1e32fdc18f7218b (patch)
tree0268f0a5513c4df77e9b325fcdff13e9b8362984
parent8337c89c7403a208af6667f9341bd782e0e91ff2 (diff)
rtpbin: Handle rysnc of iterator when looking for free pad name
If a new pad was added while iterating then a pad could be returned that was already in use. Fixes #630451
-rw-r--r--gst/rtpmanager/gstrtpbin.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c
index 085fe8b43..88965f64b 100644
--- a/gst/rtpmanager/gstrtpbin.c
+++ b/gst/rtpmanager/gstrtpbin.c
@@ -2768,25 +2768,47 @@ 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) {
+ gboolean done = FALSE;
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 (name_found &&
- gst_iterator_next (pad_it, (gpointer) & pad) == GST_ITERATOR_OK) {
- gchar *name;
-
- name = gst_pad_get_name (pad);
- if (strcmp (name, pad_name) == 0)
- name_found = FALSE;
- g_free (name);
- gst_object_unref (pad);
+ while (!done) {
+ gpointer data;
+
+ switch (gst_iterator_next (pad_it, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstPad *pad;
+ gchar *name;
+
+ pad = GST_PAD_CAST (data);
+ name = gst_pad_get_name (pad);
+
+ if (strcmp (name, pad_name) == 0) {
+ done = TRUE;
+ name_found = FALSE;
+ }
+ g_free (name);
+ gst_object_unref (pad);
+ break;
+ }
+ case GST_ITERATOR_ERROR:
+ case GST_ITERATOR_RESYNC:
+ /* restart iteration */
+ done = TRUE;
+ name_found = FALSE;
+ session = 0;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
}
gst_iterator_free (pad_it);
}