diff options
-rw-r--r-- | libswresample/rematrix.c | 19 | ||||
-rw-r--r-- | libswresample/rematrix_template.c | 10 | ||||
-rw-r--r-- | libswresample/swresample_internal.h | 1 | ||||
-rw-r--r-- | tests/ref/acodec/g726 | 6 | ||||
-rw-r--r-- | tests/ref/lavf/dv_fmt | 4 | ||||
-rw-r--r-- | tests/ref/lavf/mxf_d10 | 4 |
6 files changed, 27 insertions, 17 deletions
diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c index baed977..f8ba737 100644 --- a/libswresample/rematrix.c +++ b/libswresample/rematrix.c @@ -22,12 +22,18 @@ #include "libavutil/audioconvert.h" #include "libavutil/avassert.h" +#define ONE (1.0) +#define R(x) x #define SAMPLE float #define RENAME(x) x ## _float #include "rematrix_template.c" #undef SAMPLE #undef RENAME +#undef R +#undef ONE +#define ONE (-32768) +#define R(x) (((x) + 16384)>>15) #define SAMPLE int16_t #define RENAME(x) x ## _s16 #include "rematrix_template.c" @@ -188,6 +194,7 @@ int swr_rematrix_init(SwrContext *s){ int ch_in=0; for(j=0; j<64; j++){ s->matrix[out_i][in_i]= matrix[i][j]; + s->matrix16[out_i][in_i]= lrintf(matrix[i][j] * 32768); if(matrix[i][j]){ s->matrix_ch[out_i][++ch_in]= in_i; sum += fabs(matrix[i][j]); @@ -203,8 +210,10 @@ int swr_rematrix_init(SwrContext *s){ if(( s->out_sample_fmt < AV_SAMPLE_FMT_FLT || s->int_sample_fmt < AV_SAMPLE_FMT_FLT) && maxcoef > 1.0){ for(i=0; i<SWR_CH_MAX; i++) - for(j=0; j<SWR_CH_MAX; j++) + for(j=0; j<SWR_CH_MAX; j++){ s->matrix[i][j] /= maxcoef; + s->matrix16[i][j]= lrintf(s->matrix[i][j] * 32768); + } } for(i=0; i<av_get_channel_layout_nb_channels(s->out_ch_layout); i++){ for(j=0; j<av_get_channel_layout_nb_channels(s->in_ch_layout); j++){ @@ -229,7 +238,7 @@ av_assert0(in ->ch_count == av_get_channel_layout_nb_channels(s-> in_ch_layout)) if(s->int_sample_fmt == AV_SAMPLE_FMT_FLT){ copy_float(out->ch[out_i], in->ch[in_i], s->matrix[out_i][in_i], len); }else - copy_s16 (out->ch[out_i], in->ch[in_i], s->matrix[out_i][in_i], len); + copy_s16 (out->ch[out_i], in->ch[in_i], s->matrix16[out_i][in_i], len); }else{ out->ch[out_i]= in->ch[in_i]; } @@ -241,7 +250,7 @@ av_assert0(in ->ch_count == av_get_channel_layout_nb_channels(s-> in_ch_layout)) len); }else{ sum2_s16 (out->ch[out_i], in->ch[ s->matrix_ch[out_i][1] ], in->ch[ s->matrix_ch[out_i][2] ], - s->matrix[out_i][ s->matrix_ch[out_i][1] ], s->matrix[out_i][ s->matrix_ch[out_i][2] ], + s->matrix16[out_i][ s->matrix_ch[out_i][1] ], s->matrix16[out_i][ s->matrix_ch[out_i][2] ], len); } break; @@ -260,9 +269,9 @@ av_assert0(in ->ch_count == av_get_channel_layout_nb_channels(s-> in_ch_layout)) int v=0; for(j=0; j<s->matrix_ch[out_i][0]; j++){ in_i= s->matrix_ch[out_i][1+j]; - v+= ((int16_t*)in->ch[in_i])[i] * s->matrix[out_i][in_i]; //FIXME use int16 coeffs + v+= ((int16_t*)in->ch[in_i])[i] * s->matrix16[out_i][in_i]; } - ((int16_t*)out->ch[out_i])[i]= v; + ((int16_t*)out->ch[out_i])[i]= (v + 16384)>>15; } } } diff --git a/libswresample/rematrix_template.c b/libswresample/rematrix_template.c index 5d5aef2..0c45fc9 100644 --- a/libswresample/rematrix_template.c +++ b/libswresample/rematrix_template.c @@ -19,20 +19,20 @@ */ -static void RENAME(sum2)(SAMPLE *out, const SAMPLE *in1, const SAMPLE *in2, float coeff1, float coeff2, int len){ +static void RENAME(sum2)(SAMPLE *out, const SAMPLE *in1, const SAMPLE *in2, SAMPLE coeff1, SAMPLE coeff2, int len){ int i; for(i=0; i<len; i++) - out[i] = coeff1*in1[i] + coeff2*in2[i]; //FIXME better int16 + out[i] = R(coeff1*in1[i] + coeff2*in2[i]); } -static void RENAME(copy)(SAMPLE *out, const SAMPLE *in, float coeff, int len){ - if(coeff == 1.0){ +static void RENAME(copy)(SAMPLE *out, const SAMPLE *in, SAMPLE coeff, int len){ + if(coeff == ONE){ memcpy(out, in, sizeof(SAMPLE)*len); }else{ int i; for(i=0; i<len; i++) - out[i] = coeff*in[i]; //FIXME better int16 + out[i] = R(coeff*in[i]); } } diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h index 17a93d8..c883269 100644 --- a/libswresample/swresample_internal.h +++ b/libswresample/swresample_internal.h @@ -61,6 +61,7 @@ typedef struct SwrContext { //FIXME find unused fields struct AVResampleContext *resample; float matrix[SWR_CH_MAX][SWR_CH_MAX]; + int16_t matrix16[SWR_CH_MAX][SWR_CH_MAX]; uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1]; //TODO callbacks for asm optims diff --git a/tests/ref/acodec/g726 b/tests/ref/acodec/g726 index 32e1a48..f8d6f4d 100644 --- a/tests/ref/acodec/g726 +++ b/tests/ref/acodec/g726 @@ -1,4 +1,4 @@ -a76fc937faac62c5de057cd69191732a *./tests/data/acodec/g726.wav +687d70267e999fc9afba2a1ecc960f3c *./tests/data/acodec/g726.wav 24052 ./tests/data/acodec/g726.wav -124de13e6cb5af64ea8758aa49feb7fc *./tests/data/g726.acodec.out.wav -stddev: 8554.23 PSNR: 17.69 MAXDIFF:29353 bytes: 95984/ 1058400 +700845e9457cae5f961fb703cb46d6a7 *./tests/data/g726.acodec.out.wav +stddev: 8553.69 PSNR: 17.69 MAXDIFF:29353 bytes: 95984/ 1058400 diff --git a/tests/ref/lavf/dv_fmt b/tests/ref/lavf/dv_fmt index 7450720..ded1cee 100644 --- a/tests/ref/lavf/dv_fmt +++ b/tests/ref/lavf/dv_fmt @@ -1,3 +1,3 @@ -6e716216d5f9e3819db8eb8796de9129 *./tests/data/lavf/lavf.dv +3a6a9163a67b729b4a6b5d972ccceb97 *./tests/data/lavf/lavf.dv 3600000 ./tests/data/lavf/lavf.dv -./tests/data/lavf/lavf.dv CRC=0x92d1e3f0 +./tests/data/lavf/lavf.dv CRC=0x5ce4e5e4 diff --git a/tests/ref/lavf/mxf_d10 b/tests/ref/lavf/mxf_d10 index 1e0ee2e..efeac5a 100644 --- a/tests/ref/lavf/mxf_d10 +++ b/tests/ref/lavf/mxf_d10 @@ -1,3 +1,3 @@ -8eb67301f72f2b5860fafab422b920ad *./tests/data/lavf/lavf.mxf_d10 +23177c8a72f34e243e9ffc4f6c70d3c7 *./tests/data/lavf/lavf.mxf_d10 5330989 ./tests/data/lavf/lavf.mxf_d10 -./tests/data/lavf/lavf.mxf_d10 CRC=0x96c02dfd +./tests/data/lavf/lavf.mxf_d10 CRC=0x81602ff1 |