X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Falac.c;h=4e8903114d6289c2cb4f1aea3a56ec78a0b24a95;hb=d27edc038a5d59f25b28964b38d9f8d7ce4a6e64;hp=49ccaac67ff76eea47efc79cb198a218d8fc194b;hpb=577b39aea221ddc9606f3b5ca698516155cdfd43;p=ffmpeg diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 49ccaac67ff..4e8903114d6 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -49,11 +49,12 @@ #include "avcodec.h" #include "get_bits.h" #include "bytestream.h" +#include "internal.h" #include "unary.h" #include "mathops.h" +#include "alac_data.h" #define ALAC_EXTRADATA_SIZE 36 -#define MAX_CHANNELS 8 typedef struct { AVCodecContext *avctx; @@ -77,40 +78,6 @@ typedef struct { int direct_output; } ALACContext; -enum RawDataBlockType { - /* At the moment, only SCE, CPE, LFE, and END are recognized. */ - TYPE_SCE, - TYPE_CPE, - TYPE_CCE, - TYPE_LFE, - TYPE_DSE, - TYPE_PCE, - TYPE_FIL, - TYPE_END -}; - -static const uint8_t alac_channel_layout_offsets[8][8] = { - { 0 }, - { 0, 1 }, - { 2, 0, 1 }, - { 2, 0, 1, 3 }, - { 2, 0, 1, 3, 4 }, - { 2, 0, 1, 4, 5, 3 }, - { 2, 0, 1, 4, 5, 6, 3 }, - { 2, 6, 7, 0, 1, 4, 5, 3 } -}; - -static const uint16_t alac_channel_layouts[8] = { - AV_CH_LAYOUT_MONO, - AV_CH_LAYOUT_STEREO, - AV_CH_LAYOUT_SURROUND, - AV_CH_LAYOUT_4POINT0, - AV_CH_LAYOUT_5POINT0_BACK, - AV_CH_LAYOUT_5POINT1_BACK, - AV_CH_LAYOUT_6POINT1_BACK, - AV_CH_LAYOUT_7POINT1_WIDE_BACK -}; - static inline unsigned int decode_scalar(GetBitContext *gb, int k, int bps) { unsigned int x = get_unary_0_9(gb); @@ -323,7 +290,7 @@ static int decode_element(AVCodecContext *avctx, void *data, int ch_index, if (!alac->nb_samples) { /* get output buffer */ alac->frame.nb_samples = output_samples; - if ((ret = avctx->get_buffer(avctx, &alac->frame)) < 0) { + if ((ret = ff_get_buffer(avctx, &alac->frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -474,7 +441,7 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { ALACContext *alac = avctx->priv_data; - enum RawDataBlockType element; + enum AlacRawDataBlockType element; int channels; int ch, ret, got_end; @@ -496,14 +463,14 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, channels = (element == TYPE_CPE) ? 2 : 1; if ( ch + channels > alac->channels - || alac_channel_layout_offsets[alac->channels - 1][ch] + channels > alac->channels + || ff_alac_channel_layout_offsets[alac->channels - 1][ch] + channels > alac->channels ) { av_log(avctx, AV_LOG_ERROR, "invalid element channel count\n"); return AVERROR_INVALIDDATA; } ret = decode_element(avctx, data, - alac_channel_layout_offsets[alac->channels - 1][ch], + ff_alac_channel_layout_offsets[alac->channels - 1][ch], channels); if (ret < 0 && get_bits_left(&alac->gb)) return ret; @@ -633,17 +600,17 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) av_log(avctx, AV_LOG_WARNING, "Invalid channel count\n"); alac->channels = avctx->channels; } else { - if (alac->channels > MAX_CHANNELS) + if (alac->channels > ALAC_MAX_CHANNELS) alac->channels = avctx->channels; else avctx->channels = alac->channels; } - if (avctx->channels > MAX_CHANNELS || avctx->channels <= 0 ) { + if (avctx->channels > ALAC_MAX_CHANNELS || avctx->channels <= 0 ) { av_log(avctx, AV_LOG_ERROR, "Unsupported channel count: %d\n", avctx->channels); return AVERROR_PATCHWELCOME; } - avctx->channel_layout = alac_channel_layouts[alac->channels - 1]; + avctx->channel_layout = ff_alac_channel_layouts[alac->channels - 1]; if ((ret = allocate_buffers(alac)) < 0) { av_log(avctx, AV_LOG_ERROR, "Error allocating buffers\n");