diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-12-04 13:46:20 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-12-05 16:13:37 -0500 |
commit | 5e1bbb8c7e7008151b36ab0ba253466f3fae64ef (patch) | |
tree | 43f3cce698d45715302388ec0edacec2a8e53c16 /libavcodec/alac.c | |
parent | b519298a1578e0c895d53d4b4ed8867b1c031a56 (diff) | |
download | ffmpeg-5e1bbb8c7e7008151b36ab0ba253466f3fae64ef.tar.gz |
alacenc: add support for multi-channel encoding
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r-- | libavcodec/alac.c | 46 |
1 files changed, 6 insertions, 40 deletions
diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 64c7f5400f..22882a56c0 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -52,9 +52,9 @@ #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; @@ -76,40 +76,6 @@ typedef struct { int nb_samples; /**< number of samples in the current frame */ } 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); @@ -431,7 +397,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; @@ -458,7 +424,7 @@ static int alac_decode_frame(AVCodecContext *avctx, void *data, } 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; @@ -581,17 +547,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) { + if (avctx->channels > ALAC_MAX_CHANNELS) { 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"); |