From 96a1a9dec6676826dd808d6c35a5ae3f7f276212 Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Fri, 21 Jan 2011 18:10:29 +0000 Subject: 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 --- ext/ogg/gstoggmux.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index 3329824b5..c6ed67c72 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]); -- cgit v1.2.3