+use nihav_core::io::codebook::*;
+
+pub const MP3_BANDS: usize = 21;
+pub const MP3_BANDS_SHORT: usize = 12;
+
+pub const MP3_PREEMP_SCALES: [i8; MP3_BANDS + 1] = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
+];
+
+pub const MP3_ISTEREO_COEFFS: [f32; 7] = [
+ 1.0, 0.78867513459481288226, 0.63397459621556135323, 0.5,
+ 0.36602540378443864677, 0.21132486540518711774, 0.0
+];
+
+pub const SCFSI_FROM_BAND: [usize; MP3_BANDS] = [
+ 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3
+];
+
+pub const MP3_SCALEFAC_BITS1: [u8; 16] = [ 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 ];
+pub const MP3_SCALEFAC_BITS2: [u8; 16] = [ 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 ];
+
+pub const MP3_SFB_LONG_OFFS: [[usize; MP3_BANDS + 2]; 9] = [
+ [ // 44.1
+ 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576
+ ], [ // 48
+ 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576
+ ], [ // 32
+ 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576
+ ], [ // 22.05
+ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+ ], [ // 24
+ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576
+ ], [ // 16
+ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+ ], [ // 11.025
+ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+ ], [ // 12
+ 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+ ], [ // 8
+ 0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576
+ ]
+];
+
+pub const MP3_SFB_SHORT_OFFS: [[usize; MP3_BANDS_SHORT + 2]; 9] = [
+ [ 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192 ], // 44.1
+ [ 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192 ], // 48
+ [ 0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192 ], // 32
+ [ 0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192 ], // 22.05
+ [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192 ], // 24
+ [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 16
+ [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 11.025
+ [ 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192 ], // 12
+ [ 0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192 ], // 8
+];
+pub const MP3_SFB_SHORT_SIZE: [[usize; MP3_BANDS_SHORT + 1]; 9] = [
+ [ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56 ], // 44.1
+ [ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66 ], // 48
+ [ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12 ], // 32
+ [ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18 ], // 22.05
+ [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12 ], // 24
+ [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 16
+ [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 11.025
+ [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 ], // 12
+ [ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26 ], // 8
+];
+
+pub const MP3_SCF_BITS3: [u8; 12 * 2] = [
+ 0, 0, 0, 1, 0, 2,
+ 1, 0, 1, 1, 1, 2,
+ 2, 0, 2, 1, 2, 2,
+ 3, 0, 3, 1, 3, 2
+];
+pub const MP3_SCF_BITS5: [u8; 25 * 2] = [
+ 0, 0, 0, 1, 0, 2, 0, 3, 0, 4,
+ 1, 0, 1, 1, 1, 2, 1, 3, 1, 4,
+ 2, 0, 2, 1, 2, 2, 2, 3, 2, 4,
+ 3, 0, 3, 1, 3, 2, 3, 3, 3, 4,
+ 4, 0, 4, 1, 4, 2, 4, 3, 4, 4
+];
+pub const MP3_SCF_BITS6: [u8; 180 * 3] = [
+ 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5,
+ 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 4, 0, 1, 5,
+ 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 2, 3, 0, 2, 4, 0, 2, 5,
+ 0, 3, 0, 0, 3, 1, 0, 3, 2, 0, 3, 3, 0, 3, 4, 0, 3, 5,
+ 0, 4, 0, 0, 4, 1, 0, 4, 2, 0, 4, 3, 0, 4, 4, 0, 4, 5,
+ 0, 5, 0, 0, 5, 1, 0, 5, 2, 0, 5, 3, 0, 5, 4, 0, 5, 5,
+ 1, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 5,
+ 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 4, 1, 1, 5,
+ 1, 2, 0, 1, 2, 1, 1, 2, 2, 1, 2, 3, 1, 2, 4, 1, 2, 5,
+ 1, 3, 0, 1, 3, 1, 1, 3, 2, 1, 3, 3, 1, 3, 4, 1, 3, 5,
+ 1, 4, 0, 1, 4, 1, 1, 4, 2, 1, 4, 3, 1, 4, 4, 1, 4, 5,
+ 1, 5, 0, 1, 5, 1, 1, 5, 2, 1, 5, 3, 1, 5, 4, 1, 5, 5,
+ 2, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5,
+ 2, 1, 0, 2, 1, 1, 2, 1, 2, 2, 1, 3, 2, 1, 4, 2, 1, 5,
+ 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 2, 2, 5,
+ 2, 3, 0, 2, 3, 1, 2, 3, 2, 2, 3, 3, 2, 3, 4, 2, 3, 5,
+ 2, 4, 0, 2, 4, 1, 2, 4, 2, 2, 4, 3, 2, 4, 4, 2, 4, 5,
+ 2, 5, 0, 2, 5, 1, 2, 5, 2, 2, 5, 3, 2, 5, 4, 2, 5, 5,
+ 3, 0, 0, 3, 0, 1, 3, 0, 2, 3, 0, 3, 3, 0, 4, 3, 0, 5,
+ 3, 1, 0, 3, 1, 1, 3, 1, 2, 3, 1, 3, 3, 1, 4, 3, 1, 5,
+ 3, 2, 0, 3, 2, 1, 3, 2, 2, 3, 2, 3, 3, 2, 4, 3, 2, 5,
+ 3, 3, 0, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 5,
+ 3, 4, 0, 3, 4, 1, 3, 4, 2, 3, 4, 3, 3, 4, 4, 3, 4, 5,
+ 3, 5, 0, 3, 5, 1, 3, 5, 2, 3, 5, 3, 3, 5, 4, 3, 5, 5,
+ 4, 0, 0, 4, 0, 1, 4, 0, 2, 4, 0, 3, 4, 0, 4, 4, 0, 5,
+ 4, 1, 0, 4, 1, 1, 4, 1, 2, 4, 1, 3, 4, 1, 4, 4, 1, 5,
+ 4, 2, 0, 4, 2, 1, 4, 2, 2, 4, 2, 3, 4, 2, 4, 4, 2, 5,
+ 4, 3, 0, 4, 3, 1, 4, 3, 2, 4, 3, 3, 4, 3, 4, 4, 3, 5,
+ 4, 4, 0, 4, 4, 1, 4, 4, 2, 4, 4, 3, 4, 4, 4, 4, 4, 5,
+ 4, 5, 0, 4, 5, 1, 4, 5, 2, 4, 5, 3, 4, 5, 4, 4, 5, 5
+];
+
+pub const MP3_SCF_ENDS: [[[usize; 4]; 3]; 6] = [
+ [ [ 6, 11, 16, 21 ], [ 9, 18, 27, 36 ], [ 6, 15, 27, 33 ] ],
+ [ [ 6, 11, 18, 21 ], [ 9, 18, 30, 36 ], [ 6, 15, 27, 33 ] ],
+ [ [ 11, 21, 21, 21 ], [ 18, 36, 36, 36 ], [ 15, 33, 33, 33 ] ],
+ [ [ 7, 14, 21, 21 ], [ 12, 24, 36, 36 ], [ 6, 21, 33, 33 ] ],
+ [ [ 6, 12, 18, 21 ], [ 12, 21, 30, 36 ], [ 6, 18, 27, 33 ] ],
+ [ [ 8, 16, 21, 21 ], [ 15, 27, 36, 36 ], [ 6, 24, 33, 33 ] ]
+];
+
+const MP3_HUFF_QUAD_A_BITS: [u8; 16] = [ 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 ];
+const MP3_HUFF_QUAD_A_LENS: [u8; 16] = [ 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6 ];
+
+const MP3_HUFF1_BITS: [u8; 4] = [ 1, 1, 1, 0 ];
+const MP3_HUFF1_LENS: [u8; 4] = [ 1, 3, 2, 3 ];
+const MP3_HUFF2_BITS: [u8; 9] = [ 1, 2, 1, 3, 1, 1, 3, 2, 0 ];
+const MP3_HUFF2_LENS: [u8; 9] = [ 1, 3, 6, 3, 3, 5, 5, 5, 6 ];
+const MP3_HUFF3_BITS: [u8; 9] = [ 3, 2, 1, 1, 1, 1, 3, 2, 0 ];
+const MP3_HUFF3_LENS: [u8; 9] = [ 2, 2, 6, 3, 2, 5, 5, 5, 6 ];
+const MP3_HUFF5_BITS: [u8; 16] = [ 1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0 ];
+const MP3_HUFF5_LENS: [u8; 16] = [ 1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8 ];
+const MP3_HUFF6_BITS: [u8; 16] = [ 7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0 ];
+const MP3_HUFF6_LENS: [u8; 16] = [ 3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7 ];
+const MP3_HUFF7_BITS: [u8; 36] = [
+ 0x01, 0x02, 0x0A, 0x13, 0x10, 0x0A, 0x03, 0x03,
+ 0x07, 0x0A, 0x05, 0x03, 0x0B, 0x04, 0x0D, 0x11,
+ 0x08, 0x04, 0x0C, 0x0B, 0x12, 0x0F, 0x0B, 0x02,
+ 0x07, 0x06, 0x09, 0x0E, 0x03, 0x01, 0x06, 0x04,
+ 0x05, 0x03, 0x02, 0x00
+];
+const MP3_HUFF7_LENS: [u8; 36] = [
+ 1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8,
+ 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8,
+ 9, 10, 10, 10
+];
+const MP3_HUFF8_BITS: [u8; 36] = [
+ 0x03, 0x04, 0x06, 0x12, 0x0C, 0x05, 0x05, 0x01,
+ 0x02, 0x10, 0x09, 0x03, 0x07, 0x03, 0x05, 0x0E,
+ 0x07, 0x03, 0x13, 0x11, 0x0F, 0x0D, 0x0A, 0x04,
+ 0x0D, 0x05, 0x08, 0x0B, 0x05, 0x01, 0x0C, 0x04,
+ 0x04, 0x01, 0x01, 0x00
+];
+const MP3_HUFF8_LENS: [u8; 36] = [
+ 2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8,
+ 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8,
+ 9, 9, 11, 11
+];
+const MP3_HUFF9_BITS: [u8; 36] = [
+ 0x07, 0x05, 0x09, 0x0E, 0x0F, 0x07, 0x06, 0x04,
+ 0x05, 0x05, 0x06, 0x07, 0x07, 0x06, 0x08, 0x08,
+ 0x08, 0x05, 0x0F, 0x06, 0x09, 0x0A, 0x05, 0x01,
+ 0x0B, 0x07, 0x09, 0x06, 0x04, 0x01, 0x0E, 0x04,
+ 0x06, 0x02, 0x06, 0x00
+];
+const MP3_HUFF9_LENS: [u8; 36] = [
+ 3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6,
+ 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7,
+ 8, 8, 9, 9
+];
+const MP3_HUFF10_BITS: [u8; 64] = [
+ 0x01, 0x02, 0x0A, 0x17, 0x23, 0x1E, 0x0C, 0x11,
+ 0x03, 0x03, 0x08, 0x0C, 0x12, 0x15, 0x0C, 0x07,
+ 0x0B, 0x09, 0x0F, 0x15, 0x20, 0x28, 0x13, 0x06,
+ 0x0E, 0x0D, 0x16, 0x22, 0x2E, 0x17, 0x12, 0x07,
+ 0x14, 0x13, 0x21, 0x2F, 0x1B, 0x16, 0x09, 0x03,
+ 0x1F, 0x16, 0x29, 0x1A, 0x15, 0x14, 0x05, 0x03,
+ 0x0E, 0x0D, 0x0A, 0x0B, 0x10, 0x06, 0x05, 0x01,
+ 0x09, 0x08, 0x07, 0x08, 0x04, 0x04, 0x02, 0x00
+];
+const MP3_HUFF10_LENS: [u8; 64] = [
+ 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8,
+ 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10,
+ 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11,
+ 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11
+];
+const MP3_HUFF11_BITS: [u8; 64] = [
+ 0x03, 0x04, 0x0A, 0x18, 0x22, 0x21, 0x15, 0x0F,
+ 0x05, 0x03, 0x04, 0x0A, 0x20, 0x11, 0x0B, 0x0A,
+ 0x0B, 0x07, 0x0D, 0x12, 0x1E, 0x1F, 0x14, 0x05,
+ 0x19, 0x0B, 0x13, 0x3B, 0x1B, 0x12, 0x0C, 0x05,
+ 0x23, 0x21, 0x1F, 0x3A, 0x1E, 0x10, 0x07, 0x05,
+ 0x1C, 0x1A, 0x20, 0x13, 0x11, 0x0F, 0x08, 0x0E,
+ 0x0E, 0x0C, 0x09, 0x0D, 0x0E, 0x09, 0x04, 0x01,
+ 0x0B, 0x04, 0x06, 0x06, 0x06, 0x03, 0x02, 0x00
+];
+const MP3_HUFF11_LENS: [u8; 64] = [
+ 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8,
+ 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9,
+ 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11,
+ 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10
+];
+const MP3_HUFF12_BITS: [u8; 64] = [
+ 0x09, 0x06, 0x10, 0x21, 0x29, 0x27, 0x26, 0x1A,
+ 0x07, 0x05, 0x06, 0x09, 0x17, 0x10, 0x1A, 0x0B,
+ 0x11, 0x07, 0x0B, 0x0E, 0x15, 0x1E, 0x0A, 0x07,
+ 0x11, 0x0A, 0x0F, 0x0C, 0x12, 0x1C, 0x0E, 0x05,
+ 0x20, 0x0D, 0x16, 0x13, 0x12, 0x10, 0x09, 0x05,
+ 0x28, 0x11, 0x1F, 0x1D, 0x11, 0x0D, 0x04, 0x02,
+ 0x1B, 0x0C, 0x0B, 0x0F, 0x0A, 0x07, 0x04, 0x01,
+ 0x1B, 0x0C, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x00
+];
+const MP3_HUFF12_LENS: [u8; 64] = [
+ 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8,
+ 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8,
+ 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9,
+ 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10
+];
+const MP3_HUFF13_BITS: [u8; 256] = [
+ 0x01, 0x05, 0x0E, 0x15, 0x22, 0x33, 0x2E, 0x47,
+ 0x2A, 0x34, 0x44, 0x34, 0x43, 0x2C, 0x2B, 0x13,
+ 0x03, 0x04, 0x0C, 0x13, 0x1F, 0x1A, 0x2C, 0x21,
+ 0x1F, 0x18, 0x20, 0x18, 0x1F, 0x23, 0x16, 0x0E,
+ 0x0F, 0x0D, 0x17, 0x24, 0x3B, 0x31, 0x4D, 0x41,
+ 0x1D, 0x28, 0x1E, 0x28, 0x1B, 0x21, 0x2A, 0x10,
+ 0x16, 0x14, 0x25, 0x3D, 0x38, 0x4F, 0x49, 0x40,
+ 0x2B, 0x4C, 0x38, 0x25, 0x1A, 0x1F, 0x19, 0x0E,
+ 0x23, 0x10, 0x3C, 0x39, 0x61, 0x4B, 0x72, 0x5B,
+ 0x36, 0x49, 0x37, 0x29, 0x30, 0x35, 0x17, 0x18,
+ 0x3A, 0x1B, 0x32, 0x60, 0x4C, 0x46, 0x5D, 0x54,
+ 0x4D, 0x3A, 0x4F, 0x1D, 0x4A, 0x31, 0x29, 0x11,
+ 0x2F, 0x2D, 0x4E, 0x4A, 0x73, 0x5E, 0x5A, 0x4F,
+ 0x45, 0x53, 0x47, 0x32, 0x3B, 0x26, 0x24, 0x0F,
+ 0x48, 0x22, 0x38, 0x5F, 0x5C, 0x55, 0x5B, 0x5A,
+ 0x56, 0x49, 0x4D, 0x41, 0x33, 0x2C, 0x2B, 0x2A,
+ 0x2B, 0x14, 0x1E, 0x2C, 0x37, 0x4E, 0x48, 0x57,
+ 0x4E, 0x3D, 0x2E, 0x36, 0x25, 0x1E, 0x14, 0x10,
+ 0x35, 0x19, 0x29, 0x25, 0x2C, 0x3B, 0x36, 0x51,
+ 0x42, 0x4C, 0x39, 0x36, 0x25, 0x12, 0x27, 0x0B,
+ 0x23, 0x21, 0x1F, 0x39, 0x2A, 0x52, 0x48, 0x50,
+ 0x2F, 0x3A, 0x37, 0x15, 0x16, 0x1A, 0x26, 0x16,
+ 0x35, 0x19, 0x17, 0x26, 0x46, 0x3C, 0x33, 0x24,
+ 0x37, 0x1A, 0x22, 0x17, 0x1B, 0x0E, 0x09, 0x07,
+ 0x22, 0x20, 0x1C, 0x27, 0x31, 0x4B, 0x1E, 0x34,
+ 0x30, 0x28, 0x34, 0x1C, 0x12, 0x11, 0x09, 0x05,
+ 0x2D, 0x15, 0x22, 0x40, 0x38, 0x32, 0x31, 0x2D,
+ 0x1F, 0x13, 0x0C, 0x0F, 0x0A, 0x07, 0x06, 0x03,
+ 0x30, 0x17, 0x14, 0x27, 0x24, 0x23, 0x35, 0x15,
+ 0x10, 0x17, 0x0D, 0x0A, 0x06, 0x01, 0x04, 0x02,
+ 0x10, 0x0F, 0x11, 0x1B, 0x19, 0x14, 0x1D, 0x0B,
+ 0x11, 0x0C, 0x10, 0x08, 0x01, 0x01, 0x00, 0x01
+];
+const MP3_HUFF13_LENS: [u8; 256] = [
+ 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13,
+ 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12,
+ 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13,
+ 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
+ 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14,
+ 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14,
+ 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14,
+ 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16,
+ 9, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15,
+ 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15,
+ 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17,
+ 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16,
+ 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16,
+ 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16,
+ 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16,
+ 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16
+];
+const MP3_HUFF15_BITS: [u8; 256] = [
+ 0x07, 0x0C, 0x12, 0x35, 0x2F, 0x4C, 0x7C, 0x6C,
+ 0x59, 0x7B, 0x6C, 0x77, 0x6B, 0x51, 0x7A, 0x3F,
+ 0x0D, 0x05, 0x10, 0x1B, 0x2E, 0x24, 0x3D, 0x33,
+ 0x2A, 0x46, 0x34, 0x53, 0x41, 0x29, 0x3B, 0x24,
+ 0x13, 0x11, 0x0F, 0x18, 0x29, 0x22, 0x3B, 0x30,
+ 0x28, 0x40, 0x32, 0x4E, 0x3E, 0x50, 0x38, 0x21,
+ 0x1D, 0x1C, 0x19, 0x2B, 0x27, 0x3F, 0x37, 0x5D,
+ 0x4C, 0x3B, 0x5D, 0x48, 0x36, 0x4B, 0x32, 0x1D,
+ 0x34, 0x16, 0x2A, 0x28, 0x43, 0x39, 0x5F, 0x4F,
+ 0x48, 0x39, 0x59, 0x45, 0x31, 0x42, 0x2E, 0x1B,
+ 0x4D, 0x25, 0x23, 0x42, 0x3A, 0x34, 0x5B, 0x4A,
+ 0x3E, 0x30, 0x4F, 0x3F, 0x5A, 0x3E, 0x28, 0x26,
+ 0x7D, 0x20, 0x3C, 0x38, 0x32, 0x5C, 0x4E, 0x41,
+ 0x37, 0x57, 0x47, 0x33, 0x49, 0x33, 0x46, 0x1E,
+ 0x6D, 0x35, 0x31, 0x5E, 0x58, 0x4B, 0x42, 0x7A,
+ 0x5B, 0x49, 0x38, 0x2A, 0x40, 0x2C, 0x15, 0x19,
+ 0x5A, 0x2B, 0x29, 0x4D, 0x49, 0x3F, 0x38, 0x5C,
+ 0x4D, 0x42, 0x2F, 0x43, 0x30, 0x35, 0x24, 0x14,
+ 0x47, 0x22, 0x43, 0x3C, 0x3A, 0x31, 0x58, 0x4C,
+ 0x43, 0x6A, 0x47, 0x36, 0x26, 0x27, 0x17, 0x0F,
+ 0x6D, 0x35, 0x33, 0x2F, 0x5A, 0x52, 0x3A, 0x39,
+ 0x30, 0x48, 0x39, 0x29, 0x17, 0x1B, 0x3E, 0x09,
+ 0x56, 0x2A, 0x28, 0x25, 0x46, 0x40, 0x34, 0x2B,
+ 0x46, 0x37, 0x2A, 0x19, 0x1D, 0x12, 0x0B, 0x0B,
+ 0x76, 0x44, 0x1E, 0x37, 0x32, 0x2E, 0x4A, 0x41,
+ 0x31, 0x27, 0x18, 0x10, 0x16, 0x0D, 0x0E, 0x07,
+ 0x5B, 0x2C, 0x27, 0x26, 0x22, 0x3F, 0x34, 0x2D,
+ 0x1F, 0x34, 0x1C, 0x13, 0x0E, 0x08, 0x09, 0x03,
+ 0x7B, 0x3C, 0x3A, 0x35, 0x2F, 0x2B, 0x20, 0x16,
+ 0x25, 0x18, 0x11, 0x0C, 0x0F, 0x0A, 0x02, 0x01,
+ 0x47, 0x25, 0x22, 0x1E, 0x1C, 0x14, 0x11, 0x1A,
+ 0x15, 0x10, 0x0A, 0x06, 0x08, 0x06, 0x02, 0x00
+];
+const MP3_HUFF15_LENS: [u8; 256] = [
+ 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13,
+ 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11,
+ 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11,
+ 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11,
+ 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11,
+ 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12,
+ 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12,
+ 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12,
+ 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12,
+ 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12,
+ 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12,
+ 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13,
+ 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13,
+ 11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13,
+ 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13,
+ 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13
+];
+const MP3_HUFF16_BITS: [u16; 256] = [
+ 0x001, 0x005, 0x00E, 0x02C, 0x04A, 0x03F, 0x06E, 0x05D,
+ 0x0AC, 0x095, 0x08A, 0x0F2, 0x0E1, 0x0C3, 0x178, 0x011,
+ 0x003, 0x004, 0x00C, 0x014, 0x023, 0x03E, 0x035, 0x02F,
+ 0x053, 0x04B, 0x044, 0x077, 0x0C9, 0x06B, 0x0CF, 0x009,
+ 0x00F, 0x00D, 0x017, 0x026, 0x043, 0x03A, 0x067, 0x05A,
+ 0x0A1, 0x048, 0x07F, 0x075, 0x06E, 0x0D1, 0x0CE, 0x010,
+ 0x02D, 0x015, 0x027, 0x045, 0x040, 0x072, 0x063, 0x057,
+ 0x09E, 0x08C, 0x0FC, 0x0D4, 0x0C7, 0x183, 0x16D, 0x01A,
+ 0x04B, 0x024, 0x044, 0x041, 0x073, 0x065, 0x0B3, 0x0A4,
+ 0x09B, 0x108, 0x0F6, 0x0E2, 0x18B, 0x17E, 0x16A, 0x009,
+ 0x042, 0x01E, 0x03B, 0x038, 0x066, 0x0B9, 0x0AD, 0x109,
+ 0x08E, 0x0FD, 0x0E8, 0x190, 0x184, 0x17A, 0x1BD, 0x010,
+ 0x06F, 0x036, 0x034, 0x064, 0x0B8, 0x0B2, 0x0A0, 0x085,
+ 0x101, 0x0F4, 0x0E4, 0x0D9, 0x181, 0x16E, 0x2CB, 0x00A,
+ 0x062, 0x030, 0x05B, 0x058, 0x0A5, 0x09D, 0x094, 0x105,
+ 0x0F8, 0x197, 0x18D, 0x174, 0x17C, 0x379, 0x374, 0x008,
+ 0x055, 0x054, 0x051, 0x09F, 0x09C, 0x08F, 0x104, 0x0F9,
+ 0x1AB, 0x191, 0x188, 0x17F, 0x2D7, 0x2C9, 0x2C4, 0x007,
+ 0x09A, 0x04C, 0x049, 0x08D, 0x083, 0x100, 0x0F5, 0x1AA,
+ 0x196, 0x18A, 0x180, 0x2DF, 0x167, 0x2C6, 0x160, 0x00B,
+ 0x08B, 0x081, 0x043, 0x07D, 0x0F7, 0x0E9, 0x0E5, 0x0DB,
+ 0x189, 0x2E7, 0x2E1, 0x2D0, 0x375, 0x372, 0x1B7, 0x004,
+ 0x0F3, 0x078, 0x076, 0x073, 0x0E3, 0x0DF, 0x18C, 0x2EA,
+ 0x2E6, 0x2E0, 0x2D1, 0x2C8, 0x2C2, 0x0DF, 0x1B4, 0x006,
+ 0x0CA, 0x0E0, 0x0DE, 0x0DA, 0x0D8, 0x185, 0x182, 0x17D,
+ 0x16C, 0x378, 0x1BB, 0x2C3, 0x1B8, 0x1B5, 0x6C0, 0x004,
+ 0x2EB, 0x0D3, 0x0D2, 0x0D0, 0x172, 0x17B, 0x2DE, 0x2D3,
+ 0x2CA, 0x6C7, 0x373, 0x36D, 0x36C, 0xD83, 0x361, 0x002,
+ 0x179, 0x171, 0x066, 0x0BB, 0x2D6, 0x2D2, 0x166, 0x2C7,
+ 0x2C5, 0x362, 0x6C6, 0x367, 0xD82, 0x366, 0x1B2, 0x000,
+ 0x00C, 0x00A, 0x007, 0x00B, 0x00A, 0x011, 0x00B, 0x009,
+ 0x00D, 0x00C, 0x00A, 0x007, 0x005, 0x003, 0x001, 0x003
+];
+const MP3_HUFF16_LENS: [u8; 256] = [
+ 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9,
+ 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8,
+ 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9,
+ 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 10,
+ 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9,
+ 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10,
+ 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10,
+ 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10,
+ 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10,
+ 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11,
+ 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10,
+ 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11,
+ 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11,
+ 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11,
+ 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11,
+ 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8
+];
+const MP3_HUFF24_BITS: [u16; 256] = [
+ 0x00F, 0x00D, 0x02E, 0x050, 0x092, 0x106, 0x0F8, 0x1B2,
+ 0x1AA, 0x29D, 0x28D, 0x289, 0x26D, 0x205, 0x408, 0x058,
+ 0x00E, 0x00C, 0x015, 0x026, 0x047, 0x082, 0x07A, 0x0D8,
+ 0x0D1, 0x0C6, 0x147, 0x159, 0x13F, 0x129, 0x117, 0x02A,
+ 0x02F, 0x016, 0x029, 0x04A, 0x044, 0x080, 0x078, 0x0DD,
+ 0x0CF, 0x0C2, 0x0B6, 0x154, 0x13B, 0x127, 0x21D, 0x012,
+ 0x051, 0x027, 0x04B, 0x046, 0x086, 0x07D, 0x074, 0x0DC,
+ 0x0CC, 0x0BE, 0x0B2, 0x145, 0x137, 0x125, 0x10F, 0x010,
+ 0x093, 0x048, 0x045, 0x087, 0x07F, 0x076, 0x070, 0x0D2,
+ 0x0C8, 0x0BC, 0x160, 0x143, 0x132, 0x11D, 0x21C, 0x00E,
+ 0x107, 0x042, 0x081, 0x07E, 0x077, 0x072, 0x0D6, 0x0CA,
+ 0x0C0, 0x0B4, 0x155, 0x13D, 0x12D, 0x119, 0x106, 0x00C,
+ 0x0F9, 0x07B, 0x079, 0x075, 0x071, 0x0D7, 0x0CE, 0x0C3,
+ 0x0B9, 0x15B, 0x14A, 0x134, 0x123, 0x110, 0x208, 0x00A,
+ 0x1B3, 0x073, 0x06F, 0x06D, 0x0D3, 0x0CB, 0x0C4, 0x0BB,
+ 0x161, 0x14C, 0x139, 0x12A, 0x11B, 0x213, 0x17D, 0x011,
+ 0x1AB, 0x0D4, 0x0D0, 0x0CD, 0x0C9, 0x0C1, 0x0BA, 0x0B1,
+ 0x0A9, 0x140, 0x12F, 0x11E, 0x10C, 0x202, 0x179, 0x010,
+ 0x14F, 0x0C7, 0x0C5, 0x0BF, 0x0BD, 0x0B5, 0x0AE, 0x14D,
+ 0x141, 0x131, 0x121, 0x113, 0x209, 0x17B, 0x173, 0x00B,
+ 0x29C, 0x0B8, 0x0B7, 0x0B3, 0x0AF, 0x158, 0x14B, 0x13A,
+ 0x130, 0x122, 0x115, 0x212, 0x17F, 0x175, 0x16E, 0x00A,
+ 0x28C, 0x15A, 0x0AB, 0x0A8, 0x0A4, 0x13E, 0x135, 0x12B,
+ 0x11F, 0x114, 0x107, 0x201, 0x177, 0x170, 0x16A, 0x006,
+ 0x288, 0x142, 0x13C, 0x138, 0x133, 0x12E, 0x124, 0x11C,
+ 0x10D, 0x105, 0x200, 0x178, 0x172, 0x16C, 0x167, 0x004,
+ 0x26C, 0x12C, 0x128, 0x126, 0x120, 0x11A, 0x111, 0x10A,
+ 0x203, 0x17C, 0x176, 0x171, 0x16D, 0x169, 0x165, 0x002,
+ 0x409, 0x118, 0x116, 0x112, 0x10B, 0x108, 0x103, 0x17E,
+ 0x17A, 0x174, 0x16F, 0x16B, 0x168, 0x166, 0x164, 0x000,
+ 0x02B, 0x014, 0x013, 0x011, 0x00F, 0x00D, 0x00B, 0x009,
+ 0x007, 0x006, 0x004, 0x007, 0x005, 0x003, 0x001, 0x003
+];
+const MP3_HUFF24_LENS: [u8; 256] = [
+ 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9,
+ 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8,
+ 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7,
+ 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7,
+ 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7,
+ 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7,
+ 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7,
+ 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8,
+ 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8,
+ 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8,
+ 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8,
+ 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8,
+ 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8,
+ 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8,
+ 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8,
+ 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4
+];
+
+const MP3_HUFF_SYMS2: [u8; 4] = [ 0x00, 0x01, 0x10, 0x11 ];
+const MP3_HUFF_SYMS3: [u8; 9] = [ 0x00, 0x01, 0x02, 0x10, 0x11, 0x12, 0x20, 0x21, 0x22 ];
+const MP3_HUFF_SYMS4: [u8; 16] = [
+ 0x00, 0x01, 0x02, 0x03,
+ 0x10, 0x11, 0x12, 0x13,
+ 0x20, 0x21, 0x22, 0x23,
+ 0x30, 0x31, 0x32, 0x33
+];
+const MP3_HUFF_SYMS6: [u8; 36] = [
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55
+];
+const MP3_HUFF_SYMS8: [u8; 64] = [
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77
+];
+
+pub struct MP3Codebooks {
+ pub quad_cb: Codebook<u8>,
+ pub cb: [Codebook<u8>; 15],
+}
+
+fn map_cb2(idx: usize) -> u8 { MP3_HUFF_SYMS2[idx] }
+fn map_cb3(idx: usize) -> u8 { MP3_HUFF_SYMS3[idx] }
+fn map_cb4(idx: usize) -> u8 { MP3_HUFF_SYMS4[idx] }
+fn map_cb6(idx: usize) -> u8 { MP3_HUFF_SYMS6[idx] }
+fn map_cb8(idx: usize) -> u8 { MP3_HUFF_SYMS8[idx] }
+fn map_cb16(idx: usize) -> u8 { idx as u8 }
+
+macro_rules! init_cb {
+ ($bits: ident, $lens: ident, $map_cb: ident) => ({
+ let mut cbr = TableCodebookDescReader::new(&$bits, &$lens, $map_cb);
+ Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()
+ })
+}
+
+impl MP3Codebooks {
+ pub fn new() -> Self {
+ let quad_cb = init_cb!(MP3_HUFF_QUAD_A_BITS, MP3_HUFF_QUAD_A_LENS, map_cb16);
+ let cb = [
+ init_cb!(MP3_HUFF1_BITS, MP3_HUFF1_LENS, map_cb2),
+ init_cb!(MP3_HUFF2_BITS, MP3_HUFF2_LENS, map_cb3),
+ init_cb!(MP3_HUFF3_BITS, MP3_HUFF3_LENS, map_cb3),
+ init_cb!(MP3_HUFF5_BITS, MP3_HUFF5_LENS, map_cb4),
+ init_cb!(MP3_HUFF6_BITS, MP3_HUFF6_LENS, map_cb4),
+ init_cb!(MP3_HUFF7_BITS, MP3_HUFF7_LENS, map_cb6),
+ init_cb!(MP3_HUFF8_BITS, MP3_HUFF8_LENS, map_cb6),
+ init_cb!(MP3_HUFF9_BITS, MP3_HUFF9_LENS, map_cb6),
+ init_cb!(MP3_HUFF10_BITS, MP3_HUFF10_LENS, map_cb8),
+ init_cb!(MP3_HUFF11_BITS, MP3_HUFF11_LENS, map_cb8),
+ init_cb!(MP3_HUFF12_BITS, MP3_HUFF12_LENS, map_cb8),
+ init_cb!(MP3_HUFF13_BITS, MP3_HUFF13_LENS, map_cb16),
+ init_cb!(MP3_HUFF15_BITS, MP3_HUFF15_LENS, map_cb16),
+ init_cb!(MP3_HUFF16_BITS, MP3_HUFF16_LENS, map_cb16),
+ init_cb!(MP3_HUFF24_BITS, MP3_HUFF24_LENS, map_cb16)
+ ];
+
+ Self { quad_cb, cb }
+ }
+ pub fn get_cb(&self, cb_id: u8) -> Option<(&Codebook<u8>, u8)> {
+ match cb_id {
+ 0 => None,
+ 1 => Some((&self.cb[0], 0)),
+ 2 => Some((&self.cb[1], 0)),
+ 3 => Some((&self.cb[2], 0)),
+ 5 => Some((&self.cb[3], 0)),
+ 6 => Some((&self.cb[4], 0)),
+ 7 => Some((&self.cb[5], 0)),
+ 8 => Some((&self.cb[6], 0)),
+ 9 => Some((&self.cb[7], 0)),
+ 10 => Some((&self.cb[8], 0)),
+ 11 => Some((&self.cb[9], 0)),
+ 12 => Some((&self.cb[10], 0)),
+ 13 => Some((&self.cb[11], 0)),
+ 15 => Some((&self.cb[12], 0)),
+ 16 => Some((&self.cb[13], 1)),
+ 17 => Some((&self.cb[13], 2)),
+ 18 => Some((&self.cb[13], 3)),
+ 19 => Some((&self.cb[13], 4)),
+ 20 => Some((&self.cb[13], 6)),
+ 21 => Some((&self.cb[13], 8)),
+ 22 => Some((&self.cb[13], 10)),
+ 23 => Some((&self.cb[13], 13)),
+ 24 => Some((&self.cb[14], 4)),
+ 25 => Some((&self.cb[14], 5)),
+ 26 => Some((&self.cb[14], 6)),
+ 27 => Some((&self.cb[14], 7)),
+ 28 => Some((&self.cb[14], 8)),
+ 29 => Some((&self.cb[14], 9)),
+ 30 => Some((&self.cb[14], 11)),
+ 31 => Some((&self.cb[14], 13)),
+ _ => unreachable!(),
+ }
+ }
+}