Skip to main content

ff_preview/
lib.rs

1//! # ff-preview
2//!
3//! Real-time video/audio preview and proxy workflow for the `avio` crate family.
4//!
5//! This crate provides single-file playback (`PreviewPlayer`) with frame-accurate
6//! seek, A/V sync, and an optional proxy generation workflow.
7//!
8//! ## Feature Flags
9//!
10//! | Feature | Description | Default |
11//! |---------|-------------|---------|
12//! | `tokio` | Async `AsyncPreviewPlayer` backed by `spawn_blocking` | no |
13//! | `proxy` | `ProxyGenerator` for lower-resolution proxy files | no |
14//!
15//! ## Usage
16//!
17//! ```ignore
18//! use ff_preview::{PreviewPlayer, RgbaSink};
19//!
20//! let mut player = PreviewPlayer::open("clip.mp4")?;
21//! player.set_sink(Box::new(RgbaSink::new()));
22//! player.play();
23//! player.run()?;
24//! ```
25
26#![warn(clippy::all)]
27#![warn(clippy::pedantic)]
28
29pub mod audio;
30pub(crate) mod cache;
31pub mod error;
32pub mod event;
33pub mod playback;
34
35#[cfg(feature = "proxy")]
36pub mod proxy;
37
38#[cfg(feature = "timeline")]
39pub mod timeline;
40
41pub use audio::{AudioMixer, AudioTrackHandle};
42pub use error::PreviewError;
43pub use event::PlayerEvent;
44pub use ff_decode::HardwareAccel;
45pub use playback::{
46    DecodeBuffer, DecodeBufferBuilder, FrameResult, FrameSink, PlaybackClock, PlayerCommand,
47    PlayerHandle, PlayerRunner, PreviewPlayer, RgbaFrame, RgbaSink, SeekEvent,
48};
49
50#[cfg(feature = "tokio")]
51pub use playback::AsyncPreviewPlayer;
52
53#[cfg(feature = "proxy")]
54pub use proxy::{ProxyGenerator, ProxyJob, ProxyResolution};
55
56#[cfg(feature = "timeline")]
57pub use timeline::{TimelinePlayer, TimelineRunner};