Mercurial > libavcodec.hg
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; |