Files
craft-libs/crates/video
Dylan M. Taylor 0226f1d03e craft-video: H.264 decoder from FilmCraft, with DeckCraft's hardening (h264-decode) (#834)
* craft-video: H.264 decoder from FilmCraft (`h264-decode` feature)

FilmCraft's crates/h264 at 4c0d2ad7 becomes craft_video::h264::decode. The encoder moves to
h264/encode and is still exported from craft_video::h264. Feature h264 now turns on h264-decode
and h264-encode, so either half can be built without the other.

Without the threads feature a reference row that was never published read through expect();
it now reads as a gray row. craft_video::budget (the picture memory budget from DeckCraft's
bitstream crate) is added for the next commit. craft-video is built at opt-level 3 in the dev
profile, as FilmCraft built its codecs.

* craft-video: H.264 decoder hardening from DeckCraft's copy

- The picture store (DPB, current picture, pictures in flight or queued for output) is checked
  against a memory budget before a picture is allocated; Decoder::set_memory_budget.
- configure_avcc checks every entry before handling any: SPS NAL units in the first list, PPS in
  the second. A picture slice in the record starts no picture.
- The inverse transforms clamp coefficients to the spec's r range instead of overflowing.
- Temporal direct motion vectors are scaled in i32 and clipped to the spec range.
- slice_qp_delta is added with a checked add.
- A picture job sets up its picture state inside the panic guard.
2026-11-11 15:25:33 -05:00
..

craft-video

Clean-room pure-Rust video codecs for the Craft apps, one feature per codec: DNxHD/DNxHR, VP8, ProRes and H.264.

  • Input and output are byte slices and planar sample buffers; the crate opens no files itself and performs no filesystem I/O.
  • Implemented from published standards and RFCs (SMPTE ST 2019-1, RFC 6386, SMPTE RDD 36 and ITU-T H.264).
  • Tested against ffmpeg as an external oracle with roundtrips, hostile fuzzing, and conformance vectors. No unsafe, no panics on corrupt streams. Builds for wasm32-unknown-unknown.
  • Containers (MP4/MOV, Matroska/WebM), bit-level I/O (craft_media::bitstream) and shared identifiers (CodecId, CodecParams) come from craft-media.

Cargo features

No codec feature is on by default.

Feature Module Codec
dnx dnx Avid DNxHD / DNxHR (SMPTE ST 2019-1 VC-3): decoder and encoder
vp8 vp8 VP8 (RFC 6386): decoder
prores prores Apple ProRes (SMPTE RDD 36): decoder and encoder
h264 h264 ITU-T H.264 / AVC: decoder (h264-decode alone) and encoder (h264-encode alone)
hevc hevc ITU-T H.265 / HEVC: decoder (hevc-decode alone) and encoder (hevc-encode alone)
vp9 vp9 VP9: decoder (vp9-decode alone) and encoder (vp9-encode alone)
av1 av1 AV1 (AOMedia Video 1): encoder
threads — Multi-threaded slice/row parallelism via rayon