X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Falac.c;h=c47d64e38dda92e7e8aa974f2d3515ee268fe7cf;hb=b3f8d871eeda38991108db7151e6c396808b22fe;hp=827c0db191ea551a8cdaf5ee84b3a4996ef02f3f;hpb=7cecab2f886b539096996980f4379d4b88ab7a46;p=ffmpeg diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 827c0db191e..c47d64e38dd 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -57,6 +57,7 @@ #include "unary.h" #include "mathops.h" #include "alac_data.h" +#include "alacdsp.h" #define ALAC_EXTRADATA_SIZE 36 @@ -81,6 +82,8 @@ typedef struct ALACContext { int direct_output; int extra_bit_bug; + + ALACDSPContext dsp; } ALACContext; static inline unsigned int decode_scalar(GetBitContext *gb, int k, int bps) @@ -230,35 +233,6 @@ static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out, } } -static void decorrelate_stereo(int32_t *buffer[2], int nb_samples, - int decorr_shift, int decorr_left_weight) -{ - int i; - - for (i = 0; i < nb_samples; i++) { - int32_t a, b; - - a = buffer[0][i]; - b = buffer[1][i]; - - a -= (b * decorr_left_weight) >> decorr_shift; - b += a; - - buffer[0][i] = b; - buffer[1][i] = a; - } -} - -static void append_extra_bits(int32_t *buffer[2], int32_t *extra_bits_buffer[2], - int extra_bits, int channels, int nb_samples) -{ - int i, ch; - - for (ch = 0; ch < channels; ch++) - for (i = 0; i < nb_samples; i++) - buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i]; -} - static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index, int channels) { @@ -389,19 +363,24 @@ 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) { + if (alac->extra_bits && alac->extra_bit_bug) { + alac->dsp.append_extra_bits[1](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 (decorr_left_weight) { + alac->dsp.decorrelate_stereo(alac->output_samples_buffer, alac->nb_samples, + decorr_shift, decorr_left_weight); + } - 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 (alac->extra_bits && !alac->extra_bit_bug) { + alac->dsp.append_extra_bits[1](alac->output_samples_buffer, alac->extra_bits_buffer, + alac->extra_bits, channels, alac->nb_samples); + } + } else if (alac->extra_bits) { + alac->dsp.append_extra_bits[0](alac->output_samples_buffer, alac->extra_bits_buffer, + alac->extra_bits, channels, alac->nb_samples); } switch(alac->sample_size) { @@ -515,11 +494,11 @@ static int allocate_buffers(ALACContext *alac) alac->direct_output = alac->sample_size > 16; if (!alac->direct_output) { FF_ALLOC_OR_GOTO(alac->avctx, alac->output_samples_buffer[ch], - buf_size, buf_alloc_fail); + buf_size + AV_INPUT_BUFFER_PADDING_SIZE, buf_alloc_fail); } FF_ALLOC_OR_GOTO(alac->avctx, alac->extra_bits_buffer[ch], - buf_size, buf_alloc_fail); + buf_size + AV_INPUT_BUFFER_PADDING_SIZE, buf_alloc_fail); } return 0; buf_alloc_fail: @@ -606,15 +585,19 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) return ret; } + ff_alacdsp_init(&alac->dsp); + return 0; } +#if HAVE_THREADS static int init_thread_copy(AVCodecContext *avctx) { ALACContext *alac = avctx->priv_data; alac->avctx = avctx; return allocate_buffers(alac); } +#endif static const AVOption options[] = { { "extra_bits_bug", "Force non-standard decoding process",