FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/tests/checkasm/hevc_pel.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 274 274 100.0%
Functions: 11 11 100.0%
Branches: 233 318 73.3%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2015 Henrik Gramner
3 * Copyright (c) 2021 Josh Dekker
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22 #include <string.h>
23 #include "checkasm.h"
24 #include "libavcodec/hevc/dsp.h"
25 #include "libavutil/common.h"
26 #include "libavutil/internal.h"
27 #include "libavutil/intreadwrite.h"
28
29 static const uint32_t pixel_mask[] = { 0xffffffff, 0x01ff01ff, 0x03ff03ff, 0x07ff07ff, 0x0fff0fff };
30 static const uint32_t pixel_mask16[] = { 0x00ff00ff, 0x01ff01ff, 0x03ff03ff, 0x07ff07ff, 0x0fff0fff };
31 static const int sizes[] = { -1, 4, 6, 8, 12, 16, 24, 32, 48, 64 };
32 static const int weights[] = { 0, 128, 255, -1 };
33 static const int denoms[] = {0, 7, 12, -1 };
34 static const int offsets[] = {0, 255, -1 };
35
36 #define SIZEOF_PIXEL ((bit_depth + 7) / 8)
37 #define BUF_SIZE (2 * MAX_PB_SIZE * (2 * 4 + MAX_PB_SIZE))
38
39 #define checkasm_check_pixel(buf1, stride1, buf2, stride2, ...) \
40 ((bit_depth > 8) ? \
41 checkasm_check(uint16_t, (const uint16_t*)buf1, stride1, \
42 (const uint16_t*)buf2, stride2, \
43 __VA_ARGS__) : \
44 checkasm_check(uint8_t, (const uint8_t*) buf1, stride1, \
45 (const uint8_t*) buf2, stride2, \
46 __VA_ARGS__))
47
48 #define randomize_buffers() \
49 do { \
50 uint32_t mask = pixel_mask[bit_depth - 8]; \
51 int k; \
52 for (k = 0; k < BUF_SIZE + SRC_EXTRA; k += 4) { \
53 uint32_t r = rnd() & mask; \
54 AV_WN32A(buf0 + k, r); \
55 AV_WN32A(buf1 + k, r); \
56 if (k >= BUF_SIZE) \
57 continue; \
58 r = rnd(); \
59 AV_WN32A(dst0 + k, r); \
60 AV_WN32A(dst1 + k, r); \
61 } \
62 } while (0)
63
64 #define randomize_buffers_ref() \
65 randomize_buffers(); \
66 do { \
67 uint32_t mask = pixel_mask16[bit_depth - 8]; \
68 int k; \
69 for (k = 0; k < BUF_SIZE; k += 2) { \
70 uint32_t r = rnd() & mask; \
71 AV_WN32A(ref0 + k, r); \
72 AV_WN32A(ref1 + k, r); \
73 } \
74 } while (0)
75
76 #define src0 (buf0 + 2 * 4 * MAX_PB_SIZE) /* hevc qpel functions read data from negative src pointer offsets */
77 #define src1 (buf1 + 2 * 4 * MAX_PB_SIZE)
78
79 /* FIXME: Does the need for SRC_EXTRA for these tests indicate a bug? */
80 #define SRC_EXTRA 8
81
82 13 static void checkasm_check_hevc_qpel(void)
83 {
84 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE + SRC_EXTRA]);
85 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE + SRC_EXTRA]);
86 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
87 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
88
89 HEVCDSPContext h;
90 int size, bit_depth, i, j;
91 13 declare_func(void, int16_t *dst, const uint8_t *src, ptrdiff_t srcstride,
92 int height, intptr_t mx, intptr_t my, int width);
93
94
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
95 65 ff_hevc_dsp_init(&h, bit_depth);
96
97
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
98
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
99
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
100 const char *type;
101
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
102 585 case 0: type = "pel_pixels"; break; // 0 0
103 585 case 1: type = "qpel_h"; break; // 0 1
104 585 case 2: type = "qpel_v"; break; // 1 0
105 585 case 3: type = "qpel_hv"; break; // 1 1
106 }
107
108
2/2
✓ Branch 3 taken 305 times.
✓ Branch 4 taken 2035 times.
2340 if (check_func(h.put_hevc_qpel[size][j][i],
109 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
110 305 int16_t *dstw0 = (int16_t *) dst0, *dstw1 = (int16_t *) dst1;
111
4/4
✓ Branch 1 taken 610 times.
✓ Branch 2 taken 702720 times.
✓ Branch 4 taken 703330 times.
✓ Branch 5 taken 305 times.
703635 randomize_buffers();
112 305 call_ref(dstw0, src0, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
113 305 call_new(dstw1, src1, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
114 305 checkasm_check(int16_t, dstw0, MAX_PB_SIZE * sizeof(int16_t),
115 dstw1, MAX_PB_SIZE * sizeof(int16_t),
116 size[sizes], size[sizes], "dst");
117
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 305 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
305 bench_new(dstw1, src1, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
118 }
119 }
120 }
121 }
122 }
123 13 report("qpel");
124 13 }
125
126 13 static void checkasm_check_hevc_qpel_uni(void)
127 {
128 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE + SRC_EXTRA]);
129 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE + SRC_EXTRA]);
130 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
131 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
132
133 HEVCDSPContext h;
134 int size, bit_depth, i, j;
135 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
136 int height, intptr_t mx, intptr_t my, int width);
137
138
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
139 65 ff_hevc_dsp_init(&h, bit_depth);
140
141
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
142
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
143
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
144 const char *type;
145
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
146 585 case 0: type = "pel_uni_pixels"; break; // 0 0
147 585 case 1: type = "qpel_uni_h"; break; // 0 1
148 585 case 2: type = "qpel_uni_v"; break; // 1 0
149 585 case 3: type = "qpel_uni_hv"; break; // 1 1
150 }
151
152
2/2
✓ Branch 3 taken 305 times.
✓ Branch 4 taken 2035 times.
2340 if (check_func(h.put_hevc_qpel_uni[size][j][i],
153 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
154
4/4
✓ Branch 1 taken 610 times.
✓ Branch 2 taken 702720 times.
✓ Branch 4 taken 703330 times.
✓ Branch 5 taken 305 times.
703635 randomize_buffers();
155 305 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
156 src0, sizes[size] * SIZEOF_PIXEL,
157 sizes[size], i, j, sizes[size]);
158 305 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
159 src1, sizes[size] * SIZEOF_PIXEL,
160 sizes[size], i, j, sizes[size]);
161
2/2
✓ Branch 0 taken 228 times.
✓ Branch 1 taken 77 times.
305 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
162 dst1, sizes[size] * SIZEOF_PIXEL,
163 size[sizes], size[sizes], "dst");
164
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 305 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
305 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
165 src1, sizes[size] * SIZEOF_PIXEL,
166 sizes[size], i, j, sizes[size]);
167 }
168 }
169 }
170 }
171 }
172 13 report("qpel_uni");
173 13 }
174
175 13 static void checkasm_check_hevc_qpel_uni_w(void)
176 {
177 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE + SRC_EXTRA]);
178 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE + SRC_EXTRA]);
179 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
180 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
181
182 HEVCDSPContext h;
183 int size, bit_depth, i, j;
184 const int *denom, *wx, *ox;
185 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
186 int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width);
187
188
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
189 65 ff_hevc_dsp_init(&h, bit_depth);
190
191
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
192
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
193
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
194 const char *type;
195
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
196 585 case 0: type = "pel_uni_w_pixels"; break; // 0 0
197 585 case 1: type = "qpel_uni_w_h"; break; // 0 1
198 585 case 2: type = "qpel_uni_w_v"; break; // 1 0
199 585 case 3: type = "qpel_uni_w_hv"; break; // 1 1
200 }
201
202
2/2
✓ Branch 3 taken 276 times.
✓ Branch 4 taken 2064 times.
2340 if (check_func(h.put_hevc_qpel_uni_w[size][j][i],
203 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
204
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 276 times.
1104 for (denom = denoms; *denom >= 0; denom++) {
205
2/2
✓ Branch 0 taken 2484 times.
✓ Branch 1 taken 828 times.
3312 for (wx = weights; *wx >= 0; wx++) {
206
2/2
✓ Branch 0 taken 4968 times.
✓ Branch 1 taken 2484 times.
7452 for (ox = offsets; *ox >= 0; ox++) {
207
4/4
✓ Branch 1 taken 9936 times.
✓ Branch 2 taken 11446272 times.
✓ Branch 4 taken 11456208 times.
✓ Branch 5 taken 4968 times.
11461176 randomize_buffers();
208 4968 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
209 src0, sizes[size] * SIZEOF_PIXEL,
210 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
211 4968 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
212 src1, sizes[size] * SIZEOF_PIXEL,
213 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
214
2/2
✓ Branch 0 taken 3744 times.
✓ Branch 1 taken 1224 times.
4968 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
215 dst1, sizes[size] * SIZEOF_PIXEL,
216 size[sizes], size[sizes], "dst");
217
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4968 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
4968 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
218 src1, sizes[size] * SIZEOF_PIXEL,
219 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
220 }
221 }
222 }
223 }
224 }
225 }
226 }
227 }
228 13 report("qpel_uni_w");
229 13 }
230
231 13 static void checkasm_check_hevc_qpel_bi(void)
232 {
233 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE + SRC_EXTRA]);
234 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE + SRC_EXTRA]);
235 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
236 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
237 13 LOCAL_ALIGNED_32(int16_t, ref0, [BUF_SIZE]);
238 13 LOCAL_ALIGNED_32(int16_t, ref1, [BUF_SIZE]);
239
240 HEVCDSPContext h;
241 int size, bit_depth, i, j;
242 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
243 const int16_t *src2,
244 int height, intptr_t mx, intptr_t my, int width);
245
246
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
247 65 ff_hevc_dsp_init(&h, bit_depth);
248
249
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
250
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
251
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
252 const char *type;
253
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
254 585 case 0: type = "pel_bi_pixels"; break; // 0 0
255 585 case 1: type = "qpel_bi_h"; break; // 0 1
256 585 case 2: type = "qpel_bi_v"; break; // 1 0
257 585 case 3: type = "qpel_bi_hv"; break; // 1 1
258 }
259
260
2/2
✓ Branch 3 taken 305 times.
✓ Branch 4 taken 2035 times.
2340 if (check_func(h.put_hevc_qpel_bi[size][j][i],
261 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
262
6/6
✓ Branch 1 taken 610 times.
✓ Branch 2 taken 702720 times.
✓ Branch 4 taken 703330 times.
✓ Branch 5 taken 305 times.
✓ Branch 7 taken 1405440 times.
✓ Branch 8 taken 305 times.
2109075 randomize_buffers_ref();
263 305 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
264 src0, sizes[size] * SIZEOF_PIXEL,
265 ref0, sizes[size], i, j, sizes[size]);
266 305 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
267 src1, sizes[size] * SIZEOF_PIXEL,
268 ref1, sizes[size], i, j, sizes[size]);
269
2/2
✓ Branch 0 taken 228 times.
✓ Branch 1 taken 77 times.
305 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
270 dst1, sizes[size] * SIZEOF_PIXEL,
271 size[sizes], size[sizes], "dst");
272
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 305 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
305 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
273 src1, sizes[size] * SIZEOF_PIXEL,
274 ref1, sizes[size], i, j, sizes[size]);
275 }
276 }
277 }
278 }
279 }
280 13 report("qpel_bi");
281 13 }
282
283 13 static void checkasm_check_hevc_qpel_bi_w(void)
284 {
285 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE + SRC_EXTRA]);
286 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE + SRC_EXTRA]);
287 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
288 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
289 13 LOCAL_ALIGNED_32(int16_t, ref0, [BUF_SIZE]);
290 13 LOCAL_ALIGNED_32(int16_t, ref1, [BUF_SIZE]);
291
292 HEVCDSPContext h;
293 int size, bit_depth, i, j;
294 const int *denom, *wx, *ox;
295 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
296 const int16_t *src2,
297 int height, int denom, int wx0, int wx1,
298 int ox0, int ox1, intptr_t mx, intptr_t my, int width);
299
300
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
301 65 ff_hevc_dsp_init(&h, bit_depth);
302
303
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
304
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
305
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
306 const char *type;
307
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
308 585 case 0: type = "pel_bi_w_pixels"; break; // 0 0
309 585 case 1: type = "qpel_bi_w_h"; break; // 0 1
310 585 case 2: type = "qpel_bi_w_v"; break; // 1 0
311 585 case 3: type = "qpel_bi_w_hv"; break; // 1 1
312 }
313
314
2/2
✓ Branch 3 taken 276 times.
✓ Branch 4 taken 2064 times.
2340 if (check_func(h.put_hevc_qpel_bi_w[size][j][i],
315 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
316
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 276 times.
1104 for (denom = denoms; *denom >= 0; denom++) {
317
2/2
✓ Branch 0 taken 2484 times.
✓ Branch 1 taken 828 times.
3312 for (wx = weights; *wx >= 0; wx++) {
318
2/2
✓ Branch 0 taken 4968 times.
✓ Branch 1 taken 2484 times.
7452 for (ox = offsets; *ox >= 0; ox++) {
319
6/6
✓ Branch 1 taken 9936 times.
✓ Branch 2 taken 11446272 times.
✓ Branch 4 taken 11456208 times.
✓ Branch 5 taken 4968 times.
✓ Branch 7 taken 22892544 times.
✓ Branch 8 taken 4968 times.
34353720 randomize_buffers_ref();
320 4968 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
321 src0, sizes[size] * SIZEOF_PIXEL,
322 ref0, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
323 4968 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
324 src1, sizes[size] * SIZEOF_PIXEL,
325 ref1, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
326
2/2
✓ Branch 0 taken 3744 times.
✓ Branch 1 taken 1224 times.
4968 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
327 dst1, sizes[size] * SIZEOF_PIXEL,
328 size[sizes], size[sizes], "dst");
329
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4968 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
4968 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
330 src1, sizes[size] * SIZEOF_PIXEL,
331 ref1, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
332 }
333 }
334 }
335 }
336 }
337 }
338 }
339 }
340 13 report("qpel_bi_w");
341 13 }
342
343 #undef SRC_EXTRA
344 #define SRC_EXTRA 0
345
346 13 static void checkasm_check_hevc_epel(void)
347 {
348 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]);
349 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]);
350 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
351 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
352
353 HEVCDSPContext h;
354 int size, bit_depth, i, j;
355 13 declare_func(void, int16_t *dst, const uint8_t *src, ptrdiff_t srcstride,
356 int height, intptr_t mx, intptr_t my, int width);
357
358
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
359 65 ff_hevc_dsp_init(&h, bit_depth);
360
361
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
362
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
363
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
364 const char *type;
365
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
366 585 case 0: type = "pel_pixels"; break; // 0 0
367 585 case 1: type = "epel_h"; break; // 0 1
368 585 case 2: type = "epel_v"; break; // 1 0
369 585 case 3: type = "epel_hv"; break; // 1 1
370 }
371
372
2/2
✓ Branch 3 taken 243 times.
✓ Branch 4 taken 2097 times.
2340 if (check_func(h.put_hevc_epel[size][j][i],
373 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
374 243 int16_t *dstw0 = (int16_t *) dst0, *dstw1 = (int16_t *) dst1;
375
3/4
✗ Branch 1 not taken.
✓ Branch 2 taken 559872 times.
✓ Branch 4 taken 559872 times.
✓ Branch 5 taken 243 times.
560115 randomize_buffers();
376 243 call_ref(dstw0, src0, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
377 243 call_new(dstw1, src1, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
378 243 checkasm_check(int16_t, dstw0, MAX_PB_SIZE * sizeof(int16_t),
379 dstw1, MAX_PB_SIZE * sizeof(int16_t),
380 size[sizes], size[sizes], "dst");
381
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 243 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
243 bench_new(dstw1, src1, sizes[size] * SIZEOF_PIXEL, sizes[size], i, j, sizes[size]);
382 }
383 }
384 }
385 }
386 }
387 13 report("epel");
388 13 }
389
390 13 static void checkasm_check_hevc_epel_uni(void)
391 {
392 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]);
393 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]);
394 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
395 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
396
397 HEVCDSPContext h;
398 int size, bit_depth, i, j;
399 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
400 int height, intptr_t mx, intptr_t my, int width);
401
402
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
403 65 ff_hevc_dsp_init(&h, bit_depth);
404
405
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
406
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
407
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
408 const char *type;
409
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
410 585 case 0: type = "pel_uni_pixels"; break; // 0 0
411 585 case 1: type = "epel_uni_h"; break; // 0 1
412 585 case 2: type = "epel_uni_v"; break; // 1 0
413 585 case 3: type = "epel_uni_hv"; break; // 1 1
414 }
415
416
2/2
✓ Branch 3 taken 243 times.
✓ Branch 4 taken 2097 times.
2340 if (check_func(h.put_hevc_epel_uni[size][j][i],
417 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
418
3/4
✗ Branch 1 not taken.
✓ Branch 2 taken 559872 times.
✓ Branch 4 taken 559872 times.
✓ Branch 5 taken 243 times.
560115 randomize_buffers();
419 243 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
420 src0, sizes[size] * SIZEOF_PIXEL,
421 sizes[size], i, j, sizes[size]);
422 243 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
423 src1, sizes[size] * SIZEOF_PIXEL,
424 sizes[size], i, j, sizes[size]);
425
2/2
✓ Branch 0 taken 179 times.
✓ Branch 1 taken 64 times.
243 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
426 dst1, sizes[size] * SIZEOF_PIXEL,
427 size[sizes], size[sizes], "dst");
428
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 243 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
243 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
429 src1, sizes[size] * SIZEOF_PIXEL,
430 sizes[size], i, j, sizes[size]);
431 }
432 }
433 }
434 }
435 }
436 13 report("epel_uni");
437 13 }
438
439 13 static void checkasm_check_hevc_epel_uni_w(void)
440 {
441 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]);
442 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]);
443 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
444 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
445
446 HEVCDSPContext h;
447 int size, bit_depth, i, j;
448 const int *denom, *wx, *ox;
449 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
450 int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width);
451
452
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
453 65 ff_hevc_dsp_init(&h, bit_depth);
454
455
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
456
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
457
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
458 const char *type;
459
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
460 585 case 0: type = "pel_uni_w_pixels"; break; // 0 0
461 585 case 1: type = "epel_uni_w_h"; break; // 0 1
462 585 case 2: type = "epel_uni_w_v"; break; // 1 0
463 585 case 3: type = "epel_uni_w_hv"; break; // 1 1
464 }
465
466
2/2
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 2121 times.
2340 if (check_func(h.put_hevc_epel_uni_w[size][j][i],
467 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
468
2/2
✓ Branch 0 taken 657 times.
✓ Branch 1 taken 219 times.
876 for (denom = denoms; *denom >= 0; denom++) {
469
2/2
✓ Branch 0 taken 1971 times.
✓ Branch 1 taken 657 times.
2628 for (wx = weights; *wx >= 0; wx++) {
470
2/2
✓ Branch 0 taken 3942 times.
✓ Branch 1 taken 1971 times.
5913 for (ox = offsets; *ox >= 0; ox++) {
471
3/4
✗ Branch 1 not taken.
✓ Branch 2 taken 9082368 times.
✓ Branch 4 taken 9082368 times.
✓ Branch 5 taken 3942 times.
9086310 randomize_buffers();
472 3942 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
473 src0, sizes[size] * SIZEOF_PIXEL,
474 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
475 3942 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
476 src1, sizes[size] * SIZEOF_PIXEL,
477 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
478
2/2
✓ Branch 0 taken 2952 times.
✓ Branch 1 taken 990 times.
3942 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
479 dst1, sizes[size] * SIZEOF_PIXEL,
480 size[sizes], size[sizes], "dst");
481
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3942 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
3942 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
482 src1, sizes[size] * SIZEOF_PIXEL,
483 sizes[size], *denom, *wx, *ox, i, j, sizes[size]);
484 }
485 }
486 }
487 }
488 }
489 }
490 }
491 }
492 13 report("epel_uni_w");
493 13 }
494
495 13 static void checkasm_check_hevc_epel_bi(void)
496 {
497 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]);
498 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]);
499 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
500 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
501 13 LOCAL_ALIGNED_32(int16_t, ref0, [BUF_SIZE]);
502 13 LOCAL_ALIGNED_32(int16_t, ref1, [BUF_SIZE]);
503
504 HEVCDSPContext h;
505 int size, bit_depth, i, j;
506 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
507 const int16_t *src2,
508 int height, intptr_t mx, intptr_t my, int width);
509
510
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
511 65 ff_hevc_dsp_init(&h, bit_depth);
512
513
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
514
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
515
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
516 const char *type;
517
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
518 585 case 0: type = "pel_bi_pixels"; break; // 0 0
519 585 case 1: type = "epel_bi_h"; break; // 0 1
520 585 case 2: type = "epel_bi_v"; break; // 1 0
521 585 case 3: type = "epel_bi_hv"; break; // 1 1
522 }
523
524
2/2
✓ Branch 3 taken 243 times.
✓ Branch 4 taken 2097 times.
2340 if (check_func(h.put_hevc_epel_bi[size][j][i],
525 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
526
5/6
✗ Branch 1 not taken.
✓ Branch 2 taken 559872 times.
✓ Branch 4 taken 559872 times.
✓ Branch 5 taken 243 times.
✓ Branch 7 taken 1119744 times.
✓ Branch 8 taken 243 times.
1679859 randomize_buffers_ref();
527 243 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
528 src0, sizes[size] * SIZEOF_PIXEL,
529 ref0, sizes[size], i, j, sizes[size]);
530 243 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
531 src1, sizes[size] * SIZEOF_PIXEL,
532 ref1, sizes[size], i, j, sizes[size]);
533
2/2
✓ Branch 0 taken 179 times.
✓ Branch 1 taken 64 times.
243 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
534 dst1, sizes[size] * SIZEOF_PIXEL,
535 size[sizes], size[sizes], "dst");
536
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 243 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
243 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
537 src1, sizes[size] * SIZEOF_PIXEL,
538 ref1, sizes[size], i, j, sizes[size]);
539 }
540 }
541 }
542 }
543 }
544 13 report("epel_bi");
545 13 }
546
547 13 static void checkasm_check_hevc_epel_bi_w(void)
548 {
549 13 LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]);
550 13 LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]);
551 13 LOCAL_ALIGNED_32(uint8_t, dst0, [BUF_SIZE]);
552 13 LOCAL_ALIGNED_32(uint8_t, dst1, [BUF_SIZE]);
553 13 LOCAL_ALIGNED_32(int16_t, ref0, [BUF_SIZE]);
554 13 LOCAL_ALIGNED_32(int16_t, ref1, [BUF_SIZE]);
555
556 HEVCDSPContext h;
557 int size, bit_depth, i, j;
558 const int *denom, *wx, *ox;
559 13 declare_func(void, uint8_t *dst, ptrdiff_t dststride, const uint8_t *src, ptrdiff_t srcstride,
560 const int16_t *src2,
561 int height, int denom, int wx0, int wx1,
562 int ox0, int ox1, intptr_t mx, intptr_t my, int width);
563
564
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 for (bit_depth = 8; bit_depth <= 12; bit_depth++) {
565 65 ff_hevc_dsp_init(&h, bit_depth);
566
567
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 65 times.
195 for (i = 0; i < 2; i++) {
568
2/2
✓ Branch 0 taken 260 times.
✓ Branch 1 taken 130 times.
390 for (j = 0; j < 2; j++) {
569
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 260 times.
2600 for (size = 1; size < 10; size++) {
570 const char *type;
571
4/5
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 585 times.
✓ Branch 2 taken 585 times.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
2340 switch ((j << 1) | i) {
572 585 case 0: type = "pel_bi_w_pixels"; break; // 0 0
573 585 case 1: type = "epel_bi_w_h"; break; // 0 1
574 585 case 2: type = "epel_bi_w_v"; break; // 1 0
575 585 case 3: type = "epel_bi_w_hv"; break; // 1 1
576 }
577
578
2/2
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 2121 times.
2340 if (check_func(h.put_hevc_epel_bi_w[size][j][i],
579 "put_hevc_%s%d_%d", type, sizes[size], bit_depth)) {
580
2/2
✓ Branch 0 taken 657 times.
✓ Branch 1 taken 219 times.
876 for (denom = denoms; *denom >= 0; denom++) {
581
2/2
✓ Branch 0 taken 1971 times.
✓ Branch 1 taken 657 times.
2628 for (wx = weights; *wx >= 0; wx++) {
582
2/2
✓ Branch 0 taken 3942 times.
✓ Branch 1 taken 1971 times.
5913 for (ox = offsets; *ox >= 0; ox++) {
583
5/6
✗ Branch 1 not taken.
✓ Branch 2 taken 9082368 times.
✓ Branch 4 taken 9082368 times.
✓ Branch 5 taken 3942 times.
✓ Branch 7 taken 18164736 times.
✓ Branch 8 taken 3942 times.
27251046 randomize_buffers_ref();
584 3942 call_ref(dst0, sizes[size] * SIZEOF_PIXEL,
585 src0, sizes[size] * SIZEOF_PIXEL,
586 ref0, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
587 3942 call_new(dst1, sizes[size] * SIZEOF_PIXEL,
588 src1, sizes[size] * SIZEOF_PIXEL,
589 ref1, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
590
2/2
✓ Branch 0 taken 2952 times.
✓ Branch 1 taken 990 times.
3942 checkasm_check_pixel(dst0, sizes[size] * SIZEOF_PIXEL,
591 dst1, sizes[size] * SIZEOF_PIXEL,
592 size[sizes], size[sizes], "dst");
593
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 3942 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
3942 bench_new(dst1, sizes[size] * SIZEOF_PIXEL,
594 src1, sizes[size] * SIZEOF_PIXEL,
595 ref1, sizes[size], *denom, *wx, *wx, *ox, *ox, i, j, sizes[size]);
596 }
597 }
598 }
599 }
600 }
601 }
602 }
603 }
604 13 report("epel_bi_w");
605 13 }
606
607 13 void checkasm_check_hevc_pel(void)
608 {
609 13 checkasm_check_hevc_qpel();
610 13 checkasm_check_hevc_qpel_uni();
611 13 checkasm_check_hevc_qpel_uni_w();
612 13 checkasm_check_hevc_qpel_bi();
613 13 checkasm_check_hevc_qpel_bi_w();
614 13 checkasm_check_hevc_epel();
615 13 checkasm_check_hevc_epel_uni();
616 13 checkasm_check_hevc_epel_uni_w();
617 13 checkasm_check_hevc_epel_bi();
618 13 checkasm_check_hevc_epel_bi_w();
619 13 }
620