diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c index 933534d551..40383a4d06 100644 --- a/libavfilter/vf_yadif.c +++ b/libavfilter/vf_yadif.c @@ -23,12 +23,15 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/imgutils.h" +#include "libavutil/x86/asm.h" +#include "libavutil/x86/cpu.h" #include "avfilter.h" #include "formats.h" #include "internal.h" #include "video.h" #include "yadif.h" + typedef struct ThreadData { AVFrame *frame; int plane; @@ -37,6 +40,35 @@ typedef struct ThreadData { int tff; } ThreadData; +typedef struct YADIFContext { + const AVClass *class; + + enum YADIFMode mode; + enum YADIFParity parity; + enum YADIFDeint deint; + + int frame_pending; + + AVFrame *cur; + AVFrame *next; + AVFrame *prev; + AVFrame *out; + + /** + * Required alignment for filter_line + */ + void (*filter_line)(void *dst, + void *prev, void *cur, void *next, + int w, int prefs, int mrefs, int parity, int mode); + void (*filter_edges)(void *dst, void *prev, void *cur, void *next, + int w, int prefs, int mrefs, int parity, int mode); + + const AVPixFmtDescriptor *csp; + int eof; + uint8_t *temp_line; + int temp_line_size; +} YADIFContext; + #define CHECK(j)\ { int score = FFABS(cur[mrefs - 1 + j] - cur[prefs - 1 - j])\ + FFABS(cur[mrefs + j] - cur[prefs - j])\ @@ -461,6 +493,9 @@ static int config_props(AVFilterLink *link) { AVFilterContext *ctx = link->src; YADIFContext *s = link->src->priv; + int cpu_flags = av_get_cpu_flags(); + int bit_depth = (!s->csp) ? 8 + : s->csp->comp[0].depth_minus1 + 1; link->time_base.num = link->src->inputs[0]->time_base.num; link->time_base.den = link->src->inputs[0]->time_base.den * 2; @@ -484,9 +519,38 @@ static int config_props(AVFilterLink *link) s->filter_edges = filter_edges; } - if (ARCH_X86) - ff_yadif_init_x86(s); - +#if HAVE_YASM + if (bit_depth >= 15) { + if (EXTERNAL_SSE4(cpu_flags)) + s->filter_line = ff_yadif_filter_line_16bit_sse4; + else if (EXTERNAL_SSSE3(cpu_flags)) + s->filter_line = ff_yadif_filter_line_16bit_ssse3; + else if (EXTERNAL_SSE2(cpu_flags)) + s->filter_line = ff_yadif_filter_line_16bit_sse2; +#if ARCH_X86_32 + else if (EXTERNAL_MMXEXT(cpu_flags)) + s->filter_line = ff_yadif_filter_line_16bit_mmxext; +#endif /* ARCH_X86_32 */ + } else if ( bit_depth >= 9 && bit_depth <= 14) { + if (EXTERNAL_SSSE3(cpu_flags)) + s->filter_line = ff_yadif_filter_line_10bit_ssse3; + else if (EXTERNAL_SSE2(cpu_flags)) + s->filter_line = ff_yadif_filter_line_10bit_sse2; +#if ARCH_X86_32 + else if (EXTERNAL_MMXEXT(cpu_flags)) + s->filter_line = ff_yadif_filter_line_10bit_mmxext; +#endif /* ARCH_X86_32 */ + } else { + if (EXTERNAL_SSSE3(cpu_flags)) + s->filter_line = ff_yadif_filter_line_ssse3; + else if (EXTERNAL_SSE2(cpu_flags)) + s->filter_line = ff_yadif_filter_line_sse2; +#if ARCH_X86_32 + else if (EXTERNAL_MMXEXT(cpu_flags)) + s->filter_line = ff_yadif_filter_line_mmxext; +#endif /* ARCH_X86_32 */ + } +#endif /* HAVE_YASM */ return 0; } diff --git a/libavfilter/x86/Makefile b/libavfilter/x86/Makefile index 6a252b40bf..be4ad83ebc 100644 --- a/libavfilter/x86/Makefile +++ b/libavfilter/x86/Makefile @@ -3,7 +3,6 @@ OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d_init.o OBJS-$(CONFIG_PULLUP_FILTER) += x86/vf_pullup_init.o OBJS-$(CONFIG_SPP_FILTER) += x86/vf_spp.o OBJS-$(CONFIG_VOLUME_FILTER) += x86/af_volume_init.o -OBJS-$(CONFIG_YADIF_FILTER) += x86/vf_yadif_init.o YASM-OBJS-$(CONFIG_GRADFUN_FILTER) += x86/vf_gradfun.o YASM-OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d.o diff --git a/libavfilter/x86/vf_yadif_init.c b/libavfilter/x86/vf_yadif_init.c deleted file mode 100644 index ae09bb060b..0000000000 --- a/libavfilter/x86/vf_yadif_init.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2006 Michael Niedermayer - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 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 General Public License for more details. - * - * You should have received a copy of the GNU 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/attributes.h" -#include "libavutil/cpu.h" -#include "libavutil/mem.h" -#include "libavutil/x86/asm.h" -#include "libavutil/x86/cpu.h" -#include "libavfilter/yadif.h" - -void ff_yadif_filter_line_mmxext(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_sse2(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_ssse3(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); - -void ff_yadif_filter_line_16bit_mmxext(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_16bit_sse2(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_16bit_ssse3(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_16bit_sse4(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); - -void ff_yadif_filter_line_10bit_mmxext(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_10bit_sse2(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); -void ff_yadif_filter_line_10bit_ssse3(void *dst, void *prev, void *cur, - void *next, int w, int prefs, - int mrefs, int parity, int mode); - -av_cold void ff_yadif_init_x86(YADIFContext *yadif) -{ -#if HAVE_YASM - int cpu_flags = av_get_cpu_flags(); - int bit_depth = (!yadif->csp) ? 8 - : yadif->csp->comp[0].depth_minus1 + 1; - - if (bit_depth >= 15) { -#if ARCH_X86_32 - if (EXTERNAL_MMXEXT(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_16bit_mmxext; -#endif /* ARCH_X86_32 */ - if (EXTERNAL_SSE2(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_16bit_sse2; - if (EXTERNAL_SSSE3(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_16bit_ssse3; - if (EXTERNAL_SSE4(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_16bit_sse4; - } else if ( bit_depth >= 9 && bit_depth <= 14) { -#if ARCH_X86_32 - if (EXTERNAL_MMXEXT(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_10bit_mmxext; -#endif /* ARCH_X86_32 */ - if (EXTERNAL_SSE2(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_10bit_sse2; - if (EXTERNAL_SSSE3(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_10bit_ssse3; - } else { -#if ARCH_X86_32 - if (EXTERNAL_MMXEXT(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_mmxext; -#endif /* ARCH_X86_32 */ - if (EXTERNAL_SSE2(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_sse2; - if (EXTERNAL_SSSE3(cpu_flags)) - yadif->filter_line = ff_yadif_filter_line_ssse3; - } -#endif /* HAVE_YASM */ -} diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h index 3ddf0050a6..5afe01424b 100644 --- a/libavfilter/yadif.h +++ b/libavfilter/yadif.h @@ -19,7 +19,6 @@ #ifndef AVFILTER_YADIF_H #define AVFILTER_YADIF_H -#include "libavutil/pixdesc.h" #include "avfilter.h" enum YADIFMode { @@ -40,35 +39,37 @@ enum YADIFDeint { YADIF_DEINT_INTERLACED = 1, ///< only deinterlace frames marked as interlaced }; -typedef struct YADIFContext { - const AVClass *class; +void ff_yadif_filter_line_mmxext(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_sse2(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_ssse3(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); - enum YADIFMode mode; - enum YADIFParity parity; - enum YADIFDeint deint; +void ff_yadif_filter_line_16bit_mmxext(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_16bit_sse2(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_16bit_ssse3(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_16bit_sse4(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); - int frame_pending; - - AVFrame *cur; - AVFrame *next; - AVFrame *prev; - AVFrame *out; - - /** - * Required alignment for filter_line - */ - void (*filter_line)(void *dst, - void *prev, void *cur, void *next, - int w, int prefs, int mrefs, int parity, int mode); - void (*filter_edges)(void *dst, void *prev, void *cur, void *next, - int w, int prefs, int mrefs, int parity, int mode); - - const AVPixFmtDescriptor *csp; - int eof; - uint8_t *temp_line; - int temp_line_size; -} YADIFContext; - -void ff_yadif_init_x86(YADIFContext *yadif); +void ff_yadif_filter_line_10bit_mmxext(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_10bit_sse2(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); +void ff_yadif_filter_line_10bit_ssse3(void *dst, void *prev, void *cur, + void *next, int w, int prefs, + int mrefs, int parity, int mode); #endif /* AVFILTER_YADIF_H */