Files
craft-libs/crates/video/Cargo.toml
Dylan M. Taylor 16564be34b craft-video: AV1 decoder from FilmCraft, with DeckCraft's hardening (av1-decode) (#836)
* craft-video: AV1 decoder from FilmCraft (`av1-decode` feature)

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

The ignored speed tests no longer read the thread CPU clock (FilmCraft used rustix for it).
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: AV1 decoder hardening from DeckCraft's copy

- The picture store (eight reference slots, the new frame, frames in flight) is checked against
  a memory budget before a frame is allocated; Decoder::set_memory_budget.
- Non-uniform tile spacing is refused past MAX_TILE_COLS columns or MAX_TILE_ROWS rows.

* craft-video: AV1 fuzz seeds are 64x64 so SVT-AV1 2.x can encode them

FilmCraft's seeds were 64x48; the SVT-AV1 2.3 on the Ubuntu runners refuses a source under 64
lines, and an encoder that exists but fails is a test failure, not a skip.
2026-11-11 17:43:10 -05:00

124 lines
3.0 KiB
TOML

[package]
name = "craft-video"
description = "Clean-room pure-Rust video codecs, one feature per codec: DNxHD/DNxHR, VP8, ProRes, H.264, HEVC, VP9, AV1."
version.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
repository.workspace = true
[package.metadata.docs.rs]
all-features = true
[lints]
workspace = true
[features]
# Every codec feature turns on one codec module; none is on by default.
# DNxHD / DNxHR (SMPTE ST 2019-1): decoder and encoder.
dnx = []
# APV (Advanced Professional Video, RFC 9924): decoder and encoder; `apv-decode` or `apv-encode` for one of them.
apv = ["apv-decode", "apv-encode"]
apv-decode = ["craft-media/bitstream"]
apv-encode = ["craft-media/bitstream"]
# VP8 (RFC 6386): decoder.
vp8 = []
# MPEG-2 video (ITU-T H.262) and MPEG-1 video (ISO/IEC 11172-2): decoder.
mpeg2 = []
# Apple ProRes (SMPTE RDD 36): decoder and encoder.
prores = ["craft-media/bitstream"]
# H.264 / AVC: decoder and encoder; `h264-decode` or `h264-encode` for one of them.
h264 = ["h264-decode", "h264-encode"]
h264-decode = ["craft-media/bitstream"]
h264-encode = ["craft-media/isobmff"]
# H.265 / HEVC: decoder and encoder; `hevc-decode` or `hevc-encode` for one of them.
hevc = ["hevc-decode", "hevc-encode"]
hevc-decode = ["craft-media/bitstream"]
hevc-encode = ["craft-media/isobmff"]
# VP9: decoder and encoder; `vp9-decode` or `vp9-encode` for one of them.
vp9 = ["vp9-decode", "vp9-encode"]
vp9-decode = ["craft-media/bitstream"]
vp9-encode = ["craft-media/isobmff"]
# AV1: decoder and encoder; `av1-decode` or `av1-encode` for one of them.
av1 = ["av1-decode", "av1-encode"]
av1-decode = []
av1-encode = ["craft-media/isobmff"]
# Decode and encode across worker threads (rayon) in the codecs that support it.
threads = ["dep:rayon"]
[dependencies]
craft-media = { workspace = true }
thiserror = { workspace = true }
rayon = { workspace = true, optional = true }
[dev-dependencies]
craft-media-testkit = { workspace = true }
[[test]]
name = "dnx"
required-features = ["dnx"]
[[test]]
name = "apv"
required-features = ["apv"]
[[test]]
name = "vp8"
required-features = ["vp8"]
[[example]]
name = "vp8_fuzz"
required-features = ["vp8"]
[[example]]
name = "vp8_vp8dec"
required-features = ["vp8"]
[[test]]
name = "av1_decode"
required-features = ["av1-decode"]
[[example]]
name = "av1_av1dec"
required-features = ["av1-decode"]
[[test]]
name = "h264_decode"
required-features = ["h264-decode"]
[[example]]
name = "h264_h264dec"
required-features = ["h264-decode"]
[[test]]
name = "hevc_decode"
required-features = ["hevc-decode"]
[[example]]
name = "hevc_hevcdec"
required-features = ["hevc-decode"]
[[test]]
name = "vp9_decode"
required-features = ["vp9-decode"]
[[example]]
name = "vp9_vp9dec"
required-features = ["vp9-decode"]
[[test]]
name = "mpeg2"
required-features = ["mpeg2"]
[[test]]
name = "prores"
required-features = ["prores"]
[[test]]
name = "hevc"
required-features = ["hevc-encode"]
[[test]]
name = "av1"
required-features = ["av1"]