tsdemux: Support more DTS/AC3 descriptors
authorThibault Saunier <thibault.saunier@collabora.com>
Mon, 20 Feb 2012 20:32:21 +0000 (17:32 -0300)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Fri, 24 Feb 2012 09:56:58 +0000 (10:56 +0100)
gst/mpegtsdemux/gstmpegdesc.h
gst/mpegtsdemux/tsdemux.c

index 06aa17b..f2640ad 100644 (file)
 #define DESC_DVB_EXTENSION      0x7F
 /* 0x80 - 0xFE are user defined */
 #define DESC_DTG_LOGICAL_CHANNEL       0x83 /* from DTG D-Book */
+#define DESC_AC3_AUDIO_STREAM                 0x81
 /* 0xFF is forbidden */
 
 /* common for all descriptors */
 /* DVB Carousel Identifier Descriptor */
 #define DESC_DVB_CAROUSEL_IDENTIFIER_carousel_id(desc)         (GST_READ_UINT32_BE((desc) + 2))
 
+/* AC3_audio_stream_descriptor */
+#define DESC_AC_AUDIO_STREAM_bsid(desc)             ((desc)[2] & 0x1f)
+
 /* registration_descriptor format IDs */
 #define DRF_ID_HDMV       0x48444d56
 #define DRF_ID_VC1        0x56432D31   /* defined in RP227 */
-
-typedef struct {
-  guint    n_desc;
-  guint8   data_length;
-  guint8  *data;
+#define DRF_ID_DTS1       0x44545331
+#define DRF_ID_DTS2       0x44545332
+#define DRF_ID_DTS3       0x44545333
+
+typedef struct
+{
+  guint n_desc;
+  guint8 data_length;
+  guint8 *data;
 } GstMPEGDescriptor;
 
 void gst_mpegtsdesc_init_debug (void);
index 4ed9b76..5be489e 100644 (file)
@@ -1020,8 +1020,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
       break;
     case ST_PRIVATE_DATA:
       GST_LOG ("private data");
-      desc =
-          mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+      desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
           DESC_DVB_AC3);
       if (desc) {
         GST_LOG ("ac3 audio");
@@ -1031,8 +1030,8 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
         g_free (desc);
         break;
       }
-      desc =
-          mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+
+      desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
           DESC_DVB_ENHANCED_AC3);
       if (desc) {
         GST_LOG ("ac3 audio");
@@ -1042,8 +1041,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
         g_free (desc);
         break;
       }
-      desc =
-          mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+      desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
           DESC_DVB_TELETEXT);
       if (desc) {
         GST_LOG ("teletext");
@@ -1064,6 +1062,26 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
         g_free (desc);
         break;
       }
+
+      desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+          DESC_REGISTRATION);
+      if (desc) {
+        switch (DESC_REGISTRATION_format_identifier (desc)) {
+          case DRF_ID_DTS1:
+          case DRF_ID_DTS2:
+          case DRF_ID_DTS3:
+            /* SMPTE registered DTS */
+            GST_LOG ("subtitling");
+            template = gst_static_pad_template_get (&private_template);
+            name = g_strdup_printf ("private_%04x", bstream->pid);
+            caps = gst_caps_new_simple ("audio/x-dts", NULL);
+            break;
+        }
+        g_free (desc);
+      }
+      if (template)
+        break;
+
       /* hack for itv hd (sid 10510, video pid 3401 */
       if (program->program_number == 10510 && bstream->pid == 3401) {
         template = gst_static_pad_template_get (&video_template);
@@ -1167,18 +1185,35 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
       desc = mpegts_get_descriptor_from_program (program, DESC_REGISTRATION);
       if (desc) {
         if (DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) {
-          template = gst_static_pad_template_get (&audio_template);
-          name = g_strdup_printf ("audio_%04x", bstream->pid);
-          caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+          guint8 *ac3_desc;
+
+          /* ATSC ac3 audio descriptor */
+          ac3_desc =
+              mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+              DESC_AC3_AUDIO_STREAM);
+          if (ac3_desc && DESC_AC_AUDIO_STREAM_bsid (ac3_desc) != 16) {
+            GST_LOG ("ac3 audio");
+            template = gst_static_pad_template_get (&audio_template);
+            name = g_strdup_printf ("audio_%04x", bstream->pid);
+            caps = gst_caps_new_simple ("audio/x-ac3", NULL);
+
+            g_free (ac3_desc);
+          } else {
+            template = gst_static_pad_template_get (&audio_template);
+            name = g_strdup_printf ("audio_%04x", bstream->pid);
+            caps = gst_caps_new_simple ("audio/x-eac3", NULL);
+          }
+
         }
+
         g_free (desc);
       }
       if (template)
         break;
 
+
       /* DVB_ENHANCED_AC3 */
-      desc =
-          mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
+      desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream,
           DESC_DVB_ENHANCED_AC3);
       if (desc) {
         template = gst_static_pad_template_get (&audio_template);