mpegtsdemux: Not apply various time the same PMT to a program when repetead

Sometimes their are several times the same PMT applying to a same program in a stream,
tsdemux was totally baffled when this was happening, we now keep the one we
already applied so it works properly.
This commit is contained in:
Thibault Saunier 2012-02-17 12:15:27 -03:00
parent adc947e127
commit 8cb0e87f56

View file

@ -953,6 +953,8 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
{
gboolean res = TRUE;
GstStructure *structure = NULL;
gint program_number;
MpegTSBaseProgram *program = NULL;
/* table ids 0x70 - 0x73 do not have a crc */
if (G_LIKELY (section->table_id < 0x70 || section->table_id > 0x73)) {
@ -982,10 +984,22 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
break;
case 0x02:
structure = mpegts_packetizer_parse_pmt (base->packetizer, section);
if (G_LIKELY (structure))
if (G_UNLIKELY (structure == NULL))
return FALSE;
gst_structure_id_get (structure, QUARK_PROGRAM_NUMBER, G_TYPE_UINT,
&program_number, NULL);
program = mpegts_base_get_program (base, program_number);
/* We already have the same PMT for the current program in use, so we do
* not need to reset it */
if (program && program->active && program->pmt_pid == section->pid) {
GST_DEBUG ("Already have the PMT %u for program %i, not applying again",
program->pmt_pid, program_number);
res = TRUE;
} else {
mpegts_base_apply_pmt (base, section->pid, structure);
else
res = FALSE;
}
break;
case 0x40: