oggmux: ensure serialnos are unique
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 21 Jan 2011 18:10:29 +0000 (18:10 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 3 Feb 2011 09:29:28 +0000 (09:29 +0000)
We do that by checking a newly generated one is not already used in
an existing stream, and doing it again if it is.

https://bugzilla.gnome.org/show_bug.cgi?id=640211

ext/ogg/gstoggmux.c

index 3329824..c6ed67c 100644 (file)
@@ -337,6 +337,34 @@ gst_ogg_mux_sink_event (GstPad * pad, GstEvent * event)
   return ret;
 }
 
+static gboolean
+gst_ogg_mux_is_serialno_present (GstOggMux * ogg_mux, guint32 serialno)
+{
+  GSList *walk;
+
+  walk = ogg_mux->collect->data;
+  while (walk) {
+    GstOggPadData *pad = (GstOggPadData *) walk->data;
+    if (pad->map.serialno == serialno)
+      return TRUE;
+    walk = walk->next;
+  }
+
+  return FALSE;
+}
+
+static guint32
+gst_ogg_mux_generate_serialno (GstOggMux * ogg_mux)
+{
+  guint32 serialno;
+
+  do {
+    serialno = g_random_int_range (0, G_MAXINT32);
+  } while (gst_ogg_mux_is_serialno_present (ogg_mux, serialno));
+
+  return serialno;
+}
+
 static GstPad *
 gst_ogg_mux_request_new_pad (GstElement * element,
     GstPadTemplate * templ, const gchar * req_name)
@@ -364,7 +392,7 @@ gst_ogg_mux_request_new_pad (GstElement * element,
 
     if (req_name == NULL || strlen (req_name) < 6) {
       /* no name given when requesting the pad, use random serial number */
-      serial = rand ();
+      serial = gst_ogg_mux_generate_serialno (ogg_mux);
     } else {
       /* parse serial number from requested padname */
       serial = atoi (&req_name[5]);