diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-05-02 00:50:00 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-05-02 01:12:16 +0200 |
commit | f2e799a3d08b4a0ff2d2821f58e69cd40cda0a53 (patch) | |
tree | 15bf48cf29b93e65d009f9fcefc44160589ffcfd /libswresample/rematrix.c | |
parent | 71a1f76d3cc937fc1a47f501fc4866f95b74d0b0 (diff) | |
download | ffmpeg-f2e799a3d08b4a0ff2d2821f58e69cd40cda0a53.tar.gz |
swr: add double precision support to the rematrix code
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswresample/rematrix.c')
-rw-r--r-- | libswresample/rematrix.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c index 1eeb7173b6..15e3ead06e 100644 --- a/libswresample/rematrix.c +++ b/libswresample/rematrix.c @@ -34,6 +34,18 @@ #undef ONE #undef COEFF +#define ONE (1.0) +#define R(x) x +#define SAMPLE double +#define COEFF double +#define RENAME(x) x ## _double +#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 @@ -297,6 +309,15 @@ int swri_rematrix_init(SwrContext *s){ *((float*)s->native_one) = 1.0; s->mix_1_1_f = copy_float; s->mix_2_1_f = sum2_float; + }else if(s->midbuf.fmt == AV_SAMPLE_FMT_DBLP){ + s->native_matrix = av_mallocz(nb_in * nb_out * sizeof(double)); + s->native_one = av_mallocz(sizeof(double)); + for (i = 0; i < nb_out; i++) + for (j = 0; j < nb_in; j++) + ((double*)s->native_matrix)[i * nb_in + j] = s->matrix[i][j]; + *((double*)s->native_one) = 1.0; + s->mix_1_1_f = copy_double; + s->mix_2_1_f = sum2_double; }else av_assert0(0); //FIXME quantize for integeres @@ -353,6 +374,15 @@ int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mus } ((float*)out->ch[out_i])[i]= v; } + }else if(s->int_sample_fmt == AV_SAMPLE_FMT_DBLP){ + for(i=0; i<len; i++){ + double v=0; + for(j=0; j<s->matrix_ch[out_i][0]; j++){ + in_i= s->matrix_ch[out_i][1+j]; + v+= ((double*)in->ch[in_i])[i] * s->matrix[out_i][in_i]; + } + ((double*)out->ch[out_i])[i]= v; + } }else{ for(i=0; i<len; i++){ int v=0; |