comparison ac3dec.c @ 6094:07fc769bf4e2 libavcodec

pass an AC3DecodeContext to ac3_downmix() instead of multiple arguments
author jbr
date Sun, 30 Dec 2007 22:28:17 +0000
parents 5562b898db5b
children 77626e4e0077
comparison
equal deleted inserted replaced
6093:5562b898db5b 6094:07fc769bf4e2
733 } 733 }
734 734
735 /** 735 /**
736 * Downmix the output to mono or stereo. 736 * Downmix the output to mono or stereo.
737 */ 737 */
738 static void ac3_downmix(float samples[AC3_MAX_CHANNELS][256], int fbw_channels, 738 static void ac3_downmix(AC3DecodeContext *s)
739 int output_mode, float coef[AC3_MAX_CHANNELS][2])
740 { 739 {
741 int i, j; 740 int i, j;
742 float v0, v1, s0, s1; 741 float v0, v1, s0, s1;
743 742
744 for(i=0; i<256; i++) { 743 for(i=0; i<256; i++) {
745 v0 = v1 = s0 = s1 = 0.0f; 744 v0 = v1 = s0 = s1 = 0.0f;
746 for(j=0; j<fbw_channels; j++) { 745 for(j=0; j<s->fbw_channels; j++) {
747 v0 += samples[j][i] * coef[j][0]; 746 v0 += s->output[j][i] * s->downmix_coeffs[j][0];
748 v1 += samples[j][i] * coef[j][1]; 747 v1 += s->output[j][i] * s->downmix_coeffs[j][1];
749 s0 += coef[j][0]; 748 s0 += s->downmix_coeffs[j][0];
750 s1 += coef[j][1]; 749 s1 += s->downmix_coeffs[j][1];
751 } 750 }
752 v0 /= s0; 751 v0 /= s0;
753 v1 /= s1; 752 v1 /= s1;
754 if(output_mode == AC3_CHMODE_MONO) { 753 if(s->output_mode == AC3_CHMODE_MONO) {
755 samples[0][i] = (v0 + v1) * LEVEL_MINUS_3DB; 754 s->output[0][i] = (v0 + v1) * LEVEL_MINUS_3DB;
756 } else if(output_mode == AC3_CHMODE_STEREO) { 755 } else if(s->output_mode == AC3_CHMODE_STEREO) {
757 samples[0][i] = v0; 756 s->output[0][i] = v0;
758 samples[1][i] = v1; 757 s->output[1][i] = v1;
759 } 758 }
760 } 759 }
761 } 760 }
762 761
763 /** 762 /**
1051 do_imdct(s); 1050 do_imdct(s);
1052 1051
1053 /* downmix output if needed */ 1052 /* downmix output if needed */
1054 if(s->channels != s->out_channels && !((s->output_mode & AC3_OUTPUT_LFEON) && 1053 if(s->channels != s->out_channels && !((s->output_mode & AC3_OUTPUT_LFEON) &&
1055 s->fbw_channels == s->out_channels)) { 1054 s->fbw_channels == s->out_channels)) {
1056 ac3_downmix(s->output, s->fbw_channels, s->output_mode, 1055 ac3_downmix(s);
1057 s->downmix_coeffs);
1058 } 1056 }
1059 1057
1060 /* convert float to 16-bit integer */ 1058 /* convert float to 16-bit integer */
1061 for(ch=0; ch<s->out_channels; ch++) { 1059 for(ch=0; ch<s->out_channels; ch++) {
1062 for(i=0; i<256; i++) { 1060 for(i=0; i<256; i++) {