From f2e799a3d08b4a0ff2d2821f58e69cd40cda0a53 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 2 May 2012 00:50:00 +0200 Subject: swr: add double precision support to the rematrix code Signed-off-by: Michael Niedermayer --- libswresample/rematrix.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'libswresample/rematrix.c') 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; imatrix_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