mirror of
https://github.com/storytold/soundcraft.git
synced 2026-11-07 19:05:47 +00:00
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>
15 lines
590 B
Rust
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}"),
|
|
}
|
|
}
|