comparison ac3dec.c @ 6432:f22e4bdf4ad8 libavcodec

use scale factor instead of sum for downmix level adjustment. avoids division inside downmix loop. 7% faster 5.1-to-stereo downmixing.
author jbr
date Sat, 01 Mar 2008 16:10:19 +0000
parents 305c49259b59
children 6f01a499e785
comparison
equal deleted inserted replaced
6431:305c49259b59 6432:f22e4bdf4ad8
152 int out_channels; ///< number of output channels 152 int out_channels; ///< number of output channels
153 153
154 int center_mix_level; ///< Center mix level index 154 int center_mix_level; ///< Center mix level index
155 int surround_mix_level; ///< Surround mix level index 155 int surround_mix_level; ///< Surround mix level index
156 float downmix_coeffs[AC3_MAX_CHANNELS][2]; ///< stereo downmix coefficients 156 float downmix_coeffs[AC3_MAX_CHANNELS][2]; ///< stereo downmix coefficients
157 float downmix_coeff_sum[2]; ///< sum of downmix coeffs for each output channel 157 float downmix_coeff_adjust[2]; ///< adjustment needed for each output channel when downmixing
158 float dynamic_range[2]; ///< dynamic range 158 float dynamic_range[2]; ///< dynamic range
159 int cpl_coords[AC3_MAX_CHANNELS][18]; ///< coupling coordinates 159 int cpl_coords[AC3_MAX_CHANNELS][18]; ///< coupling coordinates
160 int num_cpl_bands; ///< number of coupling bands 160 int num_cpl_bands; ///< number of coupling bands
161 int num_cpl_subbands; ///< number of coupling sub bands 161 int num_cpl_subbands; ///< number of coupling sub bands
162 int start_freq[AC3_MAX_CHANNELS]; ///< start frequency bin 162 int start_freq[AC3_MAX_CHANNELS]; ///< start frequency bin
402 if(s->channel_mode == AC3_CHMODE_2F2R || s->channel_mode == AC3_CHMODE_3F2R) { 402 if(s->channel_mode == AC3_CHMODE_2F2R || s->channel_mode == AC3_CHMODE_3F2R) {
403 int nf = s->channel_mode - 4; 403 int nf = s->channel_mode - 4;
404 s->downmix_coeffs[nf][0] = s->downmix_coeffs[nf+1][1] = smix; 404 s->downmix_coeffs[nf][0] = s->downmix_coeffs[nf+1][1] = smix;
405 } 405 }
406 406
407 s->downmix_coeff_sum[0] = s->downmix_coeff_sum[1] = 0.0f; 407 /* calculate adjustment needed for each channel to avoid clipping */
408 s->downmix_coeff_adjust[0] = s->downmix_coeff_adjust[1] = 0.0f;
408 for(i=0; i<s->fbw_channels; i++) { 409 for(i=0; i<s->fbw_channels; i++) {
409 s->downmix_coeff_sum[0] += s->downmix_coeffs[i][0]; 410 s->downmix_coeff_adjust[0] += s->downmix_coeffs[i][0];
410 s->downmix_coeff_sum[1] += s->downmix_coeffs[i][1]; 411 s->downmix_coeff_adjust[1] += s->downmix_coeffs[i][1];
411 } 412 }
413 s->downmix_coeff_adjust[0] = 1.0f / s->downmix_coeff_adjust[0];
414 s->downmix_coeff_adjust[1] = 1.0f / s->downmix_coeff_adjust[1];
412 } 415 }
413 416
414 /** 417 /**
415 * Decode the grouped exponents according to exponent strategy. 418 * Decode the grouped exponents according to exponent strategy.
416 * reference: Section 7.1.3 Exponent Decoding 419 * reference: Section 7.1.3 Exponent Decoding
745 v0 = v1 = 0.0f; 748 v0 = v1 = 0.0f;
746 for(j=0; j<s->fbw_channels; j++) { 749 for(j=0; j<s->fbw_channels; j++) {
747 v0 += s->output[j][i] * s->downmix_coeffs[j][0]; 750 v0 += s->output[j][i] * s->downmix_coeffs[j][0];
748 v1 += s->output[j][i] * s->downmix_coeffs[j][1]; 751 v1 += s->output[j][i] * s->downmix_coeffs[j][1];
749 } 752 }
750 v0 /= s->downmix_coeff_sum[0]; 753 v0 *= s->downmix_coeff_adjust[0];
751 v1 /= s->downmix_coeff_sum[1]; 754 v1 *= s->downmix_coeff_adjust[1];
752 if(s->output_mode == AC3_CHMODE_MONO) { 755 if(s->output_mode == AC3_CHMODE_MONO) {
753 s->output[0][i] = (v0 + v1) * LEVEL_MINUS_3DB; 756 s->output[0][i] = (v0 + v1) * LEVEL_MINUS_3DB;
754 } else if(s->output_mode == AC3_CHMODE_STEREO) { 757 } else if(s->output_mode == AC3_CHMODE_STEREO) {
755 s->output[0][i] = v0; 758 s->output[0][i] = v0;
756 s->output[1][i] = v1; 759 s->output[1][i] = v1;