aboutsummaryrefslogtreecommitdiffstats
path: root/libswresample/x86
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2014-07-02 22:16:48 -0300
committerMichael Niedermayer <michaelni@gmx.at>2014-07-04 01:37:41 +0200
commit857cd1f33bcf86005529af2a77f861f884327be5 (patch)
tree519ce6e41cfa927c419131481d509c85b6f20eec /libswresample/x86
parent5c65aed7fdfba6d5488bae4b50b9df8829587818 (diff)
downloadffmpeg-857cd1f33bcf86005529af2a77f861f884327be5.tar.gz
swr: initialize only the necessary resample dsp functions
Signed-off-by: James Almer <jamrial@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswresample/x86')
-rw-r--r--libswresample/x86/resample_x86_dsp.c78
1 files changed, 43 insertions, 35 deletions
diff --git a/libswresample/x86/resample_x86_dsp.c b/libswresample/x86/resample_x86_dsp.c
index e32b6ee341..00eb9e14a1 100644
--- a/libswresample/x86/resample_x86_dsp.c
+++ b/libswresample/x86/resample_x86_dsp.c
@@ -28,10 +28,10 @@
#include "libswresample/resample.h"
#define RESAMPLE_FUNCS(type, opt) \
-int ff_resample_common_##type##_##opt(ResampleContext *c, uint8_t *dst, \
- const uint8_t *src, int sz, int upd); \
-int ff_resample_linear_##type##_##opt(ResampleContext *c, uint8_t *dst, \
- const uint8_t *src, int sz, int upd)
+int ff_resample_common_##type##_##opt(ResampleContext *c, void *dst, \
+ const void *src, int sz, int upd); \
+int ff_resample_linear_##type##_##opt(ResampleContext *c, void *dst, \
+ const void *src, int sz, int upd)
RESAMPLE_FUNCS(int16, mmxext);
RESAMPLE_FUNCS(int16, sse2);
@@ -46,36 +46,44 @@ void swri_resample_dsp_x86_init(ResampleContext *c)
{
int av_unused mm_flags = av_get_cpu_flags();
-#define FNIDX(fmt) (AV_SAMPLE_FMT_##fmt - AV_SAMPLE_FMT_S16P)
- if (ARCH_X86_32 && HAVE_MMXEXT_EXTERNAL && mm_flags & AV_CPU_FLAG_MMX2) {
- c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_mmxext;
- c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_mmxext;
- }
- if (HAVE_SSE_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE) {
- c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_sse;
- c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_sse;
- }
- if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) {
- c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_sse2;
- c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_sse2;
-
- c->dsp.resample_common[FNIDX(DBLP)] = ff_resample_common_double_sse2;
- c->dsp.resample_linear[FNIDX(DBLP)] = ff_resample_linear_double_sse2;
- }
- if (HAVE_AVX_EXTERNAL && mm_flags & AV_CPU_FLAG_AVX) {
- c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_avx;
- c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_avx;
- }
- if (HAVE_FMA3_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA3) {
- c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_fma3;
- c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_fma3;
- }
- if (HAVE_FMA4_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA4) {
- c->dsp.resample_common[FNIDX(FLTP)] = ff_resample_common_float_fma4;
- c->dsp.resample_linear[FNIDX(FLTP)] = ff_resample_linear_float_fma4;
- }
- if (HAVE_XOP_EXTERNAL && mm_flags & AV_CPU_FLAG_XOP) {
- c->dsp.resample_common[FNIDX(S16P)] = ff_resample_common_int16_xop;
- c->dsp.resample_linear[FNIDX(S16P)] = ff_resample_linear_int16_xop;
+ switch(c->format){
+ case AV_SAMPLE_FMT_S16P:
+ if (ARCH_X86_32 && HAVE_MMXEXT_EXTERNAL && mm_flags & AV_CPU_FLAG_MMX2) {
+ c->dsp.resample = c->linear ? ff_resample_linear_int16_mmxext
+ : ff_resample_common_int16_mmxext;
+ }
+ if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) {
+ c->dsp.resample = c->linear ? ff_resample_linear_int16_sse2
+ : ff_resample_common_int16_sse2;
+ }
+ if (HAVE_XOP_EXTERNAL && mm_flags & AV_CPU_FLAG_XOP) {
+ c->dsp.resample = c->linear ? ff_resample_linear_int16_xop
+ : ff_resample_common_int16_xop;
+ }
+ break;
+ case AV_SAMPLE_FMT_FLTP:
+ if (HAVE_SSE_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE) {
+ c->dsp.resample = c->linear ? ff_resample_linear_float_sse
+ : ff_resample_common_float_sse;
+ }
+ if (HAVE_AVX_EXTERNAL && mm_flags & AV_CPU_FLAG_AVX) {
+ c->dsp.resample = c->linear ? ff_resample_linear_float_avx
+ : ff_resample_common_float_avx;
+ }
+ if (HAVE_FMA3_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA3) {
+ c->dsp.resample = c->linear ? ff_resample_linear_float_fma3
+ : ff_resample_common_float_fma3;
+ }
+ if (HAVE_FMA4_EXTERNAL && mm_flags & AV_CPU_FLAG_FMA4) {
+ c->dsp.resample = c->linear ? ff_resample_linear_float_fma4
+ : ff_resample_common_float_fma4;
+ }
+ break;
+ case AV_SAMPLE_FMT_DBLP:
+ if (HAVE_SSE2_EXTERNAL && mm_flags & AV_CPU_FLAG_SSE2) {
+ c->dsp.resample = c->linear ? ff_resample_linear_double_sse2
+ : ff_resample_common_double_sse2;
+ }
+ break;
}
}