summaryrefslogtreecommitdiff
path: root/libswresample/rematrix.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-05-02 00:50:00 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-05-02 01:12:16 +0200
commitf2e799a3d08b4a0ff2d2821f58e69cd40cda0a53 (patch)
tree15bf48cf29b93e65d009f9fcefc44160589ffcfd /libswresample/rematrix.c
parent71a1f76d3cc937fc1a47f501fc4866f95b74d0b0 (diff)
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.c30
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;