Coverage Report

Created: 2026-11-13 08:07

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
64.2k
{
638
64.2k
    i16 const* ip = input;
639
64.2k
    i16* op = output;
640
641
321k
    for (int i = 0; i < 4; i++) {
642
257k
        int a1 = ip[0] + ip[12];
643
257k
        int b1 = ip[4] + ip[8];
644
257k
        int c1 = ip[4] - ip[8];
645
257k
        int d1 = ip[0] - ip[12];
646
647
257k
        op[0] = a1 + b1;
648
257k
        op[4] = c1 + d1;
649
257k
        op[8] = a1 - b1;
650
257k
        op[12] = d1 - c1;
651
257k
        ip++;
652
257k
        op++;
653
257k
    }
654
655
64.2k
    ip = output;
656
64.2k
    op = output;
657
321k
    for (int i = 0; i < 4; i++) {
658
257k
        int a1 = ip[0] + ip[3];
659
257k
        int b1 = ip[1] + ip[2];
660
257k
        int c1 = ip[1] - ip[2];
661
257k
        int d1 = ip[0] - ip[3];
662
663
257k
        int a2 = a1 + b1;
664
257k
        int b2 = c1 + d1;
665
257k
        int c2 = a1 - b1;
666
257k
        int d2 = d1 - c1;
667
257k
        op[0] = (a2 + 3) >> 3;
668
257k
        op[1] = (b2 + 3) >> 3;
669
257k
        op[2] = (c2 + 3) >> 3;
670
257k
        op[3] = (d2 + 3) >> 3;
671
672
257k
        ip += 4;
673
257k
        op += 4;
674
257k
    }
675
64.2k
}
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
3.33M
{
680
3.33M
    static constexpr int cospi8sqrt2minus1 = 20091;
681
3.33M
    static constexpr int sinpi8sqrt2 = 35468;
682
683
3.33M
    i16 const* ip = input;
684
3.33M
    i16* op = output;
685
3.33M
    int shortpitch = pitch >> 1;
686
687
16.6M
    for (int i = 0; i < 4; i++) {
688
13.3M
        int a1 = ip[0] + ip[8];
689
13.3M
        int b1 = ip[0] - ip[8];
690
691
13.3M
        int temp1 = (ip[4] * sinpi8sqrt2) >> 16;
692
13.3M
        int temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
693
13.3M
        int c1 = temp1 - temp2;
694
695
13.3M
        temp1 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
696
13.3M
        temp2 = (ip[12] * sinpi8sqrt2) >> 16;
697
13.3M
        int d1 = temp1 + temp2;
698
699
13.3M
        op[shortpitch * 0] = a1 + d1;
700
13.3M
        op[shortpitch * 3] = a1 - d1;
701
13.3M
        op[shortpitch * 1] = b1 + c1;
702
13.3M
        op[shortpitch * 2] = b1 - c1;
703
704
13.3M
        ip++;
705
13.3M
        op++;
706
13.3M
    }
707
708
3.33M
    ip = output;
709
3.33M
    op = output;
710
16.6M
    for (int i = 0; i < 4; i++) {
711
13.3M
        int a1 = ip[0] + ip[2];
712
13.3M
        int b1 = ip[0] - ip[2];
713
714
13.3M
        int temp1 = (ip[1] * sinpi8sqrt2) >> 16;
715
13.3M
        int temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
716
13.3M
        int c1 = temp1 - temp2;
717
718
13.3M
        temp1 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
719
13.3M
        temp2 = (ip[3] * sinpi8sqrt2) >> 16;
720
13.3M
        int d1 = temp1 + temp2;
721
722
13.3M
        op[0] = (a1 + d1 + 4) >> 3;
723
13.3M
        op[3] = (a1 - d1 + 4) >> 3;
724
13.3M
        op[1] = (b1 + c1 + 4) >> 3;
725
13.3M
        op[2] = (b1 - c1 + 4) >> 3;
726
727
13.3M
        ip += shortpitch;
728
13.3M
        op += shortpitch;
729
13.3M
    }
730
3.33M
}
731
732
}