blob: cc4fed328d29c60f59e0d200c3744826a91fb261
1 | /* |
2 | * thirdpel DSP functions |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | /** |
22 | * @file |
23 | * thirdpel DSP functions |
24 | */ |
25 | |
26 | #include <stdint.h> |
27 | |
28 | #include "libavutil/attributes.h" |
29 | #include "tpeldsp.h" |
30 | |
31 | #define BIT_DEPTH 8 |
32 | #include "pel_template.c" |
33 | |
34 | static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, |
35 | int stride, int width, int height) |
36 | { |
37 | switch (width) { |
38 | case 2: |
39 | put_pixels2_8_c(dst, src, stride, height); |
40 | break; |
41 | case 4: |
42 | put_pixels4_8_c(dst, src, stride, height); |
43 | break; |
44 | case 8: |
45 | put_pixels8_8_c(dst, src, stride, height); |
46 | break; |
47 | case 16: |
48 | put_pixels16_8_c(dst, src, stride, height); |
49 | break; |
50 | } |
51 | } |
52 | |
53 | static inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, |
54 | int stride, int width, int height) |
55 | { |
56 | int i, j; |
57 | |
58 | for (i = 0; i < height; i++) { |
59 | for (j = 0; j < width; j++) |
60 | dst[j] = ((2 * src[j] + src[j + 1] + 1) * |
61 | 683) >> 11; |
62 | src += stride; |
63 | dst += stride; |
64 | } |
65 | } |
66 | |
67 | static inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, |
68 | int stride, int width, int height) |
69 | { |
70 | int i, j; |
71 | |
72 | for (i = 0; i < height; i++) { |
73 | for (j = 0; j < width; j++) |
74 | dst[j] = ((src[j] + 2 * src[j + 1] + 1) * |
75 | 683) >> 11; |
76 | src += stride; |
77 | dst += stride; |
78 | } |
79 | } |
80 | |
81 | static inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, |
82 | int stride, int width, int height) |
83 | { |
84 | int i, j; |
85 | |
86 | for (i = 0; i < height; i++) { |
87 | for (j = 0; j < width; j++) |
88 | dst[j] = ((2 * src[j] + src[j + stride] + 1) * |
89 | 683) >> 11; |
90 | src += stride; |
91 | dst += stride; |
92 | } |
93 | } |
94 | |
95 | static inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, |
96 | int stride, int width, int height) |
97 | { |
98 | int i, j; |
99 | |
100 | for (i = 0; i < height; i++) { |
101 | for (j = 0; j < width; j++) |
102 | dst[j] = ((4 * src[j] + 3 * src[j + 1] + |
103 | 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * |
104 | 2731) >> 15; |
105 | src += stride; |
106 | dst += stride; |
107 | } |
108 | } |
109 | |
110 | static inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, |
111 | int stride, int width, int height) |
112 | { |
113 | int i, j; |
114 | |
115 | for (i = 0; i < height; i++) { |
116 | for (j = 0; j < width; j++) |
117 | dst[j] = ((3 * src[j] + 2 * src[j + 1] + |
118 | 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * |
119 | 2731) >> 15; |
120 | src += stride; |
121 | dst += stride; |
122 | } |
123 | } |
124 | |
125 | static inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, |
126 | int stride, int width, int height) |
127 | { |
128 | int i, j; |
129 | |
130 | for (i = 0; i < height; i++) { |
131 | for (j = 0; j < width; j++) |
132 | dst[j] = ((src[j] + 2 * src[j + stride] + 1) * |
133 | 683) >> 11; |
134 | src += stride; |
135 | dst += stride; |
136 | } |
137 | } |
138 | |
139 | static inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, |
140 | int stride, int width, int height) |
141 | { |
142 | int i, j; |
143 | |
144 | for (i = 0; i < height; i++) { |
145 | for (j = 0; j < width; j++) |
146 | dst[j] = ((3 * src[j] + 4 * src[j + 1] + |
147 | 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * |
148 | 2731) >> 15; |
149 | src += stride; |
150 | dst += stride; |
151 | } |
152 | } |
153 | |
154 | static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, |
155 | int stride, int width, int height) |
156 | { |
157 | int i, j; |
158 | |
159 | for (i = 0; i < height; i++) { |
160 | for (j = 0; j < width; j++) |
161 | dst[j] = ((2 * src[j] + 3 * src[j + 1] + |
162 | 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) * |
163 | 2731) >> 15; |
164 | src += stride; |
165 | dst += stride; |
166 | } |
167 | } |
168 | |
169 | static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, |
170 | int stride, int width, int height) |
171 | { |
172 | switch (width) { |
173 | case 2: |
174 | avg_pixels2_8_c(dst, src, stride, height); |
175 | break; |
176 | case 4: |
177 | avg_pixels4_8_c(dst, src, stride, height); |
178 | break; |
179 | case 8: |
180 | avg_pixels8_8_c(dst, src, stride, height); |
181 | break; |
182 | case 16: |
183 | avg_pixels16_8_c(dst, src, stride, height); |
184 | break; |
185 | } |
186 | } |
187 | |
188 | static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, |
189 | int stride, int width, int height) |
190 | { |
191 | int i, j; |
192 | |
193 | for (i = 0; i < height; i++) { |
194 | for (j = 0; j < width; j++) |
195 | dst[j] = (dst[j] + |
196 | (((2 * src[j] + src[j + 1] + 1) * |
197 | 683) >> 11) + 1) >> 1; |
198 | src += stride; |
199 | dst += stride; |
200 | } |
201 | } |
202 | |
203 | static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, |
204 | int stride, int width, int height) |
205 | { |
206 | int i, j; |
207 | |
208 | for (i = 0; i < height; i++) { |
209 | for (j = 0; j < width; j++) |
210 | dst[j] = (dst[j] + |
211 | (((src[j] + 2 * src[j + 1] + 1) * |
212 | 683) >> 11) + 1) >> 1; |
213 | src += stride; |
214 | dst += stride; |
215 | } |
216 | } |
217 | |
218 | static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, |
219 | int stride, int width, int height) |
220 | { |
221 | int i, j; |
222 | |
223 | for (i = 0; i < height; i++) { |
224 | for (j = 0; j < width; j++) |
225 | dst[j] = (dst[j] + |
226 | (((2 * src[j] + src[j + stride] + 1) * |
227 | 683) >> 11) + 1) >> 1; |
228 | src += stride; |
229 | dst += stride; |
230 | } |
231 | } |
232 | |
233 | static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, |
234 | int stride, int width, int height) |
235 | { |
236 | int i, j; |
237 | |
238 | for (i = 0; i < height; i++) { |
239 | for (j = 0; j < width; j++) |
240 | dst[j] = (dst[j] + |
241 | (((4 * src[j] + 3 * src[j + 1] + |
242 | 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * |
243 | 2731) >> 15) + 1) >> 1; |
244 | src += stride; |
245 | dst += stride; |
246 | } |
247 | } |
248 | |
249 | static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, |
250 | int stride, int width, int height) |
251 | { |
252 | int i, j; |
253 | |
254 | for (i = 0; i < height; i++) { |
255 | for (j = 0; j < width; j++) |
256 | dst[j] = (dst[j] + |
257 | (((3 * src[j] + 2 * src[j + 1] + |
258 | 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * |
259 | 2731) >> 15) + 1) >> 1; |
260 | src += stride; |
261 | dst += stride; |
262 | } |
263 | } |
264 | |
265 | static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, |
266 | int stride, int width, int height) |
267 | { |
268 | int i, j; |
269 | |
270 | for (i = 0; i < height; i++) { |
271 | for (j = 0; j < width; j++) |
272 | dst[j] = (dst[j] + |
273 | (((src[j] + 2 * src[j + stride] + 1) * |
274 | 683) >> 11) + 1) >> 1; |
275 | src += stride; |
276 | dst += stride; |
277 | } |
278 | } |
279 | |
280 | static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, |
281 | int stride, int width, int height) |
282 | { |
283 | int i, j; |
284 | |
285 | for (i = 0; i < height; i++) { |
286 | for (j = 0; j < width; j++) |
287 | dst[j] = (dst[j] + |
288 | (((3 * src[j] + 4 * src[j + 1] + |
289 | 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * |
290 | 2731) >> 15) + 1) >> 1; |
291 | src += stride; |
292 | dst += stride; |
293 | } |
294 | } |
295 | |
296 | static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, |
297 | int stride, int width, int height) |
298 | { |
299 | int i, j; |
300 | |
301 | for (i = 0; i < height; i++) { |
302 | for (j = 0; j < width; j++) |
303 | dst[j] = (dst[j] + |
304 | (((2 * src[j] + 3 * src[j + 1] + |
305 | 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) * |
306 | 2731) >> 15) + 1) >> 1; |
307 | src += stride; |
308 | dst += stride; |
309 | } |
310 | } |
311 | |
312 | av_cold void ff_tpeldsp_init(TpelDSPContext *c) |
313 | { |
314 | c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c; |
315 | c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c; |
316 | c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c; |
317 | c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c; |
318 | c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c; |
319 | c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c; |
320 | c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c; |
321 | c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c; |
322 | c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c; |
323 | |
324 | c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c; |
325 | c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c; |
326 | c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c; |
327 | c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c; |
328 | c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c; |
329 | c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c; |
330 | c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c; |
331 | c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c; |
332 | c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c; |
333 | } |
334 |