Skip to content

mibz2 (Rust)

The crate's API documentation is on docs.rs.

API what
decode, decode_parallel(data, threads) a whole .bz2 in memory
BzReader::new(r), BzReader::parallel(r, threads), parallel_with(r, threads, slots, kernels) a Read adaptor; a bad stream is an io::Error (InvalidData) wrapping mibz2::Error
StreamDecoder::new(threads, slots, kernels) the push form: write compressed chunks from one thread, read decoded bytes from another, close, cancel; at most slots blocks in flight
scan(data) → BlockSpan { index, start_bit, end_bit, crc, stream, level } block boundaries, without decoding
decode_blocks(data, start_bit, end_bit, level, kernels, out) → Range a range of whole blocks, each CRC checked
Error { kind: ErrorKind, block, bit } what is wrong with the input, and where
Kernels::detect(), Kernels::scalar() the SIMD kernels, or the portable ones
bwt::InverseBwt (Segmented, the default; Plain), decode_with::<I>, StreamDecoder::with_inverse::<I> the inverse-BWT kernel, swappable and timeable as part of the whole decoder
// the block boundaries (each block's header and Huffman symbols read, nothing decoded),
// then any range of whole blocks decoded on its own, on any thread
let data = std::fs::read("file.bz2")?;
for span in mibz2::scan(&data) {
    let span = span?;
    let mut part = Vec::new();
    let range = mibz2::decode_blocks(&data, span.start_bit, span.end_bit, span.level,
                                      mibz2::Kernels::detect(), &mut part)?;
    // range.blocks: each block's (start bit, end bit, CRC); mibz2::combine(...) gives a
    // stream's combined CRC from its blocks'
}