Files
soundcraft/crates/video/examples/test_movie.rs
Brandon ThomasandClaude Opus 5.5 cdefc57c91 Video track, Audio Unit hosting, plugin state and editors, Renderer and UI Customization
Video (new standalone crate soundcraft-video):
- Pure-Rust H.264 (Baseline/Main/High), ProRes (all flavours) and Motion JPEG decoding with
  ISO-BMFF demux, adapted from FilmCraft's crates; fuzzed with mutated/truncated movies
- TrackKind::Video with ClipContent::Video referencing Session.videos; file.import_video adds
  the picture track and the movie's audio; relinking on open; video.offset/online/list
- Video and Video Universe windows, thumbnails on the timeline, background decoding

Third-party plugins:
- Plugin state (CLAP state ext, VST3 component + controller state) saved in sessions
- Hosted instances created, state-loaded and dropped on the UI thread, never the audio thread
- Plugin editors: floating CLAP GUIs and VST3 views on macOS (verified with Melodyne)
- New isolated FFI crate soundcraft-au-host: Audio Units on macOS (effects and instruments,
  parameters, latency, MIDI, ClassInfo state), wired into the mixer and plugin browser

UI: Window > Renderer (speaker layout with live levels and object positions), Window > UI
Customization (interface scale, reduce motion), Window > Configurations > Auto-Update.

Fix: saturating sample-index math in clip rendering (hostile stretch values overflowed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:41:05 -04:00

15 lines
590 B
Rust

//! Write a synthetic colour-bar test movie (H.264 in MP4, 320x192, 24 fps).
//!
//! `cargo run -p soundcraft-video --example test_movie -- out.mp4 [seconds]`
fn main() {
let mut args = std::env::args().skip(1);
let out = args.next().unwrap_or_else(|| "test_pattern.mp4".into());
let secs = args.next().and_then(|s| s.parse().ok()).unwrap_or(4);
match soundcraft_video::synth::test_pattern_mp4(secs).map(|b| std::fs::write(&out, b)) {
Ok(Ok(())) => println!("wrote {out}"),
Ok(Err(e)) => eprintln!("{out}: {e}"),
Err(e) => eprintln!("{e}"),
}
}