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, Histogram, HistogramExtractor, ImageDecoder, KeyframeEnumerator, RgbParade,
SceneDetector, ScopeAnalyzer, 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, AsyncAudioDecoderBuilder, AsyncImageDecoder, AsyncVideoDecoder,
AsyncVideoDecoderBuilder,
};
#[cfg(feature = "tokio")]
pub use ff_encode::{AsyncAudioEncoder, AsyncVideoEncoder};
#[cfg(feature = "filter")]
pub use ff_filter::{
AnalyzeOptions, AnimatedValue, AnimationEntry, AnimationTrack, AudioConcatenator, AudioTrack,
BlendMode, ClipJoiner, DrawTextOptions, Easing, EqBand, FilterError, FilterGraph,
FilterGraphBuilder, FilterStep, HwAccel, Interpolation, Keyframe, LensProfile, Lerp,
LoudnessMeter, LoudnessResult, MultiTrackAudioMixer, MultiTrackComposer, NoiseType,
QualityMetrics, Rgb, ScaleAlgorithm, StabilizeOptions, Stabilizer, 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(feature = "preview")]
pub use ff_preview::{
AudioMixer, AudioTrackHandle, DecodeBuffer, DecodeBufferBuilder, FrameResult, FrameSink,
PlaybackClock, PlayerCommand, PlayerEvent, PlayerHandle, PlayerRunner, PreviewError,
PreviewPlayer, RgbaFrame, RgbaSink, SeekEvent,
};
#[cfg(all(feature = "preview", not(feature = "decode")))]
pub use ff_preview::HardwareAccel;
#[cfg(all(feature = "preview", feature = "pipeline"))]
pub use ff_preview::{TimelinePlayer, TimelineRunner};
#[cfg(all(feature = "preview", feature = "tokio"))]
pub use ff_preview::AsyncPreviewPlayer;
#[cfg(feature = "preview-proxy")]
pub use ff_preview::{ProxyGenerator, ProxyJob, ProxyResolution};
#[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(),
};
}
#[cfg(feature = "preview")]
#[test]
fn preview_rgba_types_should_be_accessible() {
let _: Option<RgbaSink> = None;
let _: Option<RgbaFrame> = None;
}
#[cfg(feature = "preview")]
#[test]
fn preview_player_command_should_be_accessible() {
let _ = PlayerCommand::Play;
let _ = PlayerCommand::Pause;
let _ = PlayerCommand::Stop;
}
#[cfg(feature = "preview")]
#[test]
fn preview_audio_types_should_be_accessible() {
let _ = std::mem::size_of::<AudioMixer>();
let _ = std::mem::size_of::<AudioTrackHandle>();
}
#[cfg(all(feature = "preview", not(feature = "decode")))]
#[test]
fn preview_hardware_accel_without_decode_should_be_accessible() {
let _ = HardwareAccel::Auto;
let _ = HardwareAccel::None;
}
#[cfg(all(feature = "preview", feature = "pipeline"))]
#[test]
fn preview_timeline_types_should_be_accessible() {
let _ = std::mem::size_of::<TimelinePlayer>();
let _ = std::mem::size_of::<TimelineRunner>();
}
#[cfg(all(feature = "preview", feature = "tokio"))]
#[test]
fn preview_async_player_should_be_accessible() {
let _ = std::mem::size_of::<AsyncPreviewPlayer>();
}
#[cfg(feature = "preview-proxy")]
#[test]
fn preview_proxy_types_should_be_accessible() {
let _: ProxyResolution = ProxyResolution::Half;
let _: ProxyResolution = ProxyResolution::Quarter;
let _: ProxyResolution = ProxyResolution::Eighth;
}
}