summaryrefslogtreecommitdiff
path: root/libavcodec/alac.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-12-04 13:46:20 -0500
committerJustin Ruggles <justin.ruggles@gmail.com>2012-12-05 16:13:37 -0500
commit5e1bbb8c7e7008151b36ab0ba253466f3fae64ef (patch)
tree43f3cce698d45715302388ec0edacec2a8e53c16 /libavcodec/alac.c
parentb519298a1578e0c895d53d4b4ed8867b1c031a56 (diff)
alacenc: add support for multi-channel encoding
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r--libavcodec/alac.c46
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");