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; iint_sample_fmt != AV_SAMPLE_FMT_S16P &&s->int_sample_fmt != AV_SAMPLE_FMT_S32P - &&s->int_sample_fmt != AV_SAMPLE_FMT_FLTP){ - av_log(s, AV_LOG_ERROR, "Requested sample format %s is not supported internally, S16/S32/FLT is supported\n", av_get_sample_fmt_name(s->int_sample_fmt)); + &&s->int_sample_fmt != AV_SAMPLE_FMT_FLTP + &&s->int_sample_fmt != AV_SAMPLE_FMT_DBLP){ + av_log(s, AV_LOG_ERROR, "Requested sample format %s is not supported internally, S16/S32/FLT/DBL is supported\n", av_get_sample_fmt_name(s->int_sample_fmt)); return AVERROR(EINVAL); }