ff_pipeline/lib.rs
1//! # ff-pipeline
2//!
3//! Unified decode → filter → encode pipeline for the ff-* crate family.
4//!
5//! This crate wires together `ff-decode`, `ff-filter`, and `ff-encode` into a
6//! single high-level API. All `unsafe` `FFmpeg` internals remain encapsulated in
7//! the underlying crates; users of `ff-pipeline` never need to write `unsafe` code.
8//!
9//! ## Features
10//!
11//! - **Single-call transcode**: open → filter → encode in one `Pipeline::run()`
12//! - **Progress callbacks**: real-time frame-count and elapsed-time updates
13//! - **Cancellation**: returning `false` from the progress callback aborts the pipeline
14//! - **Multi-input concatenation**: pass multiple input paths to concatenate clips
15//!
16//! ## Usage
17//!
18//! ```ignore
19//! use ff_pipeline::{Pipeline, EncoderConfig};
20//! use ff_format::{VideoCodec, AudioCodec};
21//! use ff_encode::BitrateMode;
22//!
23//! let config = EncoderConfig::builder()
24//! .video_codec(VideoCodec::H264)
25//! .audio_codec(AudioCodec::Aac)
26//! .bitrate_mode(BitrateMode::Cbr(4_000_000))
27//! .resolution(1280, 720)
28//! .framerate(30.0)
29//! .build();
30//!
31//! Pipeline::builder()
32//! .input("input.mp4")
33//! .output("output.mp4", config)
34//! .on_progress(|p| {
35//! println!("frame={} elapsed={:?}", p.frames_processed, p.elapsed);
36//! true // return false to cancel
37//! })
38//! .build()?
39//! .run()?;
40//! ```
41//!
42//! ## Module Structure
43//!
44//! - [`audio_pipeline`] — [`AudioPipeline`]
45//! - [`error`] — [`PipelineError`]
46//! - [`pipeline`] — [`Pipeline`], [`PipelineBuilder`], [`EncoderConfig`]
47//! - [`progress`] — [`Progress`], [`ProgressCallback`]
48//! - [`thumbnail`] — [`ThumbnailPipeline`]
49//! - [`video_pipeline`] — [`VideoPipeline`]
50
51#![warn(missing_docs)]
52
53pub mod audio_pipeline;
54pub mod error;
55pub mod pipeline;
56pub mod progress;
57pub mod thumbnail;
58pub mod video_pipeline;
59
60pub use audio_pipeline::AudioPipeline;
61pub use error::PipelineError;
62pub use pipeline::{EncoderConfig, EncoderConfigBuilder, Pipeline, PipelineBuilder};
63pub use progress::{Progress, ProgressCallback};
64pub use thumbnail::ThumbnailPipeline;
65pub use video_pipeline::VideoPipeline;