From 2b84beab51533a2dd8d14a5431812ddc02588144 Mon Sep 17 00:00:00 2001 From: gnattu Date: Mon, 21 Oct 2024 16:06:17 +0800 Subject: [PATCH] avcodec/audiotoolboxenc: fix 7.1 channel mapping and sample rate Both AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK and AV_CHANNEL_LAYOUT_7POINT1 should be mapped to kAudioChannelLayoutTag_AAC_7_1_B, otherwise neither the back surround channel nor the side surround channel has sound. aac_at has stricter sample rate than other encoders which should be spcified to enable auto resampling. alac with sample rate higher than 38400 will not play on Apple devices, although higher sample rates are accepted by the encoder All encoders provided by AudioToolbox can hanle 32bit integer samples, enable that for all encoders. --- .../0079-fix-atenc-layout-samplerate.patch | 67 +++++++++++++++++++ debian/patches/series | 1 + libavcodec/aarch64/flacencdsp_init.c | 0 3 files changed, 68 insertions(+) create mode 100644 debian/patches/0079-fix-atenc-layout-samplerate.patch create mode 100644 libavcodec/aarch64/flacencdsp_init.c diff --git a/debian/patches/0079-fix-atenc-layout-samplerate.patch b/debian/patches/0079-fix-atenc-layout-samplerate.patch new file mode 100644 index 00000000000..4de8cda5f1c --- /dev/null +++ b/debian/patches/0079-fix-atenc-layout-samplerate.patch @@ -0,0 +1,67 @@ +Index: FFmpeg/libavcodec/audiotoolboxenc.c +=================================================================== +--- FFmpeg.orig/libavcodec/audiotoolboxenc.c ++++ FFmpeg/libavcodec/audiotoolboxenc.c +@@ -235,8 +235,8 @@ static int get_aac_tag(const AVChannelLa + { AV_CHANNEL_LAYOUT_6POINT0, kAudioChannelLayoutTag_AAC_6_0 }, + { AV_CHANNEL_LAYOUT_6POINT1, kAudioChannelLayoutTag_AAC_6_1 }, + { AV_CHANNEL_LAYOUT_7POINT0, kAudioChannelLayoutTag_AAC_7_0 }, +- { AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK, kAudioChannelLayoutTag_AAC_7_1 }, +- { AV_CHANNEL_LAYOUT_7POINT1, kAudioChannelLayoutTag_MPEG_7_1_C }, ++ { AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK, kAudioChannelLayoutTag_AAC_7_1_B }, ++ { AV_CHANNEL_LAYOUT_7POINT1, kAudioChannelLayoutTag_AAC_7_1_B }, + }; + int i; + +@@ -633,7 +633,7 @@ static const AVOption options[] = { + .version = LIBAVUTIL_VERSION_INT, \ + }; + +-#define FFAT_ENC(NAME, ID, PROFILES, CAPS, CHANNEL_LAYOUTS, CH_LAYOUTS) \ ++#define FFAT_ENC(NAME, ID, PROFILES, CAPS, CHANNEL_LAYOUTS, CH_LAYOUTS, SAMPLE_RATES) \ + FFAT_ENC_CLASS(NAME) \ + const FFCodec ff_##NAME##_at_encoder = { \ + .p.name = #NAME "_at", \ +@@ -650,9 +650,10 @@ static const AVOption options[] = { + AV_CODEC_CAP_ENCODER_FLUSH CAPS, \ + .p.ch_layouts = CH_LAYOUTS, \ + .p.sample_fmts = (const enum AVSampleFormat[]) { \ +- AV_SAMPLE_FMT_S16, \ ++ AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,\ + AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NONE \ + }, \ ++ .p.supported_samplerates = SAMPLE_RATES, \ + .p.profiles = PROFILES, \ + .p.wrapper_name = "at", \ + }; +@@ -667,15 +668,25 @@ static const AVChannelLayout aac_at_ch_l + AV_CHANNEL_LAYOUT_6POINT0, + AV_CHANNEL_LAYOUT_6POINT1, + AV_CHANNEL_LAYOUT_7POINT0, ++ AV_CHANNEL_LAYOUT_7POINT1, + AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK, + AV_CHANNEL_LAYOUT_QUAD, + AV_CHANNEL_LAYOUT_OCTAGONAL, + { 0 }, + }; + +-FFAT_ENC(aac, AV_CODEC_ID_AAC, aac_profiles, , aac_at_channel_layouts, aac_at_ch_layouts) ++static const int aac_at_sample_rates[9] = { ++ 48000, 44100, 32000,24000, 22050, 16000, 12000, 11025, 8000 ++}; ++ ++static const int alac_at_sample_rates[16] = { ++ 384000, 352800, 192000, 176400, 96000, 88200, 64000, 48000, ++ 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 ++}; ++ ++FFAT_ENC(aac, AV_CODEC_ID_AAC, aac_profiles, , aac_at_channel_layouts, aac_at_ch_layouts, aac_at_sample_rates) + //FFAT_ENC(adpcm_ima_qt, AV_CODEC_ID_ADPCM_IMA_QT, NULL) +-FFAT_ENC(alac, AV_CODEC_ID_ALAC, NULL, , NULL, NULL) +-FFAT_ENC(ilbc, AV_CODEC_ID_ILBC, NULL, , NULL, NULL) +-FFAT_ENC(pcm_alaw, AV_CODEC_ID_PCM_ALAW, NULL, , NULL, NULL) +-FFAT_ENC(pcm_mulaw, AV_CODEC_ID_PCM_MULAW, NULL, , NULL, NULL) ++FFAT_ENC(alac, AV_CODEC_ID_ALAC, NULL, , NULL, NULL, alac_at_sample_rates) ++FFAT_ENC(ilbc, AV_CODEC_ID_ILBC, NULL, , NULL, NULL, aac_at_sample_rates) ++FFAT_ENC(pcm_alaw, AV_CODEC_ID_PCM_ALAW, NULL, , NULL, NULL, NULL) ++FFAT_ENC(pcm_mulaw, AV_CODEC_ID_PCM_MULAW, NULL, , NULL, NULL, NULL) diff --git a/debian/patches/series b/debian/patches/series index 3feb7ac5054..18f324345d7 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -76,3 +76,4 @@ 0076-alway-set-videotoolboxenc-pixel-buffer-info.patch 0077-add-remove-dovi-hdr10plus-bsf.patch 0078-validate-dovi-config-for-muxers.patch +0079-fix-atenc-layout-samplerate.patch diff --git a/libavcodec/aarch64/flacencdsp_init.c b/libavcodec/aarch64/flacencdsp_init.c new file mode 100644 index 00000000000..e69de29bb2d