swr: add double precision support to the rematrix code
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
71a1f76d3c
commit
f2e799a3d0
@ -34,6 +34,18 @@
|
|||||||
#undef ONE
|
#undef ONE
|
||||||
#undef COEFF
|
#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 ONE (-32768)
|
||||||
#define R(x) (((x) + 16384)>>15)
|
#define R(x) (((x) + 16384)>>15)
|
||||||
#define SAMPLE int16_t
|
#define SAMPLE int16_t
|
||||||
@ -297,6 +309,15 @@ int swri_rematrix_init(SwrContext *s){
|
|||||||
*((float*)s->native_one) = 1.0;
|
*((float*)s->native_one) = 1.0;
|
||||||
s->mix_1_1_f = copy_float;
|
s->mix_1_1_f = copy_float;
|
||||||
s->mix_2_1_f = sum2_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
|
}else
|
||||||
av_assert0(0);
|
av_assert0(0);
|
||||||
//FIXME quantize for integeres
|
//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;
|
((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{
|
}else{
|
||||||
for(i=0; i<len; i++){
|
for(i=0; i<len; i++){
|
||||||
int v=0;
|
int v=0;
|
||||||
|
@ -216,8 +216,9 @@ int swr_init(struct SwrContext *s){
|
|||||||
|
|
||||||
if( s->int_sample_fmt != AV_SAMPLE_FMT_S16P
|
if( s->int_sample_fmt != AV_SAMPLE_FMT_S16P
|
||||||
&&s->int_sample_fmt != AV_SAMPLE_FMT_S32P
|
&&s->int_sample_fmt != AV_SAMPLE_FMT_S32P
|
||||||
&&s->int_sample_fmt != AV_SAMPLE_FMT_FLTP){
|
&&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_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);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user