Mercurial > libavcodec.hg
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++) { |