| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * This file is part of FFmpeg. | ||
| 3 | * | ||
| 4 | * FFmpeg is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with FFmpeg; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <string.h> | ||
| 20 | #include "checkasm.h" | ||
| 21 | #include "libavcodec/vvc/dsp.h" | ||
| 22 | #include "libavcodec/vvc/intra.h" | ||
| 23 | #include "libavutil/intreadwrite.h" | ||
| 24 | #include "libavutil/mem_internal.h" | ||
| 25 | |||
| 26 | static const uint32_t pixel_mask[3] = { 0xffffffff, 0x03ff03ff, 0x0fff0fff }; | ||
| 27 | static const int mip_modes[] = {16, 8, 6}; | ||
| 28 | |||
| 29 | #define SIZEOF_PIXEL ((bit_depth + 7) / 8) | ||
| 30 | #define PIXEL_STRIDE (MAX_TB_SIZE * 2) // 2 * max transform size | ||
| 31 | #define BUF_SIZE (2 * PIXEL_STRIDE * 64) // Enough for 64x64 with stride=128 | ||
| 32 | // IntraEdgeParams arrays are uint16_t, rounded up as they are filled 4 bytes at a time | ||
| 33 | #define REF_BYTES FFALIGN(2 * (6 * MAX_TB_SIZE + 5), 4) | ||
| 34 | #define REF_OFFSET (MAX_TB_SIZE + 3) // Same as offset from prepare_intra_edge_params | ||
| 35 | |||
| 36 | #define randomize_buffers() \ | ||
| 37 | do { \ | ||
| 38 | uint32_t mask = pixel_mask[(bit_depth - 8) >> 1]; \ | ||
| 39 | for (int i = 0; i < BUF_SIZE; i += 4) { \ | ||
| 40 | uint32_t r = rnd() & mask; \ | ||
| 41 | AV_WN32A(buf0 + i, r); \ | ||
| 42 | AV_WN32A(buf1 + i, r); \ | ||
| 43 | } \ | ||
| 44 | /* Make sure reference buffer writes don't go out of bounds */ \ | ||
| 45 | for (int i = -(REF_OFFSET * SIZEOF_PIXEL); \ | ||
| 46 | i < REF_BYTES - REF_OFFSET * SIZEOF_PIXEL; i += 4) { \ | ||
| 47 | AV_WN32A(top + i, rnd() & mask); \ | ||
| 48 | AV_WN32A(left + i, rnd() & mask); \ | ||
| 49 | } \ | ||
| 50 | } while (0) | ||
| 51 | |||
| 52 | // From prepare_intra_edge_params in avcodec/vvc/intra_template.c | ||
| 53 | 14175 | static int derive_filter_flag(const int mode, const int ref_idx, const int w, const int h) | |
| 54 | { | ||
| 55 |
4/4✓ Branch 1 taken 13500 times.
✓ Branch 2 taken 675 times.
✓ Branch 3 taken 9000 times.
✓ Branch 4 taken 4500 times.
|
14175 | if (ff_vvc_ref_filter_flag_derive(mode) || ref_idx) |
| 56 | 9675 | return 0; | |
| 57 | 4500 | const int min_dist_ver_hor = FFMIN(abs(mode - 50), abs(mode - 18)); | |
| 58 | 4500 | const int intra_hor_ver_dist_thres[] = {24, 14, 2, 0, 0}; | |
| 59 | 4500 | const int ntbs = (av_log2(w) + av_log2(h)) >> 1; | |
| 60 | 4500 | return min_dist_ver_hor > intra_hor_ver_dist_thres[ntbs - 2]; | |
| 61 | } | ||
| 62 | |||
| 63 | 42 | static void check_pred_dc(VVCDSPContext *c, | |
| 64 | uint8_t *buf0, uint8_t *buf1, | ||
| 65 | uint8_t *top, uint8_t *left, int bit_depth) | ||
| 66 | { | ||
| 67 | 42 | declare_func(void, uint8_t *src, const uint8_t *top, | |
| 68 | const uint8_t *left, const int w, const int h, const ptrdiff_t stride); | ||
| 69 | |||
| 70 | /* Test all sizes 4x4 up to 64x64, including non-square */ | ||
| 71 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 42 times.
|
252 | for (int log2_w = 2; log2_w <= 6; log2_w++) { |
| 72 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 210 times.
|
1260 | for (int log2_h = 2; log2_h <= 6; log2_h++) { |
| 73 | 1050 | int w = 1 << log2_w; | |
| 74 | 1050 | int h = 1 << log2_h; | |
| 75 | 1050 | ptrdiff_t stride = FFALIGN((w + rnd() % 64), 32); | |
| 76 | |||
| 77 |
2/2✓ Branch 1 taken 75 times.
✓ Branch 2 taken 975 times.
|
1050 | if (check_func(c->intra.pred_dc, "vvc_pred_dc_%dx%d_%d", |
| 78 | w, h, bit_depth)) { | ||
| 79 |
4/4✓ Branch 1 taken 307200 times.
✓ Branch 2 taken 75 times.
✓ Branch 5 taken 14625 times.
✓ Branch 6 taken 75 times.
|
321900 | randomize_buffers(); |
| 80 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 75 times.
|
75 | call_ref(buf0, top, left, w, h, stride); |
| 81 | 75 | call_new(buf1, top, left, w, h, stride); | |
| 82 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 75 times.
|
75 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 83 | ✗ | fail(); | |
| 84 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 60 times.
|
75 | if (w == h) |
| 85 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
15 | bench_new(buf1, top, left, w, h, stride); |
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | 42 | report("pred_dc"); | |
| 91 | 42 | } | |
| 92 | |||
| 93 | 42 | static void check_pred_planar(VVCDSPContext *c, | |
| 94 | uint8_t *buf0, uint8_t *buf1, | ||
| 95 | uint8_t *top, uint8_t *left, int bit_depth) | ||
| 96 | { | ||
| 97 | 42 | declare_func(void, uint8_t *src, const uint8_t *top, | |
| 98 | const uint8_t *left, const int w, const int h, const ptrdiff_t stride); | ||
| 99 | |||
| 100 | /* Test all sizes 4x1 up to 64x64, including non-square. Heights of 1 and 2 | ||
| 101 | * come from ISP splits and from chroma. */ | ||
| 102 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 42 times.
|
252 | for (int log2_w = 2; log2_w <= 6; log2_w++) { |
| 103 |
2/2✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 210 times.
|
1680 | for (int log2_h = 0; log2_h <= 6; log2_h++) { |
| 104 | 1470 | int w = 1 << log2_w; | |
| 105 | 1470 | int h = 1 << log2_h; | |
| 106 | 1470 | ptrdiff_t stride = FFALIGN((w + rnd() % 64), 32); | |
| 107 | |||
| 108 |
2/2✓ Branch 1 taken 140 times.
✓ Branch 2 taken 1330 times.
|
1470 | if (check_func(c->intra.pred_planar, "vvc_pred_planar_%dx%d_%d", |
| 109 | w, h, bit_depth)) { | ||
| 110 |
4/4✓ Branch 1 taken 573440 times.
✓ Branch 2 taken 140 times.
✓ Branch 5 taken 27300 times.
✓ Branch 6 taken 140 times.
|
600880 | randomize_buffers(); |
| 111 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 140 times.
|
140 | call_ref(buf0, top, left, w, h, stride); |
| 112 | 140 | call_new(buf1, top, left, w, h, stride); | |
| 113 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 140 times.
|
140 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 114 | ✗ | fail(); | |
| 115 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 120 times.
|
140 | if (w == h) |
| 116 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
20 | bench_new(buf1, top, left, w, h, stride); |
| 117 | } | ||
| 118 | } | ||
| 119 | } | ||
| 120 | |||
| 121 | 42 | report("pred_planar"); | |
| 122 | 42 | } | |
| 123 | |||
| 124 | 42 | static void check_pred_vh(VVCDSPContext *c, | |
| 125 | uint8_t *buf0, uint8_t *buf1, | ||
| 126 | uint8_t *top, uint8_t *left, int bit_depth) | ||
| 127 | { | ||
| 128 | 42 | declare_func(void, uint8_t *src, const uint8_t *ref, | |
| 129 | const int w, const int h, const ptrdiff_t stride); | ||
| 130 | |||
| 131 | /* Test all sizes 4x4 up to 64x64, including non-square */ | ||
| 132 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 42 times.
|
252 | for (int log2_w = 2; log2_w <= 6; log2_w++) { |
| 133 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 210 times.
|
1260 | for (int log2_h = 2; log2_h <= 6; log2_h++) { |
| 134 | 1050 | int w = 1 << log2_w; | |
| 135 | 1050 | int h = 1 << log2_h; | |
| 136 | 1050 | ptrdiff_t stride = FFALIGN((w + rnd() % 64), 32); | |
| 137 | |||
| 138 |
2/2✓ Branch 1 taken 75 times.
✓ Branch 2 taken 975 times.
|
1050 | if (check_func(c->intra.pred_v, "vvc_pred_v_%dx%d_%d", |
| 139 | w, h, bit_depth)) { | ||
| 140 |
4/4✓ Branch 1 taken 307200 times.
✓ Branch 2 taken 75 times.
✓ Branch 5 taken 14625 times.
✓ Branch 6 taken 75 times.
|
321900 | randomize_buffers(); |
| 141 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 75 times.
|
75 | call_ref(buf0, top, w, h, stride); |
| 142 | 75 | call_new(buf1, top, w, h, stride); | |
| 143 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 75 times.
|
75 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 144 | ✗ | fail(); | |
| 145 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 60 times.
|
75 | if (w == h) |
| 146 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
15 | bench_new(buf1, top, w, h, stride); |
| 147 | } | ||
| 148 | |||
| 149 |
2/2✓ Branch 1 taken 75 times.
✓ Branch 2 taken 975 times.
|
1050 | if (check_func(c->intra.pred_h, "vvc_pred_h_%dx%d_%d", |
| 150 | w, h, bit_depth)) { | ||
| 151 |
4/4✓ Branch 1 taken 307200 times.
✓ Branch 2 taken 75 times.
✓ Branch 5 taken 14625 times.
✓ Branch 6 taken 75 times.
|
321900 | randomize_buffers(); |
| 152 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 75 times.
|
75 | call_ref(buf0, left, w, h, stride); |
| 153 | 75 | call_new(buf1, left, w, h, stride); | |
| 154 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 75 times.
|
75 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 155 | ✗ | fail(); | |
| 156 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 60 times.
|
75 | if (w == h) |
| 157 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
15 | bench_new(buf1, left, w, h, stride); |
| 158 | } | ||
| 159 | } | ||
| 160 | } | ||
| 161 | |||
| 162 | 42 | report("pred_vh"); | |
| 163 | 42 | } | |
| 164 | |||
| 165 | 42 | static void check_pred_mip(VVCDSPContext *c, | |
| 166 | uint8_t *buf0, uint8_t *buf1, | ||
| 167 | uint8_t *top, uint8_t *left, int bit_depth) | ||
| 168 | { | ||
| 169 | 42 | declare_func(void, uint8_t *src, const uint8_t *top, | |
| 170 | const uint8_t *left, const int w, const int h, | ||
| 171 | const ptrdiff_t stride, int mode_id, int is_transposed); | ||
| 172 | |||
| 173 | /* Test all sizes 4x4 up to 64x64, including non-square */ | ||
| 174 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 42 times.
|
252 | for (int log2_w = 2; log2_w <= 6; log2_w++) { |
| 175 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 210 times.
|
1260 | for (int log2_h = 2; log2_h <= 6; log2_h++) { |
| 176 | 1050 | int w = 1 << log2_w; | |
| 177 | 1050 | int h = 1 << log2_h; | |
| 178 | 1050 | ptrdiff_t stride = FFALIGN((w + rnd() % 64), 32); | |
| 179 | 1050 | int size_id = ff_vvc_get_mip_size_id(w, h); | |
| 180 | |||
| 181 |
2/2✓ Branch 0 taken 7476 times.
✓ Branch 1 taken 1050 times.
|
8526 | for (int mode_id = 0; mode_id < mip_modes[size_id]; mode_id++) { |
| 182 |
2/2✓ Branch 1 taken 534 times.
✓ Branch 2 taken 6942 times.
|
7476 | if (check_func(c->intra.pred_mip, "vvc_pred_mip_%dx%d_mode%d_%d", |
| 183 | w, h, mode_id, bit_depth)) { | ||
| 184 |
4/4✓ Branch 1 taken 2187264 times.
✓ Branch 2 taken 534 times.
✓ Branch 5 taken 104130 times.
✓ Branch 6 taken 534 times.
|
2291928 | randomize_buffers(); |
| 185 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 534 times.
|
534 | call_ref(buf0, top, left, w, h, stride, mode_id, 0); |
| 186 | 534 | call_new(buf1, top, left, w, h, stride, mode_id, 0); | |
| 187 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 534 times.
|
534 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 188 | ✗ | fail(); | |
| 189 | |||
| 190 | /* Test transposed */ | ||
| 191 |
4/4✓ Branch 1 taken 2187264 times.
✓ Branch 2 taken 534 times.
✓ Branch 5 taken 104130 times.
✓ Branch 6 taken 534 times.
|
2291928 | randomize_buffers(); |
| 192 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 534 times.
|
534 | call_ref(buf0, top, left, w, h, stride, mode_id, 1); |
| 193 | 534 | call_new(buf1, top, left, w, h, stride, mode_id, 1); | |
| 194 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 534 times.
|
534 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 195 | ✗ | fail(); | |
| 196 | |||
| 197 |
2/2✓ Branch 0 taken 126 times.
✓ Branch 1 taken 408 times.
|
534 | if (w == h) |
| 198 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 126 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
126 | bench_new(buf1, top, left, w, h, stride, mode_id, 0); |
| 199 | } | ||
| 200 | } | ||
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | 42 | report("pred_mip"); | |
| 205 | 42 | } | |
| 206 | |||
| 207 | 42 | static void check_pred_angular(VVCDSPContext *c, | |
| 208 | uint8_t *buf0, uint8_t *buf1, | ||
| 209 | uint8_t *top, uint8_t *left, int bit_depth) | ||
| 210 | { | ||
| 211 | // Set modes to bench | ||
| 212 | static const int bench_modes[] = { 2, 10, 26, INTRA_DIAG, 42, 58, INTRA_VDIAG }; | ||
| 213 | |||
| 214 | 42 | declare_func(void, uint8_t *src, const uint8_t *top, const uint8_t *left, | |
| 215 | const int w, const int h, const ptrdiff_t stride, const int c_idx, | ||
| 216 | const int mode, const int ref_idx, const int filter_flag, | ||
| 217 | const int need_pdpc); | ||
| 218 | |||
| 219 | /* Test all sizes 4x4 up to 64x64, including non-square */ | ||
| 220 |
2/2✓ Branch 0 taken 210 times.
✓ Branch 1 taken 42 times.
|
252 | for (int log2_w = 2; log2_w <= 6; log2_w++) { |
| 221 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 210 times.
|
1260 | for (int log2_h = 2; log2_h <= 6; log2_h++) { |
| 222 | 1050 | int w = 1 << log2_w; | |
| 223 | 1050 | int h = 1 << log2_h; | |
| 224 | 1050 | ptrdiff_t stride = FFALIGN((w + rnd() % 64), 32); | |
| 225 | |||
| 226 |
2/2✓ Branch 0 taken 68250 times.
✓ Branch 1 taken 1050 times.
|
69300 | for (int mode = 2; mode <= INTRA_VDIAG; mode++) { |
| 227 | // Skip vertical and horizontal (pred_v, pred_h) | ||
| 228 |
4/4✓ Branch 0 taken 67200 times.
✓ Branch 1 taken 1050 times.
✓ Branch 2 taken 1050 times.
✓ Branch 3 taken 66150 times.
|
68250 | if (mode == INTRA_VERT || mode == INTRA_HORZ) |
| 229 | 2100 | continue; | |
| 230 | |||
| 231 | 66150 | int dir = mode >= INTRA_DIAG; | |
| 232 | const char *mode_category; | ||
| 233 | |||
| 234 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 65100 times.
|
66150 | if (mode == 2) |
| 235 | 1050 | mode_category = "Hdiag"; | |
| 236 |
3/4✓ Branch 0 taken 65100 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15750 times.
✓ Branch 3 taken 49350 times.
|
65100 | else if (mode > 2 && mode < INTRA_HORZ) |
| 237 | 15750 | mode_category = "Hpos"; | |
| 238 |
3/4✓ Branch 0 taken 49350 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15750 times.
✓ Branch 3 taken 33600 times.
|
49350 | else if (mode > INTRA_HORZ && mode < INTRA_DIAG) |
| 239 | 15750 | mode_category = "Hneg"; | |
| 240 |
2/2✓ Branch 0 taken 1050 times.
✓ Branch 1 taken 32550 times.
|
33600 | else if (mode == INTRA_DIAG) |
| 241 | 1050 | mode_category = "Diag"; | |
| 242 |
3/4✓ Branch 0 taken 32550 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15750 times.
✓ Branch 3 taken 16800 times.
|
32550 | else if (mode > INTRA_DIAG && mode < INTRA_VERT) |
| 243 | 15750 | mode_category = "Vneg"; | |
| 244 |
3/4✓ Branch 0 taken 16800 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15750 times.
✓ Branch 3 taken 1050 times.
|
16800 | else if (mode > INTRA_VERT && mode < INTRA_VDIAG) |
| 245 | 15750 | mode_category = "Vpos"; | |
| 246 | else | ||
| 247 | 1050 | mode_category = "Vdiag"; | |
| 248 | |||
| 249 |
2/2✓ Branch 0 taken 198450 times.
✓ Branch 1 taken 66150 times.
|
264600 | for (int ref_idx = 0; ref_idx <= 2; ref_idx++) { |
| 250 |
6/6✓ Branch 0 taken 100800 times.
✓ Branch 1 taken 97650 times.
✓ Branch 2 taken 100800 times.
✓ Branch 3 taken 97650 times.
✓ Branch 5 taken 14175 times.
✓ Branch 6 taken 184275 times.
|
198450 | if (check_func(dir ? c->intra.pred_angular_v : c->intra.pred_angular_h, "vvc_pred_angular_%c_%dx%d_%s_mode%d_ref%d_%d", |
| 251 | dir ? 'v' : 'h', w, h, mode_category, mode, ref_idx, bit_depth)) { | ||
| 252 | 14175 | int filter_flag = derive_filter_flag(mode, ref_idx, w, h); | |
| 253 | 14175 | int need_pdpc = ff_vvc_need_pdpc(w, h, 0, mode, ref_idx); | |
| 254 | |||
| 255 |
4/4✓ Branch 1 taken 58060800 times.
✓ Branch 2 taken 14175 times.
✓ Branch 5 taken 2764125 times.
✓ Branch 6 taken 14175 times.
|
60839100 | randomize_buffers(); |
| 256 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 14175 times.
|
14175 | call_ref(buf0, top, left, w, h, stride, 0, mode, ref_idx, filter_flag, need_pdpc); |
| 257 | 14175 | call_new(buf1, top, left, w, h, stride, 0, mode, ref_idx, filter_flag, need_pdpc); | |
| 258 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14175 times.
|
14175 | if (memcmp(buf0, buf1, BUF_SIZE)) |
| 259 | ✗ | fail(); | |
| 260 |
2/2✓ Branch 0 taken 99225 times.
✓ Branch 1 taken 14175 times.
|
113400 | for (int i = 0; i < FF_ARRAY_ELEMS(bench_modes); i++) { |
| 261 |
6/6✓ Branch 0 taken 1575 times.
✓ Branch 1 taken 97650 times.
✓ Branch 2 taken 315 times.
✓ Branch 3 taken 1260 times.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 210 times.
|
99225 | if (mode == bench_modes[i] && w == h && ref_idx == 0) |
| 262 |
1/18✗ Branch 1 not taken.
✓ Branch 2 taken 105 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
|
105 | bench_new(buf1, top, left, w, h, stride, 0, mode, ref_idx, filter_flag, need_pdpc); |
| 263 | } | ||
| 264 | } | ||
| 265 | } | ||
| 266 | // TODO: Add c_idx=1 (chroma) | ||
| 267 | } | ||
| 268 | } | ||
| 269 | } | ||
| 270 | |||
| 271 | 42 | report("pred_angular"); | |
| 272 | 42 | } | |
| 273 | |||
| 274 | 14 | void checkasm_check_vvc_pred(void) | |
| 275 | { | ||
| 276 | 14 | LOCAL_ALIGNED_32(uint8_t, buf0, [BUF_SIZE]); | |
| 277 | 14 | LOCAL_ALIGNED_32(uint8_t, buf1, [BUF_SIZE]); | |
| 278 | 14 | LOCAL_ALIGNED_32(uint8_t, top_buf, [REF_BYTES + 16]); | |
| 279 | 14 | LOCAL_ALIGNED_32(uint8_t, left_buf, [REF_BYTES + 16]); | |
| 280 | |||
| 281 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 14 times.
|
56 | for (int bit_depth = 8; bit_depth <= 12; bit_depth += 2) { |
| 282 | VVCDSPContext c; | ||
| 283 | |||
| 284 | 42 | uint8_t *top = top_buf + REF_OFFSET * SIZEOF_PIXEL; | |
| 285 | 42 | uint8_t *left = left_buf + REF_OFFSET * SIZEOF_PIXEL; | |
| 286 | |||
| 287 | 42 | ff_vvc_dsp_init(&c, bit_depth); | |
| 288 | 42 | check_pred_dc(&c, buf0, buf1, top, left, bit_depth); | |
| 289 | 42 | check_pred_planar(&c, buf0, buf1, top, left, bit_depth); | |
| 290 | 42 | check_pred_vh(&c, buf0, buf1, top, left, bit_depth); | |
| 291 | 42 | check_pred_mip(&c, buf0, buf1, top, left, bit_depth); | |
| 292 | 42 | check_pred_angular(&c, buf0, buf1, top, left, bit_depth); | |
| 293 | } | ||
| 294 | 14 | } | |
| 295 |