mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-09-03 02:33:53 +00:00
mpegtsbase: Check harder for program changes
And don't just rely on the section crc/version_number changing to indicate that the program actually changed.
This commit is contained in:
parent
044df35560
commit
671550714f
1 changed files with 78 additions and 0 deletions
|
@ -569,6 +569,74 @@ mpegts_base_program_remove_stream (MpegTSBase * base,
|
||||||
program->streams[pid] = NULL;
|
program->streams[pid] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return TRUE if programs are equal */
|
||||||
|
static gboolean
|
||||||
|
mpegts_base_is_same_program (MpegTSBase * base, MpegTSBaseProgram * oldprogram,
|
||||||
|
guint16 new_pmt_pid, GstStructure * new_pmt_info)
|
||||||
|
{
|
||||||
|
guint i, nbstreams;
|
||||||
|
guint pcr_pid;
|
||||||
|
guint pid;
|
||||||
|
guint stream_type;
|
||||||
|
GstStructure *stream;
|
||||||
|
MpegTSBaseStream *oldstream;
|
||||||
|
gboolean sawpcrpid = FALSE;
|
||||||
|
const GValue *new_streams;
|
||||||
|
const GValue *value;
|
||||||
|
|
||||||
|
if (oldprogram->pmt_pid != new_pmt_pid) {
|
||||||
|
GST_DEBUG ("Different pmt_pid (new:0x%04x, old:0x%04x)", new_pmt_pid,
|
||||||
|
oldprogram->pmt_pid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_structure_id_get (new_pmt_info, QUARK_PCR_PID, G_TYPE_UINT, &pcr_pid,
|
||||||
|
NULL);
|
||||||
|
if (oldprogram->pcr_pid != pcr_pid) {
|
||||||
|
GST_DEBUG ("Different pcr_pid (new:0x%04x, old:0x%04x)",
|
||||||
|
pcr_pid, oldprogram->pcr_pid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the streams */
|
||||||
|
new_streams = gst_structure_id_get_value (new_pmt_info, QUARK_STREAMS);
|
||||||
|
nbstreams = gst_value_list_get_size (new_streams);
|
||||||
|
|
||||||
|
for (i = 0; i < nbstreams; ++i) {
|
||||||
|
value = gst_value_list_get_value (new_streams, i);
|
||||||
|
stream = g_value_get_boxed (value);
|
||||||
|
|
||||||
|
gst_structure_id_get (stream, QUARK_PID, G_TYPE_UINT, &pid,
|
||||||
|
QUARK_STREAM_TYPE, G_TYPE_UINT, &stream_type, NULL);
|
||||||
|
oldstream = oldprogram->streams[pid];
|
||||||
|
if (!oldstream) {
|
||||||
|
GST_DEBUG ("New stream 0x%04x not present in old program", pid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (oldstream->stream_type != stream_type) {
|
||||||
|
GST_DEBUG
|
||||||
|
("New stream 0x%04x has a different stream type (new:%d, old:%d)",
|
||||||
|
pid, stream_type, oldstream->stream_type);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (pid == oldprogram->pcr_pid)
|
||||||
|
sawpcrpid = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the pcr is not shared with an existing stream, we'll have one extra stream */
|
||||||
|
if (!sawpcrpid)
|
||||||
|
nbstreams += 1;
|
||||||
|
|
||||||
|
if (nbstreams != g_list_length (oldprogram->stream_list)) {
|
||||||
|
GST_DEBUG ("Different number of streams (new:%d, old:%d)",
|
||||||
|
nbstreams, g_list_length (oldprogram->stream_list));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_DEBUG ("Programs are equal");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program)
|
mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program)
|
||||||
{
|
{
|
||||||
|
@ -878,6 +946,10 @@ mpegts_base_apply_pmt (MpegTSBase * base,
|
||||||
if (G_UNLIKELY (old_program == NULL))
|
if (G_UNLIKELY (old_program == NULL))
|
||||||
goto no_program;
|
goto no_program;
|
||||||
|
|
||||||
|
if (G_UNLIKELY (mpegts_base_is_same_program (base, old_program, pmt_pid,
|
||||||
|
pmt_info)))
|
||||||
|
goto same_program;
|
||||||
|
|
||||||
/* If the current program is active, this means we have a new program */
|
/* If the current program is active, this means we have a new program */
|
||||||
if (old_program->active) {
|
if (old_program->active) {
|
||||||
old_program = mpegts_base_steal_program (base, program_number);
|
old_program = mpegts_base_steal_program (base, program_number);
|
||||||
|
@ -911,6 +983,12 @@ no_program:
|
||||||
GST_ERROR ("Attempted to apply a PMT on a program that wasn't created");
|
GST_ERROR ("Attempted to apply a PMT on a program that wasn't created");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
same_program:
|
||||||
|
{
|
||||||
|
GST_DEBUG ("Not applying identical program");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue