tsdemux: Add more AC3 detection cases
authorEdward Hervey <edward@collabora.com>
Mon, 29 Jul 2013 06:23:30 +0000 (08:23 +0200)
committerEdward Hervey <edward@collabora.com>
Mon, 29 Jul 2013 07:42:11 +0000 (09:42 +0200)
ATSC ac3 streams are always guaranteed to be AC3 if EAC3 descriptor
is not present
If stream registration id is 'AC-3' then it's also guaranteed to be AC3.
Finally if AC3 descriptor is present it's guaranteed to be AC3.

Only silences a warning, but still.

gst/mpegtsdemux/gstmpegdesc.h
gst/mpegtsdemux/tsdemux.c

index 6bb9d4ce38e7e12902745108abe477f507dc58fd..fcb473409ad60ee7941e50610627817f3d2e638d 100644 (file)
 #define DRF_ID_DTS3       0x44545333
 #define DRF_ID_S302M      0x42535344
 #define DRF_ID_TSHV       0x54534856
+#define DRF_ID_AC3        0x41432d33
+#define DRF_ID_GA94       0x47413934
+#define DRF_ID_CUEI       0x43554549
 
 #endif /* __GST_MPEG_DESC_H__ */
index 54118117b6b2c009e81147bfc2f29501d166c148..927577735f7d3991415231434ed8d5d8ab262cb0 100644 (file)
@@ -946,12 +946,22 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
         break;
       }
 
-      /* DVB_AC3 */
-      desc = mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_AC3);
-      if (!desc)
-        GST_WARNING ("AC3 stream type found but no corresponding "
-            "descriptor to differentiate between AC3 and EAC3. "
-            "Assuming plain AC3.");
+      /* If stream has ac3 descriptor 
+       * OR program is ATSC (GA94)
+       * OR stream registration is AC-3
+       * then it's regular AC3 */
+      if (bstream->registration_id == DRF_ID_AC3 ||
+          program->registration_id == DRF_ID_GA94 ||
+          mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_AC3)) {
+        template = gst_static_pad_template_get (&audio_template);
+        name = g_strdup_printf ("audio_%04x", bstream->pid);
+        caps = gst_caps_new_empty_simple ("audio/x-ac3");
+        break;
+      }
+
+      GST_WARNING ("AC3 stream type found but no guaranteed "
+          "way found to differentiate between AC3 and EAC3. "
+          "Assuming plain AC3.");
       template = gst_static_pad_template_get (&audio_template);
       name = g_strdup_printf ("audio_%04x", bstream->pid);
       caps = gst_caps_new_empty_simple ("audio/x-ac3");