rav1e/quantize/
tables.rs

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::uninit(); QINDEX_RANGE];
199    let mut i = 0;
200    while i < QINDEX_RANGE {
201      let _ = if raw[i] == 0 { [(); 0][i] } else { () };
202      nonzero[i] = MaybeUninit::new(NonZeroU16::new_unchecked(raw[i]));
203      i += 1;
204    }
205    transmute(nonzero)
206  }
207}