symphonia_bundle_mp3/layer3/
codebooks.rs

1// Symphonia
2// Copyright (c) 2019-2022 The Project Symphonia Developers.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at https://mozilla.org/MPL/2.0/.
7
8use symphonia_core::io::vlc::*;
9
10use lazy_static::lazy_static;
11
12#[rustfmt::skip]
13const MPEG_CODES_0: [u32; 0] = [ ];
14
15#[rustfmt::skip]
16const MPEG_BITS_0: [u8; 0] = [ ];
17
18#[rustfmt::skip]
19const MPEG_CODES_1: [u32; 4] = [
20    0x0001, 0x0001, 0x0001, 0x0000,
21];
22
23#[rustfmt::skip]
24const MPEG_BITS_1: [u8; 4] = [
25    1,  3,  2,  3,
26];
27
28#[rustfmt::skip]
29const MPEG_CODES_2: [u32; 9] = [
30    0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002,
31    0x0000,
32];
33
34#[rustfmt::skip]
35const MPEG_BITS_2: [u8; 9] = [
36    1,  3,  6,  3,  3,  5,  5,  5,
37    6,
38];
39
40#[rustfmt::skip]
41const MPEG_CODES_3: [u32; 9] = [
42    0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002,
43    0x0000,
44];
45
46#[rustfmt::skip]
47const MPEG_BITS_3: [u8; 9] = [
48    2,  2,  6,  3,  2,  5,  5,  5,
49    6,
50];
51
52#[rustfmt::skip]
53const MPEG_CODES_5: [u32; 16] = [
54    0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004,
55    0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000,
56];
57
58#[rustfmt::skip]
59const MPEG_BITS_5: [u8; 16] = [
60    1,  3,  6,  7,  3,  3,  6,  7,
61    6,  6,  7,  8,  7,  6,  7,  8,
62];
63
64#[rustfmt::skip]
65const MPEG_CODES_6: [u32; 16] = [
66    0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002,
67    0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000,
68];
69
70#[rustfmt::skip]
71const MPEG_BITS_6: [u8; 16] = [
72    3,  3,  5,  7,  3,  2,  4,  5,
73    4,  4,  5,  6,  6,  5,  6,  7,
74];
75
76#[rustfmt::skip]
77const MPEG_CODES_7: [u32; 36] = [
78    0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003,
79    0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011,
80    0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002,
81    0x0007, 0x0006, 0x0009, 0x000e, 0x0003, 0x0001, 0x0006, 0x0004,
82    0x0005, 0x0003, 0x0002, 0x0000,
83];
84
85#[rustfmt::skip]
86const MPEG_BITS_7: [u8; 36] = [
87    1,  3,  6,  8,  8,  9,  3,  4,
88    6,  7,  7,  8,  6,  5,  7,  8,
89    8,  9,  7,  7,  8,  9,  9,  9,
90    7,  7,  8,  9,  9, 10,  8,  8,
91    9, 10, 10, 10,
92];
93
94#[rustfmt::skip]
95const MPEG_CODES_8: [u32; 36] = [
96    0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001,
97    0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e,
98    0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004,
99    0x000d, 0x0005, 0x0008, 0x000b, 0x0005, 0x0001, 0x000c, 0x0004,
100    0x0004, 0x0001, 0x0001, 0x0000,
101];
102
103#[rustfmt::skip]
104const MPEG_BITS_8: [u8; 36] = [
105    2,  3,  6,  8,  8,  9,  3,  2,
106    4,  8,  8,  8,  6,  4,  6,  8,
107    8,  9,  8,  8,  8,  9,  9, 10,
108    8,  7,  8,  9, 10, 10,  9,  8,
109    9,  9, 11, 11,
110];
111
112#[rustfmt::skip]
113const MPEG_CODES_9: [u32; 36] = [
114    0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004,
115    0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008,
116    0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001,
117    0x000b, 0x0007, 0x0009, 0x0006, 0x0004, 0x0001, 0x000e, 0x0004,
118    0x0006, 0x0002, 0x0006, 0x0000,
119];
120
121#[rustfmt::skip]
122const MPEG_BITS_9: [u8; 36] = [
123    3,  3,  5,  6,  8,  9,  3,  3,
124    4,  5,  6,  8,  4,  4,  5,  6,
125    7,  8,  6,  5,  6,  7,  7,  8,
126    7,  6,  7,  7,  8,  9,  8,  7,
127    8,  8,  9,  9,
128];
129
130#[rustfmt::skip]
131const MPEG_CODES_10: [u32; 64] = [
132    0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011,
133    0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007,
134    0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006,
135    0x000e, 0x000d, 0x0016, 0x0022, 0x002e, 0x0017, 0x0012, 0x0007,
136    0x0014, 0x0013, 0x0021, 0x002f, 0x001b, 0x0016, 0x0009, 0x0003,
137    0x001f, 0x0016, 0x0029, 0x001a, 0x0015, 0x0014, 0x0005, 0x0003,
138    0x000e, 0x000d, 0x000a, 0x000b, 0x0010, 0x0006, 0x0005, 0x0001,
139    0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000,
140];
141
142#[rustfmt::skip]
143const MPEG_BITS_10: [u8; 64] = [
144    1,  3,  6,  8,  9,  9,  9, 10,
145    3,  4,  6,  7,  8,  9,  8,  8,
146    6,  6,  7,  8,  9, 10,  9,  9,
147    7,  7,  8,  9, 10, 10,  9, 10,
148    8,  8,  9, 10, 10, 10, 10, 10,
149    9,  9, 10, 10, 11, 11, 10, 11,
150    8,  8,  9, 10, 10, 10, 11, 11,
151    9,  8,  9, 10, 10, 11, 11, 11,
152];
153
154#[rustfmt::skip]
155const MPEG_CODES_11: [u32; 64] = [
156    0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f,
157    0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a,
158    0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005,
159    0x0019, 0x000b, 0x0013, 0x003b, 0x001b, 0x0012, 0x000c, 0x0005,
160    0x0023, 0x0021, 0x001f, 0x003a, 0x001e, 0x0010, 0x0007, 0x0005,
161    0x001c, 0x001a, 0x0020, 0x0013, 0x0011, 0x000f, 0x0008, 0x000e,
162    0x000e, 0x000c, 0x0009, 0x000d, 0x000e, 0x0009, 0x0004, 0x0001,
163    0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000,
164];
165
166#[rustfmt::skip]
167const MPEG_BITS_11: [u8; 64] = [
168    2,  3,  5,  7,  8,  9,  8,  9,
169    3,  3,  4,  6,  8,  8,  7,  8,
170    5,  5,  6,  7,  8,  9,  8,  8,
171    7,  6,  7,  9,  8, 10,  8,  9,
172    8,  8,  8,  9,  9, 10,  9, 10,
173    8,  8,  9, 10, 10, 11, 10, 11,
174    8,  7,  7,  8,  9, 10, 10, 10,
175    8,  7,  8,  9, 10, 10, 10, 10,
176];
177
178#[rustfmt::skip]
179const MPEG_CODES_12: [u32; 64] = [
180    0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a,
181    0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b,
182    0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007,
183    0x0011, 0x000a, 0x000f, 0x000c, 0x0012, 0x001c, 0x000e, 0x0005,
184    0x0020, 0x000d, 0x0016, 0x0013, 0x0012, 0x0010, 0x0009, 0x0005,
185    0x0028, 0x0011, 0x001f, 0x001d, 0x0011, 0x000d, 0x0004, 0x0002,
186    0x001b, 0x000c, 0x000b, 0x000f, 0x000a, 0x0007, 0x0004, 0x0001,
187    0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000,
188];
189
190#[rustfmt::skip]
191const MPEG_BITS_12: [u8; 64] = [
192    4,  3,  5,  7,  8,  9,  9,  9,
193    3,  3,  4,  5,  7,  7,  8,  8,
194    5,  4,  5,  6,  7,  8,  7,  8,
195    6,  5,  6,  6,  7,  8,  8,  8,
196    7,  6,  7,  7,  8,  8,  8,  9,
197    8,  7,  8,  8,  8,  9,  8,  9,
198    8,  7,  7,  8,  8,  9,  9, 10,
199    9,  8,  8,  9,  9,  9,  9, 10,
200];
201
202#[rustfmt::skip]
203const MPEG_CODES_13: [u32; 256] = [
204    0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047,
205    0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013,
206    0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021,
207    0x001f, 0x0018, 0x0020, 0x0018, 0x001f, 0x0023, 0x0016, 0x000e,
208    0x000f, 0x000d, 0x0017, 0x0024, 0x003b, 0x0031, 0x004d, 0x0041,
209    0x001d, 0x0028, 0x001e, 0x0028, 0x001b, 0x0021, 0x002a, 0x0010,
210    0x0016, 0x0014, 0x0025, 0x003d, 0x0038, 0x004f, 0x0049, 0x0040,
211    0x002b, 0x004c, 0x0038, 0x0025, 0x001a, 0x001f, 0x0019, 0x000e,
212    0x0023, 0x0010, 0x003c, 0x0039, 0x0061, 0x004b, 0x0072, 0x005b,
213    0x0036, 0x0049, 0x0037, 0x0029, 0x0030, 0x0035, 0x0017, 0x0018,
214    0x003a, 0x001b, 0x0032, 0x0060, 0x004c, 0x0046, 0x005d, 0x0054,
215    0x004d, 0x003a, 0x004f, 0x001d, 0x004a, 0x0031, 0x0029, 0x0011,
216    0x002f, 0x002d, 0x004e, 0x004a, 0x0073, 0x005e, 0x005a, 0x004f,
217    0x0045, 0x0053, 0x0047, 0x0032, 0x003b, 0x0026, 0x0024, 0x000f,
218    0x0048, 0x0022, 0x0038, 0x005f, 0x005c, 0x0055, 0x005b, 0x005a,
219    0x0056, 0x0049, 0x004d, 0x0041, 0x0033, 0x002c, 0x002b, 0x002a,
220    0x002b, 0x0014, 0x001e, 0x002c, 0x0037, 0x004e, 0x0048, 0x0057,
221    0x004e, 0x003d, 0x002e, 0x0036, 0x0025, 0x001e, 0x0014, 0x0010,
222    0x0035, 0x0019, 0x0029, 0x0025, 0x002c, 0x003b, 0x0036, 0x0051,
223    0x0042, 0x004c, 0x0039, 0x0036, 0x0025, 0x0012, 0x0027, 0x000b,
224    0x0023, 0x0021, 0x001f, 0x0039, 0x002a, 0x0052, 0x0048, 0x0050,
225    0x002f, 0x003a, 0x0037, 0x0015, 0x0016, 0x001a, 0x0026, 0x0016,
226    0x0035, 0x0019, 0x0017, 0x0026, 0x0046, 0x003c, 0x0033, 0x0024,
227    0x0037, 0x001a, 0x0022, 0x0017, 0x001b, 0x000e, 0x0009, 0x0007,
228    0x0022, 0x0020, 0x001c, 0x0027, 0x0031, 0x004b, 0x001e, 0x0034,
229    0x0030, 0x0028, 0x0034, 0x001c, 0x0012, 0x0011, 0x0009, 0x0005,
230    0x002d, 0x0015, 0x0022, 0x0040, 0x0038, 0x0032, 0x0031, 0x002d,
231    0x001f, 0x0013, 0x000c, 0x000f, 0x000a, 0x0007, 0x0006, 0x0003,
232    0x0030, 0x0017, 0x0014, 0x0027, 0x0024, 0x0023, 0x0035, 0x0015,
233    0x0010, 0x0017, 0x000d, 0x000a, 0x0006, 0x0001, 0x0004, 0x0002,
234    0x0010, 0x000f, 0x0011, 0x001b, 0x0019, 0x0014, 0x001d, 0x000b,
235    0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001,
236];
237
238#[rustfmt::skip]
239const MPEG_BITS_13: [u8; 256] = [
240     1,  4,  6,  7,  8,  9,  9, 10,
241     9, 10, 11, 11, 12, 12, 13, 13,
242     3,  4,  6,  7,  8,  8,  9,  9,
243     9,  9, 10, 10, 11, 12, 12, 12,
244     6,  6,  7,  8,  9,  9, 10, 10,
245     9, 10, 10, 11, 11, 12, 13, 13,
246     7,  7,  8,  9,  9, 10, 10, 10,
247    10, 11, 11, 11, 11, 12, 13, 13,
248     8,  7,  9,  9, 10, 10, 11, 11,
249    10, 11, 11, 12, 12, 13, 13, 14,
250     9,  8,  9, 10, 10, 10, 11, 11,
251    11, 11, 12, 11, 13, 13, 14, 14,
252     9,  9, 10, 10, 11, 11, 11, 11,
253    11, 12, 12, 12, 13, 13, 14, 14,
254    10,  9, 10, 11, 11, 11, 12, 12,
255    12, 12, 13, 13, 13, 14, 16, 16,
256     9,  8,  9, 10, 10, 11, 11, 12,
257    12, 12, 12, 13, 13, 14, 15, 15,
258    10,  9, 10, 10, 11, 11, 11, 13,
259    12, 13, 13, 14, 14, 14, 16, 15,
260    10, 10, 10, 11, 11, 12, 12, 13,
261    12, 13, 14, 13, 14, 15, 16, 17,
262    11, 10, 10, 11, 12, 12, 12, 12,
263    13, 13, 13, 14, 15, 15, 15, 16,
264    11, 11, 11, 12, 12, 13, 12, 13,
265    14, 14, 15, 15, 15, 16, 16, 16,
266    12, 11, 12, 13, 13, 13, 14, 14,
267    14, 14, 14, 15, 16, 15, 16, 16,
268    13, 12, 12, 13, 13, 13, 15, 14,
269    14, 17, 15, 15, 15, 17, 16, 16,
270    12, 12, 13, 14, 14, 14, 15, 14,
271    15, 15, 16, 16, 19, 18, 19, 16,
272];
273
274#[rustfmt::skip]
275const MPEG_CODES_15: [u32; 256] = [
276    0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c,
277    0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f,
278    0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033,
279    0x002a, 0x0046, 0x0034, 0x0053, 0x0041, 0x0029, 0x003b, 0x0024,
280    0x0013, 0x0011, 0x000f, 0x0018, 0x0029, 0x0022, 0x003b, 0x0030,
281    0x0028, 0x0040, 0x0032, 0x004e, 0x003e, 0x0050, 0x0038, 0x0021,
282    0x001d, 0x001c, 0x0019, 0x002b, 0x0027, 0x003f, 0x0037, 0x005d,
283    0x004c, 0x003b, 0x005d, 0x0048, 0x0036, 0x004b, 0x0032, 0x001d,
284    0x0034, 0x0016, 0x002a, 0x0028, 0x0043, 0x0039, 0x005f, 0x004f,
285    0x0048, 0x0039, 0x0059, 0x0045, 0x0031, 0x0042, 0x002e, 0x001b,
286    0x004d, 0x0025, 0x0023, 0x0042, 0x003a, 0x0034, 0x005b, 0x004a,
287    0x003e, 0x0030, 0x004f, 0x003f, 0x005a, 0x003e, 0x0028, 0x0026,
288    0x007d, 0x0020, 0x003c, 0x0038, 0x0032, 0x005c, 0x004e, 0x0041,
289    0x0037, 0x0057, 0x0047, 0x0033, 0x0049, 0x0033, 0x0046, 0x001e,
290    0x006d, 0x0035, 0x0031, 0x005e, 0x0058, 0x004b, 0x0042, 0x007a,
291    0x005b, 0x0049, 0x0038, 0x002a, 0x0040, 0x002c, 0x0015, 0x0019,
292    0x005a, 0x002b, 0x0029, 0x004d, 0x0049, 0x003f, 0x0038, 0x005c,
293    0x004d, 0x0042, 0x002f, 0x0043, 0x0030, 0x0035, 0x0024, 0x0014,
294    0x0047, 0x0022, 0x0043, 0x003c, 0x003a, 0x0031, 0x0058, 0x004c,
295    0x0043, 0x006a, 0x0047, 0x0036, 0x0026, 0x0027, 0x0017, 0x000f,
296    0x006d, 0x0035, 0x0033, 0x002f, 0x005a, 0x0052, 0x003a, 0x0039,
297    0x0030, 0x0048, 0x0039, 0x0029, 0x0017, 0x001b, 0x003e, 0x0009,
298    0x0056, 0x002a, 0x0028, 0x0025, 0x0046, 0x0040, 0x0034, 0x002b,
299    0x0046, 0x0037, 0x002a, 0x0019, 0x001d, 0x0012, 0x000b, 0x000b,
300    0x0076, 0x0044, 0x001e, 0x0037, 0x0032, 0x002e, 0x004a, 0x0041,
301    0x0031, 0x0027, 0x0018, 0x0010, 0x0016, 0x000d, 0x000e, 0x0007,
302    0x005b, 0x002c, 0x0027, 0x0026, 0x0022, 0x003f, 0x0034, 0x002d,
303    0x001f, 0x0034, 0x001c, 0x0013, 0x000e, 0x0008, 0x0009, 0x0003,
304    0x007b, 0x003c, 0x003a, 0x0035, 0x002f, 0x002b, 0x0020, 0x0016,
305    0x0025, 0x0018, 0x0011, 0x000c, 0x000f, 0x000a, 0x0002, 0x0001,
306    0x0047, 0x0025, 0x0022, 0x001e, 0x001c, 0x0014, 0x0011, 0x001a,
307    0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000,
308];
309
310#[rustfmt::skip]
311const MPEG_BITS_15: [u8; 256] = [
312     3,  4,  5,  7,  7,  8,  9,  9,
313     9, 10, 10, 11, 11, 11, 12, 13,
314     4,  3,  5,  6,  7,  7,  8,  8,
315     8,  9,  9, 10, 10, 10, 11, 11,
316     5,  5,  5,  6,  7,  7,  8,  8,
317     8,  9,  9, 10, 10, 11, 11, 11,
318     6,  6,  6,  7,  7,  8,  8,  9,
319     9,  9, 10, 10, 10, 11, 11, 11,
320     7,  6,  7,  7,  8,  8,  9,  9,
321     9,  9, 10, 10, 10, 11, 11, 11,
322     8,  7,  7,  8,  8,  8,  9,  9,
323     9,  9, 10, 10, 11, 11, 11, 12,
324     9,  7,  8,  8,  8,  9,  9,  9,
325     9, 10, 10, 10, 11, 11, 12, 12,
326     9,  8,  8,  9,  9,  9,  9, 10,
327    10, 10, 10, 10, 11, 11, 11, 12,
328     9,  8,  8,  9,  9,  9,  9, 10,
329    10, 10, 10, 11, 11, 12, 12, 12,
330     9,  8,  9,  9,  9,  9, 10, 10,
331    10, 11, 11, 11, 11, 12, 12, 12,
332    10,  9,  9,  9, 10, 10, 10, 10,
333    10, 11, 11, 11, 11, 12, 13, 12,
334    10,  9,  9,  9, 10, 10, 10, 10,
335    11, 11, 11, 11, 12, 12, 12, 13,
336    11, 10,  9, 10, 10, 10, 11, 11,
337    11, 11, 11, 11, 12, 12, 13, 13,
338    11, 10, 10, 10, 10, 11, 11, 11,
339    11, 12, 12, 12, 12, 12, 13, 13,
340    12, 11, 11, 11, 11, 11, 11, 11,
341    12, 12, 12, 12, 13, 13, 12, 13,
342    12, 11, 11, 11, 11, 11, 11, 12,
343    12, 12, 12, 12, 13, 13, 13, 13,
344];
345
346#[rustfmt::skip]
347const MPEG_CODES_16: [u32; 256] = [
348    0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d,
349    0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011,
350    0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f,
351    0x0053, 0x004b, 0x0044, 0x0077, 0x00c9, 0x006b, 0x00cf, 0x0009,
352    0x000f, 0x000d, 0x0017, 0x0026, 0x0043, 0x003a, 0x0067, 0x005a,
353    0x00a1, 0x0048, 0x007f, 0x0075, 0x006e, 0x00d1, 0x00ce, 0x0010,
354    0x002d, 0x0015, 0x0027, 0x0045, 0x0040, 0x0072, 0x0063, 0x0057,
355    0x009e, 0x008c, 0x00fc, 0x00d4, 0x00c7, 0x0183, 0x016d, 0x001a,
356    0x004b, 0x0024, 0x0044, 0x0041, 0x0073, 0x0065, 0x00b3, 0x00a4,
357    0x009b, 0x0108, 0x00f6, 0x00e2, 0x018b, 0x017e, 0x016a, 0x0009,
358    0x0042, 0x001e, 0x003b, 0x0038, 0x0066, 0x00b9, 0x00ad, 0x0109,
359    0x008e, 0x00fd, 0x00e8, 0x0190, 0x0184, 0x017a, 0x01bd, 0x0010,
360    0x006f, 0x0036, 0x0034, 0x0064, 0x00b8, 0x00b2, 0x00a0, 0x0085,
361    0x0101, 0x00f4, 0x00e4, 0x00d9, 0x0181, 0x016e, 0x02cb, 0x000a,
362    0x0062, 0x0030, 0x005b, 0x0058, 0x00a5, 0x009d, 0x0094, 0x0105,
363    0x00f8, 0x0197, 0x018d, 0x0174, 0x017c, 0x0379, 0x0374, 0x0008,
364    0x0055, 0x0054, 0x0051, 0x009f, 0x009c, 0x008f, 0x0104, 0x00f9,
365    0x01ab, 0x0191, 0x0188, 0x017f, 0x02d7, 0x02c9, 0x02c4, 0x0007,
366    0x009a, 0x004c, 0x0049, 0x008d, 0x0083, 0x0100, 0x00f5, 0x01aa,
367    0x0196, 0x018a, 0x0180, 0x02df, 0x0167, 0x02c6, 0x0160, 0x000b,
368    0x008b, 0x0081, 0x0043, 0x007d, 0x00f7, 0x00e9, 0x00e5, 0x00db,
369    0x0189, 0x02e7, 0x02e1, 0x02d0, 0x0375, 0x0372, 0x01b7, 0x0004,
370    0x00f3, 0x0078, 0x0076, 0x0073, 0x00e3, 0x00df, 0x018c, 0x02ea,
371    0x02e6, 0x02e0, 0x02d1, 0x02c8, 0x02c2, 0x00df, 0x01b4, 0x0006,
372    0x00ca, 0x00e0, 0x00de, 0x00da, 0x00d8, 0x0185, 0x0182, 0x017d,
373    0x016c, 0x0378, 0x01bb, 0x02c3, 0x01b8, 0x01b5, 0x06c0, 0x0004,
374    0x02eb, 0x00d3, 0x00d2, 0x00d0, 0x0172, 0x017b, 0x02de, 0x02d3,
375    0x02ca, 0x06c7, 0x0373, 0x036d, 0x036c, 0x0d83, 0x0361, 0x0002,
376    0x0179, 0x0171, 0x0066, 0x00bb, 0x02d6, 0x02d2, 0x0166, 0x02c7,
377    0x02c5, 0x0362, 0x06c6, 0x0367, 0x0d82, 0x0366, 0x01b2, 0x0000,
378    0x000c, 0x000a, 0x0007, 0x000b, 0x000a, 0x0011, 0x000b, 0x0009,
379    0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
380];
381
382#[rustfmt::skip]
383const MPEG_BITS_16: [u8; 256] = [
384     1,  4,  6,  8,  9,  9, 10, 10,
385    11, 11, 11, 12, 12, 12, 13,  9,
386     3,  4,  6,  7,  8,  9,  9,  9,
387    10, 10, 10, 11, 12, 11, 12,  8,
388     6,  6,  7,  8,  9,  9, 10, 10,
389    11, 10, 11, 11, 11, 12, 12,  9,
390     8,  7,  8,  9,  9, 10, 10, 10,
391    11, 11, 12, 12, 12, 13, 13, 10,
392     9,  8,  9,  9, 10, 10, 11, 11,
393    11, 12, 12, 12, 13, 13, 13,  9,
394     9,  8,  9,  9, 10, 11, 11, 12,
395    11, 12, 12, 13, 13, 13, 14, 10,
396    10,  9,  9, 10, 11, 11, 11, 11,
397    12, 12, 12, 12, 13, 13, 14, 10,
398    10,  9, 10, 10, 11, 11, 11, 12,
399    12, 13, 13, 13, 13, 15, 15, 10,
400    10, 10, 10, 11, 11, 11, 12, 12,
401    13, 13, 13, 13, 14, 14, 14, 10,
402    11, 10, 10, 11, 11, 12, 12, 13,
403    13, 13, 13, 14, 13, 14, 13, 11,
404    11, 11, 10, 11, 12, 12, 12, 12,
405    13, 14, 14, 14, 15, 15, 14, 10,
406    12, 11, 11, 11, 12, 12, 13, 14,
407    14, 14, 14, 14, 14, 13, 14, 11,
408    12, 12, 12, 12, 12, 13, 13, 13,
409    13, 15, 14, 14, 14, 14, 16, 11,
410    14, 12, 12, 12, 13, 13, 14, 14,
411    14, 16, 15, 15, 15, 17, 15, 11,
412    13, 13, 11, 12, 14, 14, 13, 14,
413    14, 15, 16, 15, 17, 15, 14, 11,
414     9,  8,  8,  9,  9, 10, 10, 10,
415    11, 11, 11, 11, 11, 11, 11,  8,
416];
417
418#[rustfmt::skip]
419const MPEG_CODES_24: [u32; 256] = [
420    0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2,
421    0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058,
422    0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8,
423    0x00d1, 0x00c6, 0x0147, 0x0159, 0x013f, 0x0129, 0x0117, 0x002a,
424    0x002f, 0x0016, 0x0029, 0x004a, 0x0044, 0x0080, 0x0078, 0x00dd,
425    0x00cf, 0x00c2, 0x00b6, 0x0154, 0x013b, 0x0127, 0x021d, 0x0012,
426    0x0051, 0x0027, 0x004b, 0x0046, 0x0086, 0x007d, 0x0074, 0x00dc,
427    0x00cc, 0x00be, 0x00b2, 0x0145, 0x0137, 0x0125, 0x010f, 0x0010,
428    0x0093, 0x0048, 0x0045, 0x0087, 0x007f, 0x0076, 0x0070, 0x00d2,
429    0x00c8, 0x00bc, 0x0160, 0x0143, 0x0132, 0x011d, 0x021c, 0x000e,
430    0x0107, 0x0042, 0x0081, 0x007e, 0x0077, 0x0072, 0x00d6, 0x00ca,
431    0x00c0, 0x00b4, 0x0155, 0x013d, 0x012d, 0x0119, 0x0106, 0x000c,
432    0x00f9, 0x007b, 0x0079, 0x0075, 0x0071, 0x00d7, 0x00ce, 0x00c3,
433    0x00b9, 0x015b, 0x014a, 0x0134, 0x0123, 0x0110, 0x0208, 0x000a,
434    0x01b3, 0x0073, 0x006f, 0x006d, 0x00d3, 0x00cb, 0x00c4, 0x00bb,
435    0x0161, 0x014c, 0x0139, 0x012a, 0x011b, 0x0213, 0x017d, 0x0011,
436    0x01ab, 0x00d4, 0x00d0, 0x00cd, 0x00c9, 0x00c1, 0x00ba, 0x00b1,
437    0x00a9, 0x0140, 0x012f, 0x011e, 0x010c, 0x0202, 0x0179, 0x0010,
438    0x014f, 0x00c7, 0x00c5, 0x00bf, 0x00bd, 0x00b5, 0x00ae, 0x014d,
439    0x0141, 0x0131, 0x0121, 0x0113, 0x0209, 0x017b, 0x0173, 0x000b,
440    0x029c, 0x00b8, 0x00b7, 0x00b3, 0x00af, 0x0158, 0x014b, 0x013a,
441    0x0130, 0x0122, 0x0115, 0x0212, 0x017f, 0x0175, 0x016e, 0x000a,
442    0x028c, 0x015a, 0x00ab, 0x00a8, 0x00a4, 0x013e, 0x0135, 0x012b,
443    0x011f, 0x0114, 0x0107, 0x0201, 0x0177, 0x0170, 0x016a, 0x0006,
444    0x0288, 0x0142, 0x013c, 0x0138, 0x0133, 0x012e, 0x0124, 0x011c,
445    0x010d, 0x0105, 0x0200, 0x0178, 0x0172, 0x016c, 0x0167, 0x0004,
446    0x026c, 0x012c, 0x0128, 0x0126, 0x0120, 0x011a, 0x0111, 0x010a,
447    0x0203, 0x017c, 0x0176, 0x0171, 0x016d, 0x0169, 0x0165, 0x0002,
448    0x0409, 0x0118, 0x0116, 0x0112, 0x010b, 0x0108, 0x0103, 0x017e,
449    0x017a, 0x0174, 0x016f, 0x016b, 0x0168, 0x0166, 0x0164, 0x0000,
450    0x002b, 0x0014, 0x0013, 0x0011, 0x000f, 0x000d, 0x000b, 0x0009,
451    0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
452];
453
454#[rustfmt::skip]
455const MPEG_BITS_24: [u8; 256] = [
456     4,  4,  6,  7,  8,  9,  9, 10,
457    10, 11, 11, 11, 11, 11, 12,  9,
458     4,  4,  5,  6,  7,  8,  8,  9,
459     9,  9, 10, 10, 10, 10, 10,  8,
460     6,  5,  6,  7,  7,  8,  8,  9,
461     9,  9,  9, 10, 10, 10, 11,  7,
462     7,  6,  7,  7,  8,  8,  8,  9,
463     9,  9,  9, 10, 10, 10, 10,  7,
464     8,  7,  7,  8,  8,  8,  8,  9,
465     9,  9, 10, 10, 10, 10, 11,  7,
466     9,  7,  8,  8,  8,  8,  9,  9,
467     9,  9, 10, 10, 10, 10, 10,  7,
468     9,  8,  8,  8,  8,  9,  9,  9,
469     9, 10, 10, 10, 10, 10, 11,  7,
470    10,  8,  8,  8,  9,  9,  9,  9,
471    10, 10, 10, 10, 10, 11, 11,  8,
472    10,  9,  9,  9,  9,  9,  9,  9,
473     9, 10, 10, 10, 10, 11, 11,  8,
474    10,  9,  9,  9,  9,  9,  9, 10,
475    10, 10, 10, 10, 11, 11, 11,  8,
476    11,  9,  9,  9,  9, 10, 10, 10,
477    10, 10, 10, 11, 11, 11, 11,  8,
478    11, 10,  9,  9,  9, 10, 10, 10,
479    10, 10, 10, 11, 11, 11, 11,  8,
480    11, 10, 10, 10, 10, 10, 10, 10,
481    10, 10, 11, 11, 11, 11, 11,  8,
482    11, 10, 10, 10, 10, 10, 10, 10,
483    11, 11, 11, 11, 11, 11, 11,  8,
484    12, 10, 10, 10, 10, 10, 10, 11,
485    11, 11, 11, 11, 11, 11, 11,  8,
486    8,   7,  7,  7,  7,  7,  7,  7,
487    7,   7,  7,  8,  8,  8,  8,  4,
488];
489
490const MPEG_QUADS_CODES_A: [u32; 16] = [1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1];
491const MPEG_QUADS_BITS_A: [u8; 16] = [1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6];
492
493const MPEG_QUADS_CODES_B: [u32; 16] = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
494const MPEG_QUADS_BITS_B: [u8; 16] = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4];
495
496struct MpegTable {
497    codes: &'static [u32],
498    lens: &'static [u8],
499    wrap: u16,
500}
501struct MpegQuadsTable {
502    codes: &'static [u32],
503    lens: &'static [u8],
504    wrap: u16,
505}
506
507const MPEG_TABLES: [MpegTable; 18] = [
508    // Table 0
509    MpegTable { codes: &MPEG_CODES_0, lens: &MPEG_BITS_0, wrap: 0x0 },
510    // Table 1
511    MpegTable { codes: &MPEG_CODES_1, lens: &MPEG_BITS_1, wrap: 0x2 },
512    // Table 2
513    MpegTable { codes: &MPEG_CODES_2, lens: &MPEG_BITS_2, wrap: 0x3 },
514    // Table 3
515    MpegTable { codes: &MPEG_CODES_3, lens: &MPEG_BITS_3, wrap: 0x3 },
516    // Table 4 (not used)
517    MpegTable { codes: &MPEG_CODES_0, lens: &MPEG_BITS_0, wrap: 0x0 },
518    // Table 5
519    MpegTable { codes: &MPEG_CODES_5, lens: &MPEG_BITS_5, wrap: 0x4 },
520    // Table 6
521    MpegTable { codes: &MPEG_CODES_6, lens: &MPEG_BITS_6, wrap: 0x4 },
522    // Table 7
523    MpegTable { codes: &MPEG_CODES_7, lens: &MPEG_BITS_7, wrap: 0x6 },
524    // Table 8
525    MpegTable { codes: &MPEG_CODES_8, lens: &MPEG_BITS_8, wrap: 0x6 },
526    // Table 9
527    MpegTable { codes: &MPEG_CODES_9, lens: &MPEG_BITS_9, wrap: 0x6 },
528    // Table 10
529    MpegTable { codes: &MPEG_CODES_10, lens: &MPEG_BITS_10, wrap: 0x8 },
530    // Table 11
531    MpegTable { codes: &MPEG_CODES_11, lens: &MPEG_BITS_11, wrap: 0x8 },
532    // Table 12
533    MpegTable { codes: &MPEG_CODES_12, lens: &MPEG_BITS_12, wrap: 0x8 },
534    // Table 13
535    MpegTable { codes: &MPEG_CODES_13, lens: &MPEG_BITS_13, wrap: 0x10 },
536    // Table 14 (not used)
537    MpegTable { codes: &MPEG_CODES_0, lens: &MPEG_BITS_0, wrap: 0x0 },
538    // Table 15
539    MpegTable { codes: &MPEG_CODES_15, lens: &MPEG_BITS_15, wrap: 0x10 },
540    // Tables 16..24 (number of linbits vary)
541    MpegTable { codes: &MPEG_CODES_16, lens: &MPEG_BITS_16, wrap: 0x10 },
542    // Tables 24..32 (number of linbits vary)
543    MpegTable { codes: &MPEG_CODES_24, lens: &MPEG_BITS_24, wrap: 0x10 },
544];
545
546const MPEG_QUADS_TABLES: [MpegQuadsTable; 2] = [
547    // Table A
548    MpegQuadsTable { codes: &MPEG_QUADS_CODES_A, lens: &MPEG_QUADS_BITS_A, wrap: 0x10 },
549    // Table B
550    MpegQuadsTable { codes: &MPEG_QUADS_CODES_B, lens: &MPEG_QUADS_BITS_B, wrap: 0x10 },
551];
552
553pub const CODEBOOK_LINBITS: [u32; 32] = [
554    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 4, 5, 6, 7, 8, 9, 11,
555    13,
556];
557
558fn mpeg_gen_value(i: u16, wrap: u16) -> u16 {
559    ((i / wrap) << 4) | (i % wrap)
560}
561
562lazy_static! {
563    pub static ref CODEBOOK_TABLES: [Codebook<Entry16x16>; 18] = {
564        let mut codebooks: [Codebook<Entry16x16>; 18] = Default::default();
565
566        for (codebook, table) in codebooks.iter_mut().zip(&MPEG_TABLES) {
567            assert!(table.codes.len() == table.lens.len());
568
569            let len = table.codes.len() as u16;
570
571            // Generate values for the codebook.
572            let values: Vec<u16> = (0..len).map(|i| mpeg_gen_value(i, table.wrap))
573                                           .collect();
574
575            // Generate the codebook.
576            let mut builder = CodebookBuilder::new(BitOrder::Verbatim);
577
578            // Decode a maximum of 8 bits per read.
579            builder.bits_per_read(8);
580
581            *codebook = builder.make(table.codes, table.lens, &values).unwrap();
582        }
583
584        codebooks
585    };
586}
587
588lazy_static! {
589    pub static ref QUADS_CODEBOOK_TABLE: [Codebook<Entry16x16>; 2] = {
590        let mut codebooks: [Codebook<Entry16x16>; 2] = Default::default();
591
592        for (codebook, table) in codebooks.iter_mut().zip(&MPEG_QUADS_TABLES) {
593            assert!(table.codes.len() == table.lens.len());
594
595            let len = table.codes.len() as u16;
596
597            // Generate values for the codebook.
598            let values: Vec<u16> = (0..len).map(|i| mpeg_gen_value(i, table.wrap))
599                                           .collect();
600
601            // Generate the codebook.
602            let mut builder = CodebookBuilder::new(BitOrder::Verbatim);
603
604            // Decode a maximum of 8 bits per read.
605            builder.bits_per_read(8);
606
607            *codebook = builder.make(table.codes, table.lens, &values).unwrap();
608        }
609
610        codebooks
611    };
612}