pub use ff_format::subtitle::{SubtitleError, SubtitleEvent, SubtitleTrack};
pub use ff_format::{
AudioCodec, AudioFrame, AudioStreamInfo, ChannelLayout, ChapterInfo, ChapterInfoBuilder,
ColorPrimaries, ColorRange, ColorSpace, ColorTransfer, ContainerInfo, Hdr10Metadata,
MasteringDisplay, MediaInfo, MediaInfoBuilder, NetworkOptions, PixelFormat, Rational,
SampleFormat, SubtitleCodec, SubtitleStreamInfo, Timestamp, VideoCodec, VideoFrame,
VideoStreamInfo,
};
#[cfg(feature = "probe")]
pub use ff_probe::{ProbeError, open};
#[cfg(feature = "decode")]
pub use ff_common::VecPool;
#[cfg(feature = "decode")]
pub use ff_decode::{
AudioDecoder, BlackFrameDetector, DecodeError, FrameExtractor, FrameHistogram, FramePool,
HardwareAccel, HistogramExtractor, ImageDecoder, KeyframeEnumerator, SceneDetector, SeekMode,
SilenceDetector, SilenceRange, ThumbnailSelector, VideoDecoder, WaveformAnalyzer,
WaveformSample,
};
#[cfg(feature = "encode")]
pub use ff_encode::{
AacOptions, AacProfile, AudioAdder, AudioCodecOptions, AudioEncoder, AudioEncoderConfig,
AudioExtractor, AudioReplacement, Av1Options, Av1Usage, BitrateMode, CRF_MAX, DnxhdOptions,
DnxhdVariant, EncodeError, EncodeProgress, EncodeProgressCallback, ExportPreset, FlacOptions,
GifPreview, H264Options, H264Preset, H264Profile, H264Tune, H265Options, H265Profile, H265Tier,
HardwareEncoder, ImageEncoder, Mp3Options, Mp3Quality, OpusApplication, OpusOptions,
OutputContainer, Preset, ProResOptions, ProResProfile, SpriteSheet, StreamCopyTrim,
StreamCopyTrimmer, SvtAv1Options, VideoCodecEncodeExt, VideoCodecOptions, VideoEncoder,
VideoEncoderConfig, Vp9Options,
};
#[cfg(feature = "tokio")]
pub use ff_decode::{AsyncAudioDecoder, AsyncImageDecoder, AsyncVideoDecoder};
#[cfg(feature = "tokio")]
pub use ff_encode::{AsyncAudioEncoder, AsyncVideoEncoder};
#[cfg(feature = "filter")]
pub use ff_filter::{
AudioConcatenator, AudioTrack, BlendMode, ClipJoiner, DrawTextOptions, EqBand, FilterError,
FilterGraph, FilterGraphBuilder, FilterStep, HwAccel, LoudnessMeter, LoudnessResult,
MultiTrackAudioMixer, MultiTrackComposer, QualityMetrics, Rgb, ScaleAlgorithm, ToneMap,
VideoConcatenator, VideoLayer, XfadeTransition, YadifMode,
};
#[cfg(feature = "pipeline")]
pub use ff_pipeline::{
AudioPipeline, Clip, EncoderConfig, EncoderConfigBuilder, Pipeline, PipelineBuilder,
PipelineError, Progress, ProgressCallback, ThumbnailPipeline, Timeline, TimelineBuilder,
VideoPipeline,
};
#[cfg(feature = "stream")]
pub use ff_stream::{
AbrLadder, AbrRendition, DashOutput, FanoutOutput, HlsOutput, HlsSegmentFormat, LiveAbrFormat,
LiveAbrLadder, LiveDashOutput, LiveHlsOutput, Rendition, RtmpOutput, StreamError, StreamOutput,
};
#[cfg(all(feature = "stream", feature = "srt"))]
pub use ff_stream::SrtOutput;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn format_reexports_should_be_accessible() {
let _: VideoCodec = VideoCodec::default();
let _: AudioCodec = AudioCodec::default();
let _: PixelFormat = PixelFormat::default();
let _: SampleFormat = SampleFormat::default();
let _: ChannelLayout = ChannelLayout::default();
let _: ColorSpace = ColorSpace::default();
let _: ColorRange = ColorRange::default();
let _: ColorPrimaries = ColorPrimaries::default();
let _: Rational = Rational::default();
let _: Timestamp = Timestamp::default();
let _: MediaInfo = MediaInfo::default();
let _: NetworkOptions = NetworkOptions::default();
}
#[cfg(feature = "probe")]
#[test]
fn probe_open_should_be_accessible() {
let result = open("/no/such/file.mp4");
assert!(matches!(result, Err(ProbeError::FileNotFound { .. })));
}
#[cfg(feature = "probe")]
#[test]
fn probe_error_should_be_accessible() {
let err = ProbeError::FileNotFound {
path: std::path::PathBuf::from("missing.mp4"),
};
assert!(err.to_string().contains("missing.mp4"));
}
#[cfg(feature = "decode")]
#[test]
fn decode_builder_types_should_be_accessible() {
let _ = VideoDecoder::open("/no/such/file.mp4");
let _ = AudioDecoder::open("/no/such/file.mp4");
let _ = ImageDecoder::open("/no/such/file.mp4");
}
#[cfg(feature = "decode")]
#[test]
fn decode_error_should_be_accessible() {
let _: DecodeError = DecodeError::decoding_failed("test");
}
#[cfg(feature = "decode")]
#[test]
fn decode_seek_mode_should_be_accessible() {
let _: SeekMode = SeekMode::Keyframe;
let _: SeekMode = SeekMode::Exact;
let _: SeekMode = SeekMode::Backward;
}
#[cfg(feature = "decode")]
#[test]
fn decode_hardware_accel_should_be_accessible() {
let _: HardwareAccel = HardwareAccel::Auto;
let _: HardwareAccel = HardwareAccel::None;
}
#[cfg(feature = "decode")]
#[test]
fn decode_vec_pool_should_be_accessible() {
let pool: std::sync::Arc<VecPool> = VecPool::new(8);
assert_eq!(pool.capacity(), 8);
assert_eq!(pool.available(), 0);
}
#[cfg(feature = "encode")]
#[test]
fn encode_builder_types_should_be_accessible() {
let _ = VideoEncoder::create("/tmp/out.mp4");
let _ = AudioEncoder::create("/tmp/out.mp3");
}
#[cfg(feature = "encode")]
#[test]
fn encode_bitrate_mode_should_be_accessible() {
let _: BitrateMode = BitrateMode::Cbr(1_000_000);
let _: BitrateMode = BitrateMode::Crf(23);
}
#[cfg(feature = "encode")]
#[test]
fn encode_error_should_be_accessible() {
let _: EncodeError = EncodeError::Cancelled;
}
#[cfg(feature = "encode")]
#[test]
fn encode_progress_should_be_accessible() {
assert!(std::mem::size_of::<EncodeProgress>() > 0);
}
#[cfg(feature = "encode")]
#[test]
fn encode_progress_callback_should_be_accessible() {
struct NoOp;
impl EncodeProgressCallback for NoOp {
fn on_progress(&mut self, _: &EncodeProgress) {}
}
let _ = NoOp;
}
#[cfg(feature = "tokio")]
#[test]
fn tokio_async_decoders_should_be_accessible() {
let _ = AsyncVideoDecoder::open("/no/such/file.mp4");
let _ = AsyncAudioDecoder::open("/no/such/file.mp4");
let _ = AsyncImageDecoder::open("/no/such/file.mp4");
}
#[cfg(feature = "tokio")]
#[test]
fn tokio_async_encoders_should_be_accessible() {
use ff_encode::{AudioEncoderBuilder, VideoEncoderBuilder};
fn _accepts_video_builder(_: VideoEncoderBuilder) {}
fn _accepts_audio_builder(_: AudioEncoderBuilder) {}
let _ = std::mem::size_of::<AsyncVideoEncoder>();
let _ = std::mem::size_of::<AsyncAudioEncoder>();
}
#[cfg(feature = "filter")]
#[test]
fn filter_graph_builder_should_be_accessible() {
let _builder: FilterGraphBuilder = FilterGraphBuilder::new();
}
#[cfg(feature = "filter")]
#[test]
fn filter_tone_map_should_be_accessible() {
let _: ToneMap = ToneMap::Hable;
let _: ToneMap = ToneMap::Reinhard;
let _: ToneMap = ToneMap::Mobius;
}
#[cfg(feature = "filter")]
#[test]
fn filter_hw_accel_should_be_accessible() {
let _: HwAccel = HwAccel::Cuda;
let _: HwAccel = HwAccel::VideoToolbox;
}
#[cfg(feature = "filter")]
#[test]
fn filter_error_should_be_accessible() {
let _: FilterError = FilterError::BuildFailed;
let _: FilterError = FilterError::ProcessFailed;
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_builder_should_be_accessible() {
let _builder: PipelineBuilder = Pipeline::builder();
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_error_should_be_accessible() {
let _: PipelineError = PipelineError::NoInput;
let _: PipelineError = PipelineError::NoOutput;
let _: PipelineError = PipelineError::Cancelled;
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_progress_should_be_accessible() {
let p = Progress {
frames_processed: 10,
total_frames: Some(100),
elapsed: std::time::Duration::from_secs(1),
};
assert_eq!(p.percent(), Some(10.0));
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_progress_callback_should_be_accessible() {
let _cb: ProgressCallback = Box::new(|_: &Progress| true);
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_thumbnail_pipeline_should_be_accessible() {
let _t: ThumbnailPipeline = ThumbnailPipeline::new("/no/such/file.mp4");
}
#[cfg(feature = "pipeline")]
#[test]
fn pipeline_audio_pipeline_should_be_accessible() {
let _: AudioPipeline = AudioPipeline::new();
}
#[cfg(all(feature = "pipeline", feature = "encode"))]
#[test]
fn pipeline_encoder_config_should_be_accessible() {
let _config = EncoderConfig::builder()
.video_codec(VideoCodec::H264)
.audio_codec(AudioCodec::Aac)
.bitrate_mode(BitrateMode::Cbr(4_000_000))
.build();
}
#[cfg(feature = "stream")]
#[test]
fn stream_hls_output_should_be_accessible() {
let _hls: HlsOutput = HlsOutput::new("/tmp/hls");
}
#[cfg(feature = "stream")]
#[test]
fn stream_dash_output_should_be_accessible() {
let _dash: DashOutput = DashOutput::new("/tmp/dash");
}
#[cfg(feature = "stream")]
#[test]
fn stream_abr_ladder_should_be_accessible() {
let _ladder: AbrLadder = AbrLadder::new("/no/such/file.mp4");
}
#[cfg(feature = "stream")]
#[test]
fn stream_rendition_should_be_accessible() {
let _r: Rendition = Rendition {
width: 1280,
height: 720,
bitrate: 3_000_000,
};
}
#[cfg(feature = "stream")]
#[test]
fn stream_error_should_be_accessible() {
let _err: StreamError = StreamError::InvalidConfig {
reason: "test".into(),
};
}
}