summaryrefslogtreecommitdiff
path: root/libswresample/x86/swresample_x86.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-06-12 16:27:00 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-06-12 16:35:13 +0200
commitcbeeaf25932aac5923e075ae241fcc5287f7396a (patch)
tree73cca1c32b4e7ed3d6e31f871cb93fb7dbf284a6 /libswresample/x86/swresample_x86.c
parent52afa43691116bf35b6398ef3087f3a1508ef9a6 (diff)
swr: mix_1_1 int16 MMX
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswresample/x86/swresample_x86.c')
-rw-r--r--libswresample/x86/swresample_x86.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/libswresample/x86/swresample_x86.c b/libswresample/x86/swresample_x86.c
index 18c601f72e..ba0f1f131a 100644
--- a/libswresample/x86/swresample_x86.c
+++ b/libswresample/x86/swresample_x86.c
@@ -163,6 +163,21 @@ void swri_rematrix_init_x86(struct SwrContext *s){
s->mix_2_1_simd = NULL;
if (s->midbuf.fmt == AV_SAMPLE_FMT_S16P){
+ if(mm_flags & AV_CPU_FLAG_MMX) {
+ s->mix_1_1_simd = ff_mix_1_1_a_int16_mmx;
+ }
+ s->native_simd_matrix = av_mallocz(2 * num * sizeof(int16_t));
+ for(i=0; i<nb_out; i++){
+ int sh = 0;
+ for(j=0; j<nb_in; j++)
+ sh = FFMAX(sh, FFABS(((int*)s->native_matrix)[i * nb_in + j]));
+ sh = FFMAX(av_log2(sh) - 14, 0);
+ for(j=0; j<nb_in; j++) {
+ ((int16_t*)s->native_simd_matrix)[2*(i * nb_in + j)+1] = 15 - sh;
+ ((int16_t*)s->native_simd_matrix)[2*(i * nb_in + j)] =
+ ((((int*)s->native_matrix)[i * nb_in + j]) + (1<<sh>>1)) >> sh;
+ }
+ }
} else if(s->midbuf.fmt == AV_SAMPLE_FMT_FLTP){
if(mm_flags & AV_CPU_FLAG_SSE) {
s->mix_1_1_simd = ff_mix_1_1_a_float_sse;