25 #define TEMPLATE_REMATRIX_FLT
27 #undef TEMPLATE_REMATRIX_FLT
29 #define TEMPLATE_REMATRIX_DBL
31 #undef TEMPLATE_REMATRIX_DBL
33 #define TEMPLATE_REMATRIX_S16
35 #undef TEMPLATE_REMATRIX_S16
39 #define FRONT_CENTER 2
40 #define LOW_FREQUENCY 3
43 #define FRONT_LEFT_OF_CENTER 6
44 #define FRONT_RIGHT_OF_CENTER 7
49 #define TOP_FRONT_LEFT 12
50 #define TOP_FRONT_CENTER 13
51 #define TOP_FRONT_RIGHT 14
52 #define TOP_BACK_LEFT 15
53 #define TOP_BACK_CENTER 16
54 #define TOP_BACK_RIGHT 17
58 int nb_in, nb_out, in, out;
65 for (out = 0; out < nb_out; out++) {
66 for (in = 0; in < nb_in; in++)
67 s->
matrix[out][in] = matrix[in];
76 if(layout&(layout-1))
return 1;
114 double matrix[64][64]={{0}};
115 int64_t unaccounted, in_ch_layout, out_ch_layout;
136 if(in_ch_layout & out_ch_layout & (1ULL<<i))
140 unaccounted= in_ch_layout & ~out_ch_layout;
148 if(in_ch_layout & AV_CH_LAYOUT_STEREO) {
159 if(out_ch_layout & AV_CH_FRONT_CENTER){
162 if(in_ch_layout & AV_CH_FRONT_CENTER)
178 if (unaccounted & (AV_CH_BACK_LEFT | AV_CH_SIDE_LEFT)) {
189 }
else if(out_ch_layout & AV_CH_FRONT_CENTER){
195 if(out_ch_layout & AV_CH_BACK_CENTER){
199 if(in_ch_layout & AV_CH_SIDE_LEFT){
221 }
else if(out_ch_layout & AV_CH_FRONT_CENTER){
229 if(out_ch_layout & AV_CH_BACK_LEFT){
232 if (in_ch_layout & AV_CH_BACK_LEFT) {
239 }
else if(out_ch_layout & AV_CH_BACK_CENTER){
257 }
else if(out_ch_layout & AV_CH_FRONT_CENTER){
268 }
else if(out_ch_layout & AV_CH_FRONT_CENTER){
276 if (out_ch_layout & AV_CH_FRONT_CENTER) {
285 for(out_i=i=0; i<64; i++){
289 s->
matrix[out_i][in_i]= matrix[i][j];
291 sum += fabs(matrix[i][j]);
293 if(in_ch_layout & (1ULL<<j))
296 maxcoef=
FFMAX(maxcoef, sum);
297 if(out_ch_layout & (1ULL<<i))
307 s->
matrix[i][j] /= maxcoef;
342 for (i = 0; i < nb_out; i++)
343 for (j = 0; j < nb_in; j++)
352 for (i = 0; i < nb_out; i++)
353 for (j = 0; j < nb_in; j++)
362 for (i = 0; i < nb_out; i++)
363 for (j = 0; j < nb_in; j++)
394 int out_i, in_i, i, j;
405 off = len1 * out->
bps;
411 for(out_i=0; out_i<out->
ch_count; out_i++){
419 if(s->
matrix[out_i][in_i]!=1.0){
425 memcpy(out->
ch[out_i], in->
ch[in_i], len*out->
bps);
427 out->
ch[out_i]= in->
ch[in_i];
442 for(i=0; i<
len; i++){
446 v+= ((
float*)in->
ch[in_i])[i] * s->
matrix[out_i][in_i];
448 ((
float*)out->
ch[out_i])[i]= v;
451 for(i=0; i<
len; i++){
455 v+= ((
double*)in->
ch[in_i])[i] * s->
matrix[out_i][in_i];
457 ((
double*)out->
ch[out_i])[i]= v;
460 for(i=0; i<
len; i++){
464 v+= ((int16_t*)in->
ch[in_i])[i] * s->
matrix32[out_i][in_i];
466 ((int16_t*)out->
ch[out_i])[i]= (v + 16384)>>15;