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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2317>
This commit is contained in:
Sebastian Dröge 2021-06-10 11:36:43 +03:00 committed by GStreamer Marge Bot
parent 569910a5ac
commit 127ade39cf

View file

@ -1325,6 +1325,26 @@ write_fail:
} }
/* GstElement implementation */ /* 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 * static GstPad *
gst_base_ts_mux_request_new_pad (GstElement * element, GstPadTemplate * templ, 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) if (pid < TSMUX_START_ES_PID)
goto invalid_stream_pid; goto invalid_stream_pid;
} else { } 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 *) pad = (GstPad *)