mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-16 11:47:04 +00:00
rematrix: dont use floats for int16 code.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
c3c1af6dc6
commit
8593b743a8
@ -22,12 +22,18 @@
|
|||||||
#include "libavutil/audioconvert.h"
|
#include "libavutil/audioconvert.h"
|
||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
|
|
||||||
|
#define ONE (1.0)
|
||||||
|
#define R(x) x
|
||||||
#define SAMPLE float
|
#define SAMPLE float
|
||||||
#define RENAME(x) x ## _float
|
#define RENAME(x) x ## _float
|
||||||
#include "rematrix_template.c"
|
#include "rematrix_template.c"
|
||||||
#undef SAMPLE
|
#undef SAMPLE
|
||||||
#undef RENAME
|
#undef RENAME
|
||||||
|
#undef R
|
||||||
|
#undef ONE
|
||||||
|
|
||||||
|
#define ONE (-32768)
|
||||||
|
#define R(x) (((x) + 16384)>>15)
|
||||||
#define SAMPLE int16_t
|
#define SAMPLE int16_t
|
||||||
#define RENAME(x) x ## _s16
|
#define RENAME(x) x ## _s16
|
||||||
#include "rematrix_template.c"
|
#include "rematrix_template.c"
|
||||||
@ -188,6 +194,7 @@ int swr_rematrix_init(SwrContext *s){
|
|||||||
int ch_in=0;
|
int ch_in=0;
|
||||||
for(j=0; j<64; j++){
|
for(j=0; j<64; j++){
|
||||||
s->matrix[out_i][in_i]= matrix[i][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]){
|
if(matrix[i][j]){
|
||||||
s->matrix_ch[out_i][++ch_in]= in_i;
|
s->matrix_ch[out_i][++ch_in]= in_i;
|
||||||
sum += fabs(matrix[i][j]);
|
sum += fabs(matrix[i][j]);
|
||||||
@ -203,8 +210,10 @@ int swr_rematrix_init(SwrContext *s){
|
|||||||
if(( s->out_sample_fmt < AV_SAMPLE_FMT_FLT
|
if(( s->out_sample_fmt < AV_SAMPLE_FMT_FLT
|
||||||
|| s->int_sample_fmt < AV_SAMPLE_FMT_FLT) && maxcoef > 1.0){
|
|| s->int_sample_fmt < AV_SAMPLE_FMT_FLT) && maxcoef > 1.0){
|
||||||
for(i=0; i<SWR_CH_MAX; i++)
|
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->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(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++){
|
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){
|
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);
|
copy_float(out->ch[out_i], in->ch[in_i], s->matrix[out_i][in_i], len);
|
||||||
}else
|
}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{
|
}else{
|
||||||
out->ch[out_i]= in->ch[in_i];
|
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);
|
len);
|
||||||
}else{
|
}else{
|
||||||
sum2_s16 (out->ch[out_i], in->ch[ s->matrix_ch[out_i][1] ], in->ch[ s->matrix_ch[out_i][2] ],
|
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);
|
len);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -260,9 +269,9 @@ av_assert0(in ->ch_count == av_get_channel_layout_nb_channels(s-> in_ch_layout))
|
|||||||
int v=0;
|
int v=0;
|
||||||
for(j=0; j<s->matrix_ch[out_i][0]; j++){
|
for(j=0; j<s->matrix_ch[out_i][0]; j++){
|
||||||
in_i= s->matrix_ch[out_i][1+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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
int i;
|
||||||
|
|
||||||
for(i=0; i<len; 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){
|
static void RENAME(copy)(SAMPLE *out, const SAMPLE *in, SAMPLE coeff, int len){
|
||||||
if(coeff == 1.0){
|
if(coeff == ONE){
|
||||||
memcpy(out, in, sizeof(SAMPLE)*len);
|
memcpy(out, in, sizeof(SAMPLE)*len);
|
||||||
}else{
|
}else{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<len; i++)
|
for(i=0; i<len; i++)
|
||||||
out[i] = coeff*in[i]; //FIXME better int16
|
out[i] = R(coeff*in[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ typedef struct SwrContext { //FIXME find unused fields
|
|||||||
struct AVResampleContext *resample;
|
struct AVResampleContext *resample;
|
||||||
|
|
||||||
float matrix[SWR_CH_MAX][SWR_CH_MAX];
|
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];
|
uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1];
|
||||||
|
|
||||||
//TODO callbacks for asm optims
|
//TODO callbacks for asm optims
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
a76fc937faac62c5de057cd69191732a *./tests/data/acodec/g726.wav
|
687d70267e999fc9afba2a1ecc960f3c *./tests/data/acodec/g726.wav
|
||||||
24052 ./tests/data/acodec/g726.wav
|
24052 ./tests/data/acodec/g726.wav
|
||||||
124de13e6cb5af64ea8758aa49feb7fc *./tests/data/g726.acodec.out.wav
|
700845e9457cae5f961fb703cb46d6a7 *./tests/data/g726.acodec.out.wav
|
||||||
stddev: 8554.23 PSNR: 17.69 MAXDIFF:29353 bytes: 95984/ 1058400
|
stddev: 8553.69 PSNR: 17.69 MAXDIFF:29353 bytes: 95984/ 1058400
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
6e716216d5f9e3819db8eb8796de9129 *./tests/data/lavf/lavf.dv
|
3a6a9163a67b729b4a6b5d972ccceb97 *./tests/data/lavf/lavf.dv
|
||||||
3600000 ./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
|
||||||
|
@ -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
|
5330989 ./tests/data/lavf/lavf.mxf_d10
|
||||||
./tests/data/lavf/lavf.mxf_d10 CRC=0x96c02dfd
|
./tests/data/lavf/lavf.mxf_d10 CRC=0x81602ff1
|
||||||
|
Loading…
Reference in New Issue
Block a user