X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-core%2Fsrc%2Fcompr%2Fdeflate.rs;h=89e0fde18de25502433060c2529499a6fba5eb58;hp=7d6fae5eafd5174bedfd5c3d96e93ad85cc35bd8;hb=0c9b706ab86de253938471cde127abde866210dd;hpb=f8cdb949e5b15fca5b563d9f3ac06083234f0e86 diff --git a/nihav-core/src/compr/deflate.rs b/nihav-core/src/compr/deflate.rs index 7d6fae5..89e0fde 100644 --- a/nihav-core/src/compr/deflate.rs +++ b/nihav-core/src/compr/deflate.rs @@ -174,7 +174,7 @@ impl<'a> CurrentSource<'a> { fn align(&mut self) { let b = self.br.bits & 7; if b != 0 { - self.skip_cache(8 - (b as u8)); + self.skip_cache(b); } } fn left(&self) -> isize { @@ -386,6 +386,15 @@ impl Inflate { self.output_idx = 0; CurrentSource::reinit(src, self.br) }; + // check for zlib stream header + if let (&InflateState::Start, true) = (&self.state, src.len() > 2) { + let cm = src[0] & 0xF; + let cinfo = src[0] >> 4; + let hdr = (u16::from(src[0]) << 8) | u16::from(src[1]); + if cm == 8 && cinfo <= 7 && (hdr % 31) == 0 { + csrc.skip(16).unwrap(); + } + } 'main: loop { match self.state { InflateState::Start | InflateState::BlockStart => { @@ -737,8 +746,7 @@ impl Inflate { ///! Decompresses input data into output returning the uncompressed data length. pub fn uncompress(src: &[u8], dst: &mut [u8]) -> DecompressResult { let mut inflate = Self::new(); - let off = if src.len() > 2 && src[0] == 0x78 && (src[1] != 0 && ((src[1] - 1) % 31) == 0) { 2 } else { 0 }; - inflate.decompress_data(&src[off..], dst, false) + inflate.decompress_data(src, dst, false) } }