/less-avc

less Advanced Video Coding (H.264) encoding

Primary LanguageRustApache License 2.0Apache-2.0

less-avc - Less Advanced 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.
  • No use of unsafe.
  • 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 using ALL-Intra, also called All-I. Every frame is recorded as an I (intra) frame (also "keyframe") using PCM encoding.
  • Tests decode image with openh264 and ffmpeg to ensure encoded image is losslessly preserved.
  • Can be compiled without using the rust standard library std. In other words, the no_std attribute is specified. (A global allocator is required.)

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 view the location where the .h264 files are saved, run the tests with cargo test -- --nocapture.) 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-2023 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.