Line | Branch | Exec | Source |
---|---|---|---|
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 | 24 | static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, | |
35 | int stride, int width, int height) | ||
36 | { | ||
37 |
3/5✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
24 | switch (width) { |
38 | ✗ | case 2: | |
39 | ✗ | put_pixels2_8_c(dst, src, stride, height); | |
40 | ✗ | break; | |
41 | 14 | case 4: | |
42 | 14 | put_pixels4_8_c(dst, src, stride, height); | |
43 | 14 | break; | |
44 | 9 | case 8: | |
45 | 9 | put_pixels8_8_c(dst, src, stride, height); | |
46 | 9 | break; | |
47 | 1 | case 16: | |
48 | 1 | put_pixels16_8_c(dst, src, stride, height); | |
49 | 1 | break; | |
50 | } | ||
51 | 24 | } | |
52 | |||
53 | 66 | 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 |
2/2✓ Branch 0 taken 624 times.
✓ Branch 1 taken 66 times.
|
690 | for (i = 0; i < height; i++) { |
59 |
2/2✓ Branch 0 taken 6336 times.
✓ Branch 1 taken 624 times.
|
6960 | for (j = 0; j < width; j++) |
60 | 6336 | dst[j] = ((2 * src[j] + src[j + 1] + 1) * | |
61 | 6336 | 683) >> 11; | |
62 | 624 | src += stride; | |
63 | 624 | dst += stride; | |
64 | } | ||
65 | 66 | } | |
66 | |||
67 | 66 | 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 |
2/2✓ Branch 0 taken 704 times.
✓ Branch 1 taken 66 times.
|
770 | for (i = 0; i < height; i++) { |
73 |
2/2✓ Branch 0 taken 7488 times.
✓ Branch 1 taken 704 times.
|
8192 | for (j = 0; j < width; j++) |
74 | 7488 | dst[j] = ((src[j] + 2 * src[j + 1] + 1) * | |
75 | 7488 | 683) >> 11; | |
76 | 704 | src += stride; | |
77 | 704 | dst += stride; | |
78 | } | ||
79 | 66 | } | |
80 | |||
81 | 30 | 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 |
2/2✓ Branch 0 taken 320 times.
✓ Branch 1 taken 30 times.
|
350 | for (i = 0; i < height; i++) { |
87 |
2/2✓ Branch 0 taken 3456 times.
✓ Branch 1 taken 320 times.
|
3776 | for (j = 0; j < width; j++) |
88 | 3456 | dst[j] = ((2 * src[j] + src[j + stride] + 1) * | |
89 | 3456 | 683) >> 11; | |
90 | 320 | src += stride; | |
91 | 320 | dst += stride; | |
92 | } | ||
93 | 30 | } | |
94 | |||
95 | 57 | 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 |
2/2✓ Branch 0 taken 528 times.
✓ Branch 1 taken 57 times.
|
585 | for (i = 0; i < height; i++) { |
101 |
2/2✓ Branch 0 taken 4896 times.
✓ Branch 1 taken 528 times.
|
5424 | for (j = 0; j < width; j++) |
102 | 4896 | dst[j] = ((4 * src[j] + 3 * src[j + 1] + | |
103 | 4896 | 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * | |
104 | 4896 | 2731) >> 15; | |
105 | 528 | src += stride; | |
106 | 528 | dst += stride; | |
107 | } | ||
108 | 57 | } | |
109 | |||
110 | 75 | 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 |
2/2✓ Branch 0 taken 704 times.
✓ Branch 1 taken 75 times.
|
779 | for (i = 0; i < height; i++) { |
116 |
2/2✓ Branch 0 taken 7680 times.
✓ Branch 1 taken 704 times.
|
8384 | for (j = 0; j < width; j++) |
117 | 7680 | dst[j] = ((3 * src[j] + 2 * src[j + 1] + | |
118 | 7680 | 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * | |
119 | 7680 | 2731) >> 15; | |
120 | 704 | src += stride; | |
121 | 704 | dst += stride; | |
122 | } | ||
123 | 75 | } | |
124 | |||
125 | 45 | 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 |
2/2✓ Branch 0 taken 464 times.
✓ Branch 1 taken 45 times.
|
509 | for (i = 0; i < height; i++) { |
131 |
2/2✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 464 times.
|
5072 | for (j = 0; j < width; j++) |
132 | 4608 | dst[j] = ((src[j] + 2 * src[j + stride] + 1) * | |
133 | 4608 | 683) >> 11; | |
134 | 464 | src += stride; | |
135 | 464 | dst += stride; | |
136 | } | ||
137 | 45 | } | |
138 | |||
139 | 72 | 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 |
2/2✓ Branch 0 taken 688 times.
✓ Branch 1 taken 72 times.
|
760 | for (i = 0; i < height; i++) { |
145 |
2/2✓ Branch 0 taken 6720 times.
✓ Branch 1 taken 688 times.
|
7408 | for (j = 0; j < width; j++) |
146 | 6720 | dst[j] = ((3 * src[j] + 4 * src[j + 1] + | |
147 | 6720 | 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * | |
148 | 6720 | 2731) >> 15; | |
149 | 688 | src += stride; | |
150 | 688 | dst += stride; | |
151 | } | ||
152 | 72 | } | |
153 | |||
154 | 72 | 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 |
2/2✓ Branch 0 taken 752 times.
✓ Branch 1 taken 72 times.
|
824 | for (i = 0; i < height; i++) { |
160 |
2/2✓ Branch 0 taken 7008 times.
✓ Branch 1 taken 752 times.
|
7760 | for (j = 0; j < width; j++) |
161 | 7008 | dst[j] = ((2 * src[j] + 3 * src[j + 1] + | |
162 | 7008 | 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) * | |
163 | 7008 | 2731) >> 15; | |
164 | 752 | src += stride; | |
165 | 752 | dst += stride; | |
166 | } | ||
167 | 72 | } | |
168 | |||
169 | 3 | static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, | |
170 | int stride, int width, int height) | ||
171 | { | ||
172 |
2/5✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
3 | 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 | 2 | case 8: | |
180 | 2 | avg_pixels8_8_c(dst, src, stride, height); | |
181 | 2 | break; | |
182 | 1 | case 16: | |
183 | 1 | avg_pixels16_8_c(dst, src, stride, height); | |
184 | 1 | break; | |
185 | } | ||
186 | 3 | } | |
187 | |||
188 | 6 | 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 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 6 times.
|
70 | for (i = 0; i < height; i++) { |
194 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 64 times.
|
832 | for (j = 0; j < width; j++) |
195 | 768 | dst[j] = (dst[j] + | |
196 | 768 | (((2 * src[j] + src[j + 1] + 1) * | |
197 | 768 | 683) >> 11) + 1) >> 1; | |
198 | 64 | src += stride; | |
199 | 64 | dst += stride; | |
200 | } | ||
201 | 6 | } | |
202 | |||
203 | 3 | 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 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 3 times.
|
35 | for (i = 0; i < height; i++) { |
209 |
2/2✓ Branch 0 taken 384 times.
✓ Branch 1 taken 32 times.
|
416 | for (j = 0; j < width; j++) |
210 | 384 | dst[j] = (dst[j] + | |
211 | 384 | (((src[j] + 2 * src[j + 1] + 1) * | |
212 | 384 | 683) >> 11) + 1) >> 1; | |
213 | 32 | src += stride; | |
214 | 32 | dst += stride; | |
215 | } | ||
216 | 3 | } | |
217 | |||
218 | 6 | 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 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 6 times.
|
70 | for (i = 0; i < height; i++) { |
224 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 64 times.
|
832 | for (j = 0; j < width; j++) |
225 | 768 | dst[j] = (dst[j] + | |
226 | 768 | (((2 * src[j] + src[j + stride] + 1) * | |
227 | 768 | 683) >> 11) + 1) >> 1; | |
228 | 64 | src += stride; | |
229 | 64 | dst += stride; | |
230 | } | ||
231 | 6 | } | |
232 | |||
233 | 3 | 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 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 3 times.
|
35 | for (i = 0; i < height; i++) { |
239 |
2/2✓ Branch 0 taken 384 times.
✓ Branch 1 taken 32 times.
|
416 | for (j = 0; j < width; j++) |
240 | 384 | dst[j] = (dst[j] + | |
241 | 384 | (((4 * src[j] + 3 * src[j + 1] + | |
242 | 384 | 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) * | |
243 | 384 | 2731) >> 15) + 1) >> 1; | |
244 | 32 | src += stride; | |
245 | 32 | dst += stride; | |
246 | } | ||
247 | 3 | } | |
248 | |||
249 | 6 | 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 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 6 times.
|
70 | for (i = 0; i < height; i++) { |
255 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 64 times.
|
832 | for (j = 0; j < width; j++) |
256 | 768 | dst[j] = (dst[j] + | |
257 | 768 | (((3 * src[j] + 2 * src[j + 1] + | |
258 | 768 | 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) * | |
259 | 768 | 2731) >> 15) + 1) >> 1; | |
260 | 64 | src += stride; | |
261 | 64 | dst += stride; | |
262 | } | ||
263 | 6 | } | |
264 | |||
265 | 3 | 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 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 3 times.
|
35 | for (i = 0; i < height; i++) { |
271 |
2/2✓ Branch 0 taken 384 times.
✓ Branch 1 taken 32 times.
|
416 | for (j = 0; j < width; j++) |
272 | 384 | dst[j] = (dst[j] + | |
273 | 384 | (((src[j] + 2 * src[j + stride] + 1) * | |
274 | 384 | 683) >> 11) + 1) >> 1; | |
275 | 32 | src += stride; | |
276 | 32 | dst += stride; | |
277 | } | ||
278 | 3 | } | |
279 | |||
280 | 9 | 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 |
2/2✓ Branch 0 taken 96 times.
✓ Branch 1 taken 9 times.
|
105 | for (i = 0; i < height; i++) { |
286 |
2/2✓ Branch 0 taken 1152 times.
✓ Branch 1 taken 96 times.
|
1248 | for (j = 0; j < width; j++) |
287 | 1152 | dst[j] = (dst[j] + | |
288 | 1152 | (((3 * src[j] + 4 * src[j + 1] + | |
289 | 1152 | 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) * | |
290 | 1152 | 2731) >> 15) + 1) >> 1; | |
291 | 96 | src += stride; | |
292 | 96 | dst += stride; | |
293 | } | ||
294 | 9 | } | |
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 | 8 | av_cold void ff_tpeldsp_init(TpelDSPContext *c) | |
313 | { | ||
314 | 8 | c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c; | |
315 | 8 | c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c; | |
316 | 8 | c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c; | |
317 | 8 | c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c; | |
318 | 8 | c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c; | |
319 | 8 | c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c; | |
320 | 8 | c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c; | |
321 | 8 | c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c; | |
322 | 8 | c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c; | |
323 | |||
324 | 8 | c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c; | |
325 | 8 | c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c; | |
326 | 8 | c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c; | |
327 | 8 | c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c; | |
328 | 8 | c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c; | |
329 | 8 | c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c; | |
330 | 8 | c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c; | |
331 | 8 | c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c; | |
332 | 8 | c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c; | |
333 | 8 | } | |
334 |