2 * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "libavutil/attributes.h"
22 #include "libavutil/cpu.h"
23 #include "libavutil/mem.h"
24 #include "libavutil/x86/cpu.h"
25 #include "libavfilter/yadif.h"
27 void ff_yadif_filter_line_mmxext(void *dst, void *prev, void *cur,
28 void *next, int w, int prefs,
29 int mrefs, int parity, int mode);
30 void ff_yadif_filter_line_sse2(void *dst, void *prev, void *cur,
31 void *next, int w, int prefs,
32 int mrefs, int parity, int mode);
33 void ff_yadif_filter_line_ssse3(void *dst, void *prev, void *cur,
34 void *next, int w, int prefs,
35 int mrefs, int parity, int mode);
37 void ff_yadif_filter_line_16bit_mmxext(void *dst, void *prev, void *cur,
38 void *next, int w, int prefs,
39 int mrefs, int parity, int mode);
40 void ff_yadif_filter_line_16bit_sse2(void *dst, void *prev, void *cur,
41 void *next, int w, int prefs,
42 int mrefs, int parity, int mode);
43 void ff_yadif_filter_line_16bit_ssse3(void *dst, void *prev, void *cur,
44 void *next, int w, int prefs,
45 int mrefs, int parity, int mode);
46 void ff_yadif_filter_line_16bit_sse4(void *dst, void *prev, void *cur,
47 void *next, int w, int prefs,
48 int mrefs, int parity, int mode);
50 void ff_yadif_filter_line_10bit_mmxext(void *dst, void *prev, void *cur,
51 void *next, int w, int prefs,
52 int mrefs, int parity, int mode);
53 void ff_yadif_filter_line_10bit_sse2(void *dst, void *prev, void *cur,
54 void *next, int w, int prefs,
55 int mrefs, int parity, int mode);
56 void ff_yadif_filter_line_10bit_ssse3(void *dst, void *prev, void *cur,
57 void *next, int w, int prefs,
58 int mrefs, int parity, int mode);
60 av_cold void ff_yadif_init_x86(YADIFContext *yadif)
62 int cpu_flags = av_get_cpu_flags();
63 int bit_depth = (!yadif->csp) ? 8
64 : yadif->csp->comp[0].depth;
66 if (bit_depth >= 15) {
68 if (EXTERNAL_MMXEXT(cpu_flags))
69 yadif->filter_line = ff_yadif_filter_line_16bit_mmxext;
70 #endif /* ARCH_X86_32 */
71 if (EXTERNAL_SSE2(cpu_flags))
72 yadif->filter_line = ff_yadif_filter_line_16bit_sse2;
73 if (EXTERNAL_SSSE3(cpu_flags))
74 yadif->filter_line = ff_yadif_filter_line_16bit_ssse3;
75 if (EXTERNAL_SSE4(cpu_flags))
76 yadif->filter_line = ff_yadif_filter_line_16bit_sse4;
77 } else if ( bit_depth >= 9 && bit_depth <= 14) {
79 if (EXTERNAL_MMXEXT(cpu_flags))
80 yadif->filter_line = ff_yadif_filter_line_10bit_mmxext;
81 #endif /* ARCH_X86_32 */
82 if (EXTERNAL_SSE2(cpu_flags))
83 yadif->filter_line = ff_yadif_filter_line_10bit_sse2;
84 if (EXTERNAL_SSSE3(cpu_flags))
85 yadif->filter_line = ff_yadif_filter_line_10bit_ssse3;
88 if (EXTERNAL_MMXEXT(cpu_flags))
89 yadif->filter_line = ff_yadif_filter_line_mmxext;
90 #endif /* ARCH_X86_32 */
91 if (EXTERNAL_SSE2(cpu_flags))
92 yadif->filter_line = ff_yadif_filter_line_sse2;
93 if (EXTERNAL_SSSE3(cpu_flags))
94 yadif->filter_line = ff_yadif_filter_line_ssse3;