FFmpeg
qpeldsp.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 /**
24  * @file
25  * quarterpel DSP functions
26  */
27 
28 #include <stddef.h>
29 #include <stdint.h>
30 
31 #include "config.h"
32 #include "config_components.h"
33 #include "libavutil/attributes.h"
34 #include "copy_block.h"
35 #include "qpeldsp.h"
36 #include "diracdsp.h"
37 
38 #define BIT_DEPTH 8
39 #include "hpel_template.c"
40 #include "pel_template.c"
41 #include "qpel_template.c"
42 
43 #define QPEL_MC(r, OPNAME, RND, OP) \
44 static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, const uint8_t *src, \
45  int dstStride, int srcStride, \
46  int h) \
47 { \
48  const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; \
49  int i; \
50  \
51  for (i = 0; i < h; i++) { \
52  OP(dst[0], (src[0] + src[1]) * 20 - (src[0] + src[2]) * 6 + (src[1] + src[3]) * 3 - (src[2] + src[4])); \
53  OP(dst[1], (src[1] + src[2]) * 20 - (src[0] + src[3]) * 6 + (src[0] + src[4]) * 3 - (src[1] + src[5])); \
54  OP(dst[2], (src[2] + src[3]) * 20 - (src[1] + src[4]) * 6 + (src[0] + src[5]) * 3 - (src[0] + src[6])); \
55  OP(dst[3], (src[3] + src[4]) * 20 - (src[2] + src[5]) * 6 + (src[1] + src[6]) * 3 - (src[0] + src[7])); \
56  OP(dst[4], (src[4] + src[5]) * 20 - (src[3] + src[6]) * 6 + (src[2] + src[7]) * 3 - (src[1] + src[8])); \
57  OP(dst[5], (src[5] + src[6]) * 20 - (src[4] + src[7]) * 6 + (src[3] + src[8]) * 3 - (src[2] + src[8])); \
58  OP(dst[6], (src[6] + src[7]) * 20 - (src[5] + src[8]) * 6 + (src[4] + src[8]) * 3 - (src[3] + src[7])); \
59  OP(dst[7], (src[7] + src[8]) * 20 - (src[6] + src[8]) * 6 + (src[5] + src[7]) * 3 - (src[4] + src[6])); \
60  dst += dstStride; \
61  src += srcStride; \
62  } \
63 } \
64  \
65 static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, const uint8_t *src, \
66  int dstStride, int srcStride) \
67 { \
68  const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; \
69  const int w = 8; \
70  int i; \
71  \
72  for (i = 0; i < w; i++) { \
73  const int src0 = src[0 * srcStride]; \
74  const int src1 = src[1 * srcStride]; \
75  const int src2 = src[2 * srcStride]; \
76  const int src3 = src[3 * srcStride]; \
77  const int src4 = src[4 * srcStride]; \
78  const int src5 = src[5 * srcStride]; \
79  const int src6 = src[6 * srcStride]; \
80  const int src7 = src[7 * srcStride]; \
81  const int src8 = src[8 * srcStride]; \
82  OP(dst[0 * dstStride], (src0 + src1) * 20 - (src0 + src2) * 6 + (src1 + src3) * 3 - (src2 + src4)); \
83  OP(dst[1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 6 + (src0 + src4) * 3 - (src1 + src5)); \
84  OP(dst[2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 6 + (src0 + src5) * 3 - (src0 + src6)); \
85  OP(dst[3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 6 + (src1 + src6) * 3 - (src0 + src7)); \
86  OP(dst[4 * dstStride], (src4 + src5) * 20 - (src3 + src6) * 6 + (src2 + src7) * 3 - (src1 + src8)); \
87  OP(dst[5 * dstStride], (src5 + src6) * 20 - (src4 + src7) * 6 + (src3 + src8) * 3 - (src2 + src8)); \
88  OP(dst[6 * dstStride], (src6 + src7) * 20 - (src5 + src8) * 6 + (src4 + src8) * 3 - (src3 + src7)); \
89  OP(dst[7 * dstStride], (src7 + src8) * 20 - (src6 + src8) * 6 + (src5 + src7) * 3 - (src4 + src6)); \
90  dst++; \
91  src++; \
92  } \
93 } \
94  \
95 static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, \
96  const uint8_t *src, \
97  int dstStride, int srcStride, \
98  int h) \
99 { \
100  const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; \
101  int i; \
102  \
103  for (i = 0; i < h; i++) { \
104  OP(dst[0], (src[0] + src[1]) * 20 - (src[0] + src[2]) * 6 + (src[1] + src[3]) * 3 - (src[2] + src[4])); \
105  OP(dst[1], (src[1] + src[2]) * 20 - (src[0] + src[3]) * 6 + (src[0] + src[4]) * 3 - (src[1] + src[5])); \
106  OP(dst[2], (src[2] + src[3]) * 20 - (src[1] + src[4]) * 6 + (src[0] + src[5]) * 3 - (src[0] + src[6])); \
107  OP(dst[3], (src[3] + src[4]) * 20 - (src[2] + src[5]) * 6 + (src[1] + src[6]) * 3 - (src[0] + src[7])); \
108  OP(dst[4], (src[4] + src[5]) * 20 - (src[3] + src[6]) * 6 + (src[2] + src[7]) * 3 - (src[1] + src[8])); \
109  OP(dst[5], (src[5] + src[6]) * 20 - (src[4] + src[7]) * 6 + (src[3] + src[8]) * 3 - (src[2] + src[9])); \
110  OP(dst[6], (src[6] + src[7]) * 20 - (src[5] + src[8]) * 6 + (src[4] + src[9]) * 3 - (src[3] + src[10])); \
111  OP(dst[7], (src[7] + src[8]) * 20 - (src[6] + src[9]) * 6 + (src[5] + src[10]) * 3 - (src[4] + src[11])); \
112  OP(dst[8], (src[8] + src[9]) * 20 - (src[7] + src[10]) * 6 + (src[6] + src[11]) * 3 - (src[5] + src[12])); \
113  OP(dst[9], (src[9] + src[10]) * 20 - (src[8] + src[11]) * 6 + (src[7] + src[12]) * 3 - (src[6] + src[13])); \
114  OP(dst[10], (src[10] + src[11]) * 20 - (src[9] + src[12]) * 6 + (src[8] + src[13]) * 3 - (src[7] + src[14])); \
115  OP(dst[11], (src[11] + src[12]) * 20 - (src[10] + src[13]) * 6 + (src[9] + src[14]) * 3 - (src[8] + src[15])); \
116  OP(dst[12], (src[12] + src[13]) * 20 - (src[11] + src[14]) * 6 + (src[10] + src[15]) * 3 - (src[9] + src[16])); \
117  OP(dst[13], (src[13] + src[14]) * 20 - (src[12] + src[15]) * 6 + (src[11] + src[16]) * 3 - (src[10] + src[16])); \
118  OP(dst[14], (src[14] + src[15]) * 20 - (src[13] + src[16]) * 6 + (src[12] + src[16]) * 3 - (src[11] + src[15])); \
119  OP(dst[15], (src[15] + src[16]) * 20 - (src[14] + src[16]) * 6 + (src[13] + src[15]) * 3 - (src[12] + src[14])); \
120  dst += dstStride; \
121  src += srcStride; \
122  } \
123 } \
124  \
125 static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, \
126  const uint8_t *src, \
127  int dstStride, int srcStride) \
128 { \
129  const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; \
130  const int w = 16; \
131  int i; \
132  \
133  for (i = 0; i < w; i++) { \
134  const int src0 = src[0 * srcStride]; \
135  const int src1 = src[1 * srcStride]; \
136  const int src2 = src[2 * srcStride]; \
137  const int src3 = src[3 * srcStride]; \
138  const int src4 = src[4 * srcStride]; \
139  const int src5 = src[5 * srcStride]; \
140  const int src6 = src[6 * srcStride]; \
141  const int src7 = src[7 * srcStride]; \
142  const int src8 = src[8 * srcStride]; \
143  const int src9 = src[9 * srcStride]; \
144  const int src10 = src[10 * srcStride]; \
145  const int src11 = src[11 * srcStride]; \
146  const int src12 = src[12 * srcStride]; \
147  const int src13 = src[13 * srcStride]; \
148  const int src14 = src[14 * srcStride]; \
149  const int src15 = src[15 * srcStride]; \
150  const int src16 = src[16 * srcStride]; \
151  OP(dst[0 * dstStride], (src0 + src1) * 20 - (src0 + src2) * 6 + (src1 + src3) * 3 - (src2 + src4)); \
152  OP(dst[1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 6 + (src0 + src4) * 3 - (src1 + src5)); \
153  OP(dst[2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 6 + (src0 + src5) * 3 - (src0 + src6)); \
154  OP(dst[3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 6 + (src1 + src6) * 3 - (src0 + src7)); \
155  OP(dst[4 * dstStride], (src4 + src5) * 20 - (src3 + src6) * 6 + (src2 + src7) * 3 - (src1 + src8)); \
156  OP(dst[5 * dstStride], (src5 + src6) * 20 - (src4 + src7) * 6 + (src3 + src8) * 3 - (src2 + src9)); \
157  OP(dst[6 * dstStride], (src6 + src7) * 20 - (src5 + src8) * 6 + (src4 + src9) * 3 - (src3 + src10)); \
158  OP(dst[7 * dstStride], (src7 + src8) * 20 - (src6 + src9) * 6 + (src5 + src10) * 3 - (src4 + src11)); \
159  OP(dst[8 * dstStride], (src8 + src9) * 20 - (src7 + src10) * 6 + (src6 + src11) * 3 - (src5 + src12)); \
160  OP(dst[9 * dstStride], (src9 + src10) * 20 - (src8 + src11) * 6 + (src7 + src12) * 3 - (src6 + src13)); \
161  OP(dst[10 * dstStride], (src10 + src11) * 20 - (src9 + src12) * 6 + (src8 + src13) * 3 - (src7 + src14)); \
162  OP(dst[11 * dstStride], (src11 + src12) * 20 - (src10 + src13) * 6 + (src9 + src14) * 3 - (src8 + src15)); \
163  OP(dst[12 * dstStride], (src12 + src13) * 20 - (src11 + src14) * 6 + (src10 + src15) * 3 - (src9 + src16)); \
164  OP(dst[13 * dstStride], (src13 + src14) * 20 - (src12 + src15) * 6 + (src11 + src16) * 3 - (src10 + src16)); \
165  OP(dst[14 * dstStride], (src14 + src15) * 20 - (src13 + src16) * 6 + (src12 + src16) * 3 - (src11 + src15)); \
166  OP(dst[15 * dstStride], (src15 + src16) * 20 - (src14 + src16) * 6 + (src13 + src15) * 3 - (src12 + src14)); \
167  dst++; \
168  src++; \
169  } \
170 } \
171  \
172 static void OPNAME ## qpel8_mc10_c(uint8_t *dst, const uint8_t *src, \
173  ptrdiff_t stride) \
174 { \
175  uint8_t half[64]; \
176  \
177  put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8); \
178  OPNAME ## pixels8_l2_8(dst, src, half, stride, stride, 8, 8); \
179 } \
180  \
181 static void OPNAME ## qpel8_mc20_c(uint8_t *dst, const uint8_t *src, \
182  ptrdiff_t stride) \
183 { \
184  OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8); \
185 } \
186  \
187 static void OPNAME ## qpel8_mc30_c(uint8_t *dst, const uint8_t *src, \
188  ptrdiff_t stride) \
189 { \
190  uint8_t half[64]; \
191  \
192  put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8); \
193  OPNAME ## pixels8_l2_8(dst, src + 1, half, stride, stride, 8, 8); \
194 } \
195  \
196 static void OPNAME ## qpel8_mc01_c(uint8_t *dst, const uint8_t *src, \
197  ptrdiff_t stride) \
198 { \
199  uint8_t full[16 * 9]; \
200  uint8_t half[64]; \
201  \
202  copy_block8(full, src, 16, stride, 9); \
203  put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16); \
204  OPNAME ## pixels8_l2_8(dst, full, half, stride, 16, 8, 8); \
205 } \
206  \
207 static void OPNAME ## qpel8_mc02_c(uint8_t *dst, const uint8_t *src, \
208  ptrdiff_t stride) \
209 { \
210  uint8_t full[16 * 9]; \
211  \
212  copy_block8(full, src, 16, stride, 9); \
213  OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16); \
214 } \
215  \
216 static void OPNAME ## qpel8_mc03_c(uint8_t *dst, const uint8_t *src, \
217  ptrdiff_t stride) \
218 { \
219  uint8_t full[16 * 9]; \
220  uint8_t half[64]; \
221  \
222  copy_block8(full, src, 16, stride, 9); \
223  put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16); \
224  OPNAME ## pixels8_l2_8(dst, full + 16, half, stride, 16, 8, 8); \
225 } \
226  \
227 void ff_ ## OPNAME ## qpel8_mc11_old_c(uint8_t *dst, const uint8_t *src, \
228  ptrdiff_t stride) \
229 { \
230  uint8_t full[16 * 9]; \
231  uint8_t halfH[72]; \
232  uint8_t halfV[64]; \
233  uint8_t halfHV[64]; \
234  \
235  copy_block9(full, src, 16, stride, 9); \
236  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
237  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16); \
238  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
239  OPNAME ## pixels8_l4_8(dst, full, halfH, halfV, halfHV, \
240  stride, 16, 8, 8, 8, 8); \
241 } \
242  \
243 static void OPNAME ## qpel8_mc11_c(uint8_t *dst, const uint8_t *src, \
244  ptrdiff_t stride) \
245 { \
246  uint8_t full[16 * 9]; \
247  uint8_t halfH[72]; \
248  uint8_t halfHV[64]; \
249  \
250  copy_block9(full, src, 16, stride, 9); \
251  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
252  put ## RND ## pixels8_l2_8(halfH, halfH, full, 8, 8, 16, 9); \
253  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
254  OPNAME ## pixels8_l2_8(dst, halfH, halfHV, stride, 8, 8, 8); \
255 } \
256  \
257 void ff_ ## OPNAME ## qpel8_mc31_old_c(uint8_t *dst, const uint8_t *src, \
258  ptrdiff_t stride) \
259 { \
260  uint8_t full[16 * 9]; \
261  uint8_t halfH[72]; \
262  uint8_t halfV[64]; \
263  uint8_t halfHV[64]; \
264  \
265  copy_block9(full, src, 16, stride, 9); \
266  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
267  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full + 1, 8, 16); \
268  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
269  OPNAME ## pixels8_l4_8(dst, full + 1, halfH, halfV, halfHV, \
270  stride, 16, 8, 8, 8, 8); \
271 } \
272  \
273 static void OPNAME ## qpel8_mc31_c(uint8_t *dst, const uint8_t *src, \
274  ptrdiff_t stride) \
275 { \
276  uint8_t full[16 * 9]; \
277  uint8_t halfH[72]; \
278  uint8_t halfHV[64]; \
279  \
280  copy_block9(full, src, 16, stride, 9); \
281  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
282  put ## RND ## pixels8_l2_8(halfH, halfH, full + 1, 8, 8, 16, 9); \
283  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
284  OPNAME ## pixels8_l2_8(dst, halfH, halfHV, stride, 8, 8, 8); \
285 } \
286  \
287 void ff_ ## OPNAME ## qpel8_mc13_old_c(uint8_t *dst, const uint8_t *src, \
288  ptrdiff_t stride) \
289 { \
290  uint8_t full[16 * 9]; \
291  uint8_t halfH[72]; \
292  uint8_t halfV[64]; \
293  uint8_t halfHV[64]; \
294  \
295  copy_block9(full, src, 16, stride, 9); \
296  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
297  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16); \
298  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
299  OPNAME ## pixels8_l4_8(dst, full + 16, halfH + 8, halfV, halfHV, \
300  stride, 16, 8, 8, 8, 8); \
301 } \
302  \
303 static void OPNAME ## qpel8_mc13_c(uint8_t *dst, const uint8_t *src, \
304  ptrdiff_t stride) \
305 { \
306  uint8_t full[16 * 9]; \
307  uint8_t halfH[72]; \
308  uint8_t halfHV[64]; \
309  \
310  copy_block9(full, src, 16, stride, 9); \
311  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
312  put ## RND ## pixels8_l2_8(halfH, halfH, full, 8, 8, 16, 9); \
313  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
314  OPNAME ## pixels8_l2_8(dst, halfH + 8, halfHV, stride, 8, 8, 8); \
315 } \
316  \
317 void ff_ ## OPNAME ## qpel8_mc33_old_c(uint8_t *dst, const uint8_t *src, \
318  ptrdiff_t stride) \
319 { \
320  uint8_t full[16 * 9]; \
321  uint8_t halfH[72]; \
322  uint8_t halfV[64]; \
323  uint8_t halfHV[64]; \
324  \
325  copy_block9(full, src, 16, stride, 9); \
326  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
327  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full + 1, 8, 16); \
328  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
329  OPNAME ## pixels8_l4_8(dst, full + 17, halfH + 8, halfV, halfHV, \
330  stride, 16, 8, 8, 8, 8); \
331 } \
332  \
333 static void OPNAME ## qpel8_mc33_c(uint8_t *dst, const uint8_t *src, \
334  ptrdiff_t stride) \
335 { \
336  uint8_t full[16 * 9]; \
337  uint8_t halfH[72]; \
338  uint8_t halfHV[64]; \
339  \
340  copy_block9(full, src, 16, stride, 9); \
341  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
342  put ## RND ## pixels8_l2_8(halfH, halfH, full + 1, 8, 8, 16, 9); \
343  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
344  OPNAME ## pixels8_l2_8(dst, halfH + 8, halfHV, stride, 8, 8, 8); \
345 } \
346  \
347 static void OPNAME ## qpel8_mc21_c(uint8_t *dst, const uint8_t *src, \
348  ptrdiff_t stride) \
349 { \
350  uint8_t halfH[72]; \
351  uint8_t halfHV[64]; \
352  \
353  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9); \
354  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
355  OPNAME ## pixels8_l2_8(dst, halfH, halfHV, stride, 8, 8, 8); \
356 } \
357  \
358 static void OPNAME ## qpel8_mc23_c(uint8_t *dst, const uint8_t *src, \
359  ptrdiff_t stride) \
360 { \
361  uint8_t halfH[72]; \
362  uint8_t halfHV[64]; \
363  \
364  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9); \
365  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
366  OPNAME ## pixels8_l2_8(dst, halfH + 8, halfHV, stride, 8, 8, 8); \
367 } \
368  \
369 void ff_ ## OPNAME ## qpel8_mc12_old_c(uint8_t *dst, const uint8_t *src, \
370  ptrdiff_t stride) \
371 { \
372  uint8_t full[16 * 9]; \
373  uint8_t halfH[72]; \
374  uint8_t halfV[64]; \
375  uint8_t halfHV[64]; \
376  \
377  copy_block9(full, src, 16, stride, 9); \
378  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
379  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16); \
380  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
381  OPNAME ## pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8); \
382 } \
383  \
384 static void OPNAME ## qpel8_mc12_c(uint8_t *dst, const uint8_t *src, \
385  ptrdiff_t stride) \
386 { \
387  uint8_t full[16 * 9]; \
388  uint8_t halfH[72]; \
389  \
390  copy_block9(full, src, 16, stride, 9); \
391  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
392  put ## RND ## pixels8_l2_8(halfH, halfH, full, 8, 8, 16, 9); \
393  OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8); \
394 } \
395  \
396 void ff_ ## OPNAME ## qpel8_mc32_old_c(uint8_t *dst, const uint8_t *src, \
397  ptrdiff_t stride) \
398 { \
399  uint8_t full[16 * 9]; \
400  uint8_t halfH[72]; \
401  uint8_t halfV[64]; \
402  uint8_t halfHV[64]; \
403  \
404  copy_block9(full, src, 16, stride, 9); \
405  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
406  put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full + 1, 8, 16); \
407  put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8); \
408  OPNAME ## pixels8_l2_8(dst, halfV, halfHV, stride, 8, 8, 8); \
409 } \
410  \
411 static void OPNAME ## qpel8_mc32_c(uint8_t *dst, const uint8_t *src, \
412  ptrdiff_t stride) \
413 { \
414  uint8_t full[16 * 9]; \
415  uint8_t halfH[72]; \
416  \
417  copy_block9(full, src, 16, stride, 9); \
418  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9); \
419  put ## RND ## pixels8_l2_8(halfH, halfH, full + 1, 8, 8, 16, 9); \
420  OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8); \
421 } \
422  \
423 static void OPNAME ## qpel8_mc22_c(uint8_t *dst, const uint8_t *src, \
424  ptrdiff_t stride) \
425 { \
426  uint8_t halfH[72]; \
427  \
428  put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9); \
429  OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8); \
430 } \
431  \
432 static void OPNAME ## qpel16_mc10_c(uint8_t *dst, const uint8_t *src, \
433  ptrdiff_t stride) \
434 { \
435  uint8_t half[256]; \
436  \
437  put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16); \
438  OPNAME ## pixels16_l2_8(dst, src, half, stride, stride, 16, 16); \
439 } \
440  \
441 static void OPNAME ## qpel16_mc20_c(uint8_t *dst, const uint8_t *src, \
442  ptrdiff_t stride) \
443 { \
444  OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16); \
445 } \
446  \
447 static void OPNAME ## qpel16_mc30_c(uint8_t *dst, const uint8_t *src, \
448  ptrdiff_t stride) \
449 { \
450  uint8_t half[256]; \
451  \
452  put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16); \
453  OPNAME ## pixels16_l2_8(dst, src + 1, half, stride, stride, 16, 16); \
454 } \
455  \
456 static void OPNAME ## qpel16_mc01_c(uint8_t *dst, const uint8_t *src, \
457  ptrdiff_t stride) \
458 { \
459  uint8_t full[24 * 17]; \
460  uint8_t half[256]; \
461  \
462  copy_block16(full, src, 24, stride, 17); \
463  put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24); \
464  OPNAME ## pixels16_l2_8(dst, full, half, stride, 24, 16, 16); \
465 } \
466  \
467 static void OPNAME ## qpel16_mc02_c(uint8_t *dst, const uint8_t *src, \
468  ptrdiff_t stride) \
469 { \
470  uint8_t full[24 * 17]; \
471  \
472  copy_block16(full, src, 24, stride, 17); \
473  OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24); \
474 } \
475  \
476 static void OPNAME ## qpel16_mc03_c(uint8_t *dst, const uint8_t *src, \
477  ptrdiff_t stride) \
478 { \
479  uint8_t full[24 * 17]; \
480  uint8_t half[256]; \
481  \
482  copy_block16(full, src, 24, stride, 17); \
483  put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24); \
484  OPNAME ## pixels16_l2_8(dst, full + 24, half, stride, 24, 16, 16); \
485 } \
486  \
487 void ff_ ## OPNAME ## qpel16_mc11_old_c(uint8_t *dst, const uint8_t *src, \
488  ptrdiff_t stride) \
489 { \
490  uint8_t full[24 * 17]; \
491  uint8_t halfH[272]; \
492  uint8_t halfV[256]; \
493  uint8_t halfHV[256]; \
494  \
495  copy_block17(full, src, 24, stride, 17); \
496  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
497  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24); \
498  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
499  OPNAME ## pixels16_l4_8(dst, full, halfH, halfV, halfHV, \
500  stride, 24, 16, 16, 16, 16); \
501 } \
502  \
503 static void OPNAME ## qpel16_mc11_c(uint8_t *dst, const uint8_t *src, \
504  ptrdiff_t stride) \
505 { \
506  uint8_t full[24 * 17]; \
507  uint8_t halfH[272]; \
508  uint8_t halfHV[256]; \
509  \
510  copy_block17(full, src, 24, stride, 17); \
511  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
512  put ## RND ## pixels16_l2_8(halfH, halfH, full, 16, 16, 24, 17); \
513  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
514  OPNAME ## pixels16_l2_8(dst, halfH, halfHV, stride, 16, 16, 16); \
515 } \
516  \
517 void ff_ ## OPNAME ## qpel16_mc31_old_c(uint8_t *dst, const uint8_t *src, \
518  ptrdiff_t stride) \
519 { \
520  uint8_t full[24 * 17]; \
521  uint8_t halfH[272]; \
522  uint8_t halfV[256]; \
523  uint8_t halfHV[256]; \
524  \
525  copy_block17(full, src, 24, stride, 17); \
526  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
527  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full + 1, 16, 24); \
528  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
529  OPNAME ## pixels16_l4_8(dst, full + 1, halfH, halfV, halfHV, \
530  stride, 24, 16, 16, 16, 16); \
531 } \
532  \
533 static void OPNAME ## qpel16_mc31_c(uint8_t *dst, const uint8_t *src, \
534  ptrdiff_t stride) \
535 { \
536  uint8_t full[24 * 17]; \
537  uint8_t halfH[272]; \
538  uint8_t halfHV[256]; \
539  \
540  copy_block17(full, src, 24, stride, 17); \
541  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
542  put ## RND ## pixels16_l2_8(halfH, halfH, full + 1, 16, 16, 24, 17); \
543  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
544  OPNAME ## pixels16_l2_8(dst, halfH, halfHV, stride, 16, 16, 16); \
545 } \
546  \
547 void ff_ ## OPNAME ## qpel16_mc13_old_c(uint8_t *dst, const uint8_t *src, \
548  ptrdiff_t stride) \
549 { \
550  uint8_t full[24 * 17]; \
551  uint8_t halfH[272]; \
552  uint8_t halfV[256]; \
553  uint8_t halfHV[256]; \
554  \
555  copy_block17(full, src, 24, stride, 17); \
556  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
557  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24); \
558  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
559  OPNAME ## pixels16_l4_8(dst, full + 24, halfH + 16, halfV, halfHV, \
560  stride, 24, 16, 16, 16, 16); \
561 } \
562  \
563 static void OPNAME ## qpel16_mc13_c(uint8_t *dst, const uint8_t *src, \
564  ptrdiff_t stride) \
565 { \
566  uint8_t full[24 * 17]; \
567  uint8_t halfH[272]; \
568  uint8_t halfHV[256]; \
569  \
570  copy_block17(full, src, 24, stride, 17); \
571  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
572  put ## RND ## pixels16_l2_8(halfH, halfH, full, 16, 16, 24, 17); \
573  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
574  OPNAME ## pixels16_l2_8(dst, halfH + 16, halfHV, stride, 16, 16, 16); \
575 } \
576  \
577 void ff_ ## OPNAME ## qpel16_mc33_old_c(uint8_t *dst, const uint8_t *src, \
578  ptrdiff_t stride) \
579 { \
580  uint8_t full[24 * 17]; \
581  uint8_t halfH[272]; \
582  uint8_t halfV[256]; \
583  uint8_t halfHV[256]; \
584  \
585  copy_block17(full, src, 24, stride, 17); \
586  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
587  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full + 1, 16, 24); \
588  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
589  OPNAME ## pixels16_l4_8(dst, full + 25, halfH + 16, halfV, halfHV, \
590  stride, 24, 16, 16, 16, 16); \
591 } \
592  \
593 static void OPNAME ## qpel16_mc33_c(uint8_t *dst, const uint8_t *src, \
594  ptrdiff_t stride) \
595 { \
596  uint8_t full[24 * 17]; \
597  uint8_t halfH[272]; \
598  uint8_t halfHV[256]; \
599  \
600  copy_block17(full, src, 24, stride, 17); \
601  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
602  put ## RND ## pixels16_l2_8(halfH, halfH, full + 1, 16, 16, 24, 17); \
603  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
604  OPNAME ## pixels16_l2_8(dst, halfH + 16, halfHV, stride, 16, 16, 16); \
605 } \
606  \
607 static void OPNAME ## qpel16_mc21_c(uint8_t *dst, const uint8_t *src, \
608  ptrdiff_t stride) \
609 { \
610  uint8_t halfH[272]; \
611  uint8_t halfHV[256]; \
612  \
613  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17); \
614  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
615  OPNAME ## pixels16_l2_8(dst, halfH, halfHV, stride, 16, 16, 16); \
616 } \
617  \
618 static void OPNAME ## qpel16_mc23_c(uint8_t *dst, const uint8_t *src, \
619  ptrdiff_t stride) \
620 { \
621  uint8_t halfH[272]; \
622  uint8_t halfHV[256]; \
623  \
624  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17); \
625  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
626  OPNAME ## pixels16_l2_8(dst, halfH + 16, halfHV, stride, 16, 16, 16); \
627 } \
628  \
629 void ff_ ## OPNAME ## qpel16_mc12_old_c(uint8_t *dst, const uint8_t *src, \
630  ptrdiff_t stride) \
631 { \
632  uint8_t full[24 * 17]; \
633  uint8_t halfH[272]; \
634  uint8_t halfV[256]; \
635  uint8_t halfHV[256]; \
636  \
637  copy_block17(full, src, 24, stride, 17); \
638  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
639  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24); \
640  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
641  OPNAME ## pixels16_l2_8(dst, halfV, halfHV, stride, 16, 16, 16); \
642 } \
643  \
644 static void OPNAME ## qpel16_mc12_c(uint8_t *dst, const uint8_t *src, \
645  ptrdiff_t stride) \
646 { \
647  uint8_t full[24 * 17]; \
648  uint8_t halfH[272]; \
649  \
650  copy_block17(full, src, 24, stride, 17); \
651  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
652  put ## RND ## pixels16_l2_8(halfH, halfH, full, 16, 16, 24, 17); \
653  OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16); \
654 } \
655  \
656 void ff_ ## OPNAME ## qpel16_mc32_old_c(uint8_t *dst, const uint8_t *src, \
657  ptrdiff_t stride) \
658 { \
659  uint8_t full[24 * 17]; \
660  uint8_t halfH[272]; \
661  uint8_t halfV[256]; \
662  uint8_t halfHV[256]; \
663  \
664  copy_block17(full, src, 24, stride, 17); \
665  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
666  put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full + 1, 16, 24); \
667  put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16); \
668  OPNAME ## pixels16_l2_8(dst, halfV, halfHV, stride, 16, 16, 16); \
669 } \
670  \
671 static void OPNAME ## qpel16_mc32_c(uint8_t *dst, const uint8_t *src, \
672  ptrdiff_t stride) \
673 { \
674  uint8_t full[24 * 17]; \
675  uint8_t halfH[272]; \
676  \
677  copy_block17(full, src, 24, stride, 17); \
678  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17); \
679  put ## RND ## pixels16_l2_8(halfH, halfH, full + 1, 16, 16, 24, 17); \
680  OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16); \
681 } \
682  \
683 static void OPNAME ## qpel16_mc22_c(uint8_t *dst, const uint8_t *src, \
684  ptrdiff_t stride) \
685 { \
686  uint8_t halfH[272]; \
687  \
688  put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17); \
689  OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16); \
690 }
691 
692 #define op_avg(a, b) a = (((a) + cm[((b) + 16) >> 5] + 1) >> 1)
693 #define op_put(a, b) a = cm[((b) + 16) >> 5]
694 #define op_put_no_rnd(a, b) a = cm[((b) + 15) >> 5]
695 
696 QPEL_MC(0, put_, _, op_put)
697 QPEL_MC(1, put_no_rnd_, _no_rnd_, op_put_no_rnd)
698 QPEL_MC(0, avg_, _, op_avg)
699 
700 #undef op_avg
701 #undef op_put
702 #undef op_put_no_rnd
703 
704 void ff_put_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
705 {
706  put_pixels8_8_c(dst, src, stride, 8);
707 }
708 
709 void ff_avg_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
710 {
711  avg_pixels8_8_c(dst, src, stride, 8);
712 }
713 
714 void ff_put_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
715 {
716  put_pixels16_8_c(dst, src, stride, 16);
717 }
718 
719 void ff_avg_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
720 {
721  avg_pixels16_8_c(dst, src, stride, 16);
722 }
723 
724 #define put_qpel8_mc00_c ff_put_pixels8x8_c
725 #define avg_qpel8_mc00_c ff_avg_pixels8x8_c
726 #define put_qpel16_mc00_c ff_put_pixels16x16_c
727 #define avg_qpel16_mc00_c ff_avg_pixels16x16_c
728 #define put_no_rnd_qpel8_mc00_c ff_put_pixels8x8_c
729 #define put_no_rnd_qpel16_mc00_c ff_put_pixels16x16_c
730 
731 void ff_put_pixels8_l2_8(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
732  int dst_stride, int src_stride1, int src_stride2,
733  int h)
734 {
735  put_pixels8_l2_8(dst, src1, src2, dst_stride, src_stride1, src_stride2, h);
736 
737 }
738 
739 #if CONFIG_DIRAC_DECODER
740 #define DIRAC_MC(OPNAME)\
741 void ff_ ## OPNAME ## _dirac_pixels8_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
742 {\
743  OPNAME ## _pixels8_8_c(dst, src[0], stride, h);\
744 }\
745 void ff_ ## OPNAME ## _dirac_pixels16_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
746 {\
747  OPNAME ## _pixels16_8_c(dst, src[0], stride, h);\
748 }\
749 void ff_ ## OPNAME ## _dirac_pixels32_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
750 {\
751  OPNAME ## _pixels16_8_c(dst , src[0] , stride, h);\
752  OPNAME ## _pixels16_8_c(dst+16, src[0]+16, stride, h);\
753 }\
754 void ff_ ## OPNAME ## _dirac_pixels8_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
755 {\
756  OPNAME ## _pixels8_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
757 }\
758 void ff_ ## OPNAME ## _dirac_pixels16_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
759 {\
760  OPNAME ## _pixels16_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
761 }\
762 void ff_ ## OPNAME ## _dirac_pixels32_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
763 {\
764  OPNAME ## _pixels16_l2_8(dst , src[0] , src[1] , stride, stride, stride, h);\
765  OPNAME ## _pixels16_l2_8(dst+16, src[0]+16, src[1]+16, stride, stride, stride, h);\
766 }\
767 void ff_ ## OPNAME ## _dirac_pixels8_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
768 {\
769  OPNAME ## _pixels8_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
770 }\
771 void ff_ ## OPNAME ## _dirac_pixels16_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
772 {\
773  OPNAME ## _pixels16_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
774 }\
775 void ff_ ## OPNAME ## _dirac_pixels32_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
776 {\
777  OPNAME ## _pixels16_l4_8(dst , src[0] , src[1] , src[2] , src[3] , stride, stride, stride, stride, stride, h);\
778  OPNAME ## _pixels16_l4_8(dst+16, src[0]+16, src[1]+16, src[2]+16, src[3]+16, stride, stride, stride, stride, stride, h);\
779 }
780 DIRAC_MC(put)
781 DIRAC_MC(avg)
782 #endif
783 
785 {
786 #define dspfunc(PFX, IDX, NUM) \
787  c->PFX ## _pixels_tab[IDX][0] = PFX ## NUM ## _mc00_c; \
788  c->PFX ## _pixels_tab[IDX][1] = PFX ## NUM ## _mc10_c; \
789  c->PFX ## _pixels_tab[IDX][2] = PFX ## NUM ## _mc20_c; \
790  c->PFX ## _pixels_tab[IDX][3] = PFX ## NUM ## _mc30_c; \
791  c->PFX ## _pixels_tab[IDX][4] = PFX ## NUM ## _mc01_c; \
792  c->PFX ## _pixels_tab[IDX][5] = PFX ## NUM ## _mc11_c; \
793  c->PFX ## _pixels_tab[IDX][6] = PFX ## NUM ## _mc21_c; \
794  c->PFX ## _pixels_tab[IDX][7] = PFX ## NUM ## _mc31_c; \
795  c->PFX ## _pixels_tab[IDX][8] = PFX ## NUM ## _mc02_c; \
796  c->PFX ## _pixels_tab[IDX][9] = PFX ## NUM ## _mc12_c; \
797  c->PFX ## _pixels_tab[IDX][10] = PFX ## NUM ## _mc22_c; \
798  c->PFX ## _pixels_tab[IDX][11] = PFX ## NUM ## _mc32_c; \
799  c->PFX ## _pixels_tab[IDX][12] = PFX ## NUM ## _mc03_c; \
800  c->PFX ## _pixels_tab[IDX][13] = PFX ## NUM ## _mc13_c; \
801  c->PFX ## _pixels_tab[IDX][14] = PFX ## NUM ## _mc23_c; \
802  c->PFX ## _pixels_tab[IDX][15] = PFX ## NUM ## _mc33_c
803 
804  dspfunc(put_qpel, 0, 16);
805  dspfunc(put_qpel, 1, 8);
806 
807  dspfunc(put_no_rnd_qpel, 0, 16);
808  dspfunc(put_no_rnd_qpel, 1, 8);
809 
810  dspfunc(avg_qpel, 0, 16);
811  dspfunc(avg_qpel, 1, 8);
812 
813 #if ARCH_X86
815 #elif ARCH_MIPS
817 #endif
818 }
pel_template.c
src1
const pixel * src1
Definition: h264pred_template.c:421
ff_qpeldsp_init
av_cold void ff_qpeldsp_init(QpelDSPContext *c)
Definition: qpeldsp.c:784
ff_avg_pixels8x8_c
void ff_avg_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
Definition: qpeldsp.c:709
op_put_no_rnd
#define op_put_no_rnd(a, b)
Definition: qpeldsp.c:694
ff_qpeldsp_init_x86
void ff_qpeldsp_init_x86(QpelDSPContext *c)
Definition: qpeldsp_init.c:529
ff_put_pixels8_l2_8
void ff_put_pixels8_l2_8(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h)
Definition: qpeldsp.c:731
diracdsp.h
ff_put_pixels8x8_c
void ff_put_pixels8x8_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
Definition: qpeldsp.c:704
av_cold
#define av_cold
Definition: attributes.h:90
QPEL_MC
#define QPEL_MC(r, OPNAME, RND, OP)
Definition: qpeldsp.c:43
ff_put_pixels16x16_c
void ff_put_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
Definition: qpeldsp.c:714
qpeldsp.h
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_avg_pixels16x16_c
void ff_avg_pixels16x16_c(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
Definition: qpeldsp.c:719
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
avg
#define avg(a, b, c, d)
Definition: colorspacedsp_template.c:28
attributes.h
copy_block.h
src2
const pixel * src2
Definition: h264pred_template.c:422
dspfunc
#define dspfunc(PFX, IDX, NUM)
ff_qpeldsp_init_mips
void ff_qpeldsp_init_mips(QpelDSPContext *c)
Definition: qpeldsp_init_mips.c:24
op_put
#define op_put(a, b)
Definition: qpeldsp.c:693
stride
#define stride
Definition: h264pred_template.c:537
QpelDSPContext
quarterpel DSP context
Definition: qpeldsp.h:72
qpel_template.c
hpel_template.c
_
#define _
op_avg
#define op_avg(a, b)
Definition: qpeldsp.c:692
h
h
Definition: vp9dsp_template.c:2070
src
#define src
Definition: vp8dsp.c:248