]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb_psi_pmt: Recognize AC-4 audio descriptor
authorKacper Michajłow <kasper93@gmail.com>
Mon, 28 Nov 2022 19:59:26 +0000 (20:59 +0100)
committerFlole998 <Flole998@users.noreply.github.com>
Mon, 28 Nov 2022 21:32:20 +0000 (22:32 +0100)
This allows pass-through of AC-4 audio stream.

Will need adjustment when AC-4 gets support in FFmpeg to enable
transcode.

Link: https://tvheadend.org/issues/6222
Signed-off-by: Kacper Michajłow <kasper93@gmail.com>
12 files changed:
src/esfilter.h
src/esstream.h
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi_pmt.c
src/libav.c
src/muxer.c
src/muxer.h
src/muxer/muxer_audioes.c
src/muxer/muxer_libav.c
src/muxer/muxer_mkv.c
src/profile.c
src/streaming.c

index 86d0c8a07e3f71ee65b9ac6f65c6b628d46118fe..82957e3e7c4bd179758d164aeaeb0af548741976 100644 (file)
@@ -51,7 +51,7 @@ extern const idclass_t esfilter_class_other;
 #define ESF_MASK_AUDIO \
   (SCT_MASK(SCT_MPEG2AUDIO) | SCT_MASK(SCT_AC3) | SCT_MASK(SCT_AAC) | \
    SCT_MASK(SCT_EAC3) | SCT_MASK(SCT_MP4A) | SCT_MASK(SCT_VORBIS) | \
-   SCT_MASK(SCT_OPUS) | SCT_MASK(SCT_FLAC))
+   SCT_MASK(SCT_OPUS) | SCT_MASK(SCT_FLAC) | SCT_MASK(SCT_AC4))
 
 #define ESF_MASK_TELETEXT \
   SCT_MASK(SCT_TELETEXT)
index a2cb440030a38729149de3eafdfc61c8ac9f7b17..592a6933dc7f07749d1a7247e73a80eb4afb1924 100644 (file)
@@ -65,7 +65,8 @@ enum streaming_component_type {
   SCT_THEORA,
   SCT_OPUS,
   SCT_FLAC,
-  SCT_LAST = SCT_FLAC
+  SCT_AC4,
+  SCT_LAST = SCT_AC4
 };
 
 #define SCT_MASK(t) (1 << (t))
@@ -77,7 +78,8 @@ enum streaming_component_type {
 #define SCT_ISAUDIO(t) ((t) == SCT_MPEG2AUDIO || (t) == SCT_AC3 || \
                        (t) == SCT_AAC  || (t) == SCT_MP4A || \
                        (t) == SCT_EAC3 || (t) == SCT_VORBIS || \
-                       (t) == SCT_OPUS || (t) == SCT_FLAC)
+                       (t) == SCT_OPUS || (t) == SCT_FLAC || \
+                       (t) == SCT_AC4)
 
 #define SCT_ISAV(t) (SCT_ISVIDEO(t) || SCT_ISAUDIO(t))
 
index 0cc367be226e43054815240d38e69d6b96438e67..3f9411eb507f779188efec42eeeabe84bf0d9acd 100644 (file)
@@ -167,6 +167,7 @@ struct lang_str;
 #define DVB_DESC_CRID                 0x76
 #define DVB_DESC_EAC3                 0x7A
 #define DVB_DESC_AAC                  0x7C
+#define DVB_DESC_AC4                  0x7F
 
 #define DVB_DESC_BSKYB_LCN            0xB1
 
index cab116a1f5843140c04b4a25652edf622ea6ebd9..df14f47ec7890c2a0588eacd80d60451814a3856 100644 (file)
@@ -439,6 +439,11 @@ dvb_psi_parse_pmt
           hts_stream_type = SCT_EAC3;
         break;
 
+      case DVB_DESC_AC4:
+        if(estype == 0x06 || estype == 0x81)
+          hts_stream_type = SCT_AC4;
+        break;
+
       case DVB_DESC_ANCILLARY_DATA:
         if(dlen < 1)
           break;
index e87e2cd001fdc2551e8e4cd58019df221380cc7e..2827135713acf1322c838760bc5fa7e5dd38a6c3 100644 (file)
@@ -116,6 +116,10 @@ streaming_component_type2codec_id(streaming_component_type_t type)
   case SCT_EAC3:
     codec_id = AV_CODEC_ID_EAC3;
     break;
+  // Enable once supported, see https://trac.ffmpeg.org/ticket/8349
+  // case SCT_AC4:
+  //   codec_id = AV_CODEC_ID_AC4;
+  //   break;
   case SCT_MP4A:
   case SCT_AAC:
     codec_id = AV_CODEC_ID_AAC;
@@ -179,6 +183,10 @@ codec_id2streaming_component_type(enum AVCodecID id)
   case AV_CODEC_ID_EAC3:
     type = SCT_EAC3;
     break;
+  // Enable once supported, see https://trac.ffmpeg.org/ticket/8349
+  // case AV_CODEC_ID_AC4:
+  //   type = SCT_AC4;
+  //   break;
   case AV_CODEC_ID_AAC:
     type = SCT_AAC;
     break;
index bbf189c46a37f725f64dbec070c2a9cb2250ba91..81b9cea4ce65d4474bb6d97ae673db3d5050f619 100644 (file)
@@ -51,6 +51,7 @@ static struct strtab container_audio_mime[] = {
   { "audio/mpeg",               MC_MPEGPS },
   { "audio/mpeg",               MC_MPEG2AUDIO },
   { "audio/ac3",                MC_AC3 },
+  { "audio/ac4",                MC_AC4 },
   { "audio/aac",                MC_AAC },
   { "audio/aac",                MC_MP4A },
   { "audio/ogg",                MC_VORBIS },
@@ -96,6 +97,7 @@ static struct strtab container_name[] = {
   { "aac",        MC_AAC },
   { "mp4a",       MC_MP4A },
   { "oga",        MC_VORBIS },
+  { "ac4",        MC_AC4 },
 };
 
 
@@ -118,6 +120,7 @@ static struct strtab container_audio_file_suffix[] = {
   { "aac",  MC_AAC },
   { "mp4a", MC_MP4A },
   { "oga",  MC_VORBIS },
+  { "ac4",  MC_AC4 },
 };
 
 
index e9f2bc22fbf12966f7dc16bc0623b0d378209364..7cf591f96c6a2b0a0f48c9aee80df41d4afe19bf 100644 (file)
@@ -41,7 +41,8 @@ typedef enum {
   MC_AC3         = 11,
   MC_AAC         = 12,
   MC_MP4A        = 13,
-  MC_VORBIS      = 14
+  MC_VORBIS      = 14,
+  MC_AC4         = 15
 } muxer_container_type_t;
 
 typedef enum {
index fb678fd7d61bc844444a8b9328fa30f8c191ef37..ab0ca2884bd9f09ab2043918928d2ab681bf8e23 100644 (file)
@@ -61,6 +61,7 @@ audioes_muxer_type(streaming_component_type_t type)
   case SCT_AAC:         mc = MC_AAC; break;
   case SCT_MP4A:        mc = MC_MP4A; break;
   case SCT_VORBIS:      mc = MC_VORBIS; break;
+  case SCT_AC4:         mc = MC_AC4; break;
   default: break;
   }
   return mc;
@@ -302,7 +303,8 @@ audioes_muxer_create(const muxer_config_t *m_cfg,
      m_cfg->m_type != MC_AC3 &&
      m_cfg->m_type != MC_AAC &&
      m_cfg->m_type != MC_MP4A &&
-     m_cfg->m_type != MC_VORBIS)
+     m_cfg->m_type != MC_VORBIS &&
+     m_cfg->m_type != MC_AC4)
     return NULL;
 
   am = calloc(1, sizeof(audioes_muxer_t));
index 76822173a48822c95e027860a9e1d44add5edcbd..792c586f38cbf58222e934b117d78c5f4ad3f2a8 100644 (file)
@@ -216,6 +216,7 @@ lav_muxer_support_stream(muxer_container_type_t mc,
     ret |= (type == SCT_AAC);
     ret |= (type == SCT_MP4A);
     ret |= (type == SCT_EAC3);
+    ret |= (type == SCT_AC4);
 
     //Some pids lack pts, disable for now
     //ret |= (type == SCT_TELETEXT);
@@ -238,6 +239,7 @@ lav_muxer_support_stream(muxer_container_type_t mc,
     ret |= (type == SCT_AAC);
     ret |= (type == SCT_MP4A);
     ret |= (type == SCT_EAC3);
+    ret |= (type == SCT_AC4);
     break;
 
   default:
index 30f4f653d1809adeaf73299c536c3cd7609a1da7..5b71c006f53e46e91ac803f63141ab21daadab18 100644 (file)
@@ -343,6 +343,11 @@ mk_build_tracks(mk_muxer_t *mk, streaming_start_t *ss)
       codec_id = "A_EAC3";
       break;
 
+    case SCT_AC4:
+      tracktype = 2;
+      codec_id = "A_AC4";
+      break;
+
     case SCT_MP4A:
     case SCT_AAC:
       tracktype = 2;
index 554fb0235083e3030f9462f429d48d6895c8ea56..3a0bc8d628619e0611584c74a0d54f6cb183460b 100644 (file)
@@ -1929,6 +1929,7 @@ profile_class_mc_audio_list ( void *o, const char *lang )
     { N_("AAC audio"),                    MC_AAC },
     { N_("MP4 audio"),                    MC_MP4A },
     { N_("Vorbis audio"),                 MC_VORBIS },
+    { N_("AC-4 audio"),                   MC_AC4, },
   };
   return strtab2htsmsg(tab, 1, lang);
 }
@@ -2390,6 +2391,7 @@ static const struct strtab_str profile_class_src_acodec_tab[] = {
   { "EAC3",                  "EAC3" },
   { "VORBIS",                "VORBIS" },
   { "OPUS",                  "OPUS" },
+  { "AC-4",                  "AC-4" },
 };
 
 static int
@@ -2634,6 +2636,7 @@ profile_transcode_mc_valid(int mc)
   case MC_MPEGPS:
   case MC_MPEG2AUDIO:
   case MC_AC3:
+  case MC_AC4:
   case MC_AAC:
   case MC_VORBIS:
   case MC_AVMATROSKA:
index 8f4349a2a38142017402505787f2482a907f8f9b..54f48b9ec51f56d590703ca90c7292ec19946939 100644 (file)
@@ -589,6 +589,7 @@ static struct strtab streamtypetab[] = {
   { "THEORA",     SCT_THEORA },
   { "OPUS",       SCT_OPUS },
   { "FLAC",       SCT_FLAC },
+  { "AC-4",       SCT_AC4 },
 };
 
 /**