//! Video and audio filter graph operations — the Rust way.
//!
//! This crate provides a safe, ergonomic API for constructing and running
//! `FFmpeg` libavfilter filter graphs.  All `unsafe` `FFmpeg` internals are
//! encapsulated in the `filter_inner` module; users never need to write `unsafe` code.
//!
//! ## Quick start
//!
//! ```ignore
//! use ff_filter::{FilterGraph, ToneMap};
//! use std::time::Duration;
//!
//! // Build a filter graph: scale to 1280×720, then apply tone mapping.
//! let mut graph = FilterGraph::builder()
//!     .scale(1280, 720)
//!     .tone_map(ToneMap::Hable)
//!     .build()?;
//!
//! // Push decoded VideoFrames in …
//! graph.push_video(0, &decoded_frame)?;
//!
//! // … and pull filtered frames out.
//! while let Some(frame) = graph.pull_video()? {
//!     // encode or display `frame`
//! }
//! ```
//!
//! ## Module structure
//!
//! - [`graph`] — public types: [`FilterGraph`], [`FilterGraphBuilder`], [`ToneMap`], [`HwAccel`]
//! - [`error`] — [`FilterError`]
//! - `filter_inner` — `pub(crate)` unsafe `FFmpeg` calls (not part of the public API)

pub mod error;
mod filter_inner;
pub mod graph;

pub use error::FilterError;
pub use graph::{FilterGraph, FilterGraphBuilder, HwAccel, ToneMap};
