FFmpeg
qpeldsp_init.c
Go to the documentation of this file.
1 /*
2  * quarterpel DSP functions
3  * Copyright (c) 2000, 2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include <stddef.h>
24 #include <stdint.h>
25 
26 #include "config.h"
27 #include "libavutil/attributes.h"
28 #include "libavutil/cpu.h"
29 #include "libavutil/x86/cpu.h"
30 #include "libavcodec/qpeldsp.h"
31 #include "fpel.h"
32 #include "qpel.h"
33 
34 void ff_put_pixels8x9_l2_mmxext(uint8_t *dst,
35  const uint8_t *src1, const uint8_t *src2,
36  ptrdiff_t dstStride, ptrdiff_t src1Stride);
37 void ff_put_pixels16x17_l2_mmxext(uint8_t *dst,
38  const uint8_t *src1, const uint8_t *src2,
39  ptrdiff_t dstStride, ptrdiff_t src1Stride);
41  const uint8_t *src1, const uint8_t *src2,
42  ptrdiff_t dstStride, ptrdiff_t src1Stride);
44  const uint8_t *src1, const uint8_t *src2,
45  ptrdiff_t dstStride, ptrdiff_t src1Stride);
47  const uint8_t *src1, const uint8_t *src2,
48  ptrdiff_t dstStride, ptrdiff_t src1Stride);
50  const uint8_t *src1, const uint8_t *src2,
51  ptrdiff_t dstStride, ptrdiff_t src1Stride);
52 void ff_put_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
53  ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
54 void ff_avg_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
55  ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
57  const uint8_t *src,
58  ptrdiff_t dstStride, ptrdiff_t srcStride,
59  int h);
60 void ff_put_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
61  ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
62 void ff_avg_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
63  ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
65  const uint8_t *src,
66  ptrdiff_t dstStride, ptrdiff_t srcStride,
67  int h);
68 void ff_put_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
69  ptrdiff_t dstStride, ptrdiff_t srcStride);
70 void ff_avg_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
71  ptrdiff_t dstStride, ptrdiff_t srcStride);
73  const uint8_t *src,
74  ptrdiff_t dstStride, ptrdiff_t srcStride);
75 void ff_put_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
76  ptrdiff_t dstStride, ptrdiff_t srcStride);
77 void ff_avg_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
78  ptrdiff_t dstStride, ptrdiff_t srcStride);
80  const uint8_t *src,
81  ptrdiff_t dstStride, ptrdiff_t srcStride);
82 
83 #define QPEL_OP(OPNAME, RND, MMX) \
84 static void OPNAME ## qpel8_mc10_ ## MMX(uint8_t *dst, \
85  const uint8_t *src, \
86  ptrdiff_t stride) \
87 { \
88  uint64_t temp[8]; \
89  uint8_t *const half = (uint8_t *) temp; \
90  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, \
91  stride, 8); \
92  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src, half, \
93  stride, stride); \
94 } \
95  \
96 static void OPNAME ## qpel8_mc20_ ## MMX(uint8_t *dst, \
97  const uint8_t *src, \
98  ptrdiff_t stride) \
99 { \
100  ff_ ## OPNAME ## mpeg4_qpel8_h_lowpass_ ## MMX(dst, src, stride, \
101  stride, 8); \
102 } \
103  \
104 static void OPNAME ## qpel8_mc30_ ## MMX(uint8_t *dst, \
105  const uint8_t *src, \
106  ptrdiff_t stride) \
107 { \
108  uint64_t temp[8]; \
109  uint8_t *const half = (uint8_t *) temp; \
110  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, \
111  stride, 8); \
112  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src + 1, half, \
113  stride, stride); \
114 } \
115  \
116 static void OPNAME ## qpel8_mc01_ ## MMX(uint8_t *dst, \
117  const uint8_t *src, \
118  ptrdiff_t stride) \
119 { \
120  uint64_t temp[8]; \
121  uint8_t *const half = (uint8_t *) temp; \
122  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, \
123  8, stride); \
124  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src, half, \
125  stride, stride); \
126 } \
127  \
128 static void OPNAME ## qpel8_mc02_ ## MMX(uint8_t *dst, \
129  const uint8_t *src, \
130  ptrdiff_t stride) \
131 { \
132  ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, src, \
133  stride, stride); \
134 } \
135  \
136 static void OPNAME ## qpel8_mc03_ ## MMX(uint8_t *dst, \
137  const uint8_t *src, \
138  ptrdiff_t stride) \
139 { \
140  uint64_t temp[8]; \
141  uint8_t *const half = (uint8_t *) temp; \
142  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, \
143  8, stride); \
144  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src + stride, half, \
145  stride, stride); \
146 } \
147  \
148 static void OPNAME ## qpel8_mc11_ ## MMX(uint8_t *dst, \
149  const uint8_t *src, \
150  ptrdiff_t stride) \
151 { \
152  uint64_t half[8 + 9]; \
153  uint8_t *const halfH = (uint8_t *) half + 64; \
154  uint8_t *const halfHV = (uint8_t *) half; \
155  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
156  stride, 9); \
157  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, 8, \
158  stride); \
159  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
160  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
161  stride, 8); \
162 } \
163  \
164 static void OPNAME ## qpel8_mc31_ ## MMX(uint8_t *dst, \
165  const uint8_t *src, \
166  ptrdiff_t stride) \
167 { \
168  uint64_t half[8 + 9]; \
169  uint8_t *const halfH = (uint8_t *) half + 64; \
170  uint8_t *const halfHV = (uint8_t *) half; \
171  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
172  stride, 9); \
173  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
174  stride); \
175  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
176  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
177  stride, 8); \
178 } \
179  \
180 static void OPNAME ## qpel8_mc13_ ## MMX(uint8_t *dst, \
181  const uint8_t *src, \
182  ptrdiff_t stride) \
183 { \
184  uint64_t half[8 + 9]; \
185  uint8_t *const halfH = (uint8_t *) half + 64; \
186  uint8_t *const halfHV = (uint8_t *) half; \
187  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
188  stride, 9); \
189  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, 8, \
190  stride); \
191  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
192  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
193  stride, 8); \
194 } \
195  \
196 static void OPNAME ## qpel8_mc33_ ## MMX(uint8_t *dst, \
197  const uint8_t *src, \
198  ptrdiff_t stride) \
199 { \
200  uint64_t half[8 + 9]; \
201  uint8_t *const halfH = (uint8_t *) half + 64; \
202  uint8_t *const halfHV = (uint8_t *) half; \
203  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
204  stride, 9); \
205  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
206  stride); \
207  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
208  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
209  stride, 8); \
210 } \
211  \
212 static void OPNAME ## qpel8_mc21_ ## MMX(uint8_t *dst, \
213  const uint8_t *src, \
214  ptrdiff_t stride) \
215 { \
216  uint64_t half[8 + 9]; \
217  uint8_t *const halfH = (uint8_t *) half + 64; \
218  uint8_t *const halfHV = (uint8_t *) half; \
219  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
220  stride, 9); \
221  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
222  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
223  stride, 8); \
224 } \
225  \
226 static void OPNAME ## qpel8_mc23_ ## MMX(uint8_t *dst, \
227  const uint8_t *src, \
228  ptrdiff_t stride) \
229 { \
230  uint64_t half[8 + 9]; \
231  uint8_t *const halfH = (uint8_t *) half + 64; \
232  uint8_t *const halfHV = (uint8_t *) half; \
233  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
234  stride, 9); \
235  ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
236  ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
237  stride, 8); \
238 } \
239  \
240 static void OPNAME ## qpel8_mc12_ ## MMX(uint8_t *dst, \
241  const uint8_t *src, \
242  ptrdiff_t stride) \
243 { \
244  uint64_t half[8 + 9]; \
245  uint8_t *const halfH = (uint8_t *) half; \
246  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
247  stride, 9); \
248  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, \
249  8, stride); \
250  ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
251  stride, 8); \
252 } \
253  \
254 static void OPNAME ## qpel8_mc32_ ## MMX(uint8_t *dst, \
255  const uint8_t *src, \
256  ptrdiff_t stride) \
257 { \
258  uint64_t half[8 + 9]; \
259  uint8_t *const halfH = (uint8_t *) half; \
260  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
261  stride, 9); \
262  ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
263  stride); \
264  ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
265  stride, 8); \
266 } \
267  \
268 static void OPNAME ## qpel8_mc22_ ## MMX(uint8_t *dst, \
269  const uint8_t *src, \
270  ptrdiff_t stride) \
271 { \
272  uint64_t half[9]; \
273  uint8_t *const halfH = (uint8_t *) half; \
274  ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
275  stride, 9); \
276  ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
277  stride, 8); \
278 } \
279  \
280 static void OPNAME ## qpel16_mc10_ ## MMX(uint8_t *dst, \
281  const uint8_t *src, \
282  ptrdiff_t stride) \
283 { \
284  uint64_t temp[32]; \
285  uint8_t *const half = (uint8_t *) temp; \
286  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, \
287  stride, 16); \
288  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src, half, \
289  stride, stride); \
290 } \
291  \
292 static void OPNAME ## qpel16_mc20_ ## MMX(uint8_t *dst, \
293  const uint8_t *src, \
294  ptrdiff_t stride) \
295 { \
296  ff_ ## OPNAME ## mpeg4_qpel16_h_lowpass_ ## MMX(dst, src, \
297  stride, stride, 16);\
298 } \
299  \
300 static void OPNAME ## qpel16_mc30_ ## MMX(uint8_t *dst, \
301  const uint8_t *src, \
302  ptrdiff_t stride) \
303 { \
304  uint64_t temp[32]; \
305  uint8_t *const half = (uint8_t*) temp; \
306  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, \
307  stride, 16); \
308  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src + 1, half, \
309  stride, stride); \
310 } \
311  \
312 static void OPNAME ## qpel16_mc01_ ## MMX(uint8_t *dst, \
313  const uint8_t *src, \
314  ptrdiff_t stride) \
315 { \
316  uint64_t temp[32]; \
317  uint8_t *const half = (uint8_t *) temp; \
318  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, \
319  stride); \
320  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src, half, \
321  stride, stride); \
322 } \
323  \
324 static void OPNAME ## qpel16_mc02_ ## MMX(uint8_t *dst, \
325  const uint8_t *src, \
326  ptrdiff_t stride) \
327 { \
328  ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, src, \
329  stride, stride); \
330 } \
331  \
332 static void OPNAME ## qpel16_mc03_ ## MMX(uint8_t *dst, \
333  const uint8_t *src, \
334  ptrdiff_t stride) \
335 { \
336  uint64_t temp[32]; \
337  uint8_t *const half = (uint8_t *) temp; \
338  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, \
339  stride); \
340  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src+stride, half, \
341  stride, stride); \
342 } \
343  \
344 static void OPNAME ## qpel16_mc11_ ## MMX(uint8_t *dst, \
345  const uint8_t *src, \
346  ptrdiff_t stride) \
347 { \
348  uint64_t half[16 * 2 + 17 * 2]; \
349  uint8_t *const halfH = (uint8_t *) half + 256; \
350  uint8_t *const halfHV = (uint8_t *) half; \
351  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
352  stride, 17); \
353  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
354  stride); \
355  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
356  16, 16); \
357  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
358  stride, 16); \
359 } \
360  \
361 static void OPNAME ## qpel16_mc31_ ## MMX(uint8_t *dst, \
362  const uint8_t *src, \
363  ptrdiff_t stride) \
364 { \
365  uint64_t half[16 * 2 + 17 * 2]; \
366  uint8_t *const halfH = (uint8_t *) half + 256; \
367  uint8_t *const halfHV = (uint8_t *) half; \
368  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
369  stride, 17); \
370  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
371  stride); \
372  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
373  16, 16); \
374  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
375  stride, 16); \
376 } \
377  \
378 static void OPNAME ## qpel16_mc13_ ## MMX(uint8_t *dst, \
379  const uint8_t *src, \
380  ptrdiff_t stride) \
381 { \
382  uint64_t half[16 * 2 + 17 * 2]; \
383  uint8_t *const halfH = (uint8_t *) half + 256; \
384  uint8_t *const halfHV = (uint8_t *) half; \
385  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
386  stride, 17); \
387  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
388  stride); \
389  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
390  16, 16); \
391  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
392  stride, 16); \
393 } \
394  \
395 static void OPNAME ## qpel16_mc33_ ## MMX(uint8_t *dst, \
396  const uint8_t *src, \
397  ptrdiff_t stride) \
398 { \
399  uint64_t half[16 * 2 + 17 * 2]; \
400  uint8_t *const halfH = (uint8_t *) half + 256; \
401  uint8_t *const halfHV = (uint8_t *) half; \
402  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
403  stride, 17); \
404  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
405  stride); \
406  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
407  16, 16); \
408  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
409  stride, 16); \
410 } \
411  \
412 static void OPNAME ## qpel16_mc21_ ## MMX(uint8_t *dst, \
413  const uint8_t *src, \
414  ptrdiff_t stride) \
415 { \
416  uint64_t half[16 * 2 + 17 * 2]; \
417  uint8_t *const halfH = (uint8_t *) half + 256; \
418  uint8_t *const halfHV = (uint8_t *) half; \
419  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
420  stride, 17); \
421  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
422  16, 16); \
423  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
424  stride, 16); \
425 } \
426  \
427 static void OPNAME ## qpel16_mc23_ ## MMX(uint8_t *dst, \
428  const uint8_t *src, \
429  ptrdiff_t stride) \
430 { \
431  uint64_t half[16 * 2 + 17 * 2]; \
432  uint8_t *const halfH = (uint8_t *) half + 256; \
433  uint8_t *const halfHV = (uint8_t *) half; \
434  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
435  stride, 17); \
436  ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
437  16, 16); \
438  ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
439  stride, 16); \
440 } \
441  \
442 static void OPNAME ## qpel16_mc12_ ## MMX(uint8_t *dst, \
443  const uint8_t *src, \
444  ptrdiff_t stride) \
445 { \
446  uint64_t half[17 * 2]; \
447  uint8_t *const halfH = (uint8_t *) half; \
448  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
449  stride, 17); \
450  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
451  stride); \
452  ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
453  stride, 16); \
454 } \
455  \
456 static void OPNAME ## qpel16_mc32_ ## MMX(uint8_t *dst, \
457  const uint8_t *src, \
458  ptrdiff_t stride) \
459 { \
460  uint64_t half[17 * 2]; \
461  uint8_t *const halfH = (uint8_t *) half; \
462  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
463  stride, 17); \
464  ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
465  stride); \
466  ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
467  stride, 16); \
468 } \
469  \
470 static void OPNAME ## qpel16_mc22_ ## MMX(uint8_t *dst, \
471  const uint8_t *src, \
472  ptrdiff_t stride) \
473 { \
474  uint64_t half[17 * 2]; \
475  uint8_t *const halfH = (uint8_t *) half; \
476  ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
477  stride, 17); \
478  ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
479  stride, 16); \
480 }
481 
482 QPEL_OP(put_, _, mmxext)
483 QPEL_OP(avg_, _, mmxext)
484 QPEL_OP(put_no_rnd_, _no_rnd_, mmxext)
485 
486 #define SET_QPEL_FUNCS(PFX, IDX, SIZE, CPU, PREFIX) \
487 do { \
488  c->PFX ## _pixels_tab[IDX][ 1] = PREFIX ## PFX ## SIZE ## _mc10_ ## CPU; \
489  c->PFX ## _pixels_tab[IDX][ 2] = PREFIX ## PFX ## SIZE ## _mc20_ ## CPU; \
490  c->PFX ## _pixels_tab[IDX][ 3] = PREFIX ## PFX ## SIZE ## _mc30_ ## CPU; \
491  c->PFX ## _pixels_tab[IDX][ 4] = PREFIX ## PFX ## SIZE ## _mc01_ ## CPU; \
492  c->PFX ## _pixels_tab[IDX][ 5] = PREFIX ## PFX ## SIZE ## _mc11_ ## CPU; \
493  c->PFX ## _pixels_tab[IDX][ 6] = PREFIX ## PFX ## SIZE ## _mc21_ ## CPU; \
494  c->PFX ## _pixels_tab[IDX][ 7] = PREFIX ## PFX ## SIZE ## _mc31_ ## CPU; \
495  c->PFX ## _pixels_tab[IDX][ 8] = PREFIX ## PFX ## SIZE ## _mc02_ ## CPU; \
496  c->PFX ## _pixels_tab[IDX][ 9] = PREFIX ## PFX ## SIZE ## _mc12_ ## CPU; \
497  c->PFX ## _pixels_tab[IDX][10] = PREFIX ## PFX ## SIZE ## _mc22_ ## CPU; \
498  c->PFX ## _pixels_tab[IDX][11] = PREFIX ## PFX ## SIZE ## _mc32_ ## CPU; \
499  c->PFX ## _pixels_tab[IDX][12] = PREFIX ## PFX ## SIZE ## _mc03_ ## CPU; \
500  c->PFX ## _pixels_tab[IDX][13] = PREFIX ## PFX ## SIZE ## _mc13_ ## CPU; \
501  c->PFX ## _pixels_tab[IDX][14] = PREFIX ## PFX ## SIZE ## _mc23_ ## CPU; \
502  c->PFX ## _pixels_tab[IDX][15] = PREFIX ## PFX ## SIZE ## _mc33_ ## CPU; \
503 } while (0)
504 
506 {
507  int cpu_flags = av_get_cpu_flags();
508 
509  if (X86_MMXEXT(cpu_flags)) {
510 #if HAVE_MMXEXT_EXTERNAL
511  SET_QPEL_FUNCS(avg_qpel, 0, 16, mmxext, );
512  c->avg_qpel_pixels_tab[1][0] = ff_avg_pixels8x8_mmxext;
513  SET_QPEL_FUNCS(avg_qpel, 1, 8, mmxext, );
514 
515  SET_QPEL_FUNCS(put_qpel, 0, 16, mmxext, );
516  SET_QPEL_FUNCS(put_qpel, 1, 8, mmxext, );
517  SET_QPEL_FUNCS(put_no_rnd_qpel, 0, 16, mmxext, );
518  SET_QPEL_FUNCS(put_no_rnd_qpel, 1, 8, mmxext, );
519 #endif /* HAVE_MMXEXT_EXTERNAL */
520  }
521 #if HAVE_SSE2_EXTERNAL
522  if (EXTERNAL_SSE2(cpu_flags)) {
523  c->put_no_rnd_qpel_pixels_tab[0][0] =
524  c->put_qpel_pixels_tab[0][0] = ff_put_pixels16x16_sse2;
525  c->put_no_rnd_qpel_pixels_tab[1][0] =
526  c->put_qpel_pixels_tab[1][0] = ff_put_pixels8x8_sse2;
527  c->avg_qpel_pixels_tab[0][0] = ff_avg_pixels16x16_sse2;
528  }
529 #endif
530 }
cpu.h
ff_avg_mpeg4_qpel16_v_lowpass_mmxext
void ff_avg_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)
src1
const pixel * src1
Definition: h264pred_template.c:420
ff_put_mpeg4_qpel16_h_lowpass_mmxext
void ff_put_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
qpel.h
ff_avg_pixels16x16_sse2
void ff_avg_pixels16x16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size)
ff_avg_mpeg4_qpel16_h_lowpass_mmxext
void ff_avg_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition: cpu.c:109
cpu_flags
static atomic_int cpu_flags
Definition: cpu.c:56
ff_put_no_rnd_pixels8x9_l2_mmxext
void ff_put_no_rnd_pixels8x9_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
ff_put_no_rnd_pixels8x8_l2_mmxext
void ff_put_no_rnd_pixels8x8_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
ff_put_pixels16x17_l2_mmxext
void ff_put_pixels16x17_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
av_cold
#define av_cold
Definition: attributes.h:106
QPEL_OP
#define QPEL_OP(OPNAME, RND, MMX)
Definition: qpeldsp_init.c:83
ff_avg_mpeg4_qpel8_h_lowpass_mmxext
void ff_avg_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
ff_put_no_rnd_mpeg4_qpel8_v_lowpass_mmxext
void ff_put_no_rnd_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)
ff_avg_mpeg4_qpel8_v_lowpass_mmxext
void ff_avg_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)
ff_put_mpeg4_qpel16_v_lowpass_mmxext
void ff_put_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)
ff_put_pixels16x16_sse2
void ff_put_pixels16x16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size)
qpeldsp.h
SET_QPEL_FUNCS
#define SET_QPEL_FUNCS(PFX, IDX, SIZE, CPU, PREFIX)
Definition: qpeldsp_init.c:486
ff_put_pixels8x8_sse2
void ff_put_pixels8x8_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size)
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_put_mpeg4_qpel8_h_lowpass_mmxext
void ff_put_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
cpu.h
ff_qpeldsp_init_x86
av_cold void ff_qpeldsp_init_x86(QpelDSPContext *c)
Definition: qpeldsp_init.c:505
ff_put_no_rnd_mpeg4_qpel16_h_lowpass_mmxext
void ff_put_no_rnd_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
attributes.h
ff_put_mpeg4_qpel8_v_lowpass_mmxext
void ff_put_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)
EXTERNAL_SSE2
#define EXTERNAL_SSE2(flags)
Definition: cpu.h:52
src2
const pixel * src2
Definition: h264pred_template.c:421
ff_put_no_rnd_mpeg4_qpel8_h_lowpass_mmxext
void ff_put_no_rnd_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
ff_put_no_rnd_pixels16x16_l2_mmxext
void ff_put_no_rnd_pixels16x16_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
ff_avg_pixels8x8_mmxext
void ff_avg_pixels8x8_mmxext(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size)
QpelDSPContext
quarterpel DSP context
Definition: qpeldsp.h:72
ff_put_pixels8x9_l2_mmxext
void ff_put_pixels8x9_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
fpel.h
ff_put_no_rnd_pixels16x17_l2_mmxext
void ff_put_no_rnd_pixels16x17_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src1Stride)
_
#define _
h
h
Definition: vp9dsp_template.c:2070
src
#define src
Definition: vp8dsp.c:248
X86_MMXEXT
#define X86_MMXEXT(flags)
Definition: cpu.h:26
ff_put_no_rnd_mpeg4_qpel16_v_lowpass_mmxext
void ff_put_no_rnd_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)