1// Copyright (c) 2017-2023, The rav1e contributors. All rights reserved
2//
3// This source code is subject to the terms of the BSD 2 Clause License and
4// the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
5// was not distributed with this source code in the LICENSE file, you can
6// obtain it at www.aomedia.org/license/software. If the Alliance for Open
7// Media Patent License 1.0 was not distributed with this source code in the
8// PATENTS file, you can obtain it at www.aomedia.org/license/patent.
9
10use std::{
11 mem::{transmute, MaybeUninit},
12 num::NonZeroU16,
13};
14
15pub const MINQ: usize = 0;
16pub const MAXQ: usize = 255;
17pub(super) const QINDEX_RANGE: usize = MAXQ - MINQ + 1;
18
19pub(super) static dc_qlookup_Q3: [NonZeroU16; QINDEX_RANGE] =
20 nonzero_checked(dc_qlookup_Q3_raw);
21
22pub(super) static dc_qlookup_10_Q3: [NonZeroU16; QINDEX_RANGE] =
23 nonzero_checked(dc_qlookup_10_Q3_raw);
24
25pub(super) static dc_qlookup_12_Q3: [NonZeroU16; QINDEX_RANGE] =
26 nonzero_checked(dc_qlookup_12_Q3_raw);
27
28pub(super) static ac_qlookup_Q3: [NonZeroU16; QINDEX_RANGE] =
29 nonzero_checked(ac_qlookup_Q3_raw);
30
31pub(super) static ac_qlookup_10_Q3: [NonZeroU16; QINDEX_RANGE] =
32 nonzero_checked(ac_qlookup_10_Q3_raw);
33
34pub(super) static ac_qlookup_12_Q3: [NonZeroU16; QINDEX_RANGE] =
35 nonzero_checked(ac_qlookup_12_Q3_raw);
36
37#[rustfmt::skip]
38const dc_qlookup_Q3_raw: [u16; QINDEX_RANGE] = [
39 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18,
40 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30,
41 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42,
42 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53,
43 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65,
44 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76,
45 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 87, 88,
46 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110,
47 111, 113, 114, 116, 117, 118, 120, 121, 123, 125, 127, 129, 131, 134,
48 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 161, 164,
49 166, 169, 172, 174, 177, 180, 182, 185, 187, 190, 192, 195, 199, 202,
50 205, 208, 211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247,
51 250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292, 296, 300,
52 304, 309, 313, 317, 322, 326, 330, 335, 340, 344, 349, 354, 359, 364,
53 369, 374, 379, 384, 389, 395, 400, 406, 411, 417, 423, 429, 435, 441,
54 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549,
55 559, 569, 579, 590, 602, 614, 626, 640, 654, 668, 684, 700, 717, 736,
56 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 1139,
57 1184, 1232, 1282, 1336,
58];
59
60#[rustfmt::skip]
61const dc_qlookup_10_Q3_raw: [u16; QINDEX_RANGE] = [
62 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37,
63 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82,
64 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132,
65 136, 140, 143, 147, 151, 155, 159, 163, 166, 170, 174, 178, 182,
66 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230,
67 233, 237, 241, 244, 248, 251, 255, 259, 262, 266, 269, 273, 276,
68 280, 283, 287, 290, 293, 297, 300, 304, 307, 310, 314, 317, 321,
69 324, 327, 331, 334, 337, 343, 350, 356, 362, 369, 375, 381, 387,
70 394, 400, 406, 412, 418, 424, 430, 436, 442, 448, 454, 460, 466,
71 472, 478, 484, 490, 499, 507, 516, 525, 533, 542, 550, 559, 567,
72 576, 584, 592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687,
73 698, 708, 718, 729, 739, 749, 759, 770, 782, 795, 807, 819, 831,
74 844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988, 1001,
75 1015, 1030, 1045, 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170, 1186, 1202,
76 1218, 1236, 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379, 1398, 1416, 1436,
77 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717,
78 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088,
79 2123, 2159, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675,
80 2737, 2802, 2871, 2944, 3020, 3102, 3188, 3280, 3375, 3478, 3586, 3702, 3823,
81 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347,
82];
83
84#[rustfmt::skip]
85const dc_qlookup_12_Q3_raw: [u16; QINDEX_RANGE] = [
86 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91,
87 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237,
88 251, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405,
89 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580,
90 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752,
91 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 919,
92 934, 949, 964, 978, 993, 1008, 1022, 1037, 1051, 1065, 1080,
93 1094, 1108, 1122, 1136, 1151, 1165, 1179, 1192, 1206, 1220, 1234,
94 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342, 1368, 1393, 1419,
95 1444, 1469, 1494, 1519, 1544, 1569, 1594, 1618, 1643, 1668, 1692,
96 1717, 1741, 1765, 1789, 1814, 1838, 1862, 1885, 1909, 1933, 1957,
97 1992, 2027, 2061, 2096, 2130, 2165, 2199, 2233, 2267, 2300, 2334,
98 2367, 2400, 2434, 2467, 2499, 2532, 2575, 2618, 2661, 2704, 2746,
99 2788, 2830, 2872, 2913, 2954, 2995, 3036, 3076, 3127, 3177, 3226,
100 3275, 3324, 3373, 3421, 3469, 3517, 3565, 3621, 3677, 3733, 3788,
101 3843, 3897, 3951, 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420,
102 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942, 5013, 5083, 5153,
103 5222, 5291, 5367, 5442, 5517, 5591, 5665, 5745, 5825, 5905, 5984,
104 6063, 6149, 6234, 6319, 6404, 6495, 6587, 6678, 6769, 6867, 6966,
105 7064, 7163, 7269, 7376, 7483, 7599, 7715, 7832, 7958, 8085, 8214,
106 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031,
107 10245, 10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409, 12750, 13118,
108 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 17575, 18237, 18949,
109 19718, 20521, 21387,
110];
111
112#[rustfmt::skip]
113const ac_qlookup_Q3_raw: [u16; QINDEX_RANGE] = [
114 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
115 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
116 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
117 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
118 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
119 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
120 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
121 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118,
122 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144,
123 146, 148, 150, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179,
124 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223,
125 227, 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280,
126 285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347, 353,
127 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448,
128 456, 465, 474, 483, 492, 501, 510, 520, 530, 540, 550, 560, 571,
129 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, 729,
130 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933,
131 951, 969, 988, 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151, 1173, 1196,
132 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1479, 1508, 1537,
133 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828,
134];
135
136#[rustfmt::skip]
137const ac_qlookup_10_Q3_raw: [u16; QINDEX_RANGE] = [
138 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40,
139 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92,
140 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149,
141 154, 158, 163, 168, 172, 177, 181, 186, 190, 195, 199, 204, 208,
142 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267,
143 271, 275, 280, 284, 289, 293, 297, 302, 306, 311, 315, 319, 324,
144 328, 332, 337, 341, 345, 349, 354, 358, 362, 367, 371, 375, 379,
145 384, 388, 392, 396, 401, 409, 417, 425, 433, 441, 449, 458, 466,
146 474, 482, 490, 498, 506, 514, 523, 531, 539, 547, 555, 563, 571,
147 579, 588, 596, 604, 616, 628, 640, 652, 664, 676, 688, 700, 713,
148 725, 737, 749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889,
149 905, 922, 938, 954, 970, 986, 1002, 1018, 1038, 1058, 1078, 1098, 1118,
150 1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386, 1411,
151 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727, 1759, 1791,
152 1823, 1859, 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159, 2199, 2239, 2283,
153 2327, 2371, 2415, 2459, 2507, 2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915,
154 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391, 3455, 3523, 3591, 3659, 3731,
155 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784,
156 4876, 4972, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148,
157 6268, 6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312,
158];
159
160#[rustfmt::skip]
161const ac_qlookup_12_Q3_raw: [u16; QINDEX_RANGE] = [
162 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99,
163 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263,
164 280, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456,
165 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660,
166 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865,
167 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 1049, 1067,
168 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1246, 1264,
169 1282, 1299, 1317, 1335, 1352, 1370, 1387, 1405, 1422, 1440, 1457,
170 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595, 1627, 1660, 1693,
171 1725, 1758, 1791, 1824, 1856, 1889, 1922, 1954, 1987, 2020, 2052,
172 2085, 2118, 2150, 2183, 2216, 2248, 2281, 2313, 2346, 2378, 2411,
173 2459, 2508, 2556, 2605, 2653, 2701, 2750, 2798, 2847, 2895, 2943,
174 2992, 3040, 3088, 3137, 3185, 3234, 3298, 3362, 3426, 3491, 3555,
175 3619, 3684, 3748, 3812, 3876, 3941, 4005, 4069, 4149, 4230, 4310,
176 4390, 4470, 4550, 4631, 4711, 4791, 4871, 4967, 5064, 5160, 5256,
177 5352, 5448, 5544, 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410,
178 6522, 6650, 6778, 6906, 7034, 7162, 7290, 7435, 7579, 7723, 7867,
179 8011, 8155, 8315, 8475, 8635, 8795, 8956, 9132, 9308, 9484, 9660,
180 9836, 10028, 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661, 11885,
181 12109, 12333, 12573, 12813, 13053, 13309, 13565, 13821, 14093, 14365, 14637,
182 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 18062,
183 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334,
184 22766, 23214, 23662, 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599,
185 28143, 28687, 29247,
186];
187
188/// # Panics
189///
190/// - If any value is zero
191#[allow(clippy::let_unit_value)]
192#[allow(clippy::unused_unit)]
193const fn nonzero_checked(
194 raw: [u16; QINDEX_RANGE],
195) -> [NonZeroU16; QINDEX_RANGE] {
196 // SAFETY: We initialize everything before exiting this function
197 unsafe {
198 let mut nonzero: [MaybeUninit>; 256] = [MaybeUninit::uninit(); QINDEX_RANGE];
199 let mut i: usize = 0;
200 while i < QINDEX_RANGE {
201 let _ = if raw[i] == 0 { [(); 0][i] } else { () };
202 nonzero[i] = MaybeUninit::new(val:NonZeroU16::new_unchecked(raw[i]));
203 i += 1;
204 }
205 transmute(src:nonzero)
206 }
207}
208