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,