diff mbox series

[FFmpeg-devel] avcodec/audiotoolbox Support float sample format

Message ID MgQdrIX--3-2@jasonfry.co.uk
State New
Headers show
Series [FFmpeg-devel] avcodec/audiotoolbox Support float sample format
Related show

Checks

Context Check Description
andriy/configure warning Failed to apply patch
andriy/configure warning Failed to apply patch

Commit Message

jason@jasonfry.co.uk Aug. 6, 2021, 1:29 p.m. UTC
Signed-off-by: Jason Fry <jason@jasonfry.co.uk>
---
libavcodec/audiotoolboxdec.c | 19 +++++++++++++++----
libavcodec/audiotoolboxenc.c |  2 +-
2 files changed, 16 insertions(+), 5 deletions(-)

--
2.30.0
diff mbox series

Patch

diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
index a222cde62e..f2a897c8c1 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -304,8 +304,16 @@  static av_cold int ffat_create_decoder(AVCodecContext *avctx,
     OSStatus status;
     int i;

-    enum AVSampleFormat sample_fmt = (avctx->bits_per_raw_sample == 32) ?
+    enum AVSampleFormat sample_fmt = avctx->sample_fmt;
+    if (sample_fmt == AV_SAMPLE_FMT_NONE) {
+      sample_fmt = (avctx->bits_per_raw_sample == 32) ?
                                      AV_SAMPLE_FMT_S32 : AV_SAMPLE_FMT_S16;
+      avctx->sample_fmt = sample_fmt;
+    } else if (sample_fmt != AV_SAMPLE_FMT_S16 &&
+               sample_fmt != AV_SAMPLE_FMT_S32 &&
+               sample_fmt != AV_SAMPLE_FMT_FLT) {
+      return AVERROR_UNKNOWN;
+    }

     AudioStreamBasicDescription in_format = {
         .mFormatID = ffat_get_format_id(avctx->codec_id, avctx->profile),
@@ -313,12 +321,13 @@  static av_cold int ffat_create_decoder(AVCodecContext *avctx,
     };
     AudioStreamBasicDescription out_format = {
         .mFormatID = kAudioFormatLinearPCM,
-        .mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
+        .mFormatFlags = (sample_fmt == AV_SAMPLE_FMT_FLT) ?
+                                    kAudioFormatFlagIsFloat :
+                                    kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
         .mFramesPerPacket = 1,
         .mBitsPerChannel = av_get_bytes_per_sample(sample_fmt) * 8,
     };

-    avctx->sample_fmt = sample_fmt;

     if (ffat_usable_extradata(avctx)) {
         UInt32 format_size = sizeof(in_format);
@@ -468,8 +477,10 @@  static void ffat_copy_samples(AVCodecContext *avctx, AVFrame *frame)
     ATDecodeContext *at = avctx->priv_data;
     if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
         COPY_SAMPLES(int32_t);
-    } else {
+    } else if (avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
         COPY_SAMPLES(int16_t);
+    } else {
+        COPY_SAMPLES(float_t);
     }
}

diff --git a/libavcodec/audiotoolboxenc.c b/libavcodec/audiotoolboxenc.c
index 9245aa9dc4..fddbd390f6 100644
--- a/libavcodec/audiotoolboxenc.c
+++ b/libavcodec/audiotoolboxenc.c
@@ -632,7 +632,7 @@  static const AVOption options[] = {
         .capabilities   = AV_CODEC_CAP_DELAY | \
                           AV_CODEC_CAP_ENCODER_FLUSH __VA_ARGS__, \
         .sample_fmts    = (const enum AVSampleFormat[]) { \
-            AV_SAMPLE_FMT_S16, \
+            AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT, \
             AV_SAMPLE_FMT_U8,  AV_SAMPLE_FMT_NONE \
         }, \
         .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, \