#![doc = include_str!("../README.md")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(docsrs, allow(unused_attributes))]
#![deny(missing_docs)]
#![allow(clippy::type_complexity)]
mod adapter;
mod audio;
mod backend;
pub mod boundary;
mod buffer;
mod carrier;
pub mod channel_layout;
mod codec_id;
mod container;
pub mod convert;
mod decoder;
mod demuxer;
mod error;
pub mod extras;
#[cfg(test)]
mod fault_subprocess;
mod ffi;
mod footprint;
mod frame;
mod image;
pub mod limits;
mod pixdesc;
mod reader_guard;
#[cfg(feature = "resample")]
mod resampler;
mod sample_format;
mod subtitle;
pub mod ticket;
mod video;
mod view;
mod vtscale;
pub use adapter::Ffmpeg;
pub use audio::{AudioDecodeError, CarrierAudioStreamDecoder};
pub use backend::Backend;
pub use boundary::{
MediaKind, PacketBuildError, SendPayloadTooLarge, SendSideDataTooLarge,
attachment_packet_from_ffmpeg, audio_packet_from_ffmpeg, audio_packet_from_ffmpeg_in,
data_packet_from_ffmpeg_in, empty_audio_frame, empty_owned_audio_frame,
empty_owned_subtitle_frame, empty_owned_video_frame, empty_subtitle_frame, empty_video_frame,
ffmpeg_packet_from_audio_packet, ffmpeg_packet_from_owned_audio_packet,
ffmpeg_packet_from_owned_subtitle_packet, ffmpeg_packet_from_owned_video_packet,
ffmpeg_packet_from_subtitle_packet, ffmpeg_packet_from_video_packet, from_av_pixel_format,
is_hardware_pix_fmt, owned_attachment_packet_from_ffmpeg, owned_audio_packet_from_ffmpeg_in,
owned_data_packet_from_ffmpeg_in, owned_subtitle_packet_from_ffmpeg_in,
owned_video_packet_from_ffmpeg_in, subtitle_packet_from_ffmpeg, subtitle_packet_from_ffmpeg_in,
video_packet_from_ffmpeg, video_packet_from_ffmpeg_in,
};
pub use buffer::{FfmpegBytes, PacketBufferError, TrustedPayload};
pub(crate) use carrier::CarrierOps;
pub use carrier::{FfmpegCarrier, Owned, View};
pub use view::FfmpegBuffer;
pub type FfmpegDemuxer = demuxer::CarrierDemuxer<View>;
pub type FfmpegOwnedDemuxer = demuxer::CarrierDemuxer<Owned>;
pub type FfmpegAudioStreamDecoder = audio::CarrierAudioStreamDecoder<View>;
pub type FfmpegOwnedAudioStreamDecoder = audio::CarrierAudioStreamDecoder<Owned>;
pub type FfmpegSubtitleStreamDecoder = subtitle::CarrierSubtitleStreamDecoder<View>;
pub type FfmpegOwnedSubtitleStreamDecoder = subtitle::CarrierSubtitleStreamDecoder<Owned>;
pub type FfmpegImageDecoder = image::CarrierImageDecoder<View>;
pub type FfmpegOwnedImageDecoder = image::CarrierImageDecoder<Owned>;
pub type FfmpegVideoStreamDecoder = video::CarrierVideoStreamDecoder<View>;
pub type FfmpegOwnedVideoStreamDecoder = video::CarrierVideoStreamDecoder<Owned>;
pub use channel_layout::{
ChannelLayoutFault, channel_layout_description_from_ffmpeg, channel_layout_from_ffmpeg,
channel_order_from_ffmpeg,
};
pub use codec_id::CodecId;
pub use container::ContainerFormat;
pub use decoder::VideoDecoder;
pub use demuxer::{
CarrierDemuxer, ChapterAlloc, ChapterTimebaseInvalid, ChapterTitleAlloc,
ChapterTitleBudgetExhausted, ChapterTitleTooLong, DemuxError, ParametersChannelMap,
ParametersLayoutShape, ProbeBudgetExhausted, TooManyChapters, TrackMetadataAlloc,
TrackMetadataBudgetExhausted, TrackMetadataTooLong, TrackTableAlloc, TrackTimebaseInvalid,
};
pub use error::{
Error, FrameBudgetExceeded, FrameMedium, HwSurfaceTooLarge, HwTransferTooLarge, Result,
};
pub use frame::Frame;
pub use image::{CarrierImageDecoder, Corrupt, CorruptSource, ImageDecodeError, InputTooLarge};
pub use limits::{
DEFAULT_MAX_ATTACHMENT_BYTES, DEFAULT_MAX_CHAPTERS, DEFAULT_MAX_CODEC_PARAMETER_BYTES,
DEFAULT_MAX_FRAME_BYTES, DEFAULT_MAX_IMAGE_INPUT_BYTES, DEFAULT_MAX_IMAGE_SIDE_DATA_BYTES,
DEFAULT_MAX_PACKET_BYTES, DEFAULT_MAX_PIXELS, DEFAULT_MAX_PROBE_BYTES, DEFAULT_MAX_STREAMS,
DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES, DEFAULT_MAX_TOTAL_CHAPTER_TITLE_BYTES,
DEFAULT_MAX_TOTAL_CODEC_PARAMETER_BYTES, DEFAULT_MAX_TOTAL_STREAM_METADATA_BYTES, DecoderLimits,
DemuxLimits, FrameLimits, PacketLimits,
};
#[cfg(feature = "resample")]
#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
pub use resampler::{
CarrierResampler, OutputTooLarge, ResampleError, ResampleSpec, SpecEnd,
UnsupportedChannelCount as UnsupportedSpecChannelCount,
};
#[cfg(feature = "resample")]
#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
pub type FfmpegResampler = resampler::CarrierResampler<View>;
#[cfg(feature = "resample")]
#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
pub type FfmpegOwnedResampler = resampler::CarrierResampler<Owned>;
pub use sample_format::SampleFormat;
pub use subtitle::{CarrierSubtitleStreamDecoder, SubtitleDecodeError};
pub use ticket::{ChannelLayoutTicket, CodecTicket, CustomChannel, DolbyVisionConfig, Ratio};
pub use video::{CarrierVideoStreamDecoder, DecodePath, VideoDecodeError};
pub type VideoPacket = mediadecode::packet::VideoPacket<extras::VideoPacketExtra, FfmpegBuffer>;
pub type AudioPacket = mediadecode::packet::AudioPacket<extras::AudioPacketExtra, FfmpegBuffer>;
pub type SubtitlePacket =
mediadecode::packet::SubtitlePacket<extras::SubtitlePacketExtra, FfmpegBuffer>;
pub type VideoFrame =
mediadecode::frame::VideoFrame<mediadecode::PixelFormat, extras::VideoFrameExtra, FfmpegBuffer>;
pub type AudioFrame = mediadecode::frame::AudioFrame<
SampleFormat,
mediaframe::audio::ChannelLayoutDescription,
extras::AudioFrameExtra,
FfmpegBuffer,
>;
pub type SubtitleFrame =
mediadecode::frame::SubtitleFrame<extras::SubtitleFrameExtra, FfmpegBuffer>;
pub type ImageFrame =
mediadecode::frame::ImageFrame<mediadecode::PixelFormat, extras::ImageFrameExtra, FfmpegBuffer>;
pub type DataPacket = mediadecode::demuxer::DataPacket<extras::DataPacketExtra, FfmpegBuffer>;
pub type AttachmentPacket =
mediadecode::demuxer::AttachmentPacket<extras::AttachmentPacketExtra, FfmpegBuffer>;
pub type DemuxedPacket = mediadecode::demuxer::DemuxedPacket<Ffmpeg, FfmpegBuffer>;
pub type OwnedVideoPacket = mediadecode::packet::VideoPacket<extras::VideoPacketExtra, FfmpegBytes>;
pub type OwnedAudioPacket = mediadecode::packet::AudioPacket<extras::AudioPacketExtra, FfmpegBytes>;
pub type OwnedSubtitlePacket =
mediadecode::packet::SubtitlePacket<extras::SubtitlePacketExtra, FfmpegBytes>;
pub type OwnedDataPacket = mediadecode::demuxer::DataPacket<extras::DataPacketExtra, FfmpegBytes>;
pub type OwnedAttachmentPacket =
mediadecode::demuxer::AttachmentPacket<extras::AttachmentPacketExtra, FfmpegBytes>;
pub type OwnedDemuxedPacket = mediadecode::demuxer::DemuxedPacket<Ffmpeg, FfmpegBytes>;
pub type OwnedVideoFrame =
mediadecode::frame::VideoFrame<mediadecode::PixelFormat, extras::VideoFrameExtra, FfmpegBytes>;
pub type OwnedAudioFrame = mediadecode::frame::AudioFrame<
SampleFormat,
mediaframe::audio::ChannelLayoutDescription,
extras::AudioFrameExtra,
FfmpegBytes,
>;
pub type OwnedSubtitleFrame =
mediadecode::frame::SubtitleFrame<extras::SubtitleFrameExtra, FfmpegBytes>;
pub type OwnedImageFrame =
mediadecode::frame::ImageFrame<mediadecode::PixelFormat, extras::ImageFrameExtra, FfmpegBytes>;
pub type TrackInfo = mediadecode::demuxer::TrackInfo<Ffmpeg>;
pub type TrackParams = mediadecode::demuxer::TrackParams<Ffmpeg>;
pub type Chapter = mediadecode::demuxer::Chapter<Ffmpeg>;
#[cfg(test)]
#[track_caller]
pub(crate) fn accepted<E: core::fmt::Debug>(
status: core::result::Result<mediadecode::Sent, E>,
what: &str,
) {
assert_eq!(
status.unwrap_or_else(|e| panic!("{what}: {e:?}")),
mediadecode::Sent::Accepted,
"{what}: the session asked to be drained where the test expected room",
);
}