mirror of
https://github.com/storytold/filmcraft.git
synced 2026-10-27 11:38:28 -06:00
- New crates/platform (filmcraft-platform, L5): OS media FFI only. The one crate allowed `unsafe` (own [lints] with unsafe_code = "deny", #[allow(unsafe_code)] only on the videotoolbox module, SAFETY comment on every block, safe Result-returning public API). AGENTS.md §0.3 names the exception; docs/adr/0001-platform-ffi.md records why and the rules. - VideoToolbox decoder for avcC / hvcC, 8/10-bit 4:2:0 and 4:2:2: session from the sample entry's parameter sets with hardware required, asynchronous decode (2 in flight), biplanar CVPixelBuffer copied to planar Yuv8/Yuv16, reorder buffer of the stream's own depth, RASL skipped after a starting CRA. Output callback under catch_unwind. - HybridDecoder: transparent mid-stream fallback to the software decoder (replays samples since the last restart point, drops already-returned pictures). New codecs::software_video_decoder (built-in factories only) and codecs::hw (switch, counters, NalStreamInfo shared with software decoders; vui_color / sar_par helpers now used by both). - Settings ▸ Playback ▸ Hardware decoding: Auto / Off (engine applies it to the codecs switch); desktop app, CLI/MCP and bench call register(). - perf.stats decode.framesDecoded and decode.hardware counters. - Tests: bit-exact parity with the software decoders (H.264 High, HEVC Main open GOP, Main 10; resets, reseeks, flushes), forced-failure fallback, mutation fuzz of samples and parameter sets, cross-platform fallback with a stand-in decoder, setting Off, HEVC 4:2:2 vs ffmpeg. - Bench --hw auto|off; results in docs/performance.md (4K CPU/frame ~86-119 ms -> ~4 ms). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
126 lines
3.4 KiB
TOML
126 lines
3.4 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = ["crates/*", "apps/*", "xtask"]
|
|
default-members = ["crates/*", "apps/*", "xtask"]
|
|
|
|
[workspace.package]
|
|
version = "0.2.0"
|
|
edition = "2024"
|
|
license = "MIT OR Apache-2.0"
|
|
rust-version = "1.95"
|
|
repository = "https://github.com/storytold/filmcraft"
|
|
|
|
[workspace.dependencies]
|
|
# internal
|
|
filmcraft-time = { path = "crates/time" }
|
|
filmcraft-geom = { path = "crates/geom" }
|
|
filmcraft-color = { path = "crates/color" }
|
|
filmcraft-bitstream = { path = "crates/bitstream" }
|
|
filmcraft-isobmff = { path = "crates/isobmff" }
|
|
filmcraft-matroska = { path = "crates/matroska" }
|
|
filmcraft-mxf = { path = "crates/mxf" }
|
|
filmcraft-cfb = { path = "crates/cfb" }
|
|
filmcraft-mpegts = { path = "crates/mpegts" }
|
|
filmcraft-mpeg2v = { path = "crates/mpeg2v" }
|
|
filmcraft-ac3 = { path = "crates/ac3" }
|
|
filmcraft-ogg = { path = "crates/ogg" }
|
|
filmcraft-h264 = { path = "crates/h264" }
|
|
filmcraft-hevc = { path = "crates/hevc" }
|
|
filmcraft-vp9 = { path = "crates/vp9" }
|
|
filmcraft-prores = { path = "crates/prores" }
|
|
filmcraft-dnx = { path = "crates/dnx" }
|
|
filmcraft-av1 = { path = "crates/av1" }
|
|
filmcraft-aac = { path = "crates/aac" }
|
|
filmcraft-opus = { path = "crates/opus" }
|
|
filmcraft-h264enc = { path = "crates/h264enc" }
|
|
filmcraft-audio-dsp = { path = "crates/audio-dsp" }
|
|
filmcraft-frame = { path = "crates/frame" }
|
|
filmcraft-media = { path = "crates/media" }
|
|
filmcraft-codecs = { path = "crates/codecs" }
|
|
filmcraft-project = { path = "crates/project" }
|
|
filmcraft-edit = { path = "crates/edit" }
|
|
filmcraft-interchange = { path = "crates/interchange" }
|
|
filmcraft-text = { path = "crates/text" }
|
|
filmcraft-captions = { path = "crates/captions" }
|
|
filmcraft-speech = { path = "crates/speech" }
|
|
filmcraft-render = { path = "crates/render" }
|
|
filmcraft-gpu = { path = "crates/gpu" }
|
|
filmcraft-scopes = { path = "crates/scopes" }
|
|
filmcraft-export = { path = "crates/export" }
|
|
filmcraft-format = { path = "crates/format" }
|
|
filmcraft-engine = { path = "crates/engine" }
|
|
filmcraft-ui-egui = { path = "crates/ui-egui" }
|
|
filmcraft-automation = { path = "crates/automation" }
|
|
filmcraft-platform = { path = "crates/platform" }
|
|
filmcraft-testkit = { path = "crates/testkit" }
|
|
|
|
# foundation
|
|
thiserror = "2"
|
|
serde = { version = "1", features = ["derive", "rc"] }
|
|
serde_json = "1"
|
|
log = "0.4"
|
|
rayon = "1"
|
|
proptest = "1"
|
|
roxmltree = "0.21"
|
|
|
|
# ui
|
|
egui = "0.36"
|
|
eframe = { version = "0.36", default-features = false }
|
|
egui_kittest = "0.36"
|
|
rfd = "0.17"
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[workspace.lints.clippy]
|
|
dbg_macro = "warn"
|
|
todo = "warn"
|
|
too_many_arguments = "allow"
|
|
needless_range_loop = "allow"
|
|
type_complexity = "allow"
|
|
|
|
[profile.dev.package."*"]
|
|
opt-level = 2
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
|
|
# Codec hot loops: debug-build tests (RFC/oracle vectors) are minutes slower below opt-level 3.
|
|
[profile.dev.package.filmcraft-h264]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-h264enc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-hevc]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-prores]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-dnx]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-av1]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-aac]
|
|
opt-level = 3
|
|
|
|
# Audio effects: realtime-factor tests and long convolution / spectral runs.
|
|
[profile.dev.package.filmcraft-audio-dsp]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-mxf]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-opus]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.filmcraft-vp9]
|
|
opt-level = 3
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|