summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>2011-01-21 18:10:29 (GMT)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2011-02-03 09:29:28 (GMT)
commit96a1a9dec6676826dd808d6c35a5ae3f7f276212 (patch)
treefdc7897535c1e3d0c6ade956340247898e6187ba
parent54c19ba6def4f9cead7e18a893c981e425f9405c (diff)
oggmux: ensure serialnos are unique
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
-rw-r--r--ext/ogg/gstoggmux.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c
index 3329824..c6ed67c 100644
--- a/ext/ogg/gstoggmux.c
+++ b/ext/ogg/gstoggmux.c
@@ -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]);