fn read_cb(&mut self, cb: &Codebook<S>) -> CodebookResult<S>;
}
-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;
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 {
for (_, sec_bucket) in &escape_list {
build_esc_lut(table, mode, sec_bucket)?;
}
-
+
Ok(())
}
let mut symidx: usize = 0;
for i in 0..cb.len() {
let bits = cb.bits(i);
- if bits > 0 { nnz = nnz + 1; }
+ if bits > 0 {
+ nnz = nnz + 1;
+ if cb.code(i) >= (1 << bits) {
+ return Err(CodebookError::InvalidCodebook);
+ }
+ }
maxbits = max(bits, maxbits);
if bits > MAX_LUT_BITS {
let code = cb.code(i);
fn len(&mut self) -> usize { self.data.len() }
}
+pub struct TableCodebookDescReader<CodeType:'static, IndexType:'static> {
+ bits: &'static [u8],
+ codes: &'static [CodeType],
+ idx_map: fn(usize) -> IndexType,
+}
+
+impl<'a, CodeType, IndexType> TableCodebookDescReader<CodeType, IndexType> {
+ pub fn new(codes: &'static [CodeType], bits: &'static [u8], idx_map: fn(usize) -> IndexType) -> Self {
+ Self { bits, codes, idx_map }
+ }
+}
+impl<CodeType: Copy+Into<u32>, IndexType> CodebookDescReader<IndexType> for TableCodebookDescReader<CodeType, IndexType>
+{
+ 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::*;
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];