Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/m4tx/rans-rs
rANS encoder and decoder for Rust
https://github.com/m4tx/rans-rs
asymmetric-numeral-systems compression entropy-coding rust
Last synced: about 2 months ago
JSON representation
rANS encoder and decoder for Rust
- Host: GitHub
- URL: https://github.com/m4tx/rans-rs
- Owner: m4tx
- License: mit
- Created: 2022-07-16T23:36:58.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-02-11T15:46:18.000Z (11 months ago)
- Last Synced: 2024-10-31T11:57:16.823Z (2 months ago)
- Topics: asymmetric-numeral-systems, compression, entropy-coding, rust
- Language: Rust
- Homepage:
- Size: 49.8 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
rans-rs
=======[![Rust Build Status](https://github.com/m4tx/rans-rs/workflows/Rust%20CI/badge.svg)](https://github.com/m4tx/rans-rs/actions/workflows/rust.yml)
[![crates.io](https://img.shields.io/crates/v/rans.svg)](https://crates.io/crates/rans)
[![Documentation](https://docs.rs/rans/badge.svg)](https://docs.rs/rans)
[![MIT licensed](https://img.shields.io/github/license/m4tx/rans-rs)](https://github.com/m4tx/rans-rs/blob/master/LICENSE)
[![codecov](https://codecov.io/gh/m4tx/rans-rs/branch/master/graph/badge.svg)](https://codecov.io/gh/m4tx/rans-rs)Ranged Asymmetric Numeral Systems (rANS) encoder and decoder. Under the hood,
this is a high-level wrapper over
[ryg-rans-sys](https://github.com/m4tx/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.See the [ryg_rans](https://github.com/rygorous/ryg_rans) repository for more
details about the underlying implementation.## Usage
Add the following to your `Cargo.toml`:
```toml
[dependencies]
rans = "0.4.0"
```## Examples
```rust
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);
```## License
The project is licensed under the [MIT license](LICENSE).
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the project by you shall be licensed as MIT, without any
additional terms or conditions.## Developing
### `pre-commit`
We encourage contributors to use predefined [`pre-commit`](https://pre-commit.com/)
hooks --- to install them in your local repo, make sure you have `pre-commit`
installed and run
```shell
pre-commit install
```