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