mod block;
mod fast;
mod hc;
mod optimal;
#[cfg(test)]
mod tests;
use alloc::vec::Vec;
use super::FnEncoder;
use crate::compressor::core::data::Stream;
use crate::compressor::core::error::NodeError;
use crate::compressor::core::exec::NodeCx;
use crate::shared::varint;
pub(crate) use block::MAX_INPUT_SIZE;
pub(crate) static LZ4: FnEncoder = FnEncoder(encode);
const LEVEL_OVERRIDE: i32 = crate::graph::params::lz4::COMPRESSION_LEVEL_OVERRIDE;
pub(crate) fn compress_block(src: &[u8], level: i32) -> Option<Vec<u8>> {
if src.len() > MAX_INPUT_SIZE {
return None;
}
Some(if level <= 1 {
let acceleration = if level < 0 {
level.wrapping_neg().wrapping_add(1)
} else {
1
};
fast::compress(src, acceleration)
} else {
hc::compress(src, level)
})
}
fn encode<'a>(cx: &mut NodeCx<'_, 'a>, inputs: &[Stream<'a>]) -> Result<(), NodeError> {
let input = &inputs[0];
let size = input.content_size();
let level = cx.int(LEVEL_OVERRIDE).unwrap_or_else(|| cx.level());
let block = compress_block(input.bytes(), level)
.ok_or(NodeError::InvalidInput("the input is too large for LZ4"))?;
let mut header = Vec::new();
varint::push(&mut header, size as u64);
cx.emit(0, 1, block)?;
cx.send_header(&header)?;
Ok(())
}