mpegtsbase/packetizer: Add CAT section handling
authorEdward Hervey <edward.hervey@collabora.co.uk>
Sun, 3 Jun 2012 08:56:28 +0000 (10:56 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 5 Jun 2012 08:54:25 +0000 (10:54 +0200)
Allows reporting the global EMM

gst/mpegtsdemux/mpegtsbase.c
gst/mpegtsdemux/mpegtspacketizer.c
gst/mpegtsdemux/mpegtspacketizer.h

index 188276feb62668531b356bae08841afe92d99390..f3144df876a612d6bd591228c2a7c78f61f95ad7 100644 (file)
@@ -1011,6 +1011,16 @@ same_program:
   }
 }
 
+static void
+mpegts_base_apply_cat (MpegTSBase * base, GstStructure * cat_info)
+{
+  GST_DEBUG_OBJECT (base, "CAT %" GST_PTR_FORMAT, cat_info);
+
+  gst_element_post_message (GST_ELEMENT_CAST (base),
+      gst_message_new_element (GST_OBJECT (base),
+          gst_structure_copy (cat_info)));
+}
+
 static void
 mpegts_base_apply_nit (MpegTSBase * base,
     guint16 pmt_pid, GstStructure * nit_info)
@@ -1099,7 +1109,16 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
         res = FALSE;
 
       break;
+    case 0x01:
+      /* CAT */
+      structure = mpegts_packetizer_parse_cat (base->packetizer, section);
+      if (structure)
+        mpegts_base_apply_cat (base, structure);
+      else
+        res = FALSE;
+      break;
     case 0x02:
+      /* PMT */
       structure = mpegts_packetizer_parse_pmt (base->packetizer, section);
       if (G_LIKELY (structure))
         mpegts_base_apply_pmt (base, section->pid, structure);
index c1b0144a03e4bbc5a95ba41781e4aeecbbeccd6b..6e49f670a32043f51b2c9ed2c88279713dc633b9 100644 (file)
@@ -48,6 +48,8 @@ static GQuark QUARK_PROGRAM_NUMBER;
 static GQuark QUARK_PID;
 static GQuark QUARK_PROGRAMS;
 
+static GQuark QUARK_CAT;
+
 static GQuark QUARK_PMT;
 static GQuark QUARK_PCR_PID;
 static GQuark QUARK_VERSION_NUMBER;
@@ -522,6 +524,56 @@ error:
   return FALSE;
 }
 
+GstStructure *
+mpegts_packetizer_parse_cat (MpegTSPacketizer2 * packetizer,
+    MpegTSPacketizerSection * section)
+{
+  GstStructure *cat_info = NULL;
+  guint8 *data;
+  guint8 tmp;
+  GValueArray *descriptors;
+  GstMPEGDescriptor *desc;
+  guint desc_len;
+
+  /* Skip parts already parsed */
+  data = section->data + 3;
+
+  /* reserved  : 18bits */
+  data += 2;
+
+  /* version_number         : 5 bits
+   * current_next_indicator : 1 bit */
+  tmp = *data++;
+  section->version_number = (tmp >> 1) & 0x1F;
+  section->current_next_indicator = tmp & 0x01;
+
+  /* skip already handled section_number and last_section_number */
+  data += 2;
+
+  cat_info = gst_structure_new_id_empty (QUARK_CAT);
+
+  /* descriptors */
+  desc_len = section->section_length - 4 - 8;
+  desc = gst_mpeg_descriptor_parse (data, desc_len);
+  if (desc)
+    gst_mpeg_descriptor_free (desc);
+  descriptors = g_value_array_new (0);
+  if (!mpegts_packetizer_parse_descriptors (packetizer, &data, data + desc_len,
+          descriptors)) {
+    g_value_array_free (descriptors);
+    goto error;
+  }
+  gst_structure_id_set (cat_info, QUARK_DESCRIPTORS, G_TYPE_VALUE_ARRAY,
+      descriptors, NULL);
+  g_value_array_free (descriptors);
+
+  return cat_info;
+error:
+  if (cat_info)
+    gst_structure_free (cat_info);
+  return NULL;
+}
+
 GstStructure *
 mpegts_packetizer_parse_pat (MpegTSPacketizer2 * packetizer,
     MpegTSPacketizerSection * section)
@@ -2579,6 +2631,8 @@ _init_local (void)
   QUARK_PID = g_quark_from_string ("pid");
   QUARK_PROGRAMS = g_quark_from_string ("programs");
 
+  QUARK_CAT = g_quark_from_string ("pat");
+
   QUARK_PMT = g_quark_from_string ("pmt");
   QUARK_PCR_PID = g_quark_from_string ("pcr-pid");
   QUARK_VERSION_NUMBER = g_quark_from_string ("version-number");
index 2e6d2c419f88b8ee3613d6648497a3b495200ebc..b3600591a9239cb178fdc9a550480427274d6f53 100644 (file)
@@ -192,6 +192,8 @@ void mpegts_packetizer_remove_stream(MpegTSPacketizer2 *packetizer,
 
 gboolean mpegts_packetizer_push_section (MpegTSPacketizer2 *packetzer,
   MpegTSPacketizerPacket *packet, MpegTSPacketizerSection *section);
+GstStructure *mpegts_packetizer_parse_cat (MpegTSPacketizer2 *packetizer,
+  MpegTSPacketizerSection *section);
 GstStructure *mpegts_packetizer_parse_pat (MpegTSPacketizer2 *packetizer,
   MpegTSPacketizerSection *section);
 GstStructure *mpegts_packetizer_parse_pmt (MpegTSPacketizer2 *packetizer,