blob: a2e78617b01db62e8705cdd798ccb4d09504e98d [file]
// Copyright 2026 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
// --------
// RENORM_SHIFT[range_m1] is the number of bits to shift the entropy coder
// state by, when decoder.read_bit reads an entropy coded bit, so that range_m1
// stays in the range [0x7F ..= 0xFE].
//
// It is a look-up table for:
//
// RENORM_SHIFT[range_m1] = 7 - log2(range_m1 + 1)
//
// Equivalently:
//
// RENORM_SHIFT[range_m1] = 24 ^ __builtin_clz((uint32_t)(range_m1 + 1))
//
// Note that the final (255th) element is unused.
//
// If range_m1 >= 0x7F then RENORM_SHIFT[range_m1] is zero, so that shifting or
// subtracting RENORM_SHIFT[range_m1], as part of re-normalization, is a no-op.
//
// In terms of formatting, the line breaks are "off by one" (after 15, 31, 47,
// etc instead of 16, 32, 48, etc elements) because the the array is indexed by
// a "foobar_m1" expression and the "m1" means "minus 1".
pri const RENORM_SHIFT : roarray[256] base.u8[..= 7] = [
7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// Unused. Set the placeholder equal to the second-last entry.
0,
]
// RENORM_RANGE_M1[range_m1] is the re-normalized value of range_m1, used when
// decoder.read_bit reads an entropy coded bit.
//
// - There are 1 entries, matching RENORM_SHIFT[range_m1] == 7, being 128-1.
// - There are 2 entries, matching RENORM_SHIFT[range_m1] == 6, being
// 128-1, 192-1, incrementing by 64.
// - There are 4 entries, matching RENORM_SHIFT[range_m1] == 5, being
// 128-1, 160-1, ..., 224-1, incrementing by 32.
// - There are 8 entries, matching RENORM_SHIFT[range_m1] == 4, being
// 128-1, 144-1, ..., 240-1, incrementing by 16.
// - There are 16 entries, matching RENORM_SHIFT[range_m1] == 3, being
// 128-1, 136-1, ..., 248-1, incrementing by 8.
// - ...
// - There are 128 entries, matching RENORM_SHIFT[range_m1] == 0, being
// 128-1, 129-1, ..., 255-1, incrementing by 1.
//
// It is a look-up table for:
//
// RENORM_RANGE_M1[range_m1] = ((range_m1 + 1) << RENORM_SHIFT[range_m1]) - 1
//
// If range_m1 >= 0x7F then RENORM_RANGE_M1[range_m1] is range_m1, so that
// assigning "range_m1 = RENORM_RANGE_M1[range_m1]", as part of
// re-normalization, is a no-op.
//
// In terms of formatting, the line breaks are "off by one" (after 15, 31, 47,
// etc instead of 16, 32, 48, etc elements) because the the array is indexed by
// a "foobar_m1" expression and the "m1" means "minus 1".
pri const RENORM_RANGE_M1 : roarray[256] base.u8[127 ..= 254] = [
127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239,
127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247,
127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187,
191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251,
127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157,
159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189,
191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221,
223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253,
127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222,
223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
// Unused. Set the placeholder equal to the second-last entry.
254,
]
pri const CLAMP_NO_MORE_THAN_9 : roarray[16] base.u8[..= 9] = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9,
]
pri const CLAMP : roarray[1024] base.u8 = [
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]
// RFC 6386 Section 11.5. Subblock Mode Probability Table.
//
// Note that the specification (the RFC) differs from the implementation
// (libwebp's src/dec/tree_dec.c). The mode enumeration, ranging in 0 ..= 9,
// has been re-ordered. This implementation follows libwebp.
//
// Here's the sequence of SUBBLOCK_MODE_PROBS[m][0][0] values:
//
// 231, 134, 88, 193, 125, 138, 104, 102, 164, 190. RFC's kf_bmode_prob.
// 231, 134, 88, 193, 138, 104, 125, 102, 164, 190. libwebp's kBModesProba.
// ^^^ ^^^ ^^^ Note the difference.
//
//
// A libwebp commit message from 2010 says "lot of cosmetics" and "use HE and
// VE naming for prediction mode instead of H and V" but it also does this
// re-ordering. It has this diff:
//
// VP8PredFunc VP8PredLuma4[11] = {
// - DC4, TM4, V4, H4, LD4, RD4, VR4, VL4, HD4, HU4
// + DC4, TM4, VE4, HE4, RD4, VR4, LD4, VL4, HD4, HU4
// };
// ^^^ ^^^ ^^^ Note the difference.
//
// https://chromium.googlesource.com/webm/libwebp/+/f67b5939ad92e608b546b291b29bca1db3b54772%5E%21
pri const SUBBLOCK_MODE_PROBS : roarray[10] roarray[10] roarray[9] base.u8[1 ..=] = [[
[231, 120, 48, 89, 115, 113, 120, 152, 112],
[152, 179, 64, 126, 170, 118, 46, 70, 95],
[175, 69, 143, 80, 85, 82, 72, 155, 103],
[56, 58, 10, 171, 218, 189, 17, 13, 152],
[114, 26, 17, 163, 44, 195, 21, 10, 173],
[121, 24, 80, 195, 26, 62, 44, 64, 85],
[144, 71, 10, 38, 171, 213, 144, 34, 26],
[170, 46, 55, 19, 136, 160, 33, 206, 71],
[63, 20, 8, 114, 114, 208, 12, 9, 226],
[81, 40, 11, 96, 182, 84, 29, 16, 36],
],[
[134, 183, 89, 137, 98, 101, 106, 165, 148],
[72, 187, 100, 130, 157, 111, 32, 75, 80],
[66, 102, 167, 99, 74, 62, 40, 234, 128],
[41, 53, 9, 178, 241, 141, 26, 8, 107],
[74, 43, 26, 146, 73, 166, 49, 23, 157],
[65, 38, 105, 160, 51, 52, 31, 115, 128],
[104, 79, 12, 27, 217, 255, 87, 17, 7],
[87, 68, 71, 44, 114, 51, 15, 186, 23],
[47, 41, 14, 110, 182, 183, 21, 17, 194],
[66, 45, 25, 102, 197, 189, 23, 18, 22],
],[
[88, 88, 147, 150, 42, 46, 45, 196, 205],
[43, 97, 183, 117, 85, 38, 35, 179, 61],
[39, 53, 200, 87, 26, 21, 43, 232, 171],
[56, 34, 51, 104, 114, 102, 29, 93, 77],
[39, 28, 85, 171, 58, 165, 90, 98, 64],
[34, 22, 116, 206, 23, 34, 43, 166, 73],
[107, 54, 32, 26, 51, 1, 81, 43, 31],
[68, 25, 106, 22, 64, 171, 36, 225, 114],
[34, 19, 21, 102, 132, 188, 16, 76, 124],
[62, 18, 78, 95, 85, 57, 50, 48, 51],
],[
[193, 101, 35, 159, 215, 111, 89, 46, 111],
[60, 148, 31, 172, 219, 228, 21, 18, 111],
[112, 113, 77, 85, 179, 255, 38, 120, 114],
[40, 42, 1, 196, 245, 209, 10, 25, 109],
[88, 43, 29, 140, 166, 213, 37, 43, 154],
[61, 63, 30, 155, 67, 45, 68, 1, 209],
[100, 80, 8, 43, 154, 1, 51, 26, 71],
[142, 78, 78, 16, 255, 128, 34, 197, 171],
[41, 40, 5, 102, 211, 183, 4, 1, 221],
[51, 50, 17, 168, 209, 192, 23, 25, 82],
],[
[138, 31, 36, 171, 27, 166, 38, 44, 229],
[67, 87, 58, 169, 82, 115, 26, 59, 179],
[63, 59, 90, 180, 59, 166, 93, 73, 154],
[40, 40, 21, 116, 143, 209, 34, 39, 175],
[47, 15, 16, 183, 34, 223, 49, 45, 183],
[46, 17, 33, 183, 6, 98, 15, 32, 183],
[57, 46, 22, 24, 128, 1, 54, 17, 37],
[65, 32, 73, 115, 28, 128, 23, 128, 205],
[40, 3, 9, 115, 51, 192, 18, 6, 223],
[87, 37, 9, 115, 59, 77, 64, 21, 47],
],[
[104, 55, 44, 218, 9, 54, 53, 130, 226],
[64, 90, 70, 205, 40, 41, 23, 26, 57],
[54, 57, 112, 184, 5, 41, 38, 166, 213],
[30, 34, 26, 133, 152, 116, 10, 32, 134],
[39, 19, 53, 221, 26, 114, 32, 73, 255],
[31, 9, 65, 234, 2, 15, 1, 118, 73],
[75, 32, 12, 51, 192, 255, 160, 43, 51],
[88, 31, 35, 67, 102, 85, 55, 186, 85],
[56, 21, 23, 111, 59, 205, 45, 37, 192],
[55, 38, 70, 124, 73, 102, 1, 34, 98],
],[
[125, 98, 42, 88, 104, 85, 117, 175, 82],
[95, 84, 53, 89, 128, 100, 113, 101, 45],
[75, 79, 123, 47, 51, 128, 81, 171, 1],
[57, 17, 5, 71, 102, 57, 53, 41, 49],
[38, 33, 13, 121, 57, 73, 26, 1, 85],
[41, 10, 67, 138, 77, 110, 90, 47, 114],
[115, 21, 2, 10, 102, 255, 166, 23, 6],
[101, 29, 16, 10, 85, 128, 101, 196, 26],
[57, 18, 10, 102, 102, 213, 34, 20, 43],
[117, 20, 15, 36, 163, 128, 68, 1, 26],
],[
[102, 61, 71, 37, 34, 53, 31, 243, 192],
[69, 60, 71, 38, 73, 119, 28, 222, 37],
[68, 45, 128, 34, 1, 47, 11, 245, 171],
[62, 17, 19, 70, 146, 85, 55, 62, 70],
[37, 43, 37, 154, 100, 163, 85, 160, 1],
[63, 9, 92, 136, 28, 64, 32, 201, 85],
[75, 15, 9, 9, 64, 255, 184, 119, 16],
[86, 6, 28, 5, 64, 255, 25, 248, 1],
[56, 8, 17, 132, 137, 255, 55, 116, 128],
[58, 15, 20, 82, 135, 57, 26, 121, 40],
],[
[164, 50, 31, 137, 154, 133, 25, 35, 218],
[51, 103, 44, 131, 131, 123, 31, 6, 158],
[86, 40, 64, 135, 148, 224, 45, 183, 128],
[22, 26, 17, 131, 240, 154, 14, 1, 209],
[45, 16, 21, 91, 64, 222, 7, 1, 197],
[56, 21, 39, 155, 60, 138, 23, 102, 213],
[83, 12, 13, 54, 192, 255, 68, 47, 28],
[85, 26, 85, 85, 128, 128, 32, 146, 171],
[18, 11, 7, 63, 144, 171, 4, 4, 246],
[35, 27, 10, 146, 174, 171, 12, 26, 128],
],[
[190, 80, 35, 99, 180, 80, 126, 54, 45],
[85, 126, 47, 87, 176, 51, 41, 20, 32],
[101, 75, 128, 139, 118, 146, 116, 128, 85],
[56, 41, 15, 176, 236, 85, 37, 9, 62],
[71, 30, 17, 119, 118, 255, 17, 18, 138],
[101, 38, 60, 138, 55, 70, 43, 26, 142],
[146, 36, 19, 30, 171, 255, 97, 27, 20],
[138, 45, 61, 62, 219, 1, 81, 188, 64],
[32, 41, 20, 117, 151, 142, 20, 21, 163],
[112, 19, 12, 61, 195, 128, 48, 4, 24],
]]
// RFC 6386 Section 13.2. Coding of Individual Coefficient Values.
//
// Categories 1 and 2 are inlined.
pri const CATEGORY_PROBS : roarray[4] roarray[16] base.u8 = [[
// Category 3.
173, 148, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
],[
// Category 4.
176, 155, 140, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
],[
// Category 5.
180, 157, 141, 134, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
],[
// Category 6.
254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0, 0, 0, 0, 0,
]]
// RFC 6386 Section 13.3. Token Probabilities.
//
// These are the RFC's coeff_bands array values multplied by 33, with an extra
// element at the end so we can index by (i+1).
pri const COEFF_BANDS_33 : roarray[17] base.u32[..= 231] = [
0, 33, 66, 99, 198, 132, 165, 198, 198, 198, 198, 198, 198, 198, 198, 231, 0,
]
// RFC 6386 Section 13.4. Token Probability Updates.
//
// 1056 is (4 planes, 8 bands, 3 contexts, 11 tokens) flattened.
pri const COEFF_UPDATE_PROBS : roarray[1056] base.u8[1 ..=] = [
// Plane 0: Y beginning at coefficient 1
// Band 0
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 1
176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255,
223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255,
249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 2
255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255,
234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 3
255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255,
239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 4
255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255,
251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 5
255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 6
255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255,
250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255,
254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 7
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Plane 1: Y2
// Band 0
217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255,
234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255,
// Band 1
255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255,
// Band 2
255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255,
249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 3
255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255,
247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 4
255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 5
255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 6
255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255,
250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 7
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Plane 2: U or V
// Band 0
186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255,
234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255,
251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255,
// Band 1
255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255,
// Band 2
255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 3
255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 4
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 5
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 6
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 7
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Plane 3: Y beginning at coefficient 0
// Band 0
248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255,
248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255,
// Band 1
255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255,
246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255,
252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255,
// Band 2
255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255,
248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255,
253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255,
// Band 3
255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255,
245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255,
253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 4
255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255,
252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255,
255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 5
255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255,
249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 6
255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255,
250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// Band 7
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
]
// RFC 6386 Section 13.5. Default Token Probability Table.
//
// 1056 is (4 planes, 8 bands, 3 contexts, 11 tokens) flattened.
pri const DEFAULT_COEFF_PROBS : roarray[1056] base.u8[1 ..=] = [
// Plane 0: Y beginning at coefficient 1
// Band 0
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
// Band 1
253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128,
189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128,
106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128,
// Band 2
1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128,
181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128,
78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128,
// Band 3
1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128,
184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128,
77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128,
// Band 4
1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128,
170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128,
37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128,
// Band 5
1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128,
207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128,
102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128,
// Band 6
1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128,
177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128,
80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128,
// Band 7
1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
// Plane 1: Y2
// Band 0
198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62,
131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1,
68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128,
// Band 1
1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128,
184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128,
81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128,
// Band 2
1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128,
99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128,
23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128,
// Band 3
1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128,
109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128,
44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128,
// Band 4
1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128,
94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128,
22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,
// Band 5
1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128,
124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128,
35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128,
// Band 6
1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128,
121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128,
45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128,
// Band 7
1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128,
203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128,
137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128,
// Plane 2: U or V
// Band 0
253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128,
175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128,
73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128,
// Band 1
1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128,
239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128,
155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128,
// Band 2
1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128,
201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128,
69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128,
// Band 3
1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128,
223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128,
141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128,
// Band 4
1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128,
190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128,
149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
// Band 5
1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128,
247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128,
240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128,
// Band 6
1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128,
213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128,
55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128,
// Band 7
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
// Plane 3: Y beginning at coefficient 0
// Band 0
202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255,
126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128,
61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128,
// Band 1
1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128,
166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128,
39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128,
// Band 2
1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128,
124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128,
24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128,
// Band 3
1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128,
149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128,
28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128,
// Band 4
1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128,
123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128,
20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128,
// Band 5
1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128,
168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128,
47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128,
// Band 6
1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128,
141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128,
42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128,
// Band 7
1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128,
]
// RFC 6386 Section 14.1. Dequantization.
pri const DEQUANTS : roarray[2] roarray[128] base.u16[..= 284] = [[
4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118,
122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,
],[
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108,
110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152,
155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209,
213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,
]]
// RFC 6386 Section 20.16. tokens.c.
pri const ZIGZAG : roarray[16] base.u8[..= 15] = [
0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15,
]