From 127ade39cf175c7961a0eb75d689f6526920ab15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 10 Jun 2021 11:36:43 +0300 Subject: [PATCH] tsmux: Recheck existing pad PIDs when requesting a new pad with a random pid 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: --- gst/mpegtsmux/gstbasetsmux.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/gst/mpegtsmux/gstbasetsmux.c b/gst/mpegtsmux/gstbasetsmux.c index fd6138af8a..50009af4b2 100644 --- a/gst/mpegtsmux/gstbasetsmux.c +++ b/gst/mpegtsmux/gstbasetsmux.c @@ -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 *)