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++) { |
