]> git.sesse.net Git - ffmpeg/commitdiff
vf_yadif: move x86 init code to x86/yadif.c
authorMans Rullgard <mans@mansr.com>
Sun, 1 Jul 2012 12:08:17 +0000 (13:08 +0100)
committerMans Rullgard <mans@mansr.com>
Mon, 2 Jul 2012 00:16:37 +0000 (01:16 +0100)
Signed-off-by: Mans Rullgard <mans@mansr.com>
libavfilter/vf_yadif.c
libavfilter/x86/yadif.c
libavfilter/x86/yadif_template.c
libavfilter/yadif.h

index 08c543615a0d2eb5e7dcb8b4b5bd9e4cd12e51d3..230e797221573f95c2d4d774b336a5eca5127ced 100644 (file)
 #undef NDEBUG
 #include <assert.h>
 
-typedef struct {
-    /**
-     * 0: send 1 frame for each frame
-     * 1: send 1 frame for each field
-     * 2: like 0 but skips spatial interlacing check
-     * 3: like 1 but skips spatial interlacing check
-     */
-    int mode;
-
-    /**
-     *  0: top field first
-     *  1: bottom field first
-     * -1: auto-detection
-     */
-    int parity;
-
-    int frame_pending;
-
-    /**
-     *  0: deinterlace all frames
-     *  1: only deinterlace frames marked as interlaced
-     */
-    int auto_enable;
-
-    AVFilterBufferRef *cur;
-    AVFilterBufferRef *next;
-    AVFilterBufferRef *prev;
-    AVFilterBufferRef *out;
-    void (*filter_line)(uint8_t *dst,
-                        uint8_t *prev, uint8_t *cur, uint8_t *next,
-                        int w, int prefs, int mrefs, int parity, int mode);
-
-    const AVPixFmtDescriptor *csp;
-    int eof;
-} YADIFContext;
-
 #define CHECK(j)\
     {   int score = FFABS(cur[mrefs-1+(j)] - cur[prefs-1-(j)])\
                   + FFABS(cur[mrefs  +(j)] - cur[prefs  -(j)])\
@@ -397,7 +361,6 @@ static int query_formats(AVFilterContext *ctx)
 static av_cold int init(AVFilterContext *ctx, const char *args)
 {
     YADIFContext *yadif = ctx->priv;
-    int cpu_flags = av_get_cpu_flags();
 
     yadif->mode = 0;
     yadif->parity = -1;
@@ -407,12 +370,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
     if (args) sscanf(args, "%d:%d:%d", &yadif->mode, &yadif->parity, &yadif->auto_enable);
 
     yadif->filter_line = filter_line_c;
-    if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3)
-        yadif->filter_line = ff_yadif_filter_line_ssse3;
-    else if (HAVE_SSE && cpu_flags & AV_CPU_FLAG_SSE2)
-        yadif->filter_line = ff_yadif_filter_line_sse2;
-    else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX)
-        yadif->filter_line = ff_yadif_filter_line_mmx;
+
+    if (HAVE_MMX)
+        ff_yadif_init_x86(yadif);
 
     av_log(ctx, AV_LOG_VERBOSE, "mode:%d parity:%d auto_enable:%d\n", yadif->mode, yadif->parity, yadif->auto_enable);
 
index 7cd7e192581ad9fb86316ec369b566283043e3a6..fe77f3a99c6087a95c99a725163649c635329c1b 100644 (file)
@@ -18,6 +18,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include "libavutil/attributes.h"
 #include "libavutil/cpu.h"
 #include "libavutil/x86_cpu.h"
 #include "libavcodec/x86/dsputil_mmx.h"
@@ -47,3 +48,15 @@ DECLARE_ASM_CONST(16, const xmm_reg, pw_1) = {0x0001000100010001ULL, 0x000100010
 #define RENAME(a) a ## _mmx
 #include "yadif_template.c"
 #endif
+
+av_cold void ff_yadif_init_x86(YADIFContext *yadif)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX)
+        yadif->filter_line = yadif_filter_line_mmx;
+    if (HAVE_SSE && cpu_flags & AV_CPU_FLAG_SSE2)
+        yadif->filter_line = yadif_filter_line_sse2;
+    if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3)
+        yadif->filter_line = yadif_filter_line_ssse3;
+}
index ffcc39eebc6a9696b7a413e959f7dd9a02e834e6..1de0a58e8f0a6ff05ba330c807e915f76c14f45f 100644 (file)
             "por       "MM"5, "MM"3 \n\t"\
             MOVQ"      "MM"3, "MM"1 \n\t"
 
-void RENAME(ff_yadif_filter_line)(uint8_t *dst,
-                                  uint8_t *prev, uint8_t *cur, uint8_t *next,
-                                  int w, int prefs, int mrefs, int parity, int mode)
+static void RENAME(yadif_filter_line)(uint8_t *dst, uint8_t *prev, uint8_t *cur,
+                                      uint8_t *next, int w, int prefs,
+                                      int mrefs, int parity, int mode)
 {
     DECLARE_ALIGNED(16, uint8_t, tmp0)[16];
     DECLARE_ALIGNED(16, uint8_t, tmp1)[16];
index d658b683d74ddb4a58c4b55a5cd7184930730d76..9d23870cd16a6a71a69ad9e83adb08809d58935c 100644 (file)
 #ifndef AVFILTER_YADIF_H
 #define AVFILTER_YADIF_H
 
+#include "libavutil/pixdesc.h"
 #include "avfilter.h"
 
-void ff_yadif_filter_line_mmx(uint8_t *dst,
-                              uint8_t *prev, uint8_t *cur, uint8_t *next,
-                              int w, int prefs, int mrefs, int parity, int mode);
+typedef struct {
+    /**
+     * 0: send 1 frame for each frame
+     * 1: send 1 frame for each field
+     * 2: like 0 but skips spatial interlacing check
+     * 3: like 1 but skips spatial interlacing check
+     */
+    int mode;
 
-void ff_yadif_filter_line_sse2(uint8_t *dst,
-                               uint8_t *prev, uint8_t *cur, uint8_t *next,
-                               int w, int prefs, int mrefs, int parity, int mode);
+    /**
+     *  0: top field first
+     *  1: bottom field first
+     * -1: auto-detection
+     */
+    int parity;
 
-void ff_yadif_filter_line_ssse3(uint8_t *dst,
-                                uint8_t *prev, uint8_t *cur, uint8_t *next,
-                                int w, int prefs, int mrefs, int parity, int mode);
+    int frame_pending;
+
+    /**
+     *  0: deinterlace all frames
+     *  1: only deinterlace frames marked as interlaced
+     */
+    int auto_enable;
+
+    AVFilterBufferRef *cur;
+    AVFilterBufferRef *next;
+    AVFilterBufferRef *prev;
+    AVFilterBufferRef *out;
+    void (*filter_line)(uint8_t *dst,
+                        uint8_t *prev, uint8_t *cur, uint8_t *next,
+                        int w, int prefs, int mrefs, int parity, int mode);
+
+    const AVPixFmtDescriptor *csp;
+    int eof;
+} YADIFContext;
+
+void ff_yadif_init_x86(YADIFContext *yadif);
 
 #endif /* AVFILTER_YADIF_H */