Expand description
Ranged Asymmetric Numeral Systems (rANS) encoder and decoder. Under the hood, this is a high-level wrapper over ryg-rans-sys.
ANS is a family of modern entropy coding methods introduced by Jarek Duda from Jagiellonian University. It serves as an alternative to arithmetic and Huffman coding, combining the performance and compression ratio of both. Many recent compression algorithms, such as Facebook’s Zstandard, Apple’s LZFSE, or JPEG XL, use ANS under the hood.
§Types of encoders/decoders in this crate
byte_encoder
/byte_decoder
has a byte-aligned rANS encoder/decoder.b64_encoder
/b64_decoder
is a 64-bit version that emits entire 32-bit words at a time. It might be faster than byte-aligned variant on 64-bit architectures, and also makes for a very precise arithmetic coder (i.e. it gets quite close to entropy). The trade-off is that this version will be slower on 32-bit machines, and the output bitstream is not endian-neutral.
See the ryg_rans repository for more details.
§See also
§Examples
use rans::byte_decoder::{ByteRansDecSymbol, ByteRansDecoder};
use rans::byte_encoder::{ByteRansEncSymbol, ByteRansEncoder};
use rans::{RansDecSymbol, RansDecoder, RansEncSymbol, RansEncoder, RansEncoderMulti};
const SCALE_BITS: u32 = 2;
// Encode two symbols
let mut encoder = ByteRansEncoder::new(1024);
let symbol1 = ByteRansEncSymbol::new(0, 2, SCALE_BITS);
let symbol2 = ByteRansEncSymbol::new(2, 2, SCALE_BITS);
encoder.put(&symbol1);
encoder.put(&symbol2);
encoder.flush();
let mut data = encoder.data().to_owned();
// Decode the encoded data
let mut decoder = ByteRansDecoder::new(data);
let symbol1 = ByteRansDecSymbol::new(0, 2);
let symbol2 = ByteRansDecSymbol::new(2, 2);
// Please note that the data is being decoded in reverse
assert_eq!(decoder.get(SCALE_BITS), 2); // Decoder returns cumulative frequency
decoder.advance(&symbol2, SCALE_BITS);
assert_eq!(decoder.get(SCALE_BITS), 0);
decoder.advance(&symbol1, SCALE_BITS);
Modules§
- b64_
decoder - 64-bit rANS decoder.
- b64_
encoder - 64-bit rANS encoder.
- byte_
decoder - Byte-aligned rANS decoder.
- byte_
encoder - Byte-aligned rANS encoder.
- mut_cow
MutCow
smart pointer to work with mutably-borrowed/owned data in a unified way.
Traits§
- Rans
DecSymbol - A symbol that can be decoded using a rANS decoder.
- Rans
Decoder - Single-stream rANS decoder interface.
- Rans
Decoder Multi - Interleaved multi-stream rANS decoder interface.
- Rans
EncSymbol - A symbol that can be encoded using a rANS encoder.
- Rans
Encoder - Single-stream rANS encoder interface.
- Rans
Encoder Multi - Interleaved multi-stream rANS encoder interface.