mpegtsdemux: Not apply various time the same PMT to a program when repetead
authorThibault Saunier <thibault.saunier@collabora.com>
Fri, 17 Feb 2012 15:15:27 +0000 (12:15 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Fri, 17 Feb 2012 15:19:20 +0000 (12:19 -0300)
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.

gst/mpegtsdemux/mpegtsbase.c

index 363eeaf..1232338 100644 (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: