|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|