From: Kacper Michajłow Date: Mon, 28 Nov 2022 19:59:26 +0000 (+0100) Subject: dvb_psi_pmt: Recognize AC-4 audio descriptor X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=765d3ed4fd0cc87f8b8594b296833f490ae86ebd;p=thirdparty%2Ftvheadend.git dvb_psi_pmt: Recognize AC-4 audio descriptor 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 --- diff --git a/src/esfilter.h b/src/esfilter.h index 86d0c8a07..82957e3e7 100644 --- a/src/esfilter.h +++ b/src/esfilter.h @@ -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) diff --git a/src/esstream.h b/src/esstream.h index a2cb44003..592a6933d 100644 --- a/src/esstream.h +++ b/src/esstream.h @@ -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)) diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 0cc367be2..3f9411eb5 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -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 diff --git a/src/input/mpegts/dvb_psi_pmt.c b/src/input/mpegts/dvb_psi_pmt.c index cab116a1f..df14f47ec 100644 --- a/src/input/mpegts/dvb_psi_pmt.c +++ b/src/input/mpegts/dvb_psi_pmt.c @@ -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; diff --git a/src/libav.c b/src/libav.c index e87e2cd00..282713571 100644 --- a/src/libav.c +++ b/src/libav.c @@ -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; diff --git a/src/muxer.c b/src/muxer.c index bbf189c46..81b9cea4c 100644 --- a/src/muxer.c +++ b/src/muxer.c @@ -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 }, }; diff --git a/src/muxer.h b/src/muxer.h index e9f2bc22f..7cf591f96 100644 --- a/src/muxer.h +++ b/src/muxer.h @@ -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 { diff --git a/src/muxer/muxer_audioes.c b/src/muxer/muxer_audioes.c index fb678fd7d..ab0ca2884 100644 --- a/src/muxer/muxer_audioes.c +++ b/src/muxer/muxer_audioes.c @@ -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)); diff --git a/src/muxer/muxer_libav.c b/src/muxer/muxer_libav.c index 76822173a..792c586f3 100644 --- a/src/muxer/muxer_libav.c +++ b/src/muxer/muxer_libav.c @@ -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: diff --git a/src/muxer/muxer_mkv.c b/src/muxer/muxer_mkv.c index 30f4f653d..5b71c006f 100644 --- a/src/muxer/muxer_mkv.c +++ b/src/muxer/muxer_mkv.c @@ -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; diff --git a/src/profile.c b/src/profile.c index 554fb0235..3a0bc8d62 100644 --- a/src/profile.c +++ b/src/profile.c @@ -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: diff --git a/src/streaming.c b/src/streaming.c index 8f4349a2a..54f48b9ec 100644 --- a/src/streaming.c +++ b/src/streaming.c @@ -589,6 +589,7 @@ static struct strtab streamtypetab[] = { { "THEORA", SCT_THEORA }, { "OPUS", SCT_OPUS }, { "FLAC", SCT_FLAC }, + { "AC-4", SCT_AC4 }, }; /**