On Mon, Aug 18, 2014 at 8:12 AM, Christophe Gisquet
<[email protected]> wrote:
> 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.
>
> 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
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel