X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fio%2Fcodebook.rs;h=5bfd71991e186cfe7c855d2ce11411e1d27d8a59;hb=b7b96b4cabbde72f05d0464299bf7fdf74d6480c;hp=0e03ded1c63b236d0ce651f5774cfd2083bbf280;hpb=0ca65ffdfd8d16f8eb3b13f9a0832c60921934cf;p=nihav.git diff --git a/src/io/codebook.rs b/src/io/codebook.rs index 0e03ded..5bfd719 100644 --- a/src/io/codebook.rs +++ b/src/io/codebook.rs @@ -46,21 +46,6 @@ pub trait CodebookReader { fn read_cb(&mut self, cb: &Codebook) -> CodebookResult; } -pub fn reverse_bits(inval: u32) -> u32 { - const REV_TAB: [u8; 16] = [ - 0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, - 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111, - ]; - - let mut ret = 0; - let mut val = inval; - for _ in 0..8 { - ret = (ret << 4) | (REV_TAB[(val & 0xF) as usize] as u32); - val = val >> 4; - } - ret -} - const TABLE_FILL_VALUE: u32 = 0x7F; const MAX_LUT_BITS: u8 = 10; @@ -173,7 +158,7 @@ fn build_esc_lut(table: &mut Vec, for code in &bucket.codes { let bits = code.bits; - if code.bits < MAX_LUT_BITS { + if code.bits <= MAX_LUT_BITS { fill_lut(table, mode, bucket.offset, code.code, bits, maxlen, code.idx as u32, false); } else { @@ -196,7 +181,7 @@ fn build_esc_lut(table: &mut Vec, for (_, sec_bucket) in &escape_list { build_esc_lut(table, mode, sec_bucket)?; } - + Ok(()) } @@ -324,6 +309,25 @@ impl CodebookDescReader for ShortCodebookDescReader { fn len(&mut self) -> usize { self.data.len() } } +pub struct TableCodebookDescReader { + bits: &'static [u8], + codes: &'static [CodeType], + idx_map: fn(usize) -> IndexType, +} + +impl<'a, CodeType, IndexType> TableCodebookDescReader { + pub fn new(codes: &'static [CodeType], bits: &'static [u8], idx_map: fn(usize) -> IndexType) -> Self { + Self { bits, codes, idx_map } + } +} +impl, IndexType> CodebookDescReader for TableCodebookDescReader +{ + fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } + fn code(&mut self, idx: usize) -> u32 { self.codes[idx].into() } + fn sym (&mut self, idx: usize) -> IndexType { (self.idx_map)(idx) } + fn len(&mut self) -> usize { self.bits.len() } +} + #[cfg(test)] mod test { use super::*; @@ -376,7 +380,7 @@ mod test { assert_eq!(br2.read_cb(&cb).unwrap(), 5); assert_eq!(br2.read_cb(&cb).unwrap(), 8); - assert_eq!(reverse_bits(0b0000_0101_1011_1011_1101_1111_0111_1111), + assert_eq!(reverse_bits(0b0000_0101_1011_1011_1101_1111_0111_1111, 32), 0b1111_1110_1111_1011_1101_1101_1010_0000); const BITS_LE: [u8; 3] = [0b11101111, 0b01110010, 0b01];