From: Vincent Penquerc'h Date: Fri, 21 Jan 2011 18:10:29 +0000 (+0000) Subject: oggmux: ensure serialnos are unique X-Git-Tag: 1.19.3~511^2~6555^2~1168 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=96a1a9dec6676826dd808d6c35a5ae3f7f276212;p=platform%2Fupstream%2Fgstreamer.git 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 --- 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]);