swr: initialize only the necessary resample dsp functions
[ffmpeg.git] / libswresample / x86 / resample_x86_dsp.c
index e32b6ee..00eb9e1 100644 (file)
 #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;
     }
 }