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