mirror of https://git.ffmpeg.org/ffmpeg.git
Remove more code duplication. Based on a patch by Matthieu Castet.
Originally committed as revision 9727 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
d562ba238e
commit
10fb5763cc
|
@ -514,122 +514,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
*outputsize = outputsamples * alac->bytespersample;
|
*outputsize = outputsamples * alac->bytespersample;
|
||||||
readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
|
readsamplesize = alac->setinfo_sample_size - (wasted_bytes * 8) + channels - 1;
|
||||||
|
|
||||||
switch(channels) {
|
|
||||||
case 1: { /* 1 channel */
|
|
||||||
int ricemodifier;
|
|
||||||
|
|
||||||
if (!isnotcompressed) {
|
if (!isnotcompressed) {
|
||||||
/* so it is compressed */
|
/* 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];
|
int16_t predictor_coef_table[channels][32];
|
||||||
int predictor_coef_num[channels];
|
int predictor_coef_num[channels];
|
||||||
int prediction_type[channels];
|
int prediction_type[channels];
|
||||||
|
@ -655,7 +541,6 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wasted_bytes) {
|
if (wasted_bytes) {
|
||||||
/* see mono case */
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n");
|
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],
|
predictor_coef_num[chan],
|
||||||
prediction_quantitization[chan]);
|
prediction_quantitization[chan]);
|
||||||
} else {
|
} else {
|
||||||
/* see mono case */
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]);
|
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 {
|
} else {
|
||||||
|
@ -692,7 +582,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
int32_t audiobits;
|
int32_t audiobits;
|
||||||
|
|
||||||
audiobits = get_bits(&alac->gb, alac->setinfo_sample_size);
|
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;
|
alac->outputsamples_buffer[chan][i] = audiobits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -703,6 +594,8 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
int32_t audiobits;
|
int32_t audiobits;
|
||||||
|
|
||||||
audiobits = get_bits(&alac->gb, 16);
|
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 << 16;
|
||||||
audiobits = audiobits >> (32 - alac->setinfo_sample_size);
|
audiobits = audiobits >> (32 - alac->setinfo_sample_size);
|
||||||
audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16);
|
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) {
|
switch(alac->setinfo_sample_size) {
|
||||||
case 16: {
|
case 16: {
|
||||||
|
if (channels == 2) {
|
||||||
deinterlace_16(alac->outputsamples_buffer[0],
|
deinterlace_16(alac->outputsamples_buffer[0],
|
||||||
alac->outputsamples_buffer[1],
|
alac->outputsamples_buffer[1],
|
||||||
(int16_t*)outbuffer,
|
(int16_t*)outbuffer,
|
||||||
|
@ -725,6 +619,13 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
outputsamples,
|
outputsamples,
|
||||||
interlacing_shift,
|
interlacing_shift,
|
||||||
interlacing_leftweight);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case 20:
|
case 20:
|
||||||
|
@ -736,9 +637,6 @@ static int alac_decode_frame(AVCodecContext *avctx,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return input_buffer_size;
|
return input_buffer_size;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue