Hi,

2014-08-18 17:51 GMT+02:00 Timothy Gu <timothyg...@gmail.com>:
>> Prior to 56.1.100, incorrect ALAC files for 24bps content were produced, in
>> particular not decoding losslessly.
>
> That is the FFmpeg libavcodec version number.

And it just happens it was bumped, not for that reason. I've removed
the mention of the version in the updated attached patch, but maybe
that patch can be added during an API bump and the commit message made
to match it.

-- 
Christophe
From 6aaa4f8171a05040a3f8de2a9d238ae546000dd5 Mon Sep 17 00:00:00 2001
From: Christophe Gisquet <christophe.gisq...@gmail.com>
Date: Mon, 18 Aug 2014 09:53:20 +0200
Subject: [PATCH 3/3] alac: add option to decode incorrect ALAC

Prior to fixing the encoder, incorrect ALAC files for 24bps content were
produced, in particular not decoding losslessly.

Add the codec option extra_bits_bug to allow correctly decoding those
streams.
---
 libavcodec/alac.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index 5272f84..0776b4f 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -48,6 +48,7 @@
 #include <inttypes.h>
 
 #include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
 #include "avcodec.h"
 #include "get_bits.h"
 #include "bytestream.h"
@@ -59,6 +60,7 @@
 #define ALAC_EXTRADATA_SIZE 36
 
 typedef struct {
+    AVClass        *class;
     AVCodecContext *avctx;
     GetBitContext gb;
     int channels;
@@ -75,6 +77,8 @@ typedef struct {
 
     int extra_bits;     /**< number of extra bits beyond 16-bit */
     int nb_samples;     /**< number of samples in the current frame */
+
+    int extra_bit_bug;
 } ALACContext;
 
 static inline unsigned int decode_scalar(GetBitContext *gb, int k, int bps)
@@ -368,12 +372,17 @@ static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index,
         decorr_left_weight = 0;
     }
 
+    if (alac->extra_bits && alac->extra_bit_bug) {
+        append_extra_bits(alac->output_samples_buffer, alac->extra_bits_buffer,
+                          alac->extra_bits, channels, alac->nb_samples);
+    }
+
     if (channels == 2 && decorr_left_weight) {
         decorrelate_stereo(alac->output_samples_buffer, alac->nb_samples,
                            decorr_shift, decorr_left_weight);
     }
 
-    if (alac->extra_bits) {
+    if (alac->extra_bits && !alac->extra_bit_bug) {
         append_extra_bits(alac->output_samples_buffer, alac->extra_bits_buffer,
                           alac->extra_bits, channels, alac->nb_samples);
     }
@@ -572,6 +581,20 @@ static av_cold int alac_decode_init(AVCodecContext * avctx)
     return 0;
 }
 
+static const AVOption options[] = {
+    { "extra_bits_bug", "Force non-standard decoding process",
+      offsetof(ALACContext, extra_bit_bug), AV_OPT_TYPE_INT, { .i64 = 0 },
+      0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM },
+    { NULL },
+};
+
+static const AVClass alac_class = {
+    .class_name = "alac",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 AVCodec ff_alac_decoder = {
     .name           = "alac",
     .long_name      = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
@@ -582,4 +605,5 @@ AVCodec ff_alac_decoder = {
     .close          = alac_decode_close,
     .decode         = alac_decode_frame,
     .capabilities   = CODEC_CAP_DR1,
+    .priv_class     = &alac_class
 };
-- 
1.9.2.msysgit.0

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to