dsputil: Split off quarterpel bits into their own context
[ffmpeg.git] / libavcodec / x86 / dsputil_init.c
1 /*
2  * This file is part of Libav.
3  *
4  * Libav is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * Libav is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with Libav; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 #include "config.h"
20 #include "libavutil/attributes.h"
21 #include "libavutil/cpu.h"
22 #include "libavutil/internal.h"
23 #include "libavutil/x86/cpu.h"
24 #include "libavcodec/avcodec.h"
25 #include "libavcodec/dsputil.h"
26 #include "libavcodec/simple_idct.h"
27 #include "libavcodec/version.h"
28 #include "dsputil_x86.h"
29 #include "idct_xvid.h"
30
31 int32_t ff_scalarproduct_int16_mmxext(const int16_t *v1, const int16_t *v2,
32                                       int order);
33 int32_t ff_scalarproduct_int16_sse2(const int16_t *v1, const int16_t *v2,
34                                     int order);
35
36 void ff_bswap32_buf_ssse3(uint32_t *dst, const uint32_t *src, int w);
37 void ff_bswap32_buf_sse2(uint32_t *dst, const uint32_t *src, int w);
38
39 void ff_vector_clip_int32_mmx(int32_t *dst, const int32_t *src,
40                               int32_t min, int32_t max, unsigned int len);
41 void ff_vector_clip_int32_sse2(int32_t *dst, const int32_t *src,
42                                int32_t min, int32_t max, unsigned int len);
43 void ff_vector_clip_int32_int_sse2(int32_t *dst, const int32_t *src,
44                                    int32_t min, int32_t max, unsigned int len);
45 void ff_vector_clip_int32_sse4(int32_t *dst, const int32_t *src,
46                                int32_t min, int32_t max, unsigned int len);
47
48 static av_cold void dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx,
49                                      int cpu_flags, unsigned high_bit_depth)
50 {
51 #if HAVE_MMX_INLINE
52     c->put_pixels_clamped        = ff_put_pixels_clamped_mmx;
53     c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
54     c->add_pixels_clamped        = ff_add_pixels_clamped_mmx;
55
56     if (!high_bit_depth) {
57         c->clear_block  = ff_clear_block_mmx;
58         c->clear_blocks = ff_clear_blocks_mmx;
59         c->draw_edges   = ff_draw_edges_mmx;
60
61         switch (avctx->idct_algo) {
62         case FF_IDCT_AUTO:
63         case FF_IDCT_SIMPLEMMX:
64             c->idct_put              = ff_simple_idct_put_mmx;
65             c->idct_add              = ff_simple_idct_add_mmx;
66             c->idct                  = ff_simple_idct_mmx;
67             c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
68             break;
69         case FF_IDCT_XVIDMMX:
70             c->idct_put              = ff_idct_xvid_mmx_put;
71             c->idct_add              = ff_idct_xvid_mmx_add;
72             c->idct                  = ff_idct_xvid_mmx;
73             break;
74         }
75     }
76
77     c->gmc = ff_gmc_mmx;
78 #endif /* HAVE_MMX_INLINE */
79
80 #if HAVE_MMX_EXTERNAL
81     c->vector_clip_int32 = ff_vector_clip_int32_mmx;
82 #endif /* HAVE_MMX_EXTERNAL */
83 }
84
85 static av_cold void dsputil_init_mmxext(DSPContext *c, AVCodecContext *avctx,
86                                         int cpu_flags, unsigned high_bit_depth)
87 {
88 #if HAVE_MMXEXT_INLINE
89     if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
90         c->idct_put = ff_idct_xvid_mmxext_put;
91         c->idct_add = ff_idct_xvid_mmxext_add;
92         c->idct     = ff_idct_xvid_mmxext;
93     }
94 #endif /* HAVE_MMXEXT_INLINE */
95
96 #if HAVE_MMXEXT_EXTERNAL
97     c->scalarproduct_int16          = ff_scalarproduct_int16_mmxext;
98 #endif /* HAVE_MMXEXT_EXTERNAL */
99 }
100
101 static av_cold void dsputil_init_sse(DSPContext *c, AVCodecContext *avctx,
102                                      int cpu_flags, unsigned high_bit_depth)
103 {
104 #if HAVE_SSE_INLINE
105     c->vector_clipf = ff_vector_clipf_sse;
106
107 #if FF_API_XVMC
108 FF_DISABLE_DEPRECATION_WARNINGS
109     /* XvMCCreateBlocks() may not allocate 16-byte aligned blocks */
110     if (CONFIG_MPEG_XVMC_DECODER && avctx->xvmc_acceleration > 1)
111         return;
112 FF_ENABLE_DEPRECATION_WARNINGS
113 #endif /* FF_API_XVMC */
114
115     if (!high_bit_depth) {
116         c->clear_block  = ff_clear_block_sse;
117         c->clear_blocks = ff_clear_blocks_sse;
118     }
119 #endif /* HAVE_SSE_INLINE */
120 }
121
122 static av_cold void dsputil_init_sse2(DSPContext *c, AVCodecContext *avctx,
123                                       int cpu_flags, unsigned high_bit_depth)
124 {
125 #if HAVE_SSE2_INLINE
126     if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
127         c->idct_put              = ff_idct_xvid_sse2_put;
128         c->idct_add              = ff_idct_xvid_sse2_add;
129         c->idct                  = ff_idct_xvid_sse2;
130         c->idct_permutation_type = FF_SSE2_IDCT_PERM;
131     }
132 #endif /* HAVE_SSE2_INLINE */
133
134 #if HAVE_SSE2_EXTERNAL
135     c->scalarproduct_int16          = ff_scalarproduct_int16_sse2;
136     if (cpu_flags & AV_CPU_FLAG_ATOM) {
137         c->vector_clip_int32 = ff_vector_clip_int32_int_sse2;
138     } else {
139         c->vector_clip_int32 = ff_vector_clip_int32_sse2;
140     }
141     c->bswap_buf = ff_bswap32_buf_sse2;
142 #endif /* HAVE_SSE2_EXTERNAL */
143 }
144
145 static av_cold void dsputil_init_ssse3(DSPContext *c, AVCodecContext *avctx,
146                                        int cpu_flags, unsigned high_bit_depth)
147 {
148 #if HAVE_SSSE3_EXTERNAL
149     c->bswap_buf = ff_bswap32_buf_ssse3;
150 #endif /* HAVE_SSSE3_EXTERNAL */
151 }
152
153 static av_cold void dsputil_init_sse4(DSPContext *c, AVCodecContext *avctx,
154                                       int cpu_flags, unsigned high_bit_depth)
155 {
156 #if HAVE_SSE4_EXTERNAL
157     c->vector_clip_int32 = ff_vector_clip_int32_sse4;
158 #endif /* HAVE_SSE4_EXTERNAL */
159 }
160
161 av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx,
162                                  unsigned high_bit_depth)
163 {
164     int cpu_flags = av_get_cpu_flags();
165
166     if (X86_MMX(cpu_flags))
167         dsputil_init_mmx(c, avctx, cpu_flags, high_bit_depth);
168
169     if (X86_MMXEXT(cpu_flags))
170         dsputil_init_mmxext(c, avctx, cpu_flags, high_bit_depth);
171
172     if (X86_SSE(cpu_flags))
173         dsputil_init_sse(c, avctx, cpu_flags, high_bit_depth);
174
175     if (X86_SSE2(cpu_flags))
176         dsputil_init_sse2(c, avctx, cpu_flags, high_bit_depth);
177
178     if (EXTERNAL_SSSE3(cpu_flags))
179         dsputil_init_ssse3(c, avctx, cpu_flags, high_bit_depth);
180
181     if (EXTERNAL_SSE4(cpu_flags))
182         dsputil_init_sse4(c, avctx, cpu_flags, high_bit_depth);
183
184     if (CONFIG_ENCODERS)
185         ff_dsputilenc_init_mmx(c, avctx, high_bit_depth);
186 }