gst-plugins-bad: tsdemux: Support more DTS/AC3 descriptors

Edward Hervey bilboed at kemper.freedesktop.org
Fri Feb 24 09:00:46 PST 2012


Module: gst-plugins-bad
Branch: master
Commit: 67fd590e9aef3a4487c31fe6e1493cfd2177ee12
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=67fd590e9aef3a4487c31fe6e1493cfd2177ee12

Author: Thibault Saunier <thibault.saunier at collabora.com>
Date:   Mon Feb 20 17:32:21 2012 -0300

tsdemux: Support more DTS/AC3 descriptors

---

 gst/mpegtsdemux/gstmpegdesc.h |   18 +++++++++---
 gst/mpegtsdemux/tsdemux.c     |   57 +++++++++++++++++++++++++++++++++--------
 2 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/gst/mpegtsdemux/gstmpegdesc.h b/gst/mpegtsdemux/gstmpegdesc.h
index 06aa17b..f2640ad 100644
--- a/gst/mpegtsdemux/gstmpegdesc.h
+++ b/gst/mpegtsdemux/gstmpegdesc.h
@@ -140,6 +140,7 @@
 #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 */
@@ -315,14 +316,21 @@
 /* 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);
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 4ed9b76..5be489e 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -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);



More information about the gstreamer-commits mailing list