use crate::compression::{
CodecImplementation, CompressionCodec, CompressionCodecType, DecompressResult,
};
use crate::error::Result;
use crate::header::CodecType;
use crate::huffman::Huffman8BitDecoder;
use bitreader::BitReader;
pub struct HuffmanCodec;
impl CodecImplementation for HuffmanCodec {
fn new(_: u32) -> Result<Self> {
Ok(HuffmanCodec)
}
fn decompress(&mut self, input: &[u8], output: &mut [u8]) -> Result<DecompressResult> {
let mut bit_reader = BitReader::new(input);
let decoder = Huffman8BitDecoder::from_huffman_tree(&mut bit_reader)?;
for i in output.iter_mut() {
*i = decoder.decode_one(&mut bit_reader)? as u8;
}
Ok(DecompressResult::new(
output.len(),
((input.len() * 8) - bit_reader.remaining() as usize) / 8,
))
}
}
impl CompressionCodecType for HuffmanCodec {
fn codec_type(&self) -> CodecType {
CodecType::HuffV5
}
}
impl CompressionCodec for HuffmanCodec {}