#![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 audio;
mod backend;
mod decoder;
mod demuxer;
mod error;
mod image;
mod subtitle;
mod video;
mod vtscale;
#[cfg(test)]
use mediaio_ffmpeg::view;
pub use mediaio_ffmpeg::{boundary, channel_layout, convert, extras, limits, ticket};
use mediaio_ffmpeg::{buffer, ffi, footprint, frame, measured, reader_guard, text};
pub use mediaio_ffmpeg::{
AttachmentPacket, AudioFrame, AudioPacket, ChannelLayoutFault, ChannelLayoutTicket, Chapter,
CodecId, CodecTicket, ContainerFormat, CrossingError, CustomChannel,
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, DataPacket,
DecoderLimits, DemuxLimits, DemuxedPacket, DolbyVisionConfig, Ffmpeg, FfmpegBuffer, FfmpegBytes,
FfmpegCarrier, Frame, FrameLimits, ImageFrame, MediaKind, Owned, OwnedAttachmentPacket,
OwnedAudioFrame, OwnedAudioPacket, OwnedDataPacket, OwnedDemuxedPacket, OwnedImageFrame,
OwnedSubtitleFrame, OwnedSubtitlePacket, OwnedVideoFrame, OwnedVideoPacket, PacketBufferError,
PacketBuildError, PacketLimits, ParametersChannelMap, ParametersError, ParametersLayoutShape,
Ratio, SampleFormat, SendPayloadTooLarge, SendSideDataTooLarge, SubtitleFrame, SubtitlePacket,
TrackInfo, TrackParams, TrustedPayload, VideoFrame, VideoPacket, View,
attachment_packet_from_ffmpeg, audio_packet_from_ffmpeg, audio_packet_from_ffmpeg_in,
channel_layout_description_from_ffmpeg, channel_layout_from_ffmpeg, channel_order_from_ffmpeg,
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,
};
use mediaio_ffmpeg::{BodyRoute, CarrierOps};
#[cfg(feature = "resample")]
#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
pub use mediaio_ffmpeg::{
CarrierResampler, FfmpegOwnedResampler, FfmpegResampler, OutputTooLarge, ResampleError,
ResampleSpec, SpecEnd, UnsupportedSpecChannelCount,
};
#[cfg(feature = "test-support")]
#[cfg_attr(docsrs, doc(cfg(feature = "test-support")))]
#[doc(hidden)]
pub use mediaio_ffmpeg::test_support;
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 audio::{AudioDecodeError, CarrierAudioStreamDecoder};
pub use backend::Backend;
pub use decoder::VideoDecoder;
pub use demuxer::{
CarrierDemuxer, ChapterAlloc, ChapterTimebaseInvalid, ChapterTitleAlloc,
ChapterTitleBudgetExhausted, ChapterTitleTooLong, DemuxError, ProbeBudgetExhausted,
TooManyChapters, TrackMetadataAlloc, TrackMetadataBudgetExhausted, TrackMetadataTooLong,
TrackTableAlloc, TrackTimebaseInvalid,
};
pub use error::{
Error, FrameBudgetExceeded, FrameMedium, HwSurfaceTooLarge, HwTransferTooLarge, Result,
};
pub use image::{CarrierImageDecoder, Corrupt, CorruptSource, ImageDecodeError, InputTooLarge};
pub use subtitle::{CarrierSubtitleStreamDecoder, SubtitleDecodeError};
pub use video::{CarrierVideoStreamDecoder, DecodePath, VideoDecodeError};
#[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",
);
}