#avc #less #8-bit #video #h-264

less-avc

less Advanced Video Coding (H.264) encoding

3 releases

Uses new Rust 2021

0.1.2 Nov 20, 2022
0.1.1 Nov 19, 2022
0.1.0 Nov 19, 2022

#86 in Video

Download history 79/week @ 2022-11-16 25/week @ 2022-11-23 9/week @ 2022-11-30

113 downloads per month

MIT/Apache

58KB
1K SLoC

less-avc - Less Advcanced Video Coding - H.264 Encoder

Crates.io Documentation Crate License

This module contains a pure Rust implementation of an H.264 encoder optimized for lossless encoding. It is simple ("less advanced") and uses a small subset of the encoder features in the H.264 specification.

Features and characteristics:

  • Pure rust.
  • Lossless encoding of 8 bit and 12 bit monochrome (luminance only 4:0:0) and color (4:2:0) data.
  • Includes an optimized path for luminance-only data in which no chroma data is saved.
  • Encodes every frame as an I (intra) frame (also "keyframe") using PCM encoding.
  • Tests decode image with openh264 and ffmpeg to ensure encoded image is losslessly preserved.

Desired but not implemented feature:

  • Support for other bit-depths and chroma sampling resolutions (e.g. 4:4:4).

Worthy of consideration features:

  • Support for context-adaptive variable-length coding (CAVLC).
  • Support for context-adaptive binary arithmetic coding (CABAC).

This was inspired by Ben Mesander's World's Smallest H.264 Encoder.

Testing

Run the basic tests with:

cargo test

Full round-trip tests with ffmpeg and openh264 are in the testbench directory and crate. For those:

cd testbench
cargo test

These tests can export the created streams to .h264 files if the LESSAVC_SAVE_TEST_H264 environment variable is set. To convert these to .mp4:

#!/bin/bash -x
set -o errexit

FILES="./*.h264"
for f in $FILES
do
    echo "Processing $f file..."
    ffmpeg -i $f -vcodec copy $f.mp4
    # ffmpeg -i $f $f.png
done

Benchmarking

Benchmarks are in the testbench directory and crate:

cd testbench
cargo bench

# Or, to benckmark while compiling for the native CPU architecture, like so:
RUSTFLAGS='-C target-cpu=native' cargo bench

License

Copyright 2022 Andrew D. Straw.

Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.

Dependencies

~1.3–1.7MB
~41K SLoC