add LinePack decoder
[nihav.git] / nihav-mpeg / src / codecs / mpegaudio / mp3data.rs
1 use nihav_core::io::codebook::*;
2
3 pub const MP3_BANDS: usize = 21;
4 pub const MP3_BANDS_SHORT: usize = 12;
5
6 pub const MP3_PREEMP_SCALES: [i8; MP3_BANDS + 1] = [
7 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
8 ];
9
10 pub const MP3_ISTEREO_COEFFS: [f32; 7] = [
11 1.0, 0.78867513459481288226, 0.63397459621556135323, 0.5,
12 0.36602540378443864677, 0.21132486540518711774, 0.0
13 ];
14
15 pub const SCFSI_FROM_BAND: [usize; MP3_BANDS] = [
16 0, 0, 0, 0, 0, 0,
17 1, 1, 1, 1, 1,
18 2, 2, 2, 2, 2,
19 3, 3, 3, 3, 3
20 ];
21
22 pub const MP3_SCALEFAC_BITS1: [u8; 16] = [ 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 ];
23 pub const MP3_SCALEFAC_BITS2: [u8; 16] = [ 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 ];
24
25 pub const MP3_SFB_LONG_OFFS: [[usize; MP3_BANDS + 2]; 9] = [
26 [ // 44.1
27 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576
28 ], [ // 48
29 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576
30 ], [ // 32
31 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576
32 ], [ // 22.05
33 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
34 ], [ // 24
35 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576
36 ], [ // 16
37 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
38 ], [ // 11.025
39 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
40 ], [ // 12
41 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
42 ], [ // 8
43 0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576
44 ]
45 ];
46
47 pub const MP3_SFB_SHORT_OFFS: [[usize; MP3_BANDS_SHORT + 2]; 9] = [
48 [ 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192 ], // 44.1
49 [ 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192 ], // 48
50 [ 0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192 ], // 32
51 [ 0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192 ], // 22.05
52 [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192 ], // 24
53 [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 16
54 [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 11.025
55 [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 12
56 [ 0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192 ], // 8
57 ];
58 pub const MP3_SFB_SHORT_SIZE: [[usize; MP3_BANDS_SHORT + 1]; 9] = [
59 [ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56 ], // 44.1
60 [ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66 ], // 48
61 [ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12 ], // 32
62 [ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18 ], // 22.05
63 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12 ], // 24
64 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 16
65 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 11.025
66 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 12
67 [ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26 ], // 8
68 ];
69
70 pub const MP3_SCF_BITS3: [u8; 12 * 2] = [
71 0, 0, 0, 1, 0, 2,
72 1, 0, 1, 1, 1, 2,
73 2, 0, 2, 1, 2, 2,
74 3, 0, 3, 1, 3, 2
75 ];
76 pub const MP3_SCF_BITS5: [u8; 25 * 2] = [
77 0, 0, 0, 1, 0, 2, 0, 3, 0, 4,
78 1, 0, 1, 1, 1, 2, 1, 3, 1, 4,
79 2, 0, 2, 1, 2, 2, 2, 3, 2, 4,
80 3, 0, 3, 1, 3, 2, 3, 3, 3, 4,
81 4, 0, 4, 1, 4, 2, 4, 3, 4, 4
82 ];
83 pub const MP3_SCF_BITS6: [u8; 180 * 3] = [
84 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5,
85 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 4, 0, 1, 5,
86 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 2, 3, 0, 2, 4, 0, 2, 5,
87 0, 3, 0, 0, 3, 1, 0, 3, 2, 0, 3, 3, 0, 3, 4, 0, 3, 5,
88 0, 4, 0, 0, 4, 1, 0, 4, 2, 0, 4, 3, 0, 4, 4, 0, 4, 5,
89 0, 5, 0, 0, 5, 1, 0, 5, 2, 0, 5, 3, 0, 5, 4, 0, 5, 5,
90 1, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 5,
91 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 4, 1, 1, 5,
92 1, 2, 0, 1, 2, 1, 1, 2, 2, 1, 2, 3, 1, 2, 4, 1, 2, 5,
93 1, 3, 0, 1, 3, 1, 1, 3, 2, 1, 3, 3, 1, 3, 4, 1, 3, 5,
94 1, 4, 0, 1, 4, 1, 1, 4, 2, 1, 4, 3, 1, 4, 4, 1, 4, 5,
95 1, 5, 0, 1, 5, 1, 1, 5, 2, 1, 5, 3, 1, 5, 4, 1, 5, 5,
96 2, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5,
97 2, 1, 0, 2, 1, 1, 2, 1, 2, 2, 1, 3, 2, 1, 4, 2, 1, 5,
98 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 5,
99 2, 3, 0, 2, 3, 1, 2, 3, 2, 2, 3, 3, 2, 3, 4, 2, 3, 5,
100 2, 4, 0, 2, 4, 1, 2, 4, 2, 2, 4, 3, 2, 4, 4, 2, 4, 5,
101 2, 5, 0, 2, 5, 1, 2, 5, 2, 2, 5, 3, 2, 5, 4, 2, 5, 5,
102 3, 0, 0, 3, 0, 1, 3, 0, 2, 3, 0, 3, 3, 0, 4, 3, 0, 5,
103 3, 1, 0, 3, 1, 1, 3, 1, 2, 3, 1, 3, 3, 1, 4, 3, 1, 5,
104 3, 2, 0, 3, 2, 1, 3, 2, 2, 3, 2, 3, 3, 2, 4, 3, 2, 5,
105 3, 3, 0, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 5,
106 3, 4, 0, 3, 4, 1, 3, 4, 2, 3, 4, 3, 3, 4, 4, 3, 4, 5,
107 3, 5, 0, 3, 5, 1, 3, 5, 2, 3, 5, 3, 3, 5, 4, 3, 5, 5,
108 4, 0, 0, 4, 0, 1, 4, 0, 2, 4, 0, 3, 4, 0, 4, 4, 0, 5,
109 4, 1, 0, 4, 1, 1, 4, 1, 2, 4, 1, 3, 4, 1, 4, 4, 1, 5,
110 4, 2, 0, 4, 2, 1, 4, 2, 2, 4, 2, 3, 4, 2, 4, 4, 2, 5,
111 4, 3, 0, 4, 3, 1, 4, 3, 2, 4, 3, 3, 4, 3, 4, 4, 3, 5,
112 4, 4, 0, 4, 4, 1, 4, 4, 2, 4, 4, 3, 4, 4, 4, 4, 4, 5,
113 4, 5, 0, 4, 5, 1, 4, 5, 2, 4, 5, 3, 4, 5, 4, 4, 5, 5
114 ];
115
116 pub const MP3_SCF_ENDS: [[[usize; 4]; 3]; 6] = [
117 [ [ 6, 11, 16, 21 ], [ 9, 18, 27, 36 ], [ 6, 15, 27, 33 ] ],
118 [ [ 6, 11, 18, 21 ], [ 9, 18, 30, 36 ], [ 6, 15, 27, 33 ] ],
119 [ [ 11, 21, 21, 21 ], [ 18, 36, 36, 36 ], [ 15, 33, 33, 33 ] ],
120 [ [ 7, 14, 21, 21 ], [ 12, 24, 36, 36 ], [ 6, 21, 33, 33 ] ],
121 [ [ 6, 12, 18, 21 ], [ 12, 21, 30, 36 ], [ 6, 18, 27, 33 ] ],
122 [ [ 8, 16, 21, 21 ], [ 15, 27, 36, 36 ], [ 6, 24, 33, 33 ] ]
123 ];
124
125 const MP3_HUFF_QUAD_A_BITS: [u8; 16] = [ 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 ];
126 const MP3_HUFF_QUAD_A_LENS: [u8; 16] = [ 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6 ];
127
128 const MP3_HUFF1_BITS: [u8; 4] = [ 1, 1, 1, 0 ];
129 const MP3_HUFF1_LENS: [u8; 4] = [ 1, 3, 2, 3 ];
130 const MP3_HUFF2_BITS: [u8; 9] = [ 1, 2, 1, 3, 1, 1, 3, 2, 0 ];
131 const MP3_HUFF2_LENS: [u8; 9] = [ 1, 3, 6, 3, 3, 5, 5, 5, 6 ];
132 const MP3_HUFF3_BITS: [u8; 9] = [ 3, 2, 1, 1, 1, 1, 3, 2, 0 ];
133 const MP3_HUFF3_LENS: [u8; 9] = [ 2, 2, 6, 3, 2, 5, 5, 5, 6 ];
134 const MP3_HUFF5_BITS: [u8; 16] = [ 1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0 ];
135 const MP3_HUFF5_LENS: [u8; 16] = [ 1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8 ];
136 const MP3_HUFF6_BITS: [u8; 16] = [ 7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0 ];
137 const MP3_HUFF6_LENS: [u8; 16] = [ 3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7 ];
138 const MP3_HUFF7_BITS: [u8; 36] = [
139 0x01, 0x02, 0x0A, 0x13, 0x10, 0x0A, 0x03, 0x03,
140 0x07, 0x0A, 0x05, 0x03, 0x0B, 0x04, 0x0D, 0x11,
141 0x08, 0x04, 0x0C, 0x0B, 0x12, 0x0F, 0x0B, 0x02,
142 0x07, 0x06, 0x09, 0x0E, 0x03, 0x01, 0x06, 0x04,
143 0x05, 0x03, 0x02, 0x00
144 ];
145 const MP3_HUFF7_LENS: [u8; 36] = [
146 1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8,
147 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8,
148 9, 10, 10, 10
149 ];
150 const MP3_HUFF8_BITS: [u8; 36] = [
151 0x03, 0x04, 0x06, 0x12, 0x0C, 0x05, 0x05, 0x01,
152 0x02, 0x10, 0x09, 0x03, 0x07, 0x03, 0x05, 0x0E,
153 0x07, 0x03, 0x13, 0x11, 0x0F, 0x0D, 0x0A, 0x04,
154 0x0D, 0x05, 0x08, 0x0B, 0x05, 0x01, 0x0C, 0x04,
155 0x04, 0x01, 0x01, 0x00
156 ];
157 const MP3_HUFF8_LENS: [u8; 36] = [
158 2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8,
159 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8,
160 9, 9, 11, 11
161 ];
162 const MP3_HUFF9_BITS: [u8; 36] = [
163 0x07, 0x05, 0x09, 0x0E, 0x0F, 0x07, 0x06, 0x04,
164 0x05, 0x05, 0x06, 0x07, 0x07, 0x06, 0x08, 0x08,
165 0x08, 0x05, 0x0F, 0x06, 0x09, 0x0A, 0x05, 0x01,
166 0x0B, 0x07, 0x09, 0x06, 0x04, 0x01, 0x0E, 0x04,
167 0x06, 0x02, 0x06, 0x00
168 ];
169 const MP3_HUFF9_LENS: [u8; 36] = [
170 3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6,
171 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7,
172 8, 8, 9, 9
173 ];
174 const MP3_HUFF10_BITS: [u8; 64] = [
175 0x01, 0x02, 0x0A, 0x17, 0x23, 0x1E, 0x0C, 0x11,
176 0x03, 0x03, 0x08, 0x0C, 0x12, 0x15, 0x0C, 0x07,
177 0x0B, 0x09, 0x0F, 0x15, 0x20, 0x28, 0x13, 0x06,
178 0x0E, 0x0D, 0x16, 0x22, 0x2E, 0x17, 0x12, 0x07,
179 0x14, 0x13, 0x21, 0x2F, 0x1B, 0x16, 0x09, 0x03,
180 0x1F, 0x16, 0x29, 0x1A, 0x15, 0x14, 0x05, 0x03,
181 0x0E, 0x0D, 0x0A, 0x0B, 0x10, 0x06, 0x05, 0x01,
182 0x09, 0x08, 0x07, 0x08, 0x04, 0x04, 0x02, 0x00
183 ];
184 const MP3_HUFF10_LENS: [u8; 64] = [
185 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8,
186 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10,
187 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11,
188 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11
189 ];
190 const MP3_HUFF11_BITS: [u8; 64] = [
191 0x03, 0x04, 0x0A, 0x18, 0x22, 0x21, 0x15, 0x0F,
192 0x05, 0x03, 0x04, 0x0A, 0x20, 0x11, 0x0B, 0x0A,
193 0x0B, 0x07, 0x0D, 0x12, 0x1E, 0x1F, 0x14, 0x05,
194 0x19, 0x0B, 0x13, 0x3B, 0x1B, 0x12, 0x0C, 0x05,
195 0x23, 0x21, 0x1F, 0x3A, 0x1E, 0x10, 0x07, 0x05,
196 0x1C, 0x1A, 0x20, 0x13, 0x11, 0x0F, 0x08, 0x0E,
197 0x0E, 0x0C, 0x09, 0x0D, 0x0E, 0x09, 0x04, 0x01,
198 0x0B, 0x04, 0x06, 0x06, 0x06, 0x03, 0x02, 0x00
199 ];
200 const MP3_HUFF11_LENS: [u8; 64] = [
201 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8,
202 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9,
203 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11,
204 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10
205 ];
206 const MP3_HUFF12_BITS: [u8; 64] = [
207 0x09, 0x06, 0x10, 0x21, 0x29, 0x27, 0x26, 0x1A,
208 0x07, 0x05, 0x06, 0x09, 0x17, 0x10, 0x1A, 0x0B,
209 0x11, 0x07, 0x0B, 0x0E, 0x15, 0x1E, 0x0A, 0x07,
210 0x11, 0x0A, 0x0F, 0x0C, 0x12, 0x1C, 0x0E, 0x05,
211 0x20, 0x0D, 0x16, 0x13, 0x12, 0x10, 0x09, 0x05,
212 0x28, 0x11, 0x1F, 0x1D, 0x11, 0x0D, 0x04, 0x02,
213 0x1B, 0x0C, 0x0B, 0x0F, 0x0A, 0x07, 0x04, 0x01,
214 0x1B, 0x0C, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x00
215 ];
216 const MP3_HUFF12_LENS: [u8; 64] = [
217 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8,
218 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8,
219 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9,
220 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10
221 ];
222 const MP3_HUFF13_BITS: [u8; 256] = [
223 0x01, 0x05, 0x0E, 0x15, 0x22, 0x33, 0x2E, 0x47,
224 0x2A, 0x34, 0x44, 0x34, 0x43, 0x2C, 0x2B, 0x13,
225 0x03, 0x04, 0x0C, 0x13, 0x1F, 0x1A, 0x2C, 0x21,
226 0x1F, 0x18, 0x20, 0x18, 0x1F, 0x23, 0x16, 0x0E,
227 0x0F, 0x0D, 0x17, 0x24, 0x3B, 0x31, 0x4D, 0x41,
228 0x1D, 0x28, 0x1E, 0x28, 0x1B, 0x21, 0x2A, 0x10,
229 0x16, 0x14, 0x25, 0x3D, 0x38, 0x4F, 0x49, 0x40,
230 0x2B, 0x4C, 0x38, 0x25, 0x1A, 0x1F, 0x19, 0x0E,
231 0x23, 0x10, 0x3C, 0x39, 0x61, 0x4B, 0x72, 0x5B,
232 0x36, 0x49, 0x37, 0x29, 0x30, 0x35, 0x17, 0x18,
233 0x3A, 0x1B, 0x32, 0x60, 0x4C, 0x46, 0x5D, 0x54,
234 0x4D, 0x3A, 0x4F, 0x1D, 0x4A, 0x31, 0x29, 0x11,
235 0x2F, 0x2D, 0x4E, 0x4A, 0x73, 0x5E, 0x5A, 0x4F,
236 0x45, 0x53, 0x47, 0x32, 0x3B, 0x26, 0x24, 0x0F,
237 0x48, 0x22, 0x38, 0x5F, 0x5C, 0x55, 0x5B, 0x5A,
238 0x56, 0x49, 0x4D, 0x41, 0x33, 0x2C, 0x2B, 0x2A,
239 0x2B, 0x14, 0x1E, 0x2C, 0x37, 0x4E, 0x48, 0x57,
240 0x4E, 0x3D, 0x2E, 0x36, 0x25, 0x1E, 0x14, 0x10,
241 0x35, 0x19, 0x29, 0x25, 0x2C, 0x3B, 0x36, 0x51,
242 0x42, 0x4C, 0x39, 0x36, 0x25, 0x12, 0x27, 0x0B,
243 0x23, 0x21, 0x1F, 0x39, 0x2A, 0x52, 0x48, 0x50,
244 0x2F, 0x3A, 0x37, 0x15, 0x16, 0x1A, 0x26, 0x16,
245 0x35, 0x19, 0x17, 0x26, 0x46, 0x3C, 0x33, 0x24,
246 0x37, 0x1A, 0x22, 0x17, 0x1B, 0x0E, 0x09, 0x07,
247 0x22, 0x20, 0x1C, 0x27, 0x31, 0x4B, 0x1E, 0x34,
248 0x30, 0x28, 0x34, 0x1C, 0x12, 0x11, 0x09, 0x05,
249 0x2D, 0x15, 0x22, 0x40, 0x38, 0x32, 0x31, 0x2D,
250 0x1F, 0x13, 0x0C, 0x0F, 0x0A, 0x07, 0x06, 0x03,
251 0x30, 0x17, 0x14, 0x27, 0x24, 0x23, 0x35, 0x15,
252 0x10, 0x17, 0x0D, 0x0A, 0x06, 0x01, 0x04, 0x02,
253 0x10, 0x0F, 0x11, 0x1B, 0x19, 0x14, 0x1D, 0x0B,
254 0x11, 0x0C, 0x10, 0x08, 0x01, 0x01, 0x00, 0x01
255 ];
256 const MP3_HUFF13_LENS: [u8; 256] = [
257 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13,
258 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12,
259 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13,
260 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
261 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14,
262 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14,
263 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14,
264 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16,
265 9, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15,
266 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15,
267 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17,
268 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16,
269 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16,
270 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16,
271 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16,
272 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16
273 ];
274 const MP3_HUFF15_BITS: [u8; 256] = [
275 0x07, 0x0C, 0x12, 0x35, 0x2F, 0x4C, 0x7C, 0x6C,
276 0x59, 0x7B, 0x6C, 0x77, 0x6B, 0x51, 0x7A, 0x3F,
277 0x0D, 0x05, 0x10, 0x1B, 0x2E, 0x24, 0x3D, 0x33,
278 0x2A, 0x46, 0x34, 0x53, 0x41, 0x29, 0x3B, 0x24,
279 0x13, 0x11, 0x0F, 0x18, 0x29, 0x22, 0x3B, 0x30,
280 0x28, 0x40, 0x32, 0x4E, 0x3E, 0x50, 0x38, 0x21,
281 0x1D, 0x1C, 0x19, 0x2B, 0x27, 0x3F, 0x37, 0x5D,
282 0x4C, 0x3B, 0x5D, 0x48, 0x36, 0x4B, 0x32, 0x1D,
283 0x34, 0x16, 0x2A, 0x28, 0x43, 0x39, 0x5F, 0x4F,
284 0x48, 0x39, 0x59, 0x45, 0x31, 0x42, 0x2E, 0x1B,
285 0x4D, 0x25, 0x23, 0x42, 0x3A, 0x34, 0x5B, 0x4A,
286 0x3E, 0x30, 0x4F, 0x3F, 0x5A, 0x3E, 0x28, 0x26,
287 0x7D, 0x20, 0x3C, 0x38, 0x32, 0x5C, 0x4E, 0x41,
288 0x37, 0x57, 0x47, 0x33, 0x49, 0x33, 0x46, 0x1E,
289 0x6D, 0x35, 0x31, 0x5E, 0x58, 0x4B, 0x42, 0x7A,
290 0x5B, 0x49, 0x38, 0x2A, 0x40, 0x2C, 0x15, 0x19,
291 0x5A, 0x2B, 0x29, 0x4D, 0x49, 0x3F, 0x38, 0x5C,
292 0x4D, 0x42, 0x2F, 0x43, 0x30, 0x35, 0x24, 0x14,
293 0x47, 0x22, 0x43, 0x3C, 0x3A, 0x31, 0x58, 0x4C,
294 0x43, 0x6A, 0x47, 0x36, 0x26, 0x27, 0x17, 0x0F,
295 0x6D, 0x35, 0x33, 0x2F, 0x5A, 0x52, 0x3A, 0x39,
296 0x30, 0x48, 0x39, 0x29, 0x17, 0x1B, 0x3E, 0x09,
297 0x56, 0x2A, 0x28, 0x25, 0x46, 0x40, 0x34, 0x2B,
298 0x46, 0x37, 0x2A, 0x19, 0x1D, 0x12, 0x0B, 0x0B,
299 0x76, 0x44, 0x1E, 0x37, 0x32, 0x2E, 0x4A, 0x41,
300 0x31, 0x27, 0x18, 0x10, 0x16, 0x0D, 0x0E, 0x07,
301 0x5B, 0x2C, 0x27, 0x26, 0x22, 0x3F, 0x34, 0x2D,
302 0x1F, 0x34, 0x1C, 0x13, 0x0E, 0x08, 0x09, 0x03,
303 0x7B, 0x3C, 0x3A, 0x35, 0x2F, 0x2B, 0x20, 0x16,
304 0x25, 0x18, 0x11, 0x0C, 0x0F, 0x0A, 0x02, 0x01,
305 0x47, 0x25, 0x22, 0x1E, 0x1C, 0x14, 0x11, 0x1A,
306 0x15, 0x10, 0x0A, 0x06, 0x08, 0x06, 0x02, 0x00
307 ];
308 const MP3_HUFF15_LENS: [u8; 256] = [
309 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13,
310 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11,
311 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11,
312 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11,
313 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11,
314 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12,
315 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12,
316 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12,
317 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12,
318 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12,
319 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12,
320 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13,
321 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13,
322 11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
323 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13,
324 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13
325 ];
326 const MP3_HUFF16_BITS: [u16; 256] = [
327 0x001, 0x005, 0x00E, 0x02C, 0x04A, 0x03F, 0x06E, 0x05D,
328 0x0AC, 0x095, 0x08A, 0x0F2, 0x0E1, 0x0C3, 0x178, 0x011,
329 0x003, 0x004, 0x00C, 0x014, 0x023, 0x03E, 0x035, 0x02F,
330 0x053, 0x04B, 0x044, 0x077, 0x0C9, 0x06B, 0x0CF, 0x009,
331 0x00F, 0x00D, 0x017, 0x026, 0x043, 0x03A, 0x067, 0x05A,
332 0x0A1, 0x048, 0x07F, 0x075, 0x06E, 0x0D1, 0x0CE, 0x010,
333 0x02D, 0x015, 0x027, 0x045, 0x040, 0x072, 0x063, 0x057,
334 0x09E, 0x08C, 0x0FC, 0x0D4, 0x0C7, 0x183, 0x16D, 0x01A,
335 0x04B, 0x024, 0x044, 0x041, 0x073, 0x065, 0x0B3, 0x0A4,
336 0x09B, 0x108, 0x0F6, 0x0E2, 0x18B, 0x17E, 0x16A, 0x009,
337 0x042, 0x01E, 0x03B, 0x038, 0x066, 0x0B9, 0x0AD, 0x109,
338 0x08E, 0x0FD, 0x0E8, 0x190, 0x184, 0x17A, 0x1BD, 0x010,
339 0x06F, 0x036, 0x034, 0x064, 0x0B8, 0x0B2, 0x0A0, 0x085,
340 0x101, 0x0F4, 0x0E4, 0x0D9, 0x181, 0x16E, 0x2CB, 0x00A,
341 0x062, 0x030, 0x05B, 0x058, 0x0A5, 0x09D, 0x094, 0x105,
342 0x0F8, 0x197, 0x18D, 0x174, 0x17C, 0x379, 0x374, 0x008,
343 0x055, 0x054, 0x051, 0x09F, 0x09C, 0x08F, 0x104, 0x0F9,
344 0x1AB, 0x191, 0x188, 0x17F, 0x2D7, 0x2C9, 0x2C4, 0x007,
345 0x09A, 0x04C, 0x049, 0x08D, 0x083, 0x100, 0x0F5, 0x1AA,
346 0x196, 0x18A, 0x180, 0x2DF, 0x167, 0x2C6, 0x160, 0x00B,
347 0x08B, 0x081, 0x043, 0x07D, 0x0F7, 0x0E9, 0x0E5, 0x0DB,
348 0x189, 0x2E7, 0x2E1, 0x2D0, 0x375, 0x372, 0x1B7, 0x004,
349 0x0F3, 0x078, 0x076, 0x073, 0x0E3, 0x0DF, 0x18C, 0x2EA,
350 0x2E6, 0x2E0, 0x2D1, 0x2C8, 0x2C2, 0x0DF, 0x1B4, 0x006,
351 0x0CA, 0x0E0, 0x0DE, 0x0DA, 0x0D8, 0x185, 0x182, 0x17D,
352 0x16C, 0x378, 0x1BB, 0x2C3, 0x1B8, 0x1B5, 0x6C0, 0x004,
353 0x2EB, 0x0D3, 0x0D2, 0x0D0, 0x172, 0x17B, 0x2DE, 0x2D3,
354 0x2CA, 0x6C7, 0x373, 0x36D, 0x36C, 0xD83, 0x361, 0x002,
355 0x179, 0x171, 0x066, 0x0BB, 0x2D6, 0x2D2, 0x166, 0x2C7,
356 0x2C5, 0x362, 0x6C6, 0x367, 0xD82, 0x366, 0x1B2, 0x000,
357 0x00C, 0x00A, 0x007, 0x00B, 0x00A, 0x011, 0x00B, 0x009,
358 0x00D, 0x00C, 0x00A, 0x007, 0x005, 0x003, 0x001, 0x003
359 ];
360 const MP3_HUFF16_LENS: [u8; 256] = [
361 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9,
362 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8,
363 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9,
364 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 10,
365 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9,
366 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10,
367 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10,
368 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10,
369 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10,
370 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11,
371 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10,
372 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11,
373 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11,
374 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11,
375 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11,
376 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8
377 ];
378 const MP3_HUFF24_BITS: [u16; 256] = [
379 0x00F, 0x00D, 0x02E, 0x050, 0x092, 0x106, 0x0F8, 0x1B2,
380 0x1AA, 0x29D, 0x28D, 0x289, 0x26D, 0x205, 0x408, 0x058,
381 0x00E, 0x00C, 0x015, 0x026, 0x047, 0x082, 0x07A, 0x0D8,
382 0x0D1, 0x0C6, 0x147, 0x159, 0x13F, 0x129, 0x117, 0x02A,
383 0x02F, 0x016, 0x029, 0x04A, 0x044, 0x080, 0x078, 0x0DD,
384 0x0CF, 0x0C2, 0x0B6, 0x154, 0x13B, 0x127, 0x21D, 0x012,
385 0x051, 0x027, 0x04B, 0x046, 0x086, 0x07D, 0x074, 0x0DC,
386 0x0CC, 0x0BE, 0x0B2, 0x145, 0x137, 0x125, 0x10F, 0x010,
387 0x093, 0x048, 0x045, 0x087, 0x07F, 0x076, 0x070, 0x0D2,
388 0x0C8, 0x0BC, 0x160, 0x143, 0x132, 0x11D, 0x21C, 0x00E,
389 0x107, 0x042, 0x081, 0x07E, 0x077, 0x072, 0x0D6, 0x0CA,
390 0x0C0, 0x0B4, 0x155, 0x13D, 0x12D, 0x119, 0x106, 0x00C,
391 0x0F9, 0x07B, 0x079, 0x075, 0x071, 0x0D7, 0x0CE, 0x0C3,
392 0x0B9, 0x15B, 0x14A, 0x134, 0x123, 0x110, 0x208, 0x00A,
393 0x1B3, 0x073, 0x06F, 0x06D, 0x0D3, 0x0CB, 0x0C4, 0x0BB,
394 0x161, 0x14C, 0x139, 0x12A, 0x11B, 0x213, 0x17D, 0x011,
395 0x1AB, 0x0D4, 0x0D0, 0x0CD, 0x0C9, 0x0C1, 0x0BA, 0x0B1,
396 0x0A9, 0x140, 0x12F, 0x11E, 0x10C, 0x202, 0x179, 0x010,
397 0x14F, 0x0C7, 0x0C5, 0x0BF, 0x0BD, 0x0B5, 0x0AE, 0x14D,
398 0x141, 0x131, 0x121, 0x113, 0x209, 0x17B, 0x173, 0x00B,
399 0x29C, 0x0B8, 0x0B7, 0x0B3, 0x0AF, 0x158, 0x14B, 0x13A,
400 0x130, 0x122, 0x115, 0x212, 0x17F, 0x175, 0x16E, 0x00A,
401 0x28C, 0x15A, 0x0AB, 0x0A8, 0x0A4, 0x13E, 0x135, 0x12B,
402 0x11F, 0x114, 0x107, 0x201, 0x177, 0x170, 0x16A, 0x006,
403 0x288, 0x142, 0x13C, 0x138, 0x133, 0x12E, 0x124, 0x11C,
404 0x10D, 0x105, 0x200, 0x178, 0x172, 0x16C, 0x167, 0x004,
405 0x26C, 0x12C, 0x128, 0x126, 0x120, 0x11A, 0x111, 0x10A,
406 0x203, 0x17C, 0x176, 0x171, 0x16D, 0x169, 0x165, 0x002,
407 0x409, 0x118, 0x116, 0x112, 0x10B, 0x108, 0x103, 0x17E,
408 0x17A, 0x174, 0x16F, 0x16B, 0x168, 0x166, 0x164, 0x000,
409 0x02B, 0x014, 0x013, 0x011, 0x00F, 0x00D, 0x00B, 0x009,
410 0x007, 0x006, 0x004, 0x007, 0x005, 0x003, 0x001, 0x003
411 ];
412 const MP3_HUFF24_LENS: [u8; 256] = [
413 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9,
414 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8,
415 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7,
416 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7,
417 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7,
418 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7,
419 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7,
420 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8,
421 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8,
422 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8,
423 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8,
424 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8,
425 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8,
426 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8,
427 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8,
428 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4
429 ];
430
431 const MP3_HUFF_SYMS2: [u8; 4] = [ 0x00, 0x01, 0x10, 0x11 ];
432 const MP3_HUFF_SYMS3: [u8; 9] = [ 0x00, 0x01, 0x02, 0x10, 0x11, 0x12, 0x20, 0x21, 0x22 ];
433 const MP3_HUFF_SYMS4: [u8; 16] = [
434 0x00, 0x01, 0x02, 0x03,
435 0x10, 0x11, 0x12, 0x13,
436 0x20, 0x21, 0x22, 0x23,
437 0x30, 0x31, 0x32, 0x33
438 ];
439 const MP3_HUFF_SYMS6: [u8; 36] = [
440 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
441 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
442 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
443 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
444 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
445 0x50, 0x51, 0x52, 0x53, 0x54, 0x55
446 ];
447 const MP3_HUFF_SYMS8: [u8; 64] = [
448 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
449 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
450 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
451 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
452 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
453 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
454 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
455 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
456 ];
457
458 pub struct MP3Codebooks {
459 pub quad_cb: Codebook<u8>,
460 pub cb: [Codebook<u8>; 15],
461 }
462
463 fn map_cb2(idx: usize) -> u8 { MP3_HUFF_SYMS2[idx] }
464 fn map_cb3(idx: usize) -> u8 { MP3_HUFF_SYMS3[idx] }
465 fn map_cb4(idx: usize) -> u8 { MP3_HUFF_SYMS4[idx] }
466 fn map_cb6(idx: usize) -> u8 { MP3_HUFF_SYMS6[idx] }
467 fn map_cb8(idx: usize) -> u8 { MP3_HUFF_SYMS8[idx] }
468 fn map_cb16(idx: usize) -> u8 { idx as u8 }
469
470 macro_rules! init_cb {
471 ($bits: ident, $lens: ident, $map_cb: ident) => ({
472 let mut cbr = TableCodebookDescReader::new(&$bits, &$lens, $map_cb);
473 Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()
474 })
475 }
476
477 impl MP3Codebooks {
478 pub fn new() -> Self {
479 let quad_cb = init_cb!(MP3_HUFF_QUAD_A_BITS, MP3_HUFF_QUAD_A_LENS, map_cb16);
480 let cb = [
481 init_cb!(MP3_HUFF1_BITS, MP3_HUFF1_LENS, map_cb2),
482 init_cb!(MP3_HUFF2_BITS, MP3_HUFF2_LENS, map_cb3),
483 init_cb!(MP3_HUFF3_BITS, MP3_HUFF3_LENS, map_cb3),
484 init_cb!(MP3_HUFF5_BITS, MP3_HUFF5_LENS, map_cb4),
485 init_cb!(MP3_HUFF6_BITS, MP3_HUFF6_LENS, map_cb4),
486 init_cb!(MP3_HUFF7_BITS, MP3_HUFF7_LENS, map_cb6),
487 init_cb!(MP3_HUFF8_BITS, MP3_HUFF8_LENS, map_cb6),
488 init_cb!(MP3_HUFF9_BITS, MP3_HUFF9_LENS, map_cb6),
489 init_cb!(MP3_HUFF10_BITS, MP3_HUFF10_LENS, map_cb8),
490 init_cb!(MP3_HUFF11_BITS, MP3_HUFF11_LENS, map_cb8),
491 init_cb!(MP3_HUFF12_BITS, MP3_HUFF12_LENS, map_cb8),
492 init_cb!(MP3_HUFF13_BITS, MP3_HUFF13_LENS, map_cb16),
493 init_cb!(MP3_HUFF15_BITS, MP3_HUFF15_LENS, map_cb16),
494 init_cb!(MP3_HUFF16_BITS, MP3_HUFF16_LENS, map_cb16),
495 init_cb!(MP3_HUFF24_BITS, MP3_HUFF24_LENS, map_cb16)
496 ];
497
498 Self { quad_cb, cb }
499 }
500 pub fn get_cb(&self, cb_id: u8) -> Option<(&Codebook<u8>, u8)> {
501 match cb_id {
502 0 => None,
503 1 => Some((&self.cb[0], 0)),
504 2 => Some((&self.cb[1], 0)),
505 3 => Some((&self.cb[2], 0)),
506 5 => Some((&self.cb[3], 0)),
507 6 => Some((&self.cb[4], 0)),
508 7 => Some((&self.cb[5], 0)),
509 8 => Some((&self.cb[6], 0)),
510 9 => Some((&self.cb[7], 0)),
511 10 => Some((&self.cb[8], 0)),
512 11 => Some((&self.cb[9], 0)),
513 12 => Some((&self.cb[10], 0)),
514 13 => Some((&self.cb[11], 0)),
515 15 => Some((&self.cb[12], 0)),
516 16 => Some((&self.cb[13], 1)),
517 17 => Some((&self.cb[13], 2)),
518 18 => Some((&self.cb[13], 3)),
519 19 => Some((&self.cb[13], 4)),
520 20 => Some((&self.cb[13], 6)),
521 21 => Some((&self.cb[13], 8)),
522 22 => Some((&self.cb[13], 10)),
523 23 => Some((&self.cb[13], 13)),
524 24 => Some((&self.cb[14], 4)),
525 25 => Some((&self.cb[14], 5)),
526 26 => Some((&self.cb[14], 6)),
527 27 => Some((&self.cb[14], 7)),
528 28 => Some((&self.cb[14], 8)),
529 29 => Some((&self.cb[14], 9)),
530 30 => Some((&self.cb[14], 11)),
531 31 => Some((&self.cb[14], 13)),
532 _ => unreachable!(),
533 }
534 }
535 }