6 releases
0.1.5 | Aug 29, 2023 |
---|---|
0.1.4 | May 24, 2023 |
0.1.3 | Mar 30, 2023 |
0.1.2 | Nov 20, 2022 |
#59 in Video
1,126 downloads per month
62KB
1.5K
SLoC
less-avc - Less Advanced Video Coding - H.264 Encoder
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, theno_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.
Dependencies
~1MB
~26K SLoC