X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fcompr%2Fdeflate.rs;h=9277731d2301b02fc212137b637f4c53aa095441;hb=e6aaad5c5273cd814b5748b7faf3751835a37217;hp=3932473959867d2128ec018b1ac40407c28d7d9b;hpb=497aa09d91eadb4b8bc8126cdab695946d5ef9db;p=nihav.git diff --git a/nihav-core/src/compr/deflate.rs b/nihav-core/src/compr/deflate.rs index 3932473..9277731 100644 --- a/nihav-core/src/compr/deflate.rs +++ b/nihav-core/src/compr/deflate.rs @@ -210,7 +210,7 @@ impl<'a, S: Copy> CodebookReader for CurrentSource<'a> { let mut lut_bits = cb.lut_bits; let orig_br = self.br; while esc { - let lut_idx = (self.peek(lut_bits) as usize) + (idx as usize); + let lut_idx = (self.peek(lut_bits) as usize) + idx; if cb.table[lut_idx] == TABLE_FILL_VALUE { return Err(CodebookError::InvalidCode); } let bits = cb.table[lut_idx] & 0x7F; esc = (cb.table[lut_idx] & 0x80) != 0; @@ -221,7 +221,7 @@ impl<'a, S: Copy> CodebookReader for CurrentSource<'a> { self.refill(); return Err(CodebookError::MemoryError); } - self.skip(skip_bits as u32).unwrap(); + self.skip(skip_bits).unwrap(); lut_bits = bits as u8; } Ok(cb.syms[idx]) @@ -790,6 +790,7 @@ impl Inflate { self.state = InflateState::Start; } + #[allow(clippy::comparison_chain)] ///! Decompresses input data into output returning the uncompressed data length. pub fn uncompress(src: &[u8], dst: &mut [u8]) -> DecompressResult { let mut csrc = CurrentSource::new(src, BitReaderState::default()); @@ -886,13 +887,11 @@ impl Inflate { } let hdist = csrc.read(5)? as usize + 1; let hclen = csrc.read(4)? as usize + 4; - let mut cur_len_idx = 0; let mut len_lengths = [0; 19]; let mut all_lengths = [0; NUM_LITERALS + NUM_DISTS]; - for _ in 0..hclen { + for cur_len_idx in 0..hclen { len_lengths[LEN_RECODE[cur_len_idx]] = csrc.read(3)? as u8; - cur_len_idx += 1; } let mut len_codes = [ShortCodebookDesc { code: 0, bits: 0 }; 19]; lengths_to_codes(&len_lengths, &mut len_codes)?; @@ -1584,25 +1583,25 @@ fn gen_tree(codes: &mut [u16], lens: &mut [u8], num_codes: &mut usize, stats: &m *num_codes = 0; return; } - while tot_w > (1 << max_bits) { - for w in stats.iter_mut() { - *w = (*w + 1) >> 1; - } - tot_w = 0; - for &w in stats.iter() { - tot_w += w; + loop { + let mut tree = Tree::new(); + for (sym, &w) in stats.iter().enumerate() { + tree.insert(Node{ sym: sym as u16, w: w as u16, idx0: 64000, idx1: 64000 }); } - } - let mut tree = Tree::new(); - for (sym, &w) in stats.iter().enumerate() { - tree.insert(Node{ sym: sym as u16, w: w as u16, idx0: 64000, idx1: 64000 }); - } - tree.trim(); - tree.build(); + tree.trim(); + tree.build(); - for n in tree.nodes[..tree.nnodes].iter() { - if n.sym != NODE_SYM { - lens[n.sym as usize] = n.w as u8; + for n in tree.nodes[..tree.nnodes].iter() { + if n.sym != NODE_SYM { + lens[n.sym as usize] = n.w as u8; + } + } + if !lens.iter().any(|&x| x > max_bits) { + break; + } else { + for w in stats.iter_mut() { + *w = (*w + 1) >> 1; + } } } lengths_to_codes16(lens, codes); @@ -1919,22 +1918,19 @@ impl LZParse for OptimalParser { } ///! Deflate compression mode. -#[derive(Clone,Copy,Debug,PartialEq)] +#[derive(Clone,Copy,Debug,PartialEq,Default)] pub enum DeflateMode { ///! No compression. NoCompr, ///! Fast compression. Fast, ///! Still fast but better compression. + #[default] Better, ///! Slow but the best compression. Best, } -impl Default for DeflateMode { - fn default() -> Self { DeflateMode::Better } -} - pub const DEFLATE_MODE_DESCRIPTION: &str = "Deflate compression level."; ///! Deflate option for no compression. pub const DEFLATE_MODE_NONE: &str = "none";