summaryrefslogtreecommitdiff
path: root/libavcodec/alac.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2007-07-18 06:06:21 +0000
committerVitor Sessak <vitor1001@gmail.com>2007-07-18 06:06:21 +0000
commit10fb5763ccf6751f736c11c672194ab0d9172f74 (patch)
tree810f91d25d904a0c55aebbc69ad173cc8322c38a /libavcodec/alac.c
parentd562ba238eb04eb36c6e39a51c0ab808d18465e5 (diff)
downloadffmpeg-10fb5763ccf6751f736c11c672194ab0d9172f74.tar.gz
Remove more code duplication. Based on a patch by Matthieu Castet.
Originally committed as revision 9727 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/alac.c')
-rw-r--r--libavcodec/alac.c138
1 files changed, 18 insertions, 120 deletions
diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index d83f85fcbd..b88ab36648 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -514,122 +514,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
*outputsize = outputsamples * alac->bytespersample;
readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
- switch(channels) {
- case 1: { /* 1 channel */
- int ricemodifier;
-
if (!isnotcompressed) {
/* so it is compressed */
- int16_t predictor_coef_table[32];
- int predictor_coef_num;
- int prediction_type;
- int prediction_quantitization;
- int i;
-
- /* FIXME: skip 16 bits, not sure what they are. seem to be used in
- * two channel case */
- get_bits(&alac->gb, 8);
- get_bits(&alac->gb, 8);
-
- prediction_type = get_bits(&alac->gb, 4);
- prediction_quantitization = get_bits(&alac->gb, 4);
-
- ricemodifier = get_bits(&alac->gb, 3);
- predictor_coef_num = get_bits(&alac->gb, 5);
-
- /* read the predictor table */
- for (i = 0; i < predictor_coef_num; i++) {
- predictor_coef_table[i] = (int16_t)get_bits(&alac->gb, 16);
- }
-
- if (wasted_bytes) {
- /* these bytes seem to have something to do with
- * > 2 channel files.
- */
- av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
- }
-
- bastardized_rice_decompress(alac,
- alac->predicterror_buffer[0],
- outputsamples,
- readsamplesize,
- alac->setinfo_rice_initialhistory,
- alac->setinfo_rice_kmodifier,
- ricemodifier * alac->setinfo_rice_historymult / 4,
- (1 << alac->setinfo_rice_kmodifier) - 1);
-
- if (prediction_type == 0) {
- /* adaptive fir */
- predictor_decompress_fir_adapt(alac->predicterror_buffer[0],
- alac->outputsamples_buffer[0],
- outputsamples,
- readsamplesize,
- predictor_coef_table,
- predictor_coef_num,
- prediction_quantitization);
- } else {
- av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type);
- /* i think the only other prediction type (or perhaps this is just a
- * boolean?) runs adaptive fir twice.. like:
- * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
- * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
- * little strange..
- */
- }
-
- } else {
- /* not compressed, easy case */
- if (readsamplesize <= 16) {
- int i;
- for (i = 0; i < outputsamples; i++) {
- int32_t audiobits = get_bits(&alac->gb, readsamplesize);
-
- audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
-
- alac->outputsamples_buffer[0][i] = audiobits;
- }
- } else {
- int i;
- for (i = 0; i < outputsamples; i++) {
- int32_t audiobits;
-
- audiobits = get_bits(&alac->gb, 16);
- /* special case of sign extension..
- * as we'll be ORing the low 16bits into this */
- audiobits = audiobits << 16;
- audiobits = audiobits >> (32 - readsamplesize);
-
- audiobits |= get_bits(&alac->gb, readsamplesize - 16);
-
- alac->outputsamples_buffer[0][i] = audiobits;
- }
- }
- /* wasted_bytes = 0; // unused */
- }
-
- switch(alac->setinfo_sample_size) {
- case 16: {
- int i;
- for (i = 0; i < outputsamples; i++) {
- int16_t sample = alac->outputsamples_buffer[0][i];
- ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
- }
- break;
- }
- case 20:
- case 24:
- case 32:
- av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
- break;
- default:
- break;
- }
- break;
- }
- case 2: { /* 2 channels */
-
- if (!isnotcompressed) {
- /* compressed */
int16_t predictor_coef_table[channels][32];
int predictor_coef_num[channels];
int prediction_type[channels];
@@ -655,7 +541,6 @@ static int alac_decode_frame(AVCodecContext *avctx,
}
if (wasted_bytes) {
- /* see mono case */
av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
}
@@ -679,8 +564,13 @@ static int alac_decode_frame(AVCodecContext *avctx,
predictor_coef_num[chan],
prediction_quantitization[chan]);
} else {
- /* see mono case */
av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]);
+ /* i think the only other prediction type (or perhaps this is just a
+ * boolean?) runs adaptive fir twice.. like:
+ * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
+ * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
+ * little strange..
+ */
}
}
} else {
@@ -692,7 +582,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
int32_t audiobits;
audiobits = get_bits(&alac->gb, alac->setinfo_sample_size);
- audiobits = SIGN_EXTENDED32(audiobits, alac->setinfo_sample_size);
+ audiobits = SIGN_EXTENDED32(audiobits, readsamplesize);
+
alac->outputsamples_buffer[chan][i] = audiobits;
}
}
@@ -703,6 +594,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
int32_t audiobits;
audiobits = get_bits(&alac->gb, 16);
+ /* special case of sign extension..
+ * as we'll be ORing the low 16bits into this */
audiobits = audiobits << 16;
audiobits = audiobits >> (32 - alac->setinfo_sample_size);
audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
@@ -718,6 +611,7 @@ static int alac_decode_frame(AVCodecContext *avctx,
switch(alac->setinfo_sample_size) {
case 16: {
+ if (channels == 2) {
deinterlace_16(alac->outputsamples_buffer[0],
alac->outputsamples_buffer[1],
(int16_t*)outbuffer,
@@ -725,6 +619,13 @@ static int alac_decode_frame(AVCodecContext *avctx,
outputsamples,
interlacing_shift,
interlacing_leftweight);
+ } else {
+ int i;
+ for (i = 0; i < outputsamples; i++) {
+ int16_t sample = alac->outputsamples_buffer[0][i];
+ ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
+ }
+ }
break;
}
case 20:
@@ -736,9 +637,6 @@ static int alac_decode_frame(AVCodecContext *avctx,
break;
}
- break;
- }
- }
return input_buffer_size;
}