Skip to main content

wmv_decoder/
vc1_tables.rs

1//! Exact VC-1 Simple/Main VLC tables used by the native WMV3 decoder.
2//!
3//! Values are transcribed from FFmpeg `libavcodec/vc1_vlc_data.h`.
4
5use 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
129// VC-1 transform-type enumeration, identical to FFmpeg's TransformTypes.
130pub 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; // final VLC entry is ESCAPE
665        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
720/// Eight VC-1 AC coding sets in the order used by FFmpeg / SMPTE 421M:
721/// high-motion intra/inter, low-motion intra/inter, mid-rate intra/inter,
722/// high-rate intra/inter.
723pub fn ac_tables() -> [Vc1AcTable; 8] {
724    [
725        Vc1AcTable::from_base(&FF_RL_BASES[1]), // 186, last=119
726        Vc1AcTable::from_base(&FF_RL_BASES[4]), // 169, last=99
727        Vc1AcTable::from_base(&FF_RL_BASES[0]), // 133, last=85
728        Vc1AcTable::from_base(&FF_RL_BASES[3]), // 149, last=81
729        Vc1AcTable::from_base(&FF_RL_BASES[2]), // 103, last=67
730        Vc1AcTable::from_base(&FF_RL_BASES[5]), // 103, last=58
731        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}