1use crate::na_rl_tables::{FF_RL_BASES, RlBase};
6use crate::vlc::VlcTable;
7use crate::vlc_tree::VlcTree;
8
9const CBPCY_CODES: [[u32; 64]; 4] = [
10 [
11 0, 6, 15, 13, 13, 11, 3, 13, 5, 8, 49, 10, 12, 114, 102, 119, 1, 54, 96, 8, 10, 111, 5, 15,
12 12, 10, 2, 12, 13, 115, 53, 63, 1, 7, 1, 7, 14, 12, 4, 14, 1, 9, 97, 11, 7, 58, 52, 62, 4,
13 103, 1, 9, 11, 56, 101, 118, 4, 110, 100, 30, 2, 5, 4, 3,
14 ],
15 [
16 0, 9, 1, 18, 5, 14, 237, 26, 3, 121, 3, 22, 13, 16, 6, 30, 2, 10, 1, 20, 12, 241, 5, 28,
17 16, 12, 3, 24, 28, 124, 239, 247, 1, 240, 1, 19, 18, 15, 4, 27, 1, 122, 2, 23, 1, 17, 7,
18 31, 1, 11, 2, 21, 19, 246, 238, 29, 17, 13, 236, 25, 58, 63, 8, 125,
19 ],
20 [
21 0, 201, 25, 231, 5, 221, 1, 3, 2, 414, 2, 241, 16, 225, 195, 492, 2, 412, 1, 240, 7, 224,
22 98, 245, 1, 220, 96, 5, 9, 230, 101, 247, 1, 102, 1, 415, 24, 3, 2, 244, 3, 54, 3, 484, 17,
23 114, 200, 493, 3, 413, 1, 4, 13, 113, 99, 485, 4, 111, 194, 243, 5, 29, 26, 31,
24 ],
25 [
26 0, 28, 12, 44, 3, 36, 20, 52, 2, 32, 16, 48, 8, 40, 24, 28, 1, 30, 14, 46, 6, 38, 22, 54,
27 3, 34, 18, 50, 10, 42, 26, 30, 1, 29, 13, 45, 5, 37, 21, 53, 2, 33, 17, 49, 9, 41, 25, 29,
28 1, 31, 15, 47, 7, 39, 23, 55, 4, 35, 19, 51, 11, 43, 27, 31,
29 ],
30];
31
32const CBPCY_BITS: [[u8; 64]; 4] = [
33 [
34 13, 13, 7, 13, 7, 13, 13, 12, 6, 13, 7, 12, 6, 8, 8, 8, 5, 7, 8, 12, 6, 8, 13, 12, 7, 13,
35 13, 12, 6, 8, 7, 7, 6, 13, 8, 12, 7, 13, 13, 12, 7, 13, 8, 12, 5, 7, 7, 7, 6, 8, 13, 12, 6,
36 7, 8, 8, 5, 8, 8, 6, 3, 3, 3, 2,
37 ],
38 [
39 14, 13, 8, 13, 3, 13, 8, 13, 3, 7, 8, 13, 4, 13, 13, 13, 3, 13, 13, 13, 4, 8, 13, 13, 5,
40 13, 13, 13, 5, 7, 8, 8, 3, 8, 14, 13, 5, 13, 13, 13, 4, 7, 13, 13, 6, 13, 13, 13, 5, 13, 8,
41 13, 5, 8, 8, 13, 5, 13, 8, 13, 6, 6, 13, 7,
42 ],
43 [
44 13, 8, 6, 8, 4, 8, 13, 12, 4, 9, 8, 8, 5, 8, 8, 9, 5, 9, 10, 8, 4, 8, 7, 8, 6, 8, 7, 13, 4,
45 8, 7, 8, 5, 7, 8, 9, 6, 13, 13, 8, 4, 6, 8, 9, 5, 7, 8, 9, 5, 9, 9, 13, 5, 7, 7, 9, 4, 7,
46 8, 8, 3, 5, 5, 5,
47 ],
48 [
49 9, 9, 9, 9, 2, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 8, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
50 9, 8, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
51 9, 9, 9, 8,
52 ],
53];
54
55pub fn cbpcy_vlcs() -> [VlcTable; 4] {
56 std::array::from_fn(|tab| {
57 let mut entries = Vec::with_capacity(64);
58 for sym in 0..64 {
59 entries.push((CBPCY_CODES[tab][sym], CBPCY_BITS[tab][sym], sym as i32));
60 }
61 VlcTable::build(&entries, CBPCY_BITS[tab].iter().copied().max().unwrap_or(1))
62 })
63}
64
65const MVDATA_CODES: [[u32; 73]; 4] = [
66 [
67 0, 2, 3, 8, 576, 3, 2, 6, 5, 577, 578, 7, 8, 9, 40, 19, 37, 82, 21, 22, 23, 579, 580, 166,
68 96, 167, 49, 194, 195, 581, 582, 583, 292, 293, 294, 13, 2, 7, 24, 50, 102, 295, 13, 7, 8,
69 18, 50, 103, 38, 20, 21, 22, 39, 204, 103, 23, 24, 25, 104, 410, 105, 106, 107, 108, 109,
70 220, 411, 442, 222, 443, 446, 447, 7,
71 ],
72 [
73 0, 4, 5, 3, 4, 3, 4, 5, 20, 6, 21, 44, 45, 46, 3008, 95, 112, 113, 57, 3009, 3010, 116,
74 117, 3011, 118, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 1, 4, 15,
75 160, 161, 41, 6, 11, 42, 162, 43, 119, 56, 57, 58, 163, 236, 237, 3023, 119, 120, 242, 122,
76 486, 1512, 487, 246, 494, 1513, 495, 1514, 1515, 1516, 1517, 1518, 1519, 31,
77 ],
78 [
79 0, 512, 513, 514, 515, 2, 3, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
80 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 1, 5,
81 287, 288, 289, 290, 6, 7, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
82 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
83 ],
84 [
85 0, 1, 1, 2, 3, 4, 1, 5, 4, 3, 5, 8, 6, 9, 10, 11, 12, 7, 104, 14, 105, 4, 10, 15, 11, 6,
86 14, 8, 106, 107, 108, 15, 109, 9, 55, 10, 1, 2, 1, 2, 3, 12, 6, 2, 6, 7, 28, 7, 15, 8, 5,
87 18, 29, 152, 77, 24, 25, 26, 39, 108, 13, 109, 55, 56, 57, 116, 11, 153, 234, 235, 118,
88 119, 15,
89 ],
90];
91
92const MVDATA_BITS: [[u8; 73]; 4] = [
93 [
94 6, 7, 7, 8, 14, 6, 5, 6, 7, 14, 14, 6, 6, 6, 8, 9, 10, 9, 7, 7, 7, 14, 14, 10, 9, 10, 8,
95 10, 10, 14, 14, 14, 13, 13, 13, 6, 3, 5, 6, 8, 9, 13, 5, 4, 4, 5, 7, 9, 6, 5, 5, 5, 6, 9,
96 8, 5, 5, 5, 7, 10, 7, 7, 7, 7, 7, 8, 10, 9, 8, 9, 9, 9, 3,
97 ],
98 [
99 5, 7, 7, 6, 6, 5, 5, 6, 7, 5, 7, 8, 8, 8, 14, 9, 9, 9, 8, 14, 14, 9, 9, 14, 9, 14, 14, 14,
100 14, 14, 14, 14, 14, 14, 14, 14, 2, 3, 6, 8, 8, 6, 3, 4, 6, 8, 6, 9, 6, 6, 6, 8, 8, 8, 14,
101 7, 7, 8, 7, 9, 13, 9, 8, 9, 13, 9, 13, 13, 13, 13, 13, 13, 5,
102 ],
103 [
104 3, 12, 12, 12, 12, 3, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
105 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 1, 5, 11, 11, 11, 11, 4, 4, 11, 11, 11,
106 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
107 11, 11, 11,
108 ],
109 [
110 15, 11, 15, 15, 15, 15, 12, 15, 12, 11, 12, 12, 15, 12, 12, 12, 12, 15, 15, 12, 15, 10, 11,
111 12, 11, 10, 11, 10, 15, 15, 15, 11, 15, 10, 14, 10, 4, 4, 5, 7, 8, 9, 5, 3, 4, 5, 6, 8, 5,
112 4, 3, 5, 6, 8, 7, 5, 5, 5, 6, 7, 9, 7, 6, 6, 6, 7, 10, 8, 8, 8, 7, 7, 4,
113 ],
114];
115
116pub fn mvdata_vlcs() -> [VlcTable; 4] {
117 std::array::from_fn(|tab| {
118 let mut entries = Vec::with_capacity(73);
119 for sym in 0..73 {
120 entries.push((MVDATA_CODES[tab][sym], MVDATA_BITS[tab][sym], sym as i32));
121 }
122 VlcTable::build(
123 &entries,
124 MVDATA_BITS[tab].iter().copied().max().unwrap_or(1),
125 )
126 })
127}
128
129pub const TT_8X8: u8 = 0;
131pub const TT_8X4_BOTTOM: u8 = 1;
132pub const TT_8X4_TOP: u8 = 2;
133pub const TT_8X4: u8 = 3;
134pub const TT_4X8_RIGHT: u8 = 4;
135pub const TT_4X8_LEFT: u8 = 5;
136pub const TT_4X8: u8 = 6;
137pub const TT_4X4: u8 = 7;
138
139const TTMB_CODES: [[u32; 16]; 3] = [
140 [
141 0x0003, 0x002E, 0x005F, 0x0000, 0x0016, 0x0015, 0x0001, 0x0004, 0x0014, 0x02F1, 0x0179,
142 0x017B, 0x0BC0, 0x0BC1, 0x05E1, 0x017A,
143 ],
144 [
145 0x0006, 0x0006, 0x0003, 0x0007, 0x000F, 0x000E, 0x0000, 0x0002, 0x0002, 0x0014, 0x0011,
146 0x000B, 0x0009, 0x0021, 0x0015, 0x0020,
147 ],
148 [
149 0x0006, 0x0000, 0x000E, 0x0005, 0x0002, 0x0003, 0x0003, 0x000F, 0x0002, 0x0081, 0x0021,
150 0x0009, 0x0101, 0x0041, 0x0011, 0x0100,
151 ],
152];
153const TTMB_BITS: [[u8; 16]; 3] = [
154 [2, 6, 7, 2, 5, 5, 2, 3, 5, 10, 9, 9, 12, 12, 11, 9],
155 [3, 4, 4, 4, 4, 4, 3, 3, 2, 7, 7, 6, 6, 8, 7, 8],
156 [3, 3, 4, 5, 3, 3, 4, 4, 2, 10, 8, 6, 11, 9, 7, 11],
157];
158const TTBLK_CODES: [[u32; 8]; 3] = [
159 [0, 1, 3, 5, 16, 17, 18, 19],
160 [3, 0, 1, 2, 3, 5, 8, 9],
161 [1, 0, 1, 4, 6, 7, 10, 11],
162];
163const TTBLK_BITS: [[u8; 8]; 3] = [
164 [2, 2, 2, 3, 5, 5, 5, 5],
165 [2, 3, 3, 3, 3, 3, 4, 4],
166 [2, 3, 3, 3, 3, 3, 4, 4],
167];
168const SUBBLKPAT_CODES: [[u32; 15]; 3] = [
169 [14, 12, 7, 11, 9, 26, 2, 10, 27, 8, 0, 6, 1, 15, 1],
170 [14, 0, 8, 15, 10, 4, 23, 13, 5, 9, 25, 3, 24, 22, 1],
171 [5, 6, 2, 2, 8, 0, 28, 3, 1, 3, 29, 1, 19, 18, 15],
172];
173const SUBBLKPAT_BITS: [[u8; 15]; 3] = [
174 [5, 5, 5, 5, 5, 6, 4, 5, 6, 5, 4, 5, 4, 5, 1],
175 [4, 3, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 2],
176 [3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4],
177];
178
179pub const VC1_ZZ_4X4: [usize; 16] = [0, 8, 16, 1, 9, 24, 17, 2, 10, 18, 25, 3, 11, 26, 19, 27];
180pub const VC1_ZZ_8X4: [usize; 32] = [
181 0, 8, 1, 16, 2, 9, 10, 3, 24, 17, 4, 11, 18, 12, 5, 19, 25, 13, 20, 26, 27, 6, 21, 28, 14, 22,
182 29, 7, 30, 15, 23, 31,
183];
184pub const VC1_ZZ_4X8: [usize; 32] = [
185 0, 1, 8, 2, 9, 16, 17, 24, 10, 32, 25, 18, 40, 3, 33, 26, 48, 11, 56, 41, 34, 49, 57, 42, 19,
186 50, 27, 58, 35, 43, 51, 59,
187];
188
189pub const TTBLK_TO_TT: [[u8; 8]; 3] = [
190 [
191 TT_8X4,
192 TT_4X8,
193 TT_8X8,
194 TT_4X4,
195 TT_8X4_TOP,
196 TT_8X4_BOTTOM,
197 TT_4X8_RIGHT,
198 TT_4X8_LEFT,
199 ],
200 [
201 TT_8X8,
202 TT_4X8_RIGHT,
203 TT_4X8_LEFT,
204 TT_4X4,
205 TT_8X4,
206 TT_4X8,
207 TT_8X4_BOTTOM,
208 TT_8X4_TOP,
209 ],
210 [
211 TT_8X8,
212 TT_4X8,
213 TT_4X4,
214 TT_8X4_BOTTOM,
215 TT_4X8_RIGHT,
216 TT_4X8_LEFT,
217 TT_8X4,
218 TT_8X4_TOP,
219 ],
220];
221
222pub fn ttmb_vlcs() -> [VlcTable; 3] {
223 std::array::from_fn(|tab| {
224 let entries: Vec<(u32, u8, i32)> = (0..16)
225 .map(|sym| (TTMB_CODES[tab][sym], TTMB_BITS[tab][sym], sym as i32))
226 .collect();
227 VlcTable::build(&entries, TTMB_BITS[tab].iter().copied().max().unwrap_or(1))
228 })
229}
230
231pub fn ttblk_vlcs() -> [VlcTable; 3] {
232 std::array::from_fn(|tab| {
233 let entries: Vec<(u32, u8, i32)> = (0..8)
234 .map(|sym| (TTBLK_CODES[tab][sym], TTBLK_BITS[tab][sym], sym as i32))
235 .collect();
236 VlcTable::build(&entries, TTBLK_BITS[tab].iter().copied().max().unwrap_or(1))
237 })
238}
239
240pub fn subblkpat_vlcs() -> [VlcTable; 3] {
241 std::array::from_fn(|tab| {
242 let entries: Vec<(u32, u8, i32)> = (0..15)
243 .map(|sym| {
244 (
245 SUBBLKPAT_CODES[tab][sym],
246 SUBBLKPAT_BITS[tab][sym],
247 sym as i32,
248 )
249 })
250 .collect();
251 VlcTable::build(
252 &entries,
253 SUBBLKPAT_BITS[tab].iter().copied().max().unwrap_or(1),
254 )
255 })
256}
257
258const HIGH_RATE_INTRA_VLC: [(u32, u8); 163] = [
259 (0x0, 2),
260 (0x3, 3),
261 (0xD, 4),
262 (0x5, 4),
263 (0x1C, 5),
264 (0x16, 5),
265 (0x3F, 6),
266 (0x3A, 6),
267 (0x2E, 6),
268 (0x22, 6),
269 (0x7B, 7),
270 (0x67, 7),
271 (0x5F, 7),
272 (0x47, 7),
273 (0x26, 7),
274 (0xEF, 8),
275 (0xCD, 8),
276 (0xC1, 8),
277 (0xA9, 8),
278 (0x4F, 8),
279 (0x1F2, 9),
280 (0x1DD, 9),
281 (0x199, 9),
282 (0x185, 9),
283 (0x15D, 9),
284 (0x11B, 9),
285 (0x3EF, 10),
286 (0x3E1, 10),
287 (0x3C8, 10),
288 (0x331, 10),
289 (0x303, 10),
290 (0x2F1, 10),
291 (0x2A0, 10),
292 (0x233, 10),
293 (0x126, 10),
294 (0x7C0, 11),
295 (0x76F, 11),
296 (0x76C, 11),
297 (0x661, 11),
298 (0x604, 11),
299 (0x572, 11),
300 (0x551, 11),
301 (0x46A, 11),
302 (0x274, 11),
303 (0xF27, 12),
304 (0xF24, 12),
305 (0xEDB, 12),
306 (0xC8E, 12),
307 (0xC0B, 12),
308 (0xC0A, 12),
309 (0xAE3, 12),
310 (0x8D6, 12),
311 (0x490, 12),
312 (0x495, 12),
313 (0x1F19, 13),
314 (0x1DB5, 13),
315 (0x9, 4),
316 (0x10, 5),
317 (0x29, 6),
318 (0x62, 7),
319 (0xF3, 8),
320 (0xAD, 8),
321 (0x1E5, 9),
322 (0x179, 9),
323 (0x9C, 9),
324 (0x3B1, 10),
325 (0x2AE, 10),
326 (0x127, 10),
327 (0x76E, 11),
328 (0x570, 11),
329 (0x275, 11),
330 (0xF25, 12),
331 (0xEC0, 12),
332 (0xAA0, 12),
333 (0x8D7, 12),
334 (0x1E4C, 13),
335 (0x8, 5),
336 (0x63, 7),
337 (0xAF, 8),
338 (0x17B, 9),
339 (0x3B3, 10),
340 (0x7DD, 11),
341 (0x640, 11),
342 (0xF8D, 12),
343 (0xBC1, 12),
344 (0x491, 12),
345 (0x28, 6),
346 (0xC3, 8),
347 (0x151, 9),
348 (0x2A1, 10),
349 (0x573, 11),
350 (0xEC3, 12),
351 (0x1F35, 13),
352 (0x65, 7),
353 (0x1DA, 9),
354 (0x2AF, 10),
355 (0x277, 11),
356 (0x8C9, 12),
357 (0x1781, 13),
358 (0x25, 7),
359 (0x118, 9),
360 (0x646, 11),
361 (0xAA6, 12),
362 (0x1780, 13),
363 (0xC9, 8),
364 (0x321, 10),
365 (0xF9B, 12),
366 (0x191E, 13),
367 (0x48, 8),
368 (0x7CC, 11),
369 (0xAA1, 12),
370 (0x180, 9),
371 (0x465, 11),
372 (0x1905, 13),
373 (0x3E2, 10),
374 (0xEC1, 12),
375 (0x3C9B, 14),
376 (0x2F4, 10),
377 (0x8C8, 12),
378 (0x7C1, 11),
379 (0x928, 13),
380 (0x5E1, 11),
381 (0x320D, 14),
382 (0xEC2, 12),
383 (0x6418, 15),
384 (0x1F34, 13),
385 (0x78, 7),
386 (0x155, 9),
387 (0x552, 11),
388 (0x191F, 13),
389 (0xFA, 8),
390 (0x7DC, 11),
391 (0x1907, 13),
392 (0xAC, 8),
393 (0x249, 11),
394 (0x13B1, 14),
395 (0x1F6, 9),
396 (0xAE2, 12),
397 (0x1DC, 9),
398 (0x4ED, 12),
399 (0x184, 9),
400 (0x1904, 13),
401 (0x156, 9),
402 (0x9D9, 13),
403 (0x3E7, 10),
404 (0x929, 13),
405 (0x3B2, 10),
406 (0x3B68, 14),
407 (0x2F5, 10),
408 (0x13B0, 14),
409 (0x322, 10),
410 (0x3B69, 14),
411 (0x234, 10),
412 (0x7935, 15),
413 (0x7C7, 11),
414 (0xC833, 16),
415 (0x660, 11),
416 (0x7934, 15),
417 (0x24B, 11),
418 (0xC832, 16),
419 (0xAA7, 12),
420 (0x1F18, 13),
421 (0x7A, 7),
422];
423const HIGH_RATE_INTER_VLC: [(u32, u8); 175] = [
424 (0x2, 2),
425 (0x0, 3),
426 (0x1E, 5),
427 (0x4, 5),
428 (0x12, 6),
429 (0x70, 7),
430 (0x1A, 7),
431 (0x5F, 8),
432 (0x47, 8),
433 (0x1D3, 9),
434 (0xB5, 9),
435 (0x57, 9),
436 (0x3B5, 10),
437 (0x16D, 10),
438 (0x162, 10),
439 (0x7CE, 11),
440 (0x719, 11),
441 (0x691, 11),
442 (0x2C6, 11),
443 (0x156, 11),
444 (0xF92, 12),
445 (0xD2E, 12),
446 (0xD20, 12),
447 (0x59E, 12),
448 (0x468, 12),
449 (0x2A6, 12),
450 (0x1DA2, 13),
451 (0x1C60, 13),
452 (0x1A43, 13),
453 (0xB1D, 13),
454 (0x8C0, 13),
455 (0x55D, 13),
456 (0x3, 3),
457 (0xA, 5),
458 (0x77, 7),
459 (0xE5, 8),
460 (0x1D9, 9),
461 (0x3E5, 10),
462 (0x166, 10),
463 (0x694, 11),
464 (0x152, 11),
465 (0x59F, 12),
466 (0x1F3C, 13),
467 (0x1A4B, 13),
468 (0x55E, 13),
469 (0xC, 4),
470 (0x7D, 7),
471 (0x44, 8),
472 (0x3E0, 10),
473 (0x769, 11),
474 (0xE31, 12),
475 (0x1F26, 13),
476 (0x55C, 13),
477 (0x1B, 5),
478 (0xE2, 8),
479 (0x3A5, 10),
480 (0x2C9, 11),
481 (0x1F23, 13),
482 (0x3B47, 14),
483 (0x7, 5),
484 (0x1D8, 9),
485 (0x2D8, 11),
486 (0x1F27, 13),
487 (0x3494, 14),
488 (0x35, 6),
489 (0x3E1, 10),
490 (0x59C, 12),
491 (0x38C3, 14),
492 (0xC, 6),
493 (0x165, 10),
494 (0x1D23, 13),
495 (0x1638, 14),
496 (0x68, 7),
497 (0x693, 11),
498 (0x3A45, 14),
499 (0x20, 7),
500 (0xF90, 12),
501 (0x7CF6, 15),
502 (0xE8, 8),
503 (0x58F, 12),
504 (0x2CEF, 15),
505 (0x45, 8),
506 (0xB3A, 13),
507 (0x1F1, 9),
508 (0x3B46, 14),
509 (0x1A7, 9),
510 (0x1676, 14),
511 (0x56, 9),
512 (0x692A, 15),
513 (0x38D, 10),
514 (0xE309, 16),
515 (0xAA, 10),
516 (0x1C611, 17),
517 (0x2DF, 11),
518 (0xB3B9, 17),
519 (0x2C8, 11),
520 (0x38C20, 18),
521 (0x1B0, 11),
522 (0x16390, 18),
523 (0xF9F, 12),
524 (0x16771, 18),
525 (0xED0, 12),
526 (0x71843, 19),
527 (0xD2A, 12),
528 (0xF9E8C, 20),
529 (0x461, 12),
530 (0xF9E8E, 20),
531 (0xB67, 13),
532 (0x55F, 13),
533 (0x3F, 6),
534 (0x6D, 9),
535 (0xE90, 12),
536 (0x54E, 13),
537 (0x13, 6),
538 (0x119, 10),
539 (0xB66, 13),
540 (0xB, 6),
541 (0x235, 11),
542 (0x7CF5, 15),
543 (0x75, 7),
544 (0xD24, 12),
545 (0xF9E9, 16),
546 (0x2E, 7),
547 (0x1F22, 13),
548 (0x21, 7),
549 (0x54F, 13),
550 (0x14, 7),
551 (0x3A44, 14),
552 (0xE4, 8),
553 (0x7CF7, 15),
554 (0x5E, 8),
555 (0x7185, 15),
556 (0x37, 8),
557 (0x2C73, 15),
558 (0x1DB, 9),
559 (0x59DD, 16),
560 (0x1C7, 9),
561 (0x692B, 15),
562 (0x1A6, 9),
563 (0x58E5, 16),
564 (0xB4, 9),
565 (0x1F3D0, 17),
566 (0xB0, 9),
567 (0xB1C9, 17),
568 (0x3E6, 10),
569 (0x16770, 18),
570 (0x16E, 10),
571 (0x3E7A2, 18),
572 (0x11B, 10),
573 (0xF9E8D, 20),
574 (0xD9, 10),
575 (0xF9E8F, 20),
576 (0xA8, 10),
577 (0x2C723, 19),
578 (0x749, 11),
579 (0xE3084, 20),
580 (0x696, 11),
581 (0x58E45, 20),
582 (0x2DE, 11),
583 (0xB1C88, 21),
584 (0x231, 11),
585 (0x1C610A, 21),
586 (0x1B1, 11),
587 (0x71842D, 23),
588 (0xD2B, 12),
589 (0x38C217, 22),
590 (0xD2F, 12),
591 (0x163913, 22),
592 (0x5B2, 12),
593 (0x163912, 22),
594 (0x469, 12),
595 (0x71842C, 23),
596 (0x1A42, 13),
597 (0x8C1, 13),
598 (0x73, 7),
599];
600
601const HIGH_RATE_INTRA_NOLAST_MAX_LEVEL: &[u8] = &[56, 20, 10, 7, 6, 5, 4, 3, 3, 3, 2, 2, 2, 2, 1];
602const HIGH_RATE_INTRA_LAST_MAX_LEVEL: &[u8] = &[4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1];
603const HIGH_RATE_INTER_NOLAST_MAX_LEVEL: &[u8] = &[
604 32, 13, 8, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
605];
606const HIGH_RATE_INTER_LAST_MAX_LEVEL: &[u8] = &[
607 4, 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, 1, 1,
608];
609
610#[derive(Clone)]
611pub struct Vc1AcTable {
612 n: usize,
613 last: usize,
614 vlc: VlcTree,
615 run: Vec<u8>,
616 level: Vec<u8>,
617 max_level: [[u8; 65]; 2],
618 max_run: [[u8; 65]; 2],
619}
620
621impl Vc1AcTable {
622 fn finish(n: usize, last: usize, vlc: VlcTree, run: Vec<u8>, level: Vec<u8>) -> Self {
623 let mut max_level = [[0u8; 65]; 2];
624 let mut max_run = [[0u8; 65]; 2];
625 for last_flag in 0..2usize {
626 let (start, end) = if last_flag == 0 { (0, last) } else { (last, n) };
627 for i in start..end {
628 let r = run[i] as usize;
629 let l = level[i] as usize;
630 if r < 65 && l < 65 {
631 max_level[last_flag][r] = max_level[last_flag][r].max(level[i]);
632 max_run[last_flag][l] = max_run[last_flag][l].max(run[i]);
633 }
634 }
635 }
636 Self {
637 n,
638 last,
639 vlc,
640 run,
641 level,
642 max_level,
643 max_run,
644 }
645 }
646
647 fn from_base(base: &RlBase) -> Self {
648 let mut vlc = VlcTree::new();
649 for (idx, (code, len)) in base.vlc.iter().enumerate() {
650 if *len != 0 {
651 vlc.insert(*code, *len, idx as i32);
652 }
653 }
654 Self::finish(
655 base.n,
656 base.last,
657 vlc,
658 base.run.to_vec(),
659 base.level.to_vec(),
660 )
661 }
662
663 fn from_high(codes: &[(u32, u8)], last: usize, no_last_max: &[u8], last_max: &[u8]) -> Self {
664 let n = codes.len() - 1; let mut run = Vec::with_capacity(n);
666 let mut level = Vec::with_capacity(n);
667 for (r, &max_l) in no_last_max.iter().enumerate() {
668 for l in 1..=max_l {
669 run.push(r as u8);
670 level.push(l);
671 }
672 }
673 assert_eq!(run.len(), last);
674 for (r, &max_l) in last_max.iter().enumerate() {
675 for l in 1..=max_l {
676 run.push(r as u8);
677 level.push(l);
678 }
679 }
680 assert_eq!(run.len(), n);
681 let mut vlc = VlcTree::new();
682 for (idx, &(code, len)) in codes.iter().enumerate() {
683 vlc.insert(code, len, idx as i32);
684 }
685 Self::finish(n, last, vlc, run, level)
686 }
687
688 #[inline]
689 pub fn decode_index(&self, br: &mut crate::bitreader::BitReader<'_>) -> Option<usize> {
690 self.vlc
691 .decode(br)
692 .and_then(|v| if v >= 0 { Some(v as usize) } else { None })
693 }
694 #[inline]
695 pub fn is_escape(&self, idx: usize) -> bool {
696 idx == self.n
697 }
698 #[inline]
699 pub fn is_last(&self, idx: usize) -> bool {
700 idx >= self.last && idx < self.n
701 }
702 #[inline]
703 pub fn run_level(&self, idx: usize) -> Option<(u8, u8)> {
704 if idx >= self.n {
705 None
706 } else {
707 Some((self.run[idx], self.level[idx]))
708 }
709 }
710 #[inline]
711 pub fn max_level(&self, last: bool, run: usize) -> u8 {
712 self.max_level[last as usize][run.min(64)]
713 }
714 #[inline]
715 pub fn max_run(&self, last: bool, level: usize) -> u8 {
716 self.max_run[last as usize][level.min(64)]
717 }
718}
719
720pub fn ac_tables() -> [Vc1AcTable; 8] {
724 [
725 Vc1AcTable::from_base(&FF_RL_BASES[1]), Vc1AcTable::from_base(&FF_RL_BASES[4]), Vc1AcTable::from_base(&FF_RL_BASES[0]), Vc1AcTable::from_base(&FF_RL_BASES[3]), Vc1AcTable::from_base(&FF_RL_BASES[2]), Vc1AcTable::from_base(&FF_RL_BASES[5]), Vc1AcTable::from_high(
732 &HIGH_RATE_INTRA_VLC,
733 126,
734 HIGH_RATE_INTRA_NOLAST_MAX_LEVEL,
735 HIGH_RATE_INTRA_LAST_MAX_LEVEL,
736 ),
737 Vc1AcTable::from_high(
738 &HIGH_RATE_INTER_VLC,
739 109,
740 HIGH_RATE_INTER_NOLAST_MAX_LEVEL,
741 HIGH_RATE_INTER_LAST_MAX_LEVEL,
742 ),
743 ]
744}