mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-23 15:48:23 +00:00
tsbase: Handle more program updates
There could be a case where the new program has the same program number as the previous one ... but is actually located on a PID previously used for elementary stream. In that case the program is guaranteed to not be an update of the previous program but a completely new one. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1919>
This commit is contained in:
parent
ad74ba6100
commit
2445c31c15
1 changed files with 27 additions and 3 deletions
|
@ -469,6 +469,12 @@ mpegts_base_add_program (MpegTSBase * base,
|
||||||
}
|
}
|
||||||
MPEGTS_BIT_SET (base->known_psi, pmt_pid);
|
MPEGTS_BIT_SET (base->known_psi, pmt_pid);
|
||||||
|
|
||||||
|
/* Ensure the PMT PID was not used by some PES stream */
|
||||||
|
if (G_UNLIKELY (MPEGTS_BIT_IS_SET (base->is_pes, pmt_pid))) {
|
||||||
|
GST_DEBUG ("New program PMT PID was previously used by a PES stream");
|
||||||
|
MPEGTS_BIT_UNSET (base->is_pes, pmt_pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
g_ptr_array_add (base->programs, program);
|
g_ptr_array_add (base->programs, program);
|
||||||
|
|
||||||
|
@ -1053,10 +1059,21 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
|
||||||
for (i = 0; i < pat->len; ++i) {
|
for (i = 0; i < pat->len; ++i) {
|
||||||
GstMpegtsPatProgram *patp = g_ptr_array_index (pat, i);
|
GstMpegtsPatProgram *patp = g_ptr_array_index (pat, i);
|
||||||
|
|
||||||
|
GST_LOG ("Looking for program %d / 0x%04x", patp->program_number,
|
||||||
|
patp->network_or_program_map_PID);
|
||||||
program = mpegts_base_get_program (base, patp->program_number);
|
program = mpegts_base_get_program (base, patp->program_number);
|
||||||
if (program) {
|
if (program) {
|
||||||
|
GST_LOG ("Program exists on pid 0x%04x", program->pmt_pid);
|
||||||
|
/* If the new PMT PID clashes with an existing known PES stream, we know
|
||||||
|
* it is not an update */
|
||||||
|
if (MPEGTS_BIT_IS_SET (base->is_pes, patp->network_or_program_map_PID)) {
|
||||||
|
GST_LOG ("Program is not an update");
|
||||||
|
program =
|
||||||
|
mpegts_base_add_program (base, patp->program_number,
|
||||||
|
patp->network_or_program_map_PID);
|
||||||
|
} else if (program->pmt_pid != patp->network_or_program_map_PID) {
|
||||||
/* IF the program already existed, just check if the PMT PID changed */
|
/* IF the program already existed, just check if the PMT PID changed */
|
||||||
if (program->pmt_pid != patp->network_or_program_map_PID) {
|
GST_LOG ("PMT is on a different PID");
|
||||||
if (program->pmt_pid != G_MAXUINT16) {
|
if (program->pmt_pid != G_MAXUINT16) {
|
||||||
/* pmt pid changed */
|
/* pmt pid changed */
|
||||||
/* FIXME: when this happens it may still be pmt pid of another
|
/* FIXME: when this happens it may still be pmt pid of another
|
||||||
|
@ -1071,6 +1088,8 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
|
||||||
("Refcounting issue. Setting twice a PMT PID (0x%04x) as know PSI",
|
("Refcounting issue. Setting twice a PMT PID (0x%04x) as know PSI",
|
||||||
program->pmt_pid);
|
program->pmt_pid);
|
||||||
MPEGTS_BIT_SET (base->known_psi, patp->network_or_program_map_PID);
|
MPEGTS_BIT_SET (base->known_psi, patp->network_or_program_map_PID);
|
||||||
|
} else {
|
||||||
|
GST_LOG ("Regular program update");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Create a new program */
|
/* Create a new program */
|
||||||
|
@ -1097,9 +1116,14 @@ mpegts_base_apply_pat (MpegTSBase * base, GstMpegtsSection * section)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (--program->patcount > 0)
|
GST_LOG ("Deactivating program %d / 0x%04x", patp->program_number,
|
||||||
|
patp->network_or_program_map_PID);
|
||||||
|
|
||||||
|
if (--program->patcount > 0) {
|
||||||
|
GST_LOG ("Referenced by new program, keeping");
|
||||||
/* the program has been referenced by the new pat, keep it */
|
/* the program has been referenced by the new pat, keep it */
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
GST_INFO_OBJECT (base, "PAT removing program 0x%04x 0x%04x",
|
GST_INFO_OBJECT (base, "PAT removing program 0x%04x 0x%04x",
|
||||||
patp->program_number, patp->network_or_program_map_PID);
|
patp->program_number, patp->network_or_program_map_PID);
|
||||||
|
|
Loading…
Reference in a new issue