mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
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:
parent
569910a5ac
commit
127ade39cf
1 changed files with 23 additions and 1 deletions
|
@ -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 *)
|
||||
|
|
Loading…
Reference in a new issue