1#![doc = include_str!("../README.md")]
2#![cfg_attr(docsrs, feature(doc_cfg))]
3#![cfg_attr(docsrs, allow(unused_attributes))]
4#![deny(missing_docs)]
5#![allow(clippy::type_complexity)]
14
15mod adapter;
16mod audio;
17mod backend;
18pub mod boundary;
19mod buffer;
20mod carrier;
21pub mod channel_layout;
22mod codec_id;
23mod container;
24pub mod convert;
25mod decoder;
26mod demuxer;
27mod error;
28pub mod extras;
29#[cfg(test)]
30mod fault_subprocess;
31mod ffi;
32mod footprint;
33mod frame;
34mod image;
35pub mod limits;
36mod pixdesc;
37mod reader_guard;
38#[cfg(feature = "resample")]
39mod resampler;
40mod sample_format;
41mod subtitle;
42pub mod ticket;
43mod video;
44mod view;
45mod vtscale;
46
47pub use adapter::Ffmpeg;
48pub use audio::{AudioDecodeError, CarrierAudioStreamDecoder};
49pub use backend::Backend;
50pub use boundary::{
51 MediaKind, PacketBuildError, SendPayloadTooLarge, SendSideDataTooLarge,
52 attachment_packet_from_ffmpeg, audio_packet_from_ffmpeg, audio_packet_from_ffmpeg_in,
53 data_packet_from_ffmpeg_in, empty_audio_frame, empty_owned_audio_frame,
54 empty_owned_subtitle_frame, empty_owned_video_frame, empty_subtitle_frame, empty_video_frame,
55 ffmpeg_packet_from_audio_packet, ffmpeg_packet_from_owned_audio_packet,
56 ffmpeg_packet_from_owned_subtitle_packet, ffmpeg_packet_from_owned_video_packet,
57 ffmpeg_packet_from_subtitle_packet, ffmpeg_packet_from_video_packet, from_av_pixel_format,
58 is_hardware_pix_fmt, owned_attachment_packet_from_ffmpeg, owned_audio_packet_from_ffmpeg_in,
59 owned_data_packet_from_ffmpeg_in, owned_subtitle_packet_from_ffmpeg_in,
60 owned_video_packet_from_ffmpeg_in, subtitle_packet_from_ffmpeg, subtitle_packet_from_ffmpeg_in,
61 video_packet_from_ffmpeg, video_packet_from_ffmpeg_in,
62};
63
64pub use buffer::{FfmpegBytes, PacketBufferError, TrustedPayload};
65pub(crate) use carrier::CarrierOps;
66pub use carrier::{FfmpegCarrier, Owned, View};
67pub use view::FfmpegBuffer;
68
69pub type FfmpegDemuxer = demuxer::CarrierDemuxer<View>;
83
84pub type FfmpegOwnedDemuxer = demuxer::CarrierDemuxer<Owned>;
92
93pub type FfmpegAudioStreamDecoder = audio::CarrierAudioStreamDecoder<View>;
95pub type FfmpegOwnedAudioStreamDecoder = audio::CarrierAudioStreamDecoder<Owned>;
97
98pub type FfmpegSubtitleStreamDecoder = subtitle::CarrierSubtitleStreamDecoder<View>;
100pub type FfmpegOwnedSubtitleStreamDecoder = subtitle::CarrierSubtitleStreamDecoder<Owned>;
102
103pub type FfmpegImageDecoder = image::CarrierImageDecoder<View>;
105pub type FfmpegOwnedImageDecoder = image::CarrierImageDecoder<Owned>;
107
108pub type FfmpegVideoStreamDecoder = video::CarrierVideoStreamDecoder<View>;
110pub type FfmpegOwnedVideoStreamDecoder = video::CarrierVideoStreamDecoder<Owned>;
112pub use channel_layout::{
113 ChannelLayoutFault, channel_layout_description_from_ffmpeg, channel_layout_from_ffmpeg,
114 channel_order_from_ffmpeg,
115};
116pub use codec_id::CodecId;
117pub use container::ContainerFormat;
118pub use decoder::VideoDecoder;
119pub use demuxer::{
120 CarrierDemuxer, ChapterAlloc, ChapterTimebaseInvalid, ChapterTitleAlloc,
121 ChapterTitleBudgetExhausted, ChapterTitleTooLong, DemuxError, ParametersChannelMap,
122 ParametersLayoutShape, ProbeBudgetExhausted, TooManyChapters, TrackMetadataAlloc,
123 TrackMetadataBudgetExhausted, TrackMetadataTooLong, TrackTableAlloc, TrackTimebaseInvalid,
124};
125pub use error::{
126 Error, FrameBudgetExceeded, FrameMedium, HwSurfaceTooLarge, HwTransferTooLarge, Result,
127};
128pub use frame::Frame;
129pub use image::{CarrierImageDecoder, Corrupt, CorruptSource, ImageDecodeError, InputTooLarge};
130pub use limits::{
131 DEFAULT_MAX_ATTACHMENT_BYTES, DEFAULT_MAX_CHAPTERS, DEFAULT_MAX_CODEC_PARAMETER_BYTES,
132 DEFAULT_MAX_FRAME_BYTES, DEFAULT_MAX_IMAGE_INPUT_BYTES, DEFAULT_MAX_IMAGE_SIDE_DATA_BYTES,
133 DEFAULT_MAX_PACKET_BYTES, DEFAULT_MAX_PIXELS, DEFAULT_MAX_PROBE_BYTES, DEFAULT_MAX_STREAMS,
134 DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES, DEFAULT_MAX_TOTAL_CHAPTER_TITLE_BYTES,
135 DEFAULT_MAX_TOTAL_CODEC_PARAMETER_BYTES, DEFAULT_MAX_TOTAL_STREAM_METADATA_BYTES, DecoderLimits,
136 DemuxLimits, FrameLimits, PacketLimits,
137};
138#[cfg(feature = "resample")]
139#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
140pub use resampler::{
141 CarrierResampler, OutputTooLarge, ResampleError, ResampleSpec, SpecEnd,
142 UnsupportedChannelCount as UnsupportedSpecChannelCount,
143};
144#[cfg(feature = "resample")]
153#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
154pub type FfmpegResampler = resampler::CarrierResampler<View>;
155
156#[cfg(feature = "resample")]
159#[cfg_attr(docsrs, doc(cfg(feature = "resample")))]
160pub type FfmpegOwnedResampler = resampler::CarrierResampler<Owned>;
161
162pub use sample_format::SampleFormat;
163pub use subtitle::{CarrierSubtitleStreamDecoder, SubtitleDecodeError};
164pub use ticket::{ChannelLayoutTicket, CodecTicket, CustomChannel, DolbyVisionConfig, Ratio};
165pub use video::{CarrierVideoStreamDecoder, DecodePath, VideoDecodeError};
166
167pub type VideoPacket = mediadecode::packet::VideoPacket<extras::VideoPacketExtra, FfmpegBuffer>;
188
189pub type AudioPacket = mediadecode::packet::AudioPacket<extras::AudioPacketExtra, FfmpegBuffer>;
192
193pub type SubtitlePacket =
196 mediadecode::packet::SubtitlePacket<extras::SubtitlePacketExtra, FfmpegBuffer>;
197
198pub type VideoFrame =
208 mediadecode::frame::VideoFrame<mediadecode::PixelFormat, extras::VideoFrameExtra, FfmpegBuffer>;
209
210pub type AudioFrame = mediadecode::frame::AudioFrame<
216 SampleFormat,
217 mediaframe::audio::ChannelLayoutDescription,
218 extras::AudioFrameExtra,
219 FfmpegBuffer,
220>;
221
222pub type SubtitleFrame =
225 mediadecode::frame::SubtitleFrame<extras::SubtitleFrameExtra, FfmpegBuffer>;
226
227pub type ImageFrame =
231 mediadecode::frame::ImageFrame<mediadecode::PixelFormat, extras::ImageFrameExtra, FfmpegBuffer>;
232
233pub type DataPacket = mediadecode::demuxer::DataPacket<extras::DataPacketExtra, FfmpegBuffer>;
236
237pub type AttachmentPacket =
241 mediadecode::demuxer::AttachmentPacket<extras::AttachmentPacketExtra, FfmpegBuffer>;
242
243pub type DemuxedPacket = mediadecode::demuxer::DemuxedPacket<Ffmpeg, FfmpegBuffer>;
245
246pub type OwnedVideoPacket = mediadecode::packet::VideoPacket<extras::VideoPacketExtra, FfmpegBytes>;
261
262pub type OwnedAudioPacket = mediadecode::packet::AudioPacket<extras::AudioPacketExtra, FfmpegBytes>;
264
265pub type OwnedSubtitlePacket =
267 mediadecode::packet::SubtitlePacket<extras::SubtitlePacketExtra, FfmpegBytes>;
268
269pub type OwnedDataPacket = mediadecode::demuxer::DataPacket<extras::DataPacketExtra, FfmpegBytes>;
271
272pub type OwnedAttachmentPacket =
274 mediadecode::demuxer::AttachmentPacket<extras::AttachmentPacketExtra, FfmpegBytes>;
275
276pub type OwnedDemuxedPacket = mediadecode::demuxer::DemuxedPacket<Ffmpeg, FfmpegBytes>;
278
279pub type OwnedVideoFrame =
283 mediadecode::frame::VideoFrame<mediadecode::PixelFormat, extras::VideoFrameExtra, FfmpegBytes>;
284
285pub type OwnedAudioFrame = mediadecode::frame::AudioFrame<
287 SampleFormat,
288 mediaframe::audio::ChannelLayoutDescription,
289 extras::AudioFrameExtra,
290 FfmpegBytes,
291>;
292
293pub type OwnedSubtitleFrame =
295 mediadecode::frame::SubtitleFrame<extras::SubtitleFrameExtra, FfmpegBytes>;
296
297pub type OwnedImageFrame =
300 mediadecode::frame::ImageFrame<mediadecode::PixelFormat, extras::ImageFrameExtra, FfmpegBytes>;
301
302pub type TrackInfo = mediadecode::demuxer::TrackInfo<Ffmpeg>;
306
307pub type TrackParams = mediadecode::demuxer::TrackParams<Ffmpeg>;
309
310pub type Chapter = mediadecode::demuxer::Chapter<Ffmpeg>;
314
315#[cfg(test)]
324#[track_caller]
325pub(crate) fn accepted<E: core::fmt::Debug>(
326 status: core::result::Result<mediadecode::Sent, E>,
327 what: &str,
328) {
329 assert_eq!(
330 status.unwrap_or_else(|e| panic!("{what}: {e:?}")),
331 mediadecode::Sent::Accepted,
332 "{what}: the session asked to be drained where the test expected room",
333 );
334}