1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//! # ff-render
//!
//! GPU compositing pipeline for real-time video preview, built on [wgpu].
//!
//! `ff-render` sits above `ff-preview` in the crate stack and implements
//! [`ff_preview::FrameSink`] so it integrates directly with
//! [`ff_preview::PlayerRunner`].
//!
//! ## Feature flags
//!
//! | Feature | Description | Default |
//! |---------|-------------|---------|
//! | `wgpu` | GPU processing via wgpu (Metal / Vulkan / DX12 / WebGPU) | no |
//!
//! Without `wgpu` only the CPU fallback path is available via
//! [`RenderGraph::process_cpu`].
//!
//! ## Usage — wiring to `PlayerRunner`
//!
//! ```ignore
//! use std::sync::Arc;
//!
//! use ff_preview::{PreviewPlayer, RgbaSink};
//! use ff_render::context::RenderContext;
//! use ff_render::graph::RenderGraph;
//! use ff_render::nodes::ColorGradeNode;
//! use ff_render::sink::GpuFrameSink;
//!
//! # #[tokio::main]
//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
//! // 1. Initialise the GPU device (headless — no window required).
//! let ctx = Arc::new(RenderContext::init().await?);
//!
//! // 2. Build a render graph: apply a gentle brightness boost.
//! let graph = RenderGraph::new(Arc::clone(&ctx)).push(ColorGradeNode {
//! brightness: 0.1,
//! ..Default::default()
//! });
//!
//! // 3. Open the player, attach the GPU sink, and run on a dedicated thread.
//! let downstream = RgbaSink::new();
//! let handle = downstream.frame_handle();
//! let (mut runner, _player_handle) = PreviewPlayer::open("clip.mp4")?.split();
//! runner.set_sink(Box::new(GpuFrameSink::new(graph, Box::new(downstream))));
//!
//! std::thread::spawn(move || runner.run());
//!
//! // 4. Retrieve the latest processed frame from any thread.
//! if let Some(frame) = handle.lock().unwrap().as_ref() {
//! println!("frame: {}×{} pts={:?}", frame.width, frame.height, frame.pts);
//! }
//! # Ok(())
//! # }
//! ```
// ── Top-level re-exports ─────────────────────────────────────────────────────
pub use ;
pub use RenderError;
pub use RenderGraph;
pub use ;
pub use GpuFrameSink;
pub use RenderContext;
pub use RenderNode;
pub use TextureHandle;