X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libswresample%2Frematrix.c;h=0e4d9630c8b2aa2258e83e918120b6532f4a35b4;hb=022f8d27dd0a61bfaae729d53d133b17418ea16b;hp=4a3ada62f41d6c0f0a9b25b0a28cd2785ca34d13;hpb=2b0cdb7364fbe1e8a7e97d36ba36dc67fb24095e;p=ffmpeg diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c index 4a3ada62f41..0e4d9630c8b 100644 --- a/libswresample/rematrix.c +++ b/libswresample/rematrix.c @@ -25,16 +25,19 @@ #define ONE (1.0) #define R(x) x #define SAMPLE float +#define COEFF float #define RENAME(x) x ## _float #include "rematrix_template.c" #undef SAMPLE #undef RENAME #undef R #undef ONE +#undef COEFF #define ONE (-32768) #define R(x) (((x) + 16384)>>15) #define SAMPLE int16_t +#define COEFF int #define RENAME(x) x ## _s16 #include "rematrix_template.c" @@ -81,7 +84,7 @@ static int sane_layout(int64_t layout){ return 1; } -int swr_rematrix_init(SwrContext *s){ +int swri_rematrix_init(SwrContext *s){ int i, j, out_i; double matrix[64][64]={{0}}; int64_t unaccounted= s->in_ch_layout & ~s->out_ch_layout; @@ -194,7 +197,7 @@ int swr_rematrix_init(SwrContext *s){ int ch_in=0; for(j=0; j<64; j++){ s->matrix[out_i][in_i]= matrix[i][j]; - s->matrix16[out_i][in_i]= lrintf(matrix[i][j] * 32768); + s->matrix32[out_i][in_i]= lrintf(matrix[i][j] * 32768); if(matrix[i][j]){ s->matrix_ch[out_i][++ch_in]= in_i; sum += fabs(matrix[i][j]); @@ -207,14 +210,26 @@ int swr_rematrix_init(SwrContext *s){ if(s->out_ch_layout & (1ULL<rematrix_volume < 0) + maxcoef = -s->rematrix_volume; + if(( s->out_sample_fmt < AV_SAMPLE_FMT_FLT || s->int_sample_fmt < AV_SAMPLE_FMT_FLT) && maxcoef > 1.0){ for(i=0; imatrix[i][j] /= maxcoef; - s->matrix16[i][j]= lrintf(s->matrix[i][j] * 32768); + s->matrix32[i][j]= lrintf(s->matrix[i][j] * 32768); } } + + if(s->rematrix_volume > 0){ + for(i=0; imatrix[i][j] *= s->rematrix_volume; + s->matrix32[i][j]= lrintf(s->matrix[i][j] * 32768); + } + } + for(i=0; iout_ch_layout); i++){ for(j=0; jin_ch_layout); j++){ av_log(NULL, AV_LOG_DEBUG, "%f ", s->matrix[i][j]); @@ -224,7 +239,7 @@ int swr_rematrix_init(SwrContext *s){ return 0; } -int swr_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy){ +int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy){ int out_i, in_i, i, j; av_assert0(out->ch_count == av_get_channel_layout_nb_channels(s->out_ch_layout)); @@ -238,7 +253,7 @@ int swr_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int must if(s->int_sample_fmt == AV_SAMPLE_FMT_FLT){ copy_float((float *)out->ch[out_i], (const float *)in->ch[in_i], s->matrix [out_i][in_i], len); }else - copy_s16 ((int16_t*)out->ch[out_i], (const int16_t*)in->ch[in_i], s->matrix16[out_i][in_i], len); + copy_s16 ((int16_t*)out->ch[out_i], (const int16_t*)in->ch[in_i], s->matrix32[out_i][in_i], len); }else{ out->ch[out_i]= in->ch[in_i]; } @@ -250,7 +265,7 @@ int swr_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int must len); }else{ sum2_s16 ((int16_t*)out->ch[out_i], (const int16_t*)in->ch[ s->matrix_ch[out_i][1] ], (const int16_t*)in->ch[ s->matrix_ch[out_i][2] ], - s->matrix16[out_i][ s->matrix_ch[out_i][1] ], s->matrix16[out_i][ s->matrix_ch[out_i][2] ], + s->matrix32[out_i][ s->matrix_ch[out_i][1] ], s->matrix32[out_i][ s->matrix_ch[out_i][2] ], len); } break; @@ -269,7 +284,7 @@ int swr_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int must int v=0; for(j=0; jmatrix_ch[out_i][0]; j++){ in_i= s->matrix_ch[out_i][1+j]; - v+= ((int16_t*)in->ch[in_i])[i] * s->matrix16[out_i][in_i]; + v+= ((int16_t*)in->ch[in_i])[i] * s->matrix32[out_i][in_i]; } ((int16_t*)out->ch[out_i])[i]= (v + 16384)>>15; }