[FFmpeg-devel] [PATCH 1/3] swr: initialize only the necessary resample dsp functions

James Almer jamrial at gmail.com
Thu Jul 3 03:16:48 CEST 2014


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libswresample/resample.c             | 10 +----
 libswresample/resample.h             | 12 ++----
 libswresample/resample_dsp.c         | 33 ++++++++-------
 libswresample/resample_template.c    | 12 ++++--
 libswresample/x86/resample_x86_dsp.c | 78 ++++++++++++++++++++----------------
 5 files changed, 76 insertions(+), 69 deletions(-)

diff --git a/libswresample/resample.c b/libswresample/resample.c
index 6124b8a..2a8aa7e 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -271,8 +271,6 @@ static int swri_resample(ResampleContext *c,
                          uint8_t *dst, const uint8_t *src, int *consumed,
                          int src_size, int dst_size, int update_ctx)
 {
-    int fn_idx = c->format - AV_SAMPLE_FMT_S16P;
-
     if (c->filter_length == 1 && c->phase_shift == 0) {
         int index= c->index;
         int frac= c->frac;
@@ -281,7 +279,7 @@ static int swri_resample(ResampleContext *c,
         int new_size = (src_size * (int64_t)c->src_incr - frac + c->dst_incr - 1) / c->dst_incr;
 
         dst_size= FFMIN(dst_size, new_size);
-        c->dsp.resample_one[fn_idx](dst, src, dst_size, index2, incr);
+        c->dsp.resample_one(dst, src, dst_size, index2, incr);
 
         index += dst_size * c->dst_incr_div;
         index += (frac + dst_size * (int64_t)c->dst_incr_mod) / c->src_incr;
@@ -298,11 +296,7 @@ static int swri_resample(ResampleContext *c,
 
         dst_size = FFMIN(dst_size, delta_n);
         if (dst_size > 0) {
-            if (!c->linear) {
-                *consumed = c->dsp.resample_common[fn_idx](c, dst, src, dst_size, update_ctx);
-            } else {
-                *consumed = c->dsp.resample_linear[fn_idx](c, dst, src, dst_size, update_ctx);
-            }
+            *consumed = c->dsp.resample(c, dst, src, dst_size, update_ctx);
         } else {
             *consumed = 0;
         }
diff --git a/libswresample/resample.h b/libswresample/resample.h
index bf00175..99a89b7 100644
--- a/libswresample/resample.h
+++ b/libswresample/resample.h
@@ -27,11 +27,6 @@
 
 #include "swresample_internal.h"
 
-typedef void (*resample_one_fn)(uint8_t *dst, const uint8_t *src,
-                                int n, int64_t index, int64_t incr);
-typedef int (*resample_fn)(struct ResampleContext *c, uint8_t *dst,
-                           const uint8_t *src, int n, int update_ctx);
-
 typedef struct ResampleContext {
     const AVClass *av_class;
     uint8_t *filter_bank;
@@ -56,9 +51,10 @@ typedef struct ResampleContext {
     int filter_shift;
 
     struct {
-        resample_one_fn resample_one[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P];
-        resample_fn resample_common[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P];
-        resample_fn resample_linear[AV_SAMPLE_FMT_NB - AV_SAMPLE_FMT_S16P];
+        void (*resample_one)(void *dst, const void *src,
+                             int n, int64_t index, int64_t incr);
+        int (*resample)(struct ResampleContext *c, void *dst,
+                        const void *src, int n, int update_ctx);
     } dsp;
 } ResampleContext;
 
diff --git a/libswresample/resample_dsp.c b/libswresample/resample_dsp.c
index f12b6b1..a811b8b 100644
--- a/libswresample/resample_dsp.c
+++ b/libswresample/resample_dsp.c
@@ -45,21 +45,24 @@
 
 void swri_resample_dsp_init(ResampleContext *c)
 {
-#define FNIDX(fmt) (AV_SAMPLE_FMT_##fmt - AV_SAMPLE_FMT_S16P)
-    c->dsp.resample_one[FNIDX(S16P)] = (resample_one_fn) resample_one_int16;
-    c->dsp.resample_one[FNIDX(S32P)] = (resample_one_fn) resample_one_int32;
-    c->dsp.resample_one[FNIDX(FLTP)] = (resample_one_fn) resample_one_float;
-    c->dsp.resample_one[FNIDX(DBLP)] = (resample_one_fn) resample_one_double;
-
-    c->dsp.resample_common[FNIDX(S16P)] = (resample_fn) resample_common_int16;
-    c->dsp.resample_common[FNIDX(S32P)] = (resample_fn) resample_common_int32;
-    c->dsp.resample_common[FNIDX(FLTP)] = (resample_fn) resample_common_float;
-    c->dsp.resample_common[FNIDX(DBLP)] = (resample_fn) resample_common_double;
-
-    c->dsp.resample_linear[FNIDX(S16P)] = (resample_fn) resample_linear_int16;
-    c->dsp.resample_linear[FNIDX(S32P)] = (resample_fn) resample_linear_int32;
-    c->dsp.resample_linear[FNIDX(FLTP)] = (resample_fn) resample_linear_float;
-    c->dsp.resample_linear[FNIDX(DBLP)] = (resample_fn) resample_linear_double;
+    switch(c->format){
+    case AV_SAMPLE_FMT_S16P:
+        c->dsp.resample_one = resample_one_int16;
+        c->dsp.resample     = c->linear ? resample_linear_int16 : resample_common_int16;
+        break;
+    case AV_SAMPLE_FMT_S32P:
+        c->dsp.resample_one = resample_one_int32;
+        c->dsp.resample     = c->linear ? resample_linear_int32 : resample_common_int32;
+        break;
+    case AV_SAMPLE_FMT_FLTP:
+        c->dsp.resample_one = resample_one_float;
+        c->dsp.resample     = c->linear ? resample_linear_float : resample_common_float;
+        break;
+    case AV_SAMPLE_FMT_DBLP:
+        c->dsp.resample_one = resample_one_double;
+        c->dsp.resample     = c->linear ? resample_linear_double : resample_common_double;
+        break;
+    }
 
     if (ARCH_X86) swri_resample_dsp_x86_init(c);
 }
diff --git a/libswresample/resample_template.c b/libswresample/resample_template.c
index ab546f1..069b19c 100644
--- a/libswresample/resample_template.c
+++ b/libswresample/resample_template.c
@@ -70,9 +70,11 @@
 
 #endif
 
-static void RENAME(resample_one)(DELEM *dst, const DELEM *src,
+static void RENAME(resample_one)(void *dest, const void *source,
                                  int dst_size, int64_t index2, int64_t incr)
 {
+    DELEM *dst = dest;
+    const DELEM *src = source;
     int dst_index;
 
     for (dst_index = 0; dst_index < dst_size; dst_index++) {
@@ -82,9 +84,11 @@ static void RENAME(resample_one)(DELEM *dst, const DELEM *src,
 }
 
 static int RENAME(resample_common)(ResampleContext *c,
-                                   DELEM *dst, const DELEM *src,
+                                   void *dest, const void *source,
                                    int n, int update_ctx)
 {
+    DELEM *dst = dest;
+    const DELEM *src = source;
     int dst_index;
     int index= c->index;
     int frac= c->frac;
@@ -120,9 +124,11 @@ static int RENAME(resample_common)(ResampleContext *c,
 }
 
 static int RENAME(resample_linear)(ResampleContext *c,
-                                   DELEM *dst, const DELEM *src,
+                                   void *dest, const void *source,
                                    int n, int update_ctx)
 {
+    DELEM *dst = dest;
+    const DELEM *src = source;
     int dst_index;
     int index= c->index;
     int frac= c->frac;
diff --git a/libswresample/x86/resample_x86_dsp.c b/libswresample/x86/resample_x86_dsp.c
index e32b6ee..00eb9e1 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;
     }
 }
-- 
1.8.5.5



More information about the ffmpeg-devel mailing list