From ee3b7608cece47a8c602955eeed6ae57ac3f63a8 Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
Date: Sun, 6 Nov 2022 21:26:37 +0100
Subject: [PATCH 2/2] lavc/audiotoolboxdec: Support 20/24/32bit Apple Lossless
 decoding.

---
 libavcodec/audiotoolboxdec.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
index f36294f84c..c1141db857 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -307,6 +307,10 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
     OSStatus status;
     int i;
     enum AVSampleFormat sample_fmt;
+    int apple_lossless_format_flags = kAppleLosslessFormatFlag_32BitSourceData |
+                                      kAppleLosslessFormatFlag_24BitSourceData |
+                                      kAppleLosslessFormatFlag_20BitSourceData |
+                                      kAppleLosslessFormatFlag_16BitSourceData;
     AudioStreamBasicDescription in_format = {
         .mFormatID = ffat_get_format_id(avctx->codec_id, avctx->profile),
         .mBytesPerPacket = (avctx->codec_id == AV_CODEC_ID_ILBC) ? avctx->block_align : 0,
@@ -359,7 +363,26 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx,
         in_format.mChannelsPerFrame = avctx->ch_layout.nb_channels ? avctx->ch_layout.nb_channels : 1;
     }
 
+    if (avctx->bits_per_raw_sample) {
         sample_fmt = avctx->bits_per_raw_sample == 32 ? AV_SAMPLE_FMT_S32 : AV_SAMPLE_FMT_S16;
+    } else {
+        switch (in_format.mFormatFlags & apple_lossless_format_flags) {
+        case kAppleLosslessFormatFlag_32BitSourceData:
+            sample_fmt = AV_SAMPLE_FMT_S32;
+            break;
+        case kAppleLosslessFormatFlag_24BitSourceData:
+            sample_fmt = AV_SAMPLE_FMT_S32;
+            avctx->bits_per_raw_sample = 24;
+            break;
+        case kAppleLosslessFormatFlag_20BitSourceData:
+            sample_fmt = AV_SAMPLE_FMT_S32;
+            avctx->bits_per_raw_sample = 20;
+            break;
+        case kAppleLosslessFormatFlag_16BitSourceData:
+        default:
+            sample_fmt = AV_SAMPLE_FMT_S16;
+        }
+    }
 
     AudioStreamBasicDescription out_format = {
         .mFormatID = kAudioFormatLinearPCM,
-- 
2.37.0 (Apple Git-136)

