add nihav-mpeg crate
[nihav.git] / nihav-mpeg / src / codecs / mpegaudio / mp3data.rs
diff --git a/nihav-mpeg/src/codecs/mpegaudio/mp3data.rs b/nihav-mpeg/src/codecs/mpegaudio/mp3data.rs
new file mode 100644 (file)
index 0000000..e7603e0
--- /dev/null
@@ -0,0 +1,535 @@
+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!(),
+        }
+    }
+}