fix clippy warnings
[nihav.git] / nihav-core / src / compr / mod.rs
CommitLineData
0443d0c5
KS
1//! Various compression formats support.
2#[cfg(feature="deflate")]
e6aaad5c 3#[allow(clippy::manual_range_contains)]
0443d0c5
KS
4pub mod deflate;
5
6use crate::io::byteio::ByteIOError;
7use crate::io::bitreader::BitReaderError;
8use crate::io::codebook::CodebookError;
9
10/// A list specifying general compression errors.
11#[derive(Debug)]
12pub enum DecompressError {
13 /// Compressed stream header contains errors.
14 InvalidHeader,
15 /// Compressed stream checksum does not match unpacked contents.
16 CRCError,
17 /// Compressed stream contains a combination of bits that cannot be decoded.
18 InvalidData,
19 /// Compressed stream ended prematurely.
20 ShortData,
21 /// There is more data than what can fit output buffer.
22 OutputFull,
23 /// Provided function argument is invalid.
24 InvalidArgument,
25 /// Compressed stream contains features that cannot be decoded.
26 Unsupported,
27 /// Underlying input reader had a problem.
28 IOError,
29}
30
31/// A specialised `Result` type for codebook operations.
32pub type DecompressResult<T> = Result<T, DecompressError>;
33
34impl From<ByteIOError> for DecompressError {
35 fn from(e: ByteIOError) -> Self {
36 match e {
37 ByteIOError::EOF => DecompressError::ShortData,
38 _ => DecompressError::IOError,
39 }
40 }
41}
42
43impl From<BitReaderError> for DecompressError {
44 fn from(e: BitReaderError) -> Self {
45 match e {
46 BitReaderError::BitstreamEnd => DecompressError::ShortData,
47 _ => DecompressError::InvalidData,
48 }
49 }
50}
51
52impl From<CodebookError> for DecompressError {
53 fn from(_: CodebookError) -> Self {
54 DecompressError::InvalidData
55 }
56}
57
58///! Copies requested amount of bytes from previous position in the same buffer.
59///! If source area overlaps with destination area already copied values should be used e.g. copying with offset 1 means essentially to repeat previous byte requested number of times.
60pub fn lz_copy(buf: &mut [u8], dst_pos: usize, offset: usize, len: usize) {
61 if dst_pos < offset {
62 panic!("Copy offset is before buffer start.");
63 }
64 let ipos = dst_pos - offset;
65 let buf = &mut buf[ipos..];
66 if ipos + len <= dst_pos {
67 let (src, dst) = buf.split_at_mut(offset);
e6aaad5c 68 dst[..len].copy_from_slice(&src[..len]);
0443d0c5
KS
69 } else {
70 for i in 0..len {
71 buf[offset + i] = buf[i];
72 }
73 }
74}