# HG changeset patch # User vitor # Date 1184709933 0 # Node ID 07c6fa47891839ad9b3be84a39b6f970e1da7c42 # Parent ed7d84e0164db7fae2132c6ef14e966b629c5aa9 Remove code duplication. Based on a patch by Matthieu Castet. diff -r ed7d84e0164d -r 07c6fa478918 alac.c --- a/alac.c Tue Jul 17 13:35:16 2007 +0000 +++ b/alac.c Tue Jul 17 22:05:33 2007 +0000 @@ -630,133 +630,86 @@ if (!isnotcompressed) { /* compressed */ - int16_t predictor_coef_table_a[32]; - int predictor_coef_num_a; - int prediction_type_a; - int prediction_quantitization_a; - int ricemodifier_a; + int16_t predictor_coef_table[channels][32]; + int predictor_coef_num[channels]; + int prediction_type[channels]; + int prediction_quantitization[channels]; + int ricemodifier[channels]; - int16_t predictor_coef_table_b[32]; - int predictor_coef_num_b; - int prediction_type_b; - int prediction_quantitization_b; - int ricemodifier_b; - - int i; + int i, chan; interlacing_shift = get_bits(&alac->gb, 8); interlacing_leftweight = get_bits(&alac->gb, 8); - /******** channel 1 ***********/ - prediction_type_a = get_bits(&alac->gb, 4); - prediction_quantitization_a = get_bits(&alac->gb, 4); + for (chan = 0; chan < channels; chan++) { + prediction_type[chan] = get_bits(&alac->gb, 4); + prediction_quantitization[chan] = get_bits(&alac->gb, 4); - ricemodifier_a = get_bits(&alac->gb, 3); - predictor_coef_num_a = get_bits(&alac->gb, 5); + ricemodifier[chan] = get_bits(&alac->gb, 3); + predictor_coef_num[chan] = get_bits(&alac->gb, 5); /* read the predictor table */ - for (i = 0; i < predictor_coef_num_a; i++) { - predictor_coef_table_a[i] = (int16_t)get_bits(&alac->gb, 16); + for (i = 0; i < predictor_coef_num[chan]; i++) { + predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16); } - - /******** channel 2 *********/ - prediction_type_b = get_bits(&alac->gb, 4); - prediction_quantitization_b = get_bits(&alac->gb, 4); + } - ricemodifier_b = get_bits(&alac->gb, 3); - predictor_coef_num_b = get_bits(&alac->gb, 5); - - /* read the predictor table */ - for (i = 0; i < predictor_coef_num_b; i++) { - predictor_coef_table_b[i] = (int16_t)get_bits(&alac->gb, 16); - } - - /*********************/ if (wasted_bytes) { /* see mono case */ av_log(avctx, AV_LOG_ERROR, "FIXME: unimplemented, unhandling of wasted_bytes\n"); } - /* channel 1 */ + for (chan = 0; chan < channels; chan++) { bastardized_rice_decompress(alac, - alac->predicterror_buffer[0], - outputsamples, - readsamplesize, - alac->setinfo_rice_initialhistory, - alac->setinfo_rice_kmodifier, - ricemodifier_a * alac->setinfo_rice_historymult / 4, - (1 << alac->setinfo_rice_kmodifier) - 1); - - if (prediction_type_a == 0) { - /* adaptive fir */ - predictor_decompress_fir_adapt(alac->predicterror_buffer[0], - alac->outputsamples_buffer[0], - outputsamples, - readsamplesize, - predictor_coef_table_a, - predictor_coef_num_a, - prediction_quantitization_a); - } else { - /* see mono case */ - av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_a); - } - - /* channel 2 */ - bastardized_rice_decompress(alac, - alac->predicterror_buffer[1], + alac->predicterror_buffer[chan], outputsamples, readsamplesize, alac->setinfo_rice_initialhistory, alac->setinfo_rice_kmodifier, - ricemodifier_b * alac->setinfo_rice_historymult / 4, + ricemodifier[chan] * alac->setinfo_rice_historymult / 4, (1 << alac->setinfo_rice_kmodifier) - 1); - if (prediction_type_b == 0) { + if (prediction_type[chan] == 0) { /* adaptive fir */ - predictor_decompress_fir_adapt(alac->predicterror_buffer[1], - alac->outputsamples_buffer[1], + predictor_decompress_fir_adapt(alac->predicterror_buffer[chan], + alac->outputsamples_buffer[chan], outputsamples, readsamplesize, - predictor_coef_table_b, - predictor_coef_num_b, - prediction_quantitization_b); + predictor_coef_table[chan], + predictor_coef_num[chan], + prediction_quantitization[chan]); } else { - av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type_b); + /* see mono case */ + av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]); } + } } else { /* not compressed, easy case */ if (alac->setinfo_sample_size <= 16) { - int i; - for (i = 0; i < outputsamples; i++) { - int32_t audiobits_a, audiobits_b; - - audiobits_a = get_bits(&alac->gb, alac->setinfo_sample_size); - audiobits_b = get_bits(&alac->gb, alac->setinfo_sample_size); - - audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size); - audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size); - - alac->outputsamples_buffer[0][i] = audiobits_a; - alac->outputsamples_buffer[1][i] = audiobits_b; - } - } else { - int i; + int i, chan; + for (chan = 0; chan < channels; chan++) { for (i = 0; i < outputsamples; i++) { - int32_t audiobits_a, audiobits_b; - - audiobits_a = get_bits(&alac->gb, 16); - audiobits_a = audiobits_a << 16; - audiobits_a = audiobits_a >> (32 - alac->setinfo_sample_size); - audiobits_a |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); + int32_t audiobits; - audiobits_b = get_bits(&alac->gb, 16); - audiobits_b = audiobits_b << 16; - audiobits_b = audiobits_b >> (32 - alac->setinfo_sample_size); - audiobits_b |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); + audiobits = get_bits(&alac->gb, alac->setinfo_sample_size); + audiobits = SIGN_EXTENDED32(audiobits, alac->setinfo_sample_size); + alac->outputsamples_buffer[chan][i] = audiobits; + } + } + } else { + int i, chan; + for (chan = 0; chan < channels; chan++) { + for (i = 0; i < outputsamples; i++) { + int32_t audiobits; - alac->outputsamples_buffer[0][i] = audiobits_a; - alac->outputsamples_buffer[1][i] = audiobits_b; + audiobits = get_bits(&alac->gb, 16); + audiobits = audiobits << 16; + audiobits = audiobits >> (32 - alac->setinfo_sample_size); + audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); + + alac->outputsamples_buffer[chan][i] = audiobits; } + } } /* wasted_bytes = 0; */ interlacing_shift = 0;