Mercurial > libavcodec.hg
comparison dca.c @ 12287:67cb57c918b6 libavcodec
DCA: fix multichannel -> 2 channel downmix.
Patch by Nick Brereton
author | banan |
---|---|
date | Tue, 27 Jul 2010 21:45:43 +0000 |
parents | 91e45d11dd6e |
children | 97219f0fa018 |
comparison
equal
deleted
inserted
replaced
12286:91e45d11dd6e | 12287:67cb57c918b6 |
---|---|
877 } | 877 } |
878 } | 878 } |
879 | 879 |
880 /* downmixing routines */ | 880 /* downmixing routines */ |
881 #define MIX_REAR1(samples, si1, rs, coef) \ | 881 #define MIX_REAR1(samples, si1, rs, coef) \ |
882 samples[i] += samples[si1] * coef[rs][0]; \ | 882 samples[i] += (samples[si1] - add_bias) * coef[rs][0]; \ |
883 samples[i+256] += samples[si1] * coef[rs][1]; | 883 samples[i+256] += (samples[si1] - add_bias) * coef[rs][1]; |
884 | 884 |
885 #define MIX_REAR2(samples, si1, si2, rs, coef) \ | 885 #define MIX_REAR2(samples, si1, si2, rs, coef) \ |
886 samples[i] += samples[si1] * coef[rs][0] + samples[si2] * coef[rs+1][0]; \ | 886 samples[i] += (samples[si1] - add_bias) * coef[rs][0] + (samples[si2] - add_bias) * coef[rs+1][0]; \ |
887 samples[i+256] += samples[si1] * coef[rs][1] + samples[si2] * coef[rs+1][1]; | 887 samples[i+256] += (samples[si1] - add_bias) * coef[rs][1] + (samples[si2] - add_bias) * coef[rs+1][1]; |
888 | 888 |
889 #define MIX_FRONT3(samples, coef) \ | 889 #define MIX_FRONT3(samples, coef) \ |
890 t = samples[i]; \ | 890 t = samples[i+c] - add_bias; \ |
891 samples[i] = t * coef[0][0] + samples[i+256] * coef[1][0] + samples[i+512] * coef[2][0]; \ | 891 u = samples[i+l] - add_bias; \ |
892 samples[i+256] = t * coef[0][1] + samples[i+256] * coef[1][1] + samples[i+512] * coef[2][1]; | 892 v = samples[i+r] - add_bias; \ |
893 samples[i] = t * coef[0][0] + u * coef[1][0] + v * coef[2][0] + add_bias; \ | |
894 samples[i+256] = t * coef[0][1] + u * coef[1][1] + v * coef[2][1] + add_bias; | |
893 | 895 |
894 #define DOWNMIX_TO_STEREO(op1, op2) \ | 896 #define DOWNMIX_TO_STEREO(op1, op2) \ |
895 for (i = 0; i < 256; i++){ \ | 897 for (i = 0; i < 256; i++){ \ |
896 op1 \ | 898 op1 \ |
897 op2 \ | 899 op2 \ |
898 } | 900 } |
899 | 901 |
900 static void dca_downmix(float *samples, int srcfmt, | 902 static void dca_downmix(float *samples, int srcfmt, |
901 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]) | 903 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2], |
902 { | 904 const int8_t *channel_mapping, float add_bias) |
905 { | |
906 int c,l,r,sl,sr,s; | |
903 int i; | 907 int i; |
904 float t; | 908 float t, u, v; |
905 float coef[DCA_PRIM_CHANNELS_MAX][2]; | 909 float coef[DCA_PRIM_CHANNELS_MAX][2]; |
906 | 910 |
907 for (i=0; i<DCA_PRIM_CHANNELS_MAX; i++) { | 911 for (i=0; i<DCA_PRIM_CHANNELS_MAX; i++) { |
908 coef[i][0] = dca_downmix_coeffs[downmix_coef[i][0]]; | 912 coef[i][0] = dca_downmix_coeffs[downmix_coef[i][0]]; |
909 coef[i][1] = dca_downmix_coeffs[downmix_coef[i][1]]; | 913 coef[i][1] = dca_downmix_coeffs[downmix_coef[i][1]]; |
918 av_log(NULL, 0, "Not implemented!\n"); | 922 av_log(NULL, 0, "Not implemented!\n"); |
919 break; | 923 break; |
920 case DCA_STEREO: | 924 case DCA_STEREO: |
921 break; | 925 break; |
922 case DCA_3F: | 926 case DCA_3F: |
927 c = channel_mapping[0] * 256; | |
928 l = channel_mapping[1] * 256; | |
929 r = channel_mapping[2] * 256; | |
923 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),); | 930 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),); |
924 break; | 931 break; |
925 case DCA_2F1R: | 932 case DCA_2F1R: |
926 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + 512, 2, coef),); | 933 s = channel_mapping[2] * 256; |
934 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + s, 2, coef),); | |
927 break; | 935 break; |
928 case DCA_3F1R: | 936 case DCA_3F1R: |
937 c = channel_mapping[0] * 256; | |
938 l = channel_mapping[1] * 256; | |
939 r = channel_mapping[2] * 256; | |
940 s = channel_mapping[3] * 256; | |
929 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), | 941 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), |
930 MIX_REAR1(samples, i + 768, 3, coef)); | 942 MIX_REAR1(samples, i + s, 3, coef)); |
931 break; | 943 break; |
932 case DCA_2F2R: | 944 case DCA_2F2R: |
933 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + 512, i + 768, 2, coef),); | 945 sl = channel_mapping[2] * 256; |
946 sr = channel_mapping[3] * 256; | |
947 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + sl, i + sr, 2, coef),); | |
934 break; | 948 break; |
935 case DCA_3F2R: | 949 case DCA_3F2R: |
950 c = channel_mapping[0] * 256; | |
951 l = channel_mapping[1] * 256; | |
952 r = channel_mapping[2] * 256; | |
953 sl = channel_mapping[3] * 256; | |
954 sr = channel_mapping[4] * 256; | |
936 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), | 955 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), |
937 MIX_REAR2(samples, i + 768, i + 1024, 3, coef)); | 956 MIX_REAR2(samples, i + sl, i + sr, 3, coef)); |
938 break; | 957 break; |
939 } | 958 } |
940 } | 959 } |
941 | 960 |
942 | 961 |
1115 s->add_bias ); | 1134 s->add_bias ); |
1116 } | 1135 } |
1117 | 1136 |
1118 /* Down mixing */ | 1137 /* Down mixing */ |
1119 if (s->avctx->request_channels == 2 && s->prim_channels > 2) { | 1138 if (s->avctx->request_channels == 2 && s->prim_channels > 2) { |
1120 dca_downmix(s->samples, s->amode, s->downmix_coef); | 1139 dca_downmix(s->samples, s->amode, s->downmix_coef, s->channel_order_tab, s->add_bias); |
1121 } | 1140 } |
1122 | 1141 |
1123 /* Generate LFE samples for this subsubframe FIXME!!! */ | 1142 /* Generate LFE samples for this subsubframe FIXME!!! */ |
1124 if (s->output & DCA_LFE) { | 1143 if (s->output & DCA_LFE) { |
1125 lfe_interpolation_fir(s, s->lfe, 2 * s->lfe, | 1144 lfe_interpolation_fir(s, s->lfe, 2 * s->lfe, |