tsmux: Recheck existing pad PIDs when requesting a new pad with a random pid
authorSebastian Dröge <sebastian@centricular.com>
Thu, 10 Jun 2021 08:36:43 +0000 (11:36 +0300)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 23 Jun 2021 05:44:48 +0000 (05:44 +0000)
Previously pads might have been requested already (e.g. in NULL state),
then reset was called (e.g. because changing state) and then a new pad
was requested. Resetting is re-creating the internal muxer object and as
such resetting the pid counter, so the next requested pad would get the
same pid as the first requested pad which then leads to collisions.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2317>

gst/mpegtsmux/gstbasetsmux.c

index fd6138a..50009af 100644 (file)
@@ -1325,6 +1325,26 @@ write_fail:
 }
 
 /* GstElement implementation */
+static gboolean
+gst_base_ts_mux_has_pad_with_pid (GstBaseTsMux * mux, guint16 pid)
+{
+  GList *l;
+  gboolean res = FALSE;
+
+  GST_OBJECT_LOCK (mux);
+
+  for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+    GstBaseTsMuxPad *tpad = GST_BASE_TS_MUX_PAD (l->data);
+
+    if (tpad->pid == pid) {
+      res = TRUE;
+      break;
+    }
+  }
+
+  GST_OBJECT_UNLOCK (mux);
+  return res;
+}
 
 static GstPad *
 gst_base_ts_mux_request_new_pad (GstElement * element, GstPadTemplate * templ,
@@ -1342,7 +1362,9 @@ gst_base_ts_mux_request_new_pad (GstElement * element, GstPadTemplate * templ,
     if (pid < TSMUX_START_ES_PID)
       goto invalid_stream_pid;
   } else {
-    pid = tsmux_get_new_pid (mux->tsmux);
+    do {
+      pid = tsmux_get_new_pid (mux->tsmux);
+    } while (gst_base_ts_mux_has_pad_with_pid (mux, pid));
   }
 
   pad = (GstPad *)