pub use ff_format::subtitle::{SubtitleError, SubtitleEvent, SubtitleTrack};
pub use ff_format::{
AlphaMode, Anchor, AudioCodec, AudioFrame, AudioStreamInfo, AudioStreamInfoBuilder,
ChannelLayout, ChapterInfo, ChapterInfoBuilder, Color, ColorPrimaries, ColorRange, ColorSpace,
ColorTransfer, ContainerInfo, ContainerInfoBuilder, ErrorSeverity, FormatError, FrameError,
Hdr10Metadata, MasteringDisplay, MediaError, MediaInfo, MediaInfoBuilder, NetworkOptions,
PixelFormat, Rational, SampleFormat, SubtitleCodec, SubtitleStreamInfo,
SubtitleStreamInfoBuilder, TextSpec, TextStyle, Timestamp, VideoCodec, VideoFrame,
VideoStreamInfo, VideoStreamInfoBuilder,
};
pub use ff_probe::{ProbeError, open};
pub use ff_decode::DecodeError;
pub use ff_analysis::{
AnalysisError, BlackFrameDetector, BpmResult, FrameHistogram, Histogram, HistogramExtractor,
KeyframeEnumerator, RgbParade, SceneDetector, ScopeAnalyzer, SilenceDetector, SilenceRange,
WaveformAnalyzer, WaveformSample,
};
pub use ff_encode::{BitrateMode, EncodeError};
pub use ff_filter::{
AnimatedValue, AnimationTrack, BlendMode, CompositeOp, DrawTextOptions, Easing, EqBand,
FilterError, FilterStep, HwAccel, Keyframe, PitchAlgo, RealtimeLayer, RealtimeLayerDescriptor,
Rgb, ScaleAlgorithm, ToneMap, XfadeTransition, YadifMode,
};
mod clip;
mod derive;
mod edit;
mod editor;
mod error;
mod ids;
mod marker;
mod timeline;
mod track;
mod validate;
pub use clip::{Clip, ClipSource, FitMode, VideoEffectRenderer};
pub use edit::{ClipProperty, Command, EditError, apply};
pub use editor::Editor;
pub use error::TimelineError;
pub use ids::{ClipId, GroupId, MarkerId, TrackId, TrackKind};
pub use marker::Marker;
pub use timeline::{Timeline, TimelineBuilder};
pub use track::Track;
pub use validate::TimelineIssue;
pub use ff_pipeline::{EncoderConfig, EncoderConfigBuilder, Progress};
#[cfg(feature = "preview")]
mod player;
#[cfg(feature = "preview")]
pub use ff_preview::{
PlayerHandle, PreviewError, Scene, SceneAudioPlacement, SceneAudioTrack, ScenePlacement,
SceneRunner, SceneVideoTrack,
};
#[cfg(feature = "preview")]
pub use player::TimelinePlayer;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn format_value_types_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 _: Rational = Rational::default();
let _: Timestamp = Timestamp::default();
let _: MediaInfo = MediaInfo::default();
let _: NetworkOptions = NetworkOptions::default();
}
#[test]
fn editing_model_should_be_accessible() {
let _ = std::mem::size_of::<Timeline>();
let _ = std::mem::size_of::<TimelineBuilder>();
let _ = std::mem::size_of::<Clip>();
let _ = std::mem::size_of::<Track>();
let _ = std::mem::size_of::<Editor>();
let _ = std::mem::size_of::<Command>();
let _ = std::mem::size_of::<Marker>();
let _ = std::mem::size_of::<TimelineError>();
let _ = std::mem::size_of::<ClipId>();
let _ = std::mem::size_of::<TrackId>();
}
#[test]
fn filter_authoring_types_should_be_accessible() {
let _ = std::mem::size_of::<FilterStep>();
let _ = std::mem::size_of::<BlendMode>();
let _ = std::mem::size_of::<CompositeOp>();
let _ = std::mem::size_of::<XfadeTransition>();
let _ = std::mem::size_of::<AnimationTrack<f64>>();
let _ = std::mem::size_of::<Keyframe<f64>>();
let _: ToneMap = ToneMap::Hable;
let _: ScaleAlgorithm = ScaleAlgorithm::Bilinear;
}
#[test]
fn export_config_should_be_accessible() {
let _: BitrateMode = BitrateMode::Crf(23);
let _config = EncoderConfig::builder()
.video_codec(VideoCodec::H264)
.audio_codec(AudioCodec::Aac)
.bitrate_mode(BitrateMode::Cbr(4_000_000))
.build();
let _ = std::mem::size_of::<Progress>();
}
#[test]
fn error_types_should_be_accessible() {
let _ = DecodeError::decoding_failed("test");
let _ = EncodeError::Cancelled;
let _ = std::mem::size_of::<FilterError>();
}
#[test]
fn probe_convenience_should_be_accessible() {
let result = open("/no/such/file.mp4");
assert!(matches!(result, Err(ProbeError::FileNotFound { .. })));
}
#[test]
fn analysis_convenience_should_be_accessible() {
let _ = std::mem::size_of::<SceneDetector>();
let _ = std::mem::size_of::<SilenceDetector>();
let _ = std::mem::size_of::<WaveformAnalyzer>();
let _ = std::mem::size_of::<ScopeAnalyzer>();
}
#[cfg(feature = "preview")]
#[test]
fn preview_engine_surface_should_be_accessible() {
let _ = std::mem::size_of::<TimelinePlayer>();
let _ = std::mem::size_of::<SceneRunner>();
let _ = std::mem::size_of::<Scene>();
let _ = std::mem::size_of::<PlayerHandle>();
}
}