aboutsummaryrefslogtreecommitdiffstats
path: root/libavresample
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-01-09 12:13:58 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-01-09 12:14:56 +0100
commit75afbe2ab4a14cdfdc4001869ae67ded99cf5ce7 (patch)
treea71971845a2b85bddf8bbcfe4227dd370341f000 /libavresample
parent34c1c08c665389daa190cb331e4d899da8dde57a (diff)
parent1fb8f6a44f06e48386450fe0363aefc02583d24a (diff)
downloadffmpeg-75afbe2ab4a14cdfdc4001869ae67ded99cf5ce7.tar.gz
Merge commit '1fb8f6a44f06e48386450fe0363aefc02583d24a'
* commit '1fb8f6a44f06e48386450fe0363aefc02583d24a': x86: lavr: add SSE2 quantize() for dithering doc/APIchanges: fill in missing dates and hashes. rtpdec_vp8: Request a keyframe if RTP packets are lost Conflicts: doc/APIchanges Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavresample')
-rw-r--r--libavresample/dither.c3
-rw-r--r--libavresample/dither.h5
-rw-r--r--libavresample/x86/Makefile2
-rw-r--r--libavresample/x86/dither.asm53
-rw-r--r--libavresample/x86/dither_init.c39
5 files changed, 102 insertions, 0 deletions
diff --git a/libavresample/dither.c b/libavresample/dither.c
index dfff03e756..f24bf5c765 100644
--- a/libavresample/dither.c
+++ b/libavresample/dither.c
@@ -336,6 +336,9 @@ static void dither_init(DitherDSPContext *ddsp,
ddsp->dither_int_to_float = dither_int_to_float_rectangular_c;
else
ddsp->dither_int_to_float = dither_int_to_float_triangular_c;
+
+ if (ARCH_X86)
+ ff_dither_init_x86(ddsp, method);
}
DitherContext *ff_dither_alloc(AVAudioResampleContext *avr,
diff --git a/libavresample/dither.h b/libavresample/dither.h
index d6a7d3ea8d..8db37146fa 100644
--- a/libavresample/dither.h
+++ b/libavresample/dither.h
@@ -85,4 +85,9 @@ void ff_dither_free(DitherContext **c);
*/
int ff_convert_dither(DitherContext *c, AudioData *dst, AudioData *src);
+/* arch-specific initialization functions */
+
+void ff_dither_init_x86(DitherDSPContext *ddsp,
+ enum AVResampleDitherMethod method);
+
#endif /* AVRESAMPLE_DITHER_H */
diff --git a/libavresample/x86/Makefile b/libavresample/x86/Makefile
index 65bed899ba..2e8786fb90 100644
--- a/libavresample/x86/Makefile
+++ b/libavresample/x86/Makefile
@@ -1,5 +1,7 @@
OBJS += x86/audio_convert_init.o \
x86/audio_mix_init.o \
+ x86/dither_init.o \
YASM-OBJS += x86/audio_convert.o \
x86/audio_mix.o \
+ x86/dither.o \
diff --git a/libavresample/x86/dither.asm b/libavresample/x86/dither.asm
new file mode 100644
index 0000000000..bfdc4e6907
--- /dev/null
+++ b/libavresample/x86/dither.asm
@@ -0,0 +1,53 @@
+;******************************************************************************
+;* x86 optimized dithering format conversion
+;* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION_RODATA 32
+
+pf_s16_scale: times 4 dd 32753.0
+
+SECTION_TEXT
+
+;------------------------------------------------------------------------------
+; void ff_quantize(int16_t *dst, float *src, float *dither, int len);
+;------------------------------------------------------------------------------
+
+INIT_XMM sse2
+cglobal quantize, 4,4,3, dst, src, dither, len
+ lea lenq, [2*lend]
+ add dstq, lenq
+ lea srcq, [srcq+2*lenq]
+ lea ditherq, [ditherq+2*lenq]
+ neg lenq
+ mova m2, [pf_s16_scale]
+.loop:
+ mulps m0, m2, [srcq+2*lenq]
+ mulps m1, m2, [srcq+2*lenq+mmsize]
+ addps m0, [ditherq+2*lenq]
+ addps m1, [ditherq+2*lenq+mmsize]
+ cvtps2dq m0, m0
+ cvtps2dq m1, m1
+ packssdw m0, m1
+ mova [dstq+lenq], m0
+ add lenq, mmsize
+ jl .loop
+ REP_RET
diff --git a/libavresample/x86/dither_init.c b/libavresample/x86/dither_init.c
new file mode 100644
index 0000000000..d5d92902fd
--- /dev/null
+++ b/libavresample/x86/dither_init.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavresample/dither.h"
+
+extern void ff_quantize_sse2(int16_t *dst, const float *src, float *dither,
+ int len);
+
+av_cold void ff_dither_init_x86(DitherDSPContext *ddsp,
+ enum AVResampleDitherMethod method)
+{
+ int mm_flags = av_get_cpu_flags();
+
+ if (EXTERNAL_SSE2(mm_flags)) {
+ ddsp->quantize = ff_quantize_sse2;
+ ddsp->ptr_align = 16;
+ ddsp->samples_align = 8;
+ }
+}