Coverage Report

Created: 2026-05-16 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibGfx/ImageFormats/WebPLoaderLossyTables.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2023, Nico Weber <thakis@chromium.org>
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#pragma once
8
9
// Contains fixed data tables from the VP8 spec.
10
11
namespace Gfx {
12
13
using Prob = u8;
14
using TreeIndex = i8;
15
16
// https://datatracker.ietf.org/doc/html/rfc6386#section-10 "Segment-Based Feature Adjustments"
17
TreeIndex const MACROBLOCK_SEGMENT_TREE[2 * (4 - 1)] = {
18
    2, 4,   /* root: "0", "1" subtrees */
19
    -0, -1, /* "00" = 0th value, "01" = 1st value */
20
    -2, -3  /* "10" = 2nd value, "11" = 3rd value */
21
};
22
23
// https://datatracker.ietf.org/doc/html/rfc6386#section-8.2 "Tree Coding Example"
24
// Repeated in https://datatracker.ietf.org/doc/html/rfc6386#section-11.2 "Luma Modes"
25
enum IntraMacroblockMode : u8 {
26
    DC_PRED,               /* predict DC using row above and column to the left */
27
    V_PRED,                /* predict rows using row above */
28
    H_PRED,                /* predict columns using column to the left */
29
    TM_PRED,               /* propagate second differences a la "True Motion" */
30
    B_PRED,                /* each Y subblock is independently predicted */
31
    num_uv_modes = B_PRED, /* first four modes apply to chroma */
32
    num_ymodes             /* all modes apply to luma */
33
};
34
35
// https://datatracker.ietf.org/doc/html/rfc6386#section-19.3 says "intra_y_mode selects the luminance intra-prediction mode (Section 16.1)",
36
// but for keyframes the correct reference is actually https://datatracker.ietf.org/doc/html/rfc6386#section-11.2 "Luma Modes".
37
// That is, we want "kf_ymode_tree", not "ymode_tree", and "kf_ymode_prob", not "ymode_prob".
38
// See "decode_kf_mb_mode" in the reference decoder in the spec.
39
static TreeIndex constexpr KEYFRAME_YMODE_TREE[2 * (num_ymodes - 1)] = {
40
    -B_PRED, 2,        /* root: B_PRED = "0", "1" subtree */
41
    4, 6,              /* "1" subtree has 2 descendant subtrees */
42
    -DC_PRED, -V_PRED, /* "10" subtree: DC_PRED = "100", V_PRED = "101" */
43
    -H_PRED, -TM_PRED  /* "11" subtree: H_PRED = "110", TM_PRED = "111" */
44
};
45
static Prob constexpr KEYFRAME_YMODE_PROBABILITIES[num_ymodes - 1] = { 145, 156, 163, 128 };
46
47
// https://datatracker.ietf.org/doc/html/rfc6386#section-11.2 "Luma Modes"
48
enum IntraBlockMode : u8 {
49
    B_DC_PRED, /* predict DC using row above and column
50
                  to the left */
51
    B_TM_PRED, /* propagate second differences a la
52
                  "True Motion" */
53
54
    B_VE_PRED, /* predict rows using row above */
55
    B_HE_PRED, /* predict columns using column to the left */
56
57
    B_LD_PRED, /* southwest (left and down) 45 degree diagonal
58
                  prediction */
59
    B_RD_PRED, /* southeast (right and down) "" */
60
61
    B_VR_PRED, /* SSE (vertical right) diagonal prediction */
62
63
    B_VL_PRED, /* SSW (vertical left) "" */
64
65
    B_HD_PRED, /* ESE (horizontal down) "" */
66
    B_HU_PRED, /* ENE (horizontal up) "" */
67
68
    num_intra_bmodes
69
};
70
71
// clang-format off
72
static TreeIndex constexpr BLOCK_MODE_TREE[2 * (num_intra_bmodes - 1)] = {
73
 -B_DC_PRED, 2,                   /* B_DC_PRED = "0" */
74
  -B_TM_PRED, 4,                  /* B_TM_PRED = "10" */
75
   -B_VE_PRED, 6,                 /* B_VE_PRED = "110" */
76
    8, 12,
77
     -B_HE_PRED, 10,              /* B_HE_PRED = "11100" */
78
      -B_RD_PRED, -B_VR_PRED,     /* B_RD_PRED = "111010",
79
                                     B_VR_PRED = "111011" */
80
     -B_LD_PRED, 14,              /* B_LD_PRED = "111110" */
81
       -B_VL_PRED, 16,            /* B_VL_PRED = "1111110" */
82
         -B_HD_PRED, -B_HU_PRED   /* HD = "11111110",
83
                                     HU = "11111111" */
84
};
85
// clang-format on
86
87
// https://datatracker.ietf.org/doc/html/rfc6386#section-11.4 "Chroma Modes"
88
// clang-format off
89
static TreeIndex constexpr UV_MODE_TREE[2 * (num_uv_modes - 1)] = {
90
    -DC_PRED, 2,              /* root: DC_PRED = "0", "1" subtree */
91
        -V_PRED, 4,           /* "1" subtree:  V_PRED = "10", "11" subtree */
92
            -H_PRED, -TM_PRED /* "11" subtree: H_PRED = "110", TM_PRED = "111" */
93
};
94
// clang-format on
95
static Prob constexpr KEYFRAME_UV_MODE_PROBABILITIES[num_uv_modes - 1] = { 142, 114, 183 };
96
97
// https://datatracker.ietf.org/doc/html/rfc6386#section-11.5 "Subblock Mode Probability Table"
98
// clang-format off
99
const Prob KEYFRAME_BLOCK_MODE_PROBABILITIES[num_intra_bmodes][num_intra_bmodes][num_intra_bmodes - 1] = {
100
    {
101
        { 231, 120,  48,  89, 115, 113, 120, 152, 112 },
102
        { 152, 179,  64, 126, 170, 118,  46,  70,  95 },
103
        { 175,  69, 143,  80,  85,  82,  72, 155, 103 },
104
        {  56,  58,  10, 171, 218, 189,  17,  13, 152 },
105
        { 144,  71,  10,  38, 171, 213, 144,  34,  26 },
106
        { 114,  26,  17, 163,  44, 195,  21,  10, 173 },
107
        { 121,  24,  80, 195,  26,  62,  44,  64,  85 },
108
        { 170,  46,  55,  19, 136, 160,  33, 206,  71 },
109
        {  63,  20,   8, 114, 114, 208,  12,   9, 226 },
110
        {  81,  40,  11,  96, 182,  84,  29,  16,  36 }
111
    },
112
    {
113
        { 134, 183,  89, 137,  98, 101, 106, 165, 148 },
114
        {  72, 187, 100, 130, 157, 111,  32,  75,  80 },
115
        {  66, 102, 167,  99,  74,  62,  40, 234, 128 },
116
        {  41,  53,   9, 178, 241, 141,  26,   8, 107 },
117
        { 104,  79,  12,  27, 217, 255,  87,  17,   7 },
118
        {  74,  43,  26, 146,  73, 166,  49,  23, 157 },
119
        {  65,  38, 105, 160,  51,  52,  31, 115, 128 },
120
        {  87,  68,  71,  44, 114,  51,  15, 186,  23 },
121
        {  47,  41,  14, 110, 182, 183,  21,  17, 194 },
122
        {  66,  45,  25, 102, 197, 189,  23,  18,  22 }
123
    },
124
    {
125
        {  88,  88, 147, 150,  42,  46,  45, 196, 205 },
126
        {  43,  97, 183, 117,  85,  38,  35, 179,  61 },
127
        {  39,  53, 200,  87,  26,  21,  43, 232, 171 },
128
        {  56,  34,  51, 104, 114, 102,  29,  93,  77 },
129
        { 107,  54,  32,  26,  51,   1,  81,  43,  31 },
130
        {  39,  28,  85, 171,  58, 165,  90,  98,  64 },
131
        {  34,  22, 116, 206,  23,  34,  43, 166,  73 },
132
        {  68,  25, 106,  22,  64, 171,  36, 225, 114 },
133
        {  34,  19,  21, 102, 132, 188,  16,  76, 124 },
134
        {  62,  18,  78,  95,  85,  57,  50,  48,  51 }
135
    },
136
    {
137
        { 193, 101,  35, 159, 215, 111,  89,  46, 111 },
138
        {  60, 148,  31, 172, 219, 228,  21,  18, 111 },
139
        { 112, 113,  77,  85, 179, 255,  38, 120, 114 },
140
        {  40,  42,   1, 196, 245, 209,  10,  25, 109 },
141
        { 100,  80,   8,  43, 154,   1,  51,  26,  71 },
142
        {  88,  43,  29, 140, 166, 213,  37,  43, 154 },
143
        {  61,  63,  30, 155,  67,  45,  68,   1, 209 },
144
        { 142,  78,  78,  16, 255, 128,  34, 197, 171 },
145
        {  41,  40,   5, 102, 211, 183,   4,   1, 221 },
146
        {  51,  50,  17, 168, 209, 192,  23,  25,  82 }
147
    },
148
    {
149
        { 125,  98,  42,  88, 104,  85, 117, 175,  82 },
150
        {  95,  84,  53,  89, 128, 100, 113, 101,  45 },
151
        {  75,  79, 123,  47,  51, 128,  81, 171,   1 },
152
        {  57,  17,   5,  71, 102,  57,  53,  41,  49 },
153
        { 115,  21,   2,  10, 102, 255, 166,  23,   6 },
154
        {  38,  33,  13, 121,  57,  73,  26,   1,  85 },
155
        {  41,  10,  67, 138,  77, 110,  90,  47, 114 },
156
        { 101,  29,  16,  10,  85, 128, 101, 196,  26 },
157
        {  57,  18,  10, 102, 102, 213,  34,  20,  43 },
158
        { 117,  20,  15,  36, 163, 128,  68,   1,  26 }
159
    },
160
    {
161
        { 138,  31,  36, 171,  27, 166,  38,  44, 229 },
162
        {  67,  87,  58, 169,  82, 115,  26,  59, 179 },
163
        {  63,  59,  90, 180,  59, 166,  93,  73, 154 },
164
        {  40,  40,  21, 116, 143, 209,  34,  39, 175 },
165
        {  57,  46,  22,  24, 128,   1,  54,  17,  37 },
166
        {  47,  15,  16, 183,  34, 223,  49,  45, 183 },
167
        {  46,  17,  33, 183,   6,  98,  15,  32, 183 },
168
        {  65,  32,  73, 115,  28, 128,  23, 128, 205 },
169
        {  40,   3,   9, 115,  51, 192,  18,   6, 223 },
170
        {  87,  37,   9, 115,  59,  77,  64,  21,  47 }
171
    },
172
    {
173
        { 104,  55,  44, 218,   9,  54,  53, 130, 226 },
174
        {  64,  90,  70, 205,  40,  41,  23,  26,  57 },
175
        {  54,  57, 112, 184,   5,  41,  38, 166, 213 },
176
        {  30,  34,  26, 133, 152, 116,  10,  32, 134 },
177
        {  75,  32,  12,  51, 192, 255, 160,  43,  51 },
178
        {  39,  19,  53, 221,  26, 114,  32,  73, 255 },
179
        {  31,   9,  65, 234,   2,  15,   1, 118,  73 },
180
        {  88,  31,  35,  67, 102,  85,  55, 186,  85 },
181
        {  56,  21,  23, 111,  59, 205,  45,  37, 192 },
182
        {  55,  38,  70, 124,  73, 102,   1,  34,  98 }
183
    },
184
    {
185
        { 102,  61,  71,  37,  34,  53,  31, 243, 192 },
186
        {  69,  60,  71,  38,  73, 119,  28, 222,  37 },
187
        {  68,  45, 128,  34,   1,  47,  11, 245, 171 },
188
        {  62,  17,  19,  70, 146,  85,  55,  62,  70 },
189
        {  75,  15,   9,   9,  64, 255, 184, 119,  16 },
190
        {  37,  43,  37, 154, 100, 163,  85, 160,   1 },
191
        {  63,   9,  92, 136,  28,  64,  32, 201,  85 },
192
        {  86,   6,  28,   5,  64, 255,  25, 248,   1 },
193
        {  56,   8,  17, 132, 137, 255,  55, 116, 128 },
194
        {  58,  15,  20,  82, 135,  57,  26, 121,  40 }
195
    },
196
    {
197
        { 164,  50,  31, 137, 154, 133,  25,  35, 218 },
198
        {  51, 103,  44, 131, 131, 123,  31,   6, 158 },
199
        {  86,  40,  64, 135, 148, 224,  45, 183, 128 },
200
        {  22,  26,  17, 131, 240, 154,  14,   1, 209 },
201
        {  83,  12,  13,  54, 192, 255,  68,  47,  28 },
202
        {  45,  16,  21,  91,  64, 222,   7,   1, 197 },
203
        {  56,  21,  39, 155,  60, 138,  23, 102, 213 },
204
        {  85,  26,  85,  85, 128, 128,  32, 146, 171 },
205
        {  18,  11,   7,  63, 144, 171,   4,   4, 246 },
206
        {  35,  27,  10, 146, 174, 171,  12,  26, 128 }
207
    },
208
    {
209
        { 190,  80,  35,  99, 180,  80, 126,  54,  45 },
210
        {  85, 126,  47,  87, 176,  51,  41,  20,  32 },
211
        { 101,  75, 128, 139, 118, 146, 116, 128,  85 },
212
        {  56,  41,  15, 176, 236,  85,  37,   9,  62 },
213
        { 146,  36,  19,  30, 171, 255,  97,  27,  20 },
214
        {  71,  30,  17, 119, 118, 255,  17,  18, 138 },
215
        { 101,  38,  60, 138,  55,  70,  43,  26, 142 },
216
        { 138,  45,  61,  62, 219,   1,  81, 188,  64 },
217
        {  32,  41,  20, 117, 151, 142,  20,  21, 163 },
218
        { 112,  19,  12,  61, 195, 128,  48,   4,  24 }
219
    }
220
};
221
// clang-format on
222
223
// https://datatracker.ietf.org/doc/html/rfc6386#section-13.2 "Coding of Individual Coefficient Values"
224
enum DCTToken {
225
    DCT_0,         /* value 0 */
226
    DCT_1,         /* 1 */
227
    DCT_2,         /* 2 */
228
    DCT_3,         /* 3 */
229
    DCT_4,         /* 4 */
230
    dct_cat1,      /* range 5 - 6  (size 2) */
231
    dct_cat2,      /* 7 - 10   (4) */
232
    dct_cat3,      /* 11 - 18  (8) */
233
    dct_cat4,      /* 19 - 34  (16) */
234
    dct_cat5,      /* 35 - 66  (32) */
235
    dct_cat6,      /* 67 - 2048  (1982) */
236
    dct_eob,       /* end of block */
237
    num_dct_tokens /* 12 */
238
};
239
240
// clang-format off
241
const TreeIndex COEFFICIENT_TREE[2 * (num_dct_tokens - 1)] = {
242
 -dct_eob, 2,               /* eob = "0"   */
243
  -DCT_0, 4,                /* 0   = "10"  */
244
   -DCT_1, 6,               /* 1   = "110" */
245
    8, 12,
246
     -DCT_2, 10,            /* 2   = "11100" */
247
      -DCT_3, -DCT_4,       /* 3   = "111010", 4 = "111011" */
248
     14, 16,
249
      -dct_cat1, -dct_cat2, /* cat1 =  "111100",
250
                               cat2 = "111101" */
251
     18, 20,
252
      -dct_cat3, -dct_cat4, /* cat3 = "1111100",
253
                               cat4 = "1111101" */
254
      -dct_cat5, -dct_cat6  /* cat4 = "1111110",
255
                               cat4 = "1111111" */
256
};
257
// clang-format on
258
259
// https://datatracker.ietf.org/doc/html/rfc6386#section-13.4 "Token Probability Updates"
260
// clang-format off
261
static Prob constexpr COEFFICIENT_UPDATE_PROBABILITIES[4][8][3][num_dct_tokens - 1] = {
262
    {
263
        {
264
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
265
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
266
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
267
        },
268
        {
269
            { 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
270
            { 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
271
            { 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 }
272
        },
273
        {
274
            { 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
275
            { 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
276
            { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
277
        },
278
        {
279
            { 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
280
            { 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
281
            { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }
282
        },
283
        {
284
            { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
285
            { 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
286
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
287
        },
288
        {
289
            { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
290
            { 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
291
            { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }
292
        },
293
        {
294
            { 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255 },
295
            { 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255 },
296
            { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
297
        },
298
        {
299
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
300
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
301
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
302
        }
303
    },
304
    {
305
        {
306
            { 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
307
            { 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255 },
308
            { 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255 }
309
        },
310
        {
311
            { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
312
            { 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
313
            { 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255 }
314
        },
315
        {
316
            { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
317
            { 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
318
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
319
        },
320
        {
321
            { 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
322
            { 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
323
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
324
        },
325
        {
326
            { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
327
            { 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
328
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
329
        },
330
        {
331
            { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
332
            { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
333
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
334
        },
335
        {
336
            { 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
337
            { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
338
            { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
339
        },
340
        {
341
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
342
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
343
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
344
        }
345
    },
346
    {
347
        {
348
            { 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255 },
349
            { 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255 },
350
            { 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255 }
351
        },
352
        {
353
            { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
354
            { 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
355
            { 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255 }
356
        },
357
        {
358
            { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
359
            { 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
360
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
361
        },
362
        {
363
            { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
364
            { 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
365
            { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
366
        },
367
        {
368
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
369
            { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
370
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
371
        },
372
        {
373
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
374
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
375
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
376
        },
377
        {
378
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
379
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
380
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
381
        },
382
        {
383
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
384
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
385
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
386
        }
387
    },
388
    {
389
        {
390
            { 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
391
            { 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255 },
392
            { 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255 }
393
        },
394
        {
395
            { 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
396
            { 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
397
            { 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255 }
398
        },
399
        {
400
            { 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
401
            { 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
402
            { 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255 }
403
        },
404
        {
405
            { 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
406
            { 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
407
            { 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }
408
        },
409
        {
410
            { 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
411
            { 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
412
            { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
413
        },
414
        {
415
            { 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
416
            { 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
417
            { 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }
418
        },
419
        {
420
            { 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
421
            { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
422
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
423
        },
424
        {
425
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
426
            { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
427
            { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }
428
        }
429
    }
430
};
431
// clang-format on
432
433
// https://datatracker.ietf.org/doc/html/rfc6386#section-13.5 "Default Token Probability Table"
434
// clang-format off
435
static Prob constexpr DEFAULT_COEFFICIENT_PROBABILITIES[4][8][3][num_dct_tokens - 1] = {
436
    {
437
        {
438
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
439
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
440
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
441
        },
442
        {
443
            { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 },
444
            { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 },
445
            { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 },
446
        },
447
        {
448
            { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 },
449
            { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 },
450
            { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128 },
451
        },
452
        {
453
            { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128 },
454
            { 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128 },
455
            { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128 },
456
        },
457
        {
458
            { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128 },
459
            { 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128 },
460
            { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128 },
461
        },
462
        {
463
            { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128 },
464
            { 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128 },
465
            { 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128 },
466
        },
467
        {
468
            { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128 },
469
            { 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128 },
470
            { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128 },
471
        },
472
        {
473
            { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
474
            { 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
475
            { 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
476
        },
477
    },
478
    {
479
        {
480
            { 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62 },
481
            { 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1 },
482
            { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128 },
483
        },
484
        {
485
            { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128 },
486
            { 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128 },
487
            { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128 },
488
        },
489
        {
490
            { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128 },
491
            { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128 },
492
            { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128 },
493
        },
494
        {
495
            { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128 },
496
            { 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128 },
497
            { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128 },
498
        },
499
        {
500
            { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128 },
501
            { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128 },
502
            { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128 },
503
        },
504
        {
505
            { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128 },
506
            { 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128 },
507
            { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128 },
508
        },
509
        {
510
            { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128 },
511
            { 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128 },
512
            { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128 },
513
        },
514
        {
515
            { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128 },
516
            { 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
517
            { 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128 },
518
        },
519
    },
520
    {
521
        {
522
            { 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128 },
523
            { 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128 },
524
            { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128 },
525
        },
526
        {
527
            { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128 },
528
            { 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128 },
529
            { 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128 },
530
        },
531
        {
532
            { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128 },
533
            { 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128 },
534
            { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128 },
535
        },
536
        {
537
            { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128 },
538
            { 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128 },
539
            { 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
540
        },
541
        {
542
            { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
543
            { 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128 },
544
            { 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
545
        },
546
        {
547
            { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
548
            { 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
549
            { 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
550
        },
551
        {
552
            { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128 },
553
            { 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128 },
554
            { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
555
        },
556
        {
557
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
558
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
559
            { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
560
        },
561
    },
562
    {
563
        {
564
            { 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255 },
565
            { 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128 },
566
            { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128 },
567
        },
568
        {
569
            { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128 },
570
            { 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128 },
571
            { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128 },
572
        },
573
        {
574
            { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128 },
575
            { 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128 },
576
            { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128 },
577
        },
578
        {
579
            { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128 },
580
            { 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128 },
581
            { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128 },
582
        },
583
        {
584
            { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128 },
585
            { 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128 },
586
            { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128 },
587
        },
588
        {
589
            { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128 },
590
            { 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128 },
591
            { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128 },
592
        },
593
        {
594
            { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128 },
595
            { 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128 },
596
            { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128 },
597
        },
598
        {
599
            { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
600
            { 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
601
            { 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
602
        },
603
    },
604
};
605
// clang-format on
606
607
// https://datatracker.ietf.org/doc/html/rfc6386#section-14.1 "Dequantization"
608
// clang-format off
609
static int constexpr dc_qlookup[] = {
610
     4,   5,   6,   7,   8,   9,  10,  10,   11,  12,  13,  14,  15,
611
    16,  17,  17,  18,  19,  20,  20,  21,   21,  22,  22,  23,  23,
612
    24,  25,  25,  26,  27,  28,  29,  30,   31,  32,  33,  34,  35,
613
    36,  37,  37,  38,  39,  40,  41,  42,   43,  44,  45,  46,  46,
614
    47,  48,  49,  50,  51,  52,  53,  54,   55,  56,  57,  58,  59,
615
    60,  61,  62,  63,  64,  65,  66,  67,   68,  69,  70,  71,  72,
616
    73,  74,  75,  76,  76,  77,  78,  79,   80,  81,  82,  83,  84,
617
    85,  86,  87,  88,  89,  91,  93,  95,   96,  98, 100, 101, 102,
618
    104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130,
619
    132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,
620
};
621
static int constexpr ac_qlookup[] = {
622
      4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,
623
     17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
624
     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,
625
     43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
626
     56,  57,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,  78,
627
     80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100, 102, 104,
628
    106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137,
629
    140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177,
630
    181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229,
631
    234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,
632
};
633
// clang-format on
634
635
// https://datatracker.ietf.org/doc/html/rfc6386#section-14.3 "Implementation of the WHT Inversion"
636
inline void vp8_short_inv_walsh4x4_c(i16 const* input, i16* output)
637
50.9k
{
638
50.9k
    i16 const* ip = input;
639
50.9k
    i16* op = output;
640
641
254k
    for (int i = 0; i < 4; i++) {
642
203k
        int a1 = ip[0] + ip[12];
643
203k
        int b1 = ip[4] + ip[8];
644
203k
        int c1 = ip[4] - ip[8];
645
203k
        int d1 = ip[0] - ip[12];
646
647
203k
        op[0] = a1 + b1;
648
203k
        op[4] = c1 + d1;
649
203k
        op[8] = a1 - b1;
650
203k
        op[12] = d1 - c1;
651
203k
        ip++;
652
203k
        op++;
653
203k
    }
654
655
50.9k
    ip = output;
656
50.9k
    op = output;
657
254k
    for (int i = 0; i < 4; i++) {
658
203k
        int a1 = ip[0] + ip[3];
659
203k
        int b1 = ip[1] + ip[2];
660
203k
        int c1 = ip[1] - ip[2];
661
203k
        int d1 = ip[0] - ip[3];
662
663
203k
        int a2 = a1 + b1;
664
203k
        int b2 = c1 + d1;
665
203k
        int c2 = a1 - b1;
666
203k
        int d2 = d1 - c1;
667
203k
        op[0] = (a2 + 3) >> 3;
668
203k
        op[1] = (b2 + 3) >> 3;
669
203k
        op[2] = (c2 + 3) >> 3;
670
203k
        op[3] = (d2 + 3) >> 3;
671
672
203k
        ip += 4;
673
203k
        op += 4;
674
203k
    }
675
50.9k
}
676
677
// https://datatracker.ietf.org/doc/html/rfc6386#section-14.4 "Implementation of the DCT Inversion"
678
inline void short_idct4x4llm_c(i16 const* input, i16* output, int pitch)
679
2.34M
{
680
2.34M
    static constexpr int cospi8sqrt2minus1 = 20091;
681
2.34M
    static constexpr int sinpi8sqrt2 = 35468;
682
683
2.34M
    i16 const* ip = input;
684
2.34M
    i16* op = output;
685
2.34M
    int shortpitch = pitch >> 1;
686
687
11.7M
    for (int i = 0; i < 4; i++) {
688
9.37M
        int a1 = ip[0] + ip[8];
689
9.37M
        int b1 = ip[0] - ip[8];
690
691
9.37M
        int temp1 = (ip[4] * sinpi8sqrt2) >> 16;
692
9.37M
        int temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
693
9.37M
        int c1 = temp1 - temp2;
694
695
9.37M
        temp1 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
696
9.37M
        temp2 = (ip[12] * sinpi8sqrt2) >> 16;
697
9.37M
        int d1 = temp1 + temp2;
698
699
9.37M
        op[shortpitch * 0] = a1 + d1;
700
9.37M
        op[shortpitch * 3] = a1 - d1;
701
9.37M
        op[shortpitch * 1] = b1 + c1;
702
9.37M
        op[shortpitch * 2] = b1 - c1;
703
704
9.37M
        ip++;
705
9.37M
        op++;
706
9.37M
    }
707
708
2.34M
    ip = output;
709
2.34M
    op = output;
710
11.7M
    for (int i = 0; i < 4; i++) {
711
9.37M
        int a1 = ip[0] + ip[2];
712
9.37M
        int b1 = ip[0] - ip[2];
713
714
9.37M
        int temp1 = (ip[1] * sinpi8sqrt2) >> 16;
715
9.37M
        int temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
716
9.37M
        int c1 = temp1 - temp2;
717
718
9.37M
        temp1 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
719
9.37M
        temp2 = (ip[3] * sinpi8sqrt2) >> 16;
720
9.37M
        int d1 = temp1 + temp2;
721
722
9.37M
        op[0] = (a1 + d1 + 4) >> 3;
723
9.37M
        op[3] = (a1 - d1 + 4) >> 3;
724
9.37M
        op[1] = (b1 + c1 + 4) >> 3;
725
9.37M
        op[2] = (b1 - c1 + 4) >> 3;
726
727
9.37M
        ip += shortpitch;
728
9.37M
        op += shortpitch;
729
9.37M
    }
730
2.34M
}
731
732
}