summaryrefslogtreecommitdiffstats
path: root/libswresample
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-09-19 09:18:05 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-09-19 09:25:50 +0200
commit8593b743a81263eebec79bb13b7b925bd024c5e1 (patch)
tree59a19c64b02b41c8cf435a29367e7f2040fee96b /libswresample
parentc3c1af6dc626a0677ec93ca10643ef2cc480814d (diff)
downloadffmpeg-streaming-8593b743a81263eebec79bb13b7b925bd024c5e1.zip
ffmpeg-streaming-8593b743a81263eebec79bb13b7b925bd024c5e1.tar.gz
rematrix: dont use floats for int16 code.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswresample')
-rw-r--r--libswresample/rematrix.c19
-rw-r--r--libswresample/rematrix_template.c10
-rw-r--r--libswresample/swresample_internal.h1
3 files changed, 20 insertions, 10 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
OpenPOWER on IntegriCloud