gst/mpegtsparse/: Parse the extended event descriptor.
authorZaheer Abbas Merali <zaheerabbas@merali.org>
Mon, 16 Jun 2008 09:22:30 +0000 (09:22 +0000)
committerZaheer Abbas Merali <zaheerabbas@merali.org>
Mon, 16 Jun 2008 09:22:30 +0000 (09:22 +0000)
Original commit message from CVS:
* gst/mpegtsparse/gstmpegdesc.h:
* gst/mpegtsparse/mpegtspacketizer.c:
Parse the extended event descriptor.

ChangeLog
gst/mpegtsparse/gstmpegdesc.h
gst/mpegtsparse/mpegtspacketizer.c

index 209858a581baf373cedd123214746b65c921f31a..1981971afcd4f040c8839b1517a260bf68955358 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-06-16  Zaheer Abbas Merali  <zaheerabbas at merali dot org>
+
+       * gst/mpegtsparse/gstmpegdesc.h:
+       * gst/mpegtsparse/mpegtspacketizer.c:
+       Parse the extended event descriptor.
+
 2008-06-16  Stefan Kost  <ensonic@users.sf.net>
 
        * gst/rtpmanager/gstrtpjitterbuffer.c:
index 494a2498ba29c24409164693434ccfb0eb1294df..0513fa94513a6b4301805832ecb87f96aa087374 100644 (file)
 #define DESC_DVB_SHORT_EVENT_description_text(desc) (desc + 6 + DESC_DVB_SHORT_EVENT_name_length(desc) + 1)
 #define DESC_DVB_SHORT_EVENT_description_length(desc)  (desc[6 + DESC_DVB_SHORT_EVENT_name_length(desc)])
 
+/* DVB Extended Event Descriptor */
+#define DESC_DVB_EXTENDED_EVENT_descriptor_number(desc) ((desc[2] & 0xF0) >> 4)
+#define DESC_DVB_EXTENDED_EVENT_last_descriptor_number(desc) (desc[2] & 0x0F)
+#define DESC_DVB_EXTENDED_EVENT_iso639_language_code(desc) (desc + 3)
+#define DESC_DVB_EXTENDED_EVENT_items_length(desc) (desc[6])
+#define DESC_DVB_EXTENDED_EVENT_items(desc) (desc + 7) 
+#define DESC_DVB_EXTENDED_EVENT_text_length(desc) (desc[6 + DESC_DVB_EXTENDED_EVENT_items_length(desc)])
+#define DESC_DVB_EXTENDED_EVENT_text(desc) (desc + 6 + DESC_DVB_EXTENDED_EVENT_items_length(desc) + 1)
+
 /* DVB Satellite Delivery System Descriptor */
 #define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_frequency(desc)     (desc + 2)
 #define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_orbital_position(desc)      (desc + 6)
index 220bd49bf33e9af37dda0fabce1b3eecdcf6f83f..3b108f991604dd80eb01a9a98dab7cd2eb65757b 100644 (file)
@@ -1419,6 +1419,7 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer * packetizer,
     if (descriptors_loop_length) {
       guint8 *event_descriptor;
       GArray *component_descriptors;
+      GArray *extended_event_descriptors;
       GstMPEGDescriptor *mpegdescriptor;
 
       if (data + descriptors_loop_length > end - 4) {
@@ -1457,6 +1458,45 @@ mpegts_packetizer_parse_eit (MpegTSPacketizer * packetizer,
           g_free (eventdescription_tmp);
         }
       }
+      extended_event_descriptors = gst_mpeg_descriptor_find_all (mpegdescriptor,
+          DESC_DVB_EXTENDED_EVENT);
+      if (extended_event_descriptors) {
+        int i;
+        guint8 *extended_descriptor;
+        /*GValue extended_items = { 0 }; */
+        gchar *extended_text = NULL;
+        /*g_value_init (&extended_items, GST_TYPE_LIST); */
+        for (i = 0; i < extended_event_descriptors->len; i++) {
+          extended_descriptor = g_array_index (extended_event_descriptors,
+              guint8 *, i);
+          if (DESC_DVB_EXTENDED_EVENT_descriptor_number (extended_descriptor) ==
+              i) {
+            if (extended_text) {
+              gchar *tmp;
+              gchar *old_extended_text = extended_text;
+              tmp =
+                  g_strndup ((gchar *)
+                  DESC_DVB_EXTENDED_EVENT_text (extended_descriptor),
+                  DESC_DVB_EXTENDED_EVENT_text_length (extended_descriptor));
+              extended_text = g_strdup_printf ("%s%s", extended_text, tmp);
+              g_free (old_extended_text);
+              g_free (tmp);
+            } else {
+              extended_text =
+                  g_strndup ((gchar *)
+                  DESC_DVB_EXTENDED_EVENT_text (extended_descriptor),
+                  DESC_DVB_EXTENDED_EVENT_text_length (extended_descriptor));
+            }
+          }
+        }
+        if (extended_text) {
+          gst_structure_set (event, "extended-text", G_TYPE_STRING,
+              extended_text, NULL);
+          g_free (extended_text);
+        }
+        g_array_free (extended_event_descriptors, TRUE);
+      }
+
       component_descriptors = gst_mpeg_descriptor_find_all (mpegdescriptor,
           DESC_DVB_COMPONENT);
       if (component_descriptors) {