Skip to main content

ff_sys/
docsrs_stubs.rs

1// Shape-compatible stubs used by docs.rs builds (DOCS_RS=1).
2//
3// These definitions mirror the real bindgen-generated FFmpeg bindings in type
4// and name, but contain no actual FFmpeg code.  All functions are no-op stubs
5// that never run; they exist only to make the dependent crates compile so that
6// rustdoc can render their public APIs.
7//
8// Maintenance note: add entries here whenever a new ff_sys symbol is referenced
9// in ff-probe, ff-decode, or ff-encode.  The values of integer constants are
10// taken from the FFmpeg 7.x headers for reference accuracy, but correctness at
11// runtime is irrelevant — docs.rs never executes this code.
12
13use std::os::raw::{c_char, c_int, c_uint, c_void};
14use std::ptr;
15
16// ── Type aliases ──────────────────────────────────────────────────────────────
17
18pub type AVCodecID = c_uint;
19pub type AVPixelFormat = c_int;
20pub type AVSampleFormat = c_int;
21pub type AVMediaType = c_int;
22pub type AVColorPrimaries = c_uint;
23pub type AVColorRange = c_uint;
24pub type AVColorSpace = c_uint;
25pub type AVHWDeviceType = c_int;
26pub type AVChannelOrder = c_uint;
27pub type AVPictureType = c_int;
28
29// ── Opaque types (only ever used behind raw pointers) ─────────────────────────
30
31pub struct AVDictionary(());
32pub struct SwsContext(());
33pub struct SwrContext(());
34pub struct AVBufferRef(());
35pub struct AVIOContext(());
36pub struct AVOutputFormat(());
37pub struct AVAudioFifo(());
38
39pub struct AVInputFormat {
40    pub name: *const c_char,
41    pub long_name: *const c_char,
42    pub flags: c_int,
43}
44
45// ── Structs with field-level access ───────────────────────────────────────────
46
47#[derive(Copy, Clone)]
48#[repr(C)]
49pub union AVChannelLayout__bindgen_ty_1 {
50    pub mask: u64,
51}
52
53impl Default for AVChannelLayout__bindgen_ty_1 {
54    fn default() -> Self {
55        Self { mask: 0 }
56    }
57}
58
59#[derive(Copy, Clone)]
60pub struct AVChannelLayout {
61    pub order: AVChannelOrder,
62    pub nb_channels: c_int,
63    pub u: AVChannelLayout__bindgen_ty_1,
64}
65
66impl Default for AVChannelLayout {
67    fn default() -> Self {
68        Self {
69            order: 0,
70            nb_channels: 0,
71            u: AVChannelLayout__bindgen_ty_1::default(),
72        }
73    }
74}
75
76#[derive(Copy, Clone)]
77pub struct AVRational {
78    pub num: c_int,
79    pub den: c_int,
80}
81
82pub struct AVDictionaryEntry {
83    pub key: *mut c_char,
84    pub value: *mut c_char,
85}
86
87pub struct AVChapter {
88    pub id: i64,
89    pub time_base: AVRational,
90    pub start: i64,
91    pub end: i64,
92    pub metadata: *mut AVDictionary,
93}
94
95pub struct AVCodecParameters {
96    pub codec_type: AVMediaType,
97    pub codec_id: AVCodecID,
98    pub codec_tag: c_uint,
99    pub extradata: *mut u8,
100    pub extradata_size: c_int,
101    pub format: c_int,
102    pub bit_rate: i64,
103    pub width: c_int,
104    pub height: c_int,
105    pub sample_rate: c_int,
106    pub ch_layout: AVChannelLayout,
107    pub sample_fmt: AVSampleFormat,
108    pub color_space: AVColorSpace,
109    pub color_range: AVColorRange,
110    pub color_primaries: AVColorPrimaries,
111}
112
113pub struct AVStream {
114    pub codecpar: *mut AVCodecParameters,
115    pub nb_frames: i64,
116    pub duration: i64,
117    pub time_base: AVRational,
118    pub avg_frame_rate: AVRational,
119    pub r_frame_rate: AVRational,
120    pub start_time: i64,
121    pub disposition: c_int,
122    pub metadata: *mut AVDictionary,
123}
124
125pub struct AVFormatContext {
126    pub nb_streams: c_uint,
127    pub streams: *mut *mut AVStream,
128    pub duration: i64,
129    pub metadata: *mut AVDictionary,
130    pub nb_chapters: c_uint,
131    pub chapters: *mut *mut AVChapter,
132    pub iformat: *mut AVInputFormat,
133    pub bit_rate: i64,
134    pub pb: *mut AVIOContext,
135    pub priv_data: *mut c_void,
136}
137
138pub struct AVFrame {
139    pub data: [*mut u8; 8],
140    pub linesize: [c_int; 8],
141    pub width: c_int,
142    pub height: c_int,
143    pub nb_samples: c_int,
144    pub format: c_int,
145    pub key_frame: c_int,
146    pub pict_type: AVPictureType,
147    pub pts: i64,
148    pub pkt_dts: i64,
149    pub sample_rate: c_int,
150    pub ch_layout: AVChannelLayout,
151    pub duration: i64,
152    pub time_base: AVRational,
153    pub hw_frames_ctx: *mut AVBufferRef,
154    pub metadata: *mut AVDictionary,
155}
156
157pub struct AVPacket {
158    pub pts: i64,
159    pub dts: i64,
160    pub data: *mut u8,
161    pub size: c_int,
162    pub stream_index: c_int,
163    pub flags: c_int,
164    pub duration: i64,
165}
166
167pub type AVColorTransferCharacteristic = c_uint;
168
169pub struct AVCodecContext {
170    pub codec_id: AVCodecID,
171    pub bit_rate: i64,
172    pub width: c_int,
173    pub height: c_int,
174    pub pix_fmt: AVPixelFormat,
175    pub sample_rate: c_int,
176    pub ch_layout: AVChannelLayout,
177    pub sample_fmt: AVSampleFormat,
178    pub time_base: AVRational,
179    pub framerate: AVRational,
180    pub gop_size: c_int,
181    pub max_b_frames: c_int,
182    pub qmin: c_int,
183    pub qmax: c_int,
184    pub thread_count: c_int,
185    pub hw_device_ctx: *mut AVBufferRef,
186    pub hw_frames_ctx: *mut AVBufferRef,
187    pub priv_data: *mut c_void,
188    pub color_primaries: AVColorPrimaries,
189    pub color_trc: AVColorTransferCharacteristic,
190    pub colorspace: AVColorSpace,
191    // Fields added for v0.7.0 feature coverage
192    pub frame_size: c_int,
193    pub color_range: AVColorRange,
194    pub refs: c_int,
195    pub rc_max_rate: i64,
196    pub rc_buffer_size: c_int,
197    pub flags: c_int,
198    pub stats_out: *mut c_char,
199    pub stats_in: *mut c_char,
200}
201
202pub struct AVCodec {
203    pub id: AVCodecID,
204    pub sample_fmts: *const AVSampleFormat,
205    pub capabilities: c_int,
206}
207
208// ── Constants ─────────────────────────────────────────────────────────────────
209
210pub const AV_DICT_IGNORE_SUFFIX: u32 = 2;
211pub const AV_NUM_DATA_POINTERS: usize = 8;
212pub const AV_TIME_BASE: u32 = 1_000_000;
213
214pub const AVMediaType_AVMEDIA_TYPE_VIDEO: AVMediaType = 0;
215pub const AVMediaType_AVMEDIA_TYPE_AUDIO: AVMediaType = 1;
216pub const AVMediaType_AVMEDIA_TYPE_SUBTITLE: AVMediaType = 3;
217pub const AVMediaType_AVMEDIA_TYPE_ATTACHMENT: AVMediaType = 4;
218
219pub const AV_DISPOSITION_FORCED: u32 = 0x0040;
220pub const AV_DISPOSITION_ATTACHED_PIC: u32 = 0x0400;
221pub const AV_INPUT_BUFFER_PADDING_SIZE: u32 = 64;
222
223pub const AVChannelOrder_AV_CHANNEL_ORDER_UNSPEC: AVChannelOrder = 0;
224pub const AVChannelOrder_AV_CHANNEL_ORDER_NATIVE: AVChannelOrder = 1;
225
226// AVCodecID — video
227pub const AVCodecID_AV_CODEC_ID_NONE: AVCodecID = 0;
228pub const AVCodecID_AV_CODEC_ID_MPEG2VIDEO: AVCodecID = 2;
229pub const AVCodecID_AV_CODEC_ID_MJPEG: AVCodecID = 7;
230pub const AVCodecID_AV_CODEC_ID_MPEG4: AVCodecID = 13;
231pub const AVCodecID_AV_CODEC_ID_H264: AVCodecID = 27;
232pub const AVCodecID_AV_CODEC_ID_THEORA: AVCodecID = 30;
233pub const AVCodecID_AV_CODEC_ID_VP8: AVCodecID = 139;
234pub const AVCodecID_AV_CODEC_ID_PRORES: AVCodecID = 147;
235pub const AVCodecID_AV_CODEC_ID_VP9: AVCodecID = 167;
236pub const AVCodecID_AV_CODEC_ID_HEVC: AVCodecID = 173;
237pub const AVCodecID_AV_CODEC_ID_AV1: AVCodecID = 226;
238pub const AVCodecID_AV_CODEC_ID_DNXHD: AVCodecID = 99;
239pub const AVCodecID_AV_CODEC_ID_FFV1: AVCodecID = 33;
240
241// AVCodecID — image (still image)
242pub const AVCodecID_AV_CODEC_ID_PNG: AVCodecID = 61;
243pub const AVCodecID_AV_CODEC_ID_BMP: AVCodecID = 76;
244pub const AVCodecID_AV_CODEC_ID_TIFF: AVCodecID = 90;
245pub const AVCodecID_AV_CODEC_ID_WEBP: AVCodecID = 219;
246pub const AVCodecID_AV_CODEC_ID_EXR: AVCodecID = 178;
247
248// AVCodecID — animation
249pub const AVCodecID_AV_CODEC_ID_GIF: AVCodecID = 97;
250
251// AVCodecID — subtitle
252pub const AVCodecID_AV_CODEC_ID_DVB_SUBTITLE: AVCodecID = 94209;
253pub const AVCodecID_AV_CODEC_ID_SSA: AVCodecID = 94212;
254pub const AVCodecID_AV_CODEC_ID_HDMV_PGS_SUBTITLE: AVCodecID = 94214;
255pub const AVCodecID_AV_CODEC_ID_SRT: AVCodecID = 94216;
256pub const AVCodecID_AV_CODEC_ID_SUBRIP: AVCodecID = 94248;
257pub const AVCodecID_AV_CODEC_ID_WEBVTT: AVCodecID = 94249;
258pub const AVCodecID_AV_CODEC_ID_ASS: AVCodecID = 94253;
259
260// AVCodecID — attachment / data
261pub const AVCodecID_AV_CODEC_ID_BIN_DATA: AVCodecID = 98314;
262
263// AVCodecID — audio
264pub const AVCodecID_AV_CODEC_ID_PCM_S16LE: AVCodecID = 65536;
265pub const AVCodecID_AV_CODEC_ID_PCM_S16BE: AVCodecID = 65537;
266pub const AVCodecID_AV_CODEC_ID_PCM_U8: AVCodecID = 65542;
267pub const AVCodecID_AV_CODEC_ID_PCM_S24LE: AVCodecID = 65544;
268pub const AVCodecID_AV_CODEC_ID_PCM_S24BE: AVCodecID = 65545;
269pub const AVCodecID_AV_CODEC_ID_PCM_S32LE: AVCodecID = 65556;
270pub const AVCodecID_AV_CODEC_ID_PCM_S32BE: AVCodecID = 65557;
271pub const AVCodecID_AV_CODEC_ID_PCM_F32LE: AVCodecID = 65558;
272pub const AVCodecID_AV_CODEC_ID_PCM_F32BE: AVCodecID = 65559;
273pub const AVCodecID_AV_CODEC_ID_PCM_F64LE: AVCodecID = 65560;
274pub const AVCodecID_AV_CODEC_ID_PCM_F64BE: AVCodecID = 65561;
275pub const AVCodecID_AV_CODEC_ID_MP3: AVCodecID = 86017;
276pub const AVCodecID_AV_CODEC_ID_AAC: AVCodecID = 86018;
277pub const AVCodecID_AV_CODEC_ID_AC3: AVCodecID = 86019;
278pub const AVCodecID_AV_CODEC_ID_DTS: AVCodecID = 86020;
279pub const AVCodecID_AV_CODEC_ID_VORBIS: AVCodecID = 86021;
280pub const AVCodecID_AV_CODEC_ID_FLAC: AVCodecID = 86028;
281pub const AVCodecID_AV_CODEC_ID_ALAC: AVCodecID = 86032;
282pub const AVCodecID_AV_CODEC_ID_WMAV2: AVCodecID = 86047;
283pub const AVCodecID_AV_CODEC_ID_EAC3: AVCodecID = 86056;
284pub const AVCodecID_AV_CODEC_ID_OPUS: AVCodecID = 86076;
285
286// AVPixelFormat
287pub const AVPixelFormat_AV_PIX_FMT_NONE: AVPixelFormat = -1;
288pub const AVPixelFormat_AV_PIX_FMT_YUV420P: AVPixelFormat = 0;
289pub const AVPixelFormat_AV_PIX_FMT_RGB24: AVPixelFormat = 2;
290pub const AVPixelFormat_AV_PIX_FMT_BGR24: AVPixelFormat = 3;
291pub const AVPixelFormat_AV_PIX_FMT_YUV422P: AVPixelFormat = 4;
292pub const AVPixelFormat_AV_PIX_FMT_YUV444P: AVPixelFormat = 5;
293pub const AVPixelFormat_AV_PIX_FMT_GRAY8: AVPixelFormat = 8;
294pub const AVPixelFormat_AV_PIX_FMT_PAL8: AVPixelFormat = 77;
295pub const AVPixelFormat_AV_PIX_FMT_NV12: AVPixelFormat = 23;
296pub const AVPixelFormat_AV_PIX_FMT_NV21: AVPixelFormat = 24;
297pub const AVPixelFormat_AV_PIX_FMT_RGBA: AVPixelFormat = 26;
298pub const AVPixelFormat_AV_PIX_FMT_BGRA: AVPixelFormat = 28;
299pub const AVPixelFormat_AV_PIX_FMT_YUVJ420P: AVPixelFormat = 12;
300pub const AVPixelFormat_AV_PIX_FMT_YUVJ422P: AVPixelFormat = 13;
301pub const AVPixelFormat_AV_PIX_FMT_YUVJ444P: AVPixelFormat = 14;
302pub const AVPixelFormat_AV_PIX_FMT_VAAPI: AVPixelFormat = 51;
303pub const AVPixelFormat_AV_PIX_FMT_DXVA2_VLD: AVPixelFormat = 53;
304pub const AV_OPT_SEARCH_CHILDREN: u32 = 1;
305pub const AVPixelFormat_AV_PIX_FMT_YUV420P10LE: AVPixelFormat = 66;
306pub const AVPixelFormat_AV_PIX_FMT_YUV422P10LE: AVPixelFormat = 64;
307pub const AVPixelFormat_AV_PIX_FMT_YUV444P10LE: AVPixelFormat = 68;
308pub const AVPixelFormat_AV_PIX_FMT_YUVA444P10LE: AVPixelFormat = 91;
309pub const AVPixelFormat_AV_PIX_FMT_VDPAU: AVPixelFormat = 101;
310pub const AVPixelFormat_AV_PIX_FMT_CUDA: AVPixelFormat = 119;
311pub const AVPixelFormat_AV_PIX_FMT_QSV: AVPixelFormat = 123;
312pub const AVPixelFormat_AV_PIX_FMT_VIDEOTOOLBOX: AVPixelFormat = 135;
313pub const AVPixelFormat_AV_PIX_FMT_MEDIACODEC: AVPixelFormat = 165;
314pub const AVPixelFormat_AV_PIX_FMT_P010LE: AVPixelFormat = 161;
315pub const AVPixelFormat_AV_PIX_FMT_GBRPF32LE: AVPixelFormat = 175;
316pub const AVPixelFormat_AV_PIX_FMT_D3D11: AVPixelFormat = 174;
317pub const AVPixelFormat_AV_PIX_FMT_OPENCL: AVPixelFormat = 180;
318pub const AVPixelFormat_AV_PIX_FMT_VULKAN: AVPixelFormat = 193;
319
320// AVSampleFormat
321pub const AVSampleFormat_AV_SAMPLE_FMT_NONE: AVSampleFormat = -1;
322pub const AVSampleFormat_AV_SAMPLE_FMT_U8: AVSampleFormat = 0;
323pub const AVSampleFormat_AV_SAMPLE_FMT_S16: AVSampleFormat = 1;
324pub const AVSampleFormat_AV_SAMPLE_FMT_S32: AVSampleFormat = 2;
325pub const AVSampleFormat_AV_SAMPLE_FMT_FLT: AVSampleFormat = 3;
326pub const AVSampleFormat_AV_SAMPLE_FMT_DBL: AVSampleFormat = 4;
327pub const AVSampleFormat_AV_SAMPLE_FMT_U8P: AVSampleFormat = 5;
328pub const AVSampleFormat_AV_SAMPLE_FMT_S16P: AVSampleFormat = 6;
329pub const AVSampleFormat_AV_SAMPLE_FMT_S32P: AVSampleFormat = 7;
330pub const AVSampleFormat_AV_SAMPLE_FMT_FLTP: AVSampleFormat = 8;
331pub const AVSampleFormat_AV_SAMPLE_FMT_DBLP: AVSampleFormat = 9;
332pub const AVSampleFormat_AV_SAMPLE_FMT_S64: AVSampleFormat = 10;
333pub const AVSampleFormat_AV_SAMPLE_FMT_S64P: AVSampleFormat = 11;
334
335// AVColorPrimaries
336pub const AVColorPrimaries_AVCOL_PRI_BT709: AVColorPrimaries = 1;
337pub const AVColorPrimaries_AVCOL_PRI_UNSPECIFIED: AVColorPrimaries = 2;
338pub const AVColorPrimaries_AVCOL_PRI_BT470BG: AVColorPrimaries = 5;
339pub const AVColorPrimaries_AVCOL_PRI_SMPTE170M: AVColorPrimaries = 6;
340pub const AVColorPrimaries_AVCOL_PRI_SMPTE240M: AVColorPrimaries = 7;
341pub const AVColorPrimaries_AVCOL_PRI_FILM: AVColorPrimaries = 8;
342pub const AVColorPrimaries_AVCOL_PRI_BT2020: AVColorPrimaries = 9;
343pub const AVColorPrimaries_AVCOL_PRI_SMPTE431: AVColorPrimaries = 11;
344pub const AVColorPrimaries_AVCOL_PRI_SMPTE432: AVColorPrimaries = 12;
345
346// AVColorRange
347pub const AVColorRange_AVCOL_RANGE_UNSPECIFIED: AVColorRange = 0;
348pub const AVColorRange_AVCOL_RANGE_MPEG: AVColorRange = 1;
349pub const AVColorRange_AVCOL_RANGE_JPEG: AVColorRange = 2;
350
351// AVColorSpace
352pub const AVColorSpace_AVCOL_SPC_RGB: AVColorSpace = 0;
353pub const AVColorSpace_AVCOL_SPC_BT709: AVColorSpace = 1;
354pub const AVColorSpace_AVCOL_SPC_UNSPECIFIED: AVColorSpace = 2;
355pub const AVColorSpace_AVCOL_SPC_FCC: AVColorSpace = 4;
356pub const AVColorSpace_AVCOL_SPC_BT470BG: AVColorSpace = 5;
357pub const AVColorSpace_AVCOL_SPC_SMPTE170M: AVColorSpace = 6;
358pub const AVColorSpace_AVCOL_SPC_SMPTE240M: AVColorSpace = 7;
359pub const AVColorSpace_AVCOL_SPC_YCGCO: AVColorSpace = 8;
360pub const AVColorSpace_AVCOL_SPC_BT2020_NCL: AVColorSpace = 9;
361pub const AVColorSpace_AVCOL_SPC_BT2020_CL: AVColorSpace = 10;
362
363// AVColorTransferCharacteristic
364pub const AVColorTransferCharacteristic_AVCOL_TRC_BT709: AVColorTransferCharacteristic = 1;
365pub const AVColorTransferCharacteristic_AVCOL_TRC_UNSPECIFIED: AVColorTransferCharacteristic = 2;
366pub const AVColorTransferCharacteristic_AVCOL_TRC_GAMMA22: AVColorTransferCharacteristic = 4;
367pub const AVColorTransferCharacteristic_AVCOL_TRC_GAMMA28: AVColorTransferCharacteristic = 5;
368pub const AVColorTransferCharacteristic_AVCOL_TRC_SMPTE170M: AVColorTransferCharacteristic = 6;
369pub const AVColorTransferCharacteristic_AVCOL_TRC_SMPTE240M: AVColorTransferCharacteristic = 7;
370pub const AVColorTransferCharacteristic_AVCOL_TRC_LINEAR: AVColorTransferCharacteristic = 8;
371pub const AVColorTransferCharacteristic_AVCOL_TRC_IEC61966_2_1: AVColorTransferCharacteristic = 13;
372pub const AVColorTransferCharacteristic_AVCOL_TRC_BT2020_10: AVColorTransferCharacteristic = 14;
373pub const AVColorTransferCharacteristic_AVCOL_TRC_BT2020_12: AVColorTransferCharacteristic = 15;
374pub const AVColorTransferCharacteristic_AVCOL_TRC_SMPTEST2084: AVColorTransferCharacteristic = 16;
375pub const AVColorTransferCharacteristic_AVCOL_TRC_ARIB_STD_B67: AVColorTransferCharacteristic = 18;
376
377// AVPacketSideDataType
378pub type AVPacketSideDataType = c_uint;
379pub const AVPacketSideDataType_AV_PKT_DATA_MASTERING_DISPLAY_METADATA: AVPacketSideDataType = 20;
380pub const AVPacketSideDataType_AV_PKT_DATA_CONTENT_LIGHT_LEVEL: AVPacketSideDataType = 22;
381
382// AVHWDeviceType
383pub const AVHWDeviceType_AV_HWDEVICE_TYPE_CUDA: AVHWDeviceType = 2;
384pub const AVHWDeviceType_AV_HWDEVICE_TYPE_VAAPI: AVHWDeviceType = 4;
385pub const AVHWDeviceType_AV_HWDEVICE_TYPE_QSV: AVHWDeviceType = 5;
386pub const AVHWDeviceType_AV_HWDEVICE_TYPE_VIDEOTOOLBOX: AVHWDeviceType = 7;
387pub const AVHWDeviceType_AV_HWDEVICE_TYPE_D3D11VA: AVHWDeviceType = 8;
388
389// AVPictureType constants
390pub const AVPictureType_AV_PICTURE_TYPE_NONE: AVPictureType = 0;
391pub const AVPictureType_AV_PICTURE_TYPE_I: AVPictureType = 1;
392
393// ── Raw FFmpeg functions (bindgen-generated counterparts) ─────────────────────
394//
395// These mirror what bindgen would emit from the real FFmpeg headers.
396// All bodies are stubs; the code is compiled but never executed on docs.rs.
397
398// SAFETY: docs.rs stubs — never called at runtime.
399pub unsafe fn av_strerror(_errnum: c_int, _errbuf: *mut c_char, _errbuf_size: usize) -> c_int {
400    0
401}
402
403pub unsafe fn av_dict_get(
404    _m: *const AVDictionary,
405    _key: *const c_char,
406    _prev: *const AVDictionaryEntry,
407    _flags: c_int,
408) -> *mut AVDictionaryEntry {
409    std::ptr::null_mut()
410}
411
412pub unsafe fn av_dict_set(
413    _pm: *mut *mut AVDictionary,
414    _key: *const c_char,
415    _value: *const c_char,
416    _flags: c_int,
417) -> c_int {
418    0
419}
420
421pub unsafe fn av_dict_free(_m: *mut *mut AVDictionary) {}
422
423pub unsafe fn av_find_input_format(_short_name: *const c_char) -> *const AVInputFormat {
424    std::ptr::null()
425}
426
427pub unsafe fn avcodec_get_name(_id: AVCodecID) -> *const c_char {
428    std::ptr::null()
429}
430
431pub unsafe fn av_frame_alloc() -> *mut AVFrame {
432    std::ptr::null_mut()
433}
434
435pub unsafe fn av_frame_free(_frame: *mut *mut AVFrame) {}
436
437pub unsafe fn av_frame_get_buffer(_frame: *mut AVFrame, _align: c_int) -> c_int {
438    0
439}
440
441pub unsafe fn av_frame_move_ref(_dst: *mut AVFrame, _src: *mut AVFrame) {}
442
443pub unsafe fn av_frame_unref(_frame: *mut AVFrame) {}
444
445pub unsafe fn av_packet_alloc() -> *mut AVPacket {
446    std::ptr::null_mut()
447}
448
449pub unsafe fn av_packet_free(_pkt: *mut *mut AVPacket) {}
450
451pub unsafe fn av_packet_unref(_pkt: *mut AVPacket) {}
452
453pub unsafe fn av_packet_new_side_data(
454    _pkt: *mut AVPacket,
455    _type_: AVPacketSideDataType,
456    _size: usize,
457) -> *mut u8 {
458    std::ptr::null_mut()
459}
460
461pub unsafe fn av_buffer_ref(_buf: *mut AVBufferRef) -> *mut AVBufferRef {
462    std::ptr::null_mut()
463}
464
465pub unsafe fn av_buffer_unref(_buf: *mut *mut AVBufferRef) {}
466
467pub unsafe fn av_hwdevice_ctx_create(
468    _device_ctx: *mut *mut AVBufferRef,
469    _type_: AVHWDeviceType,
470    _device: *const c_char,
471    _opts: *mut AVDictionary,
472    _flags: c_int,
473) -> c_int {
474    -1
475}
476
477pub unsafe fn av_hwframe_transfer_data(
478    _dst: *mut AVFrame,
479    _src: *const AVFrame,
480    _flags: c_int,
481) -> c_int {
482    -1
483}
484
485pub unsafe fn av_opt_set(
486    _obj: *mut c_void,
487    _name: *const c_char,
488    _val: *const c_char,
489    _search_flags: c_int,
490) -> c_int {
491    0
492}
493
494pub unsafe fn av_read_frame(_s: *mut AVFormatContext, _pkt: *mut AVPacket) -> c_int {
495    -1
496}
497
498pub unsafe fn av_write_trailer(_s: *mut AVFormatContext) -> c_int {
499    0
500}
501
502pub unsafe fn av_interleaved_write_frame(
503    _s: *mut AVFormatContext,
504    _pkt: *mut AVPacket,
505) -> c_int {
506    0
507}
508
509pub unsafe fn avcodec_receive_frame(_avctx: *mut AVCodecContext, _frame: *mut AVFrame) -> c_int {
510    -1
511}
512
513pub unsafe fn avcodec_send_packet(
514    _avctx: *mut AVCodecContext,
515    _avpkt: *const AVPacket,
516) -> c_int {
517    -1
518}
519
520pub unsafe fn avformat_alloc_output_context2(
521    _ctx: *mut *mut AVFormatContext,
522    _oformat: *mut AVOutputFormat,
523    _format_name: *const c_char,
524    _filename: *const c_char,
525) -> c_int {
526    -1
527}
528
529pub unsafe fn avformat_free_context(_s: *mut AVFormatContext) {}
530
531pub unsafe fn avformat_new_stream(
532    _s: *mut AVFormatContext,
533    _c: *const AVCodec,
534) -> *mut AVStream {
535    std::ptr::null_mut()
536}
537
538pub unsafe fn avformat_write_header(
539    _s: *mut AVFormatContext,
540    _options: *mut *mut AVDictionary,
541) -> c_int {
542    -1
543}
544
545pub unsafe fn swr_alloc_set_opts2(
546    _ps: *mut *mut SwrContext,
547    _out_ch_layout: *const AVChannelLayout,
548    _out_sample_fmt: AVSampleFormat,
549    _out_sample_rate: c_int,
550    _in_ch_layout: *const AVChannelLayout,
551    _in_sample_fmt: AVSampleFormat,
552    _in_sample_rate: c_int,
553    _log_offset: c_int,
554    _log_ctx: *mut c_void,
555) -> c_int {
556    -1
557}
558
559pub unsafe fn swr_convert(
560    _s: *mut SwrContext,
561    _out: *mut *mut u8,
562    _out_count: c_int,
563    _in_: *const *const u8,
564    _in_count: c_int,
565) -> c_int {
566    -1
567}
568
569pub unsafe fn swr_free(_s: *mut *mut SwrContext) {}
570
571pub unsafe fn swr_get_out_samples(_s: *mut SwrContext, _in_samples: c_int) -> c_int {
572    0
573}
574
575pub unsafe fn swr_init(_s: *mut SwrContext) -> c_int {
576    -1
577}
578
579pub unsafe fn av_channel_layout_default(_ch_layout: *mut AVChannelLayout, _nb_channels: c_int) {}
580
581pub unsafe fn av_channel_layout_uninit(_ch_layout: *mut AVChannelLayout) {}
582
583pub unsafe fn av_rescale_q(_a: i64, _bq: AVRational, _cq: AVRational) -> i64 {
584    0
585}
586
587pub unsafe fn av_mallocz(_size: usize) -> *mut c_void {
588    std::ptr::null_mut()
589}
590
591pub unsafe fn av_malloc(_size: usize) -> *mut c_void {
592    std::ptr::null_mut()
593}
594
595pub unsafe fn av_free(_ptr: *mut c_void) {}
596
597pub unsafe fn av_new_packet(_pkt: *mut AVPacket, _size: c_int) -> c_int {
598    -1
599}
600
601pub unsafe fn avcodec_parameters_copy(
602    _dst: *mut AVCodecParameters,
603    _src: *const AVCodecParameters,
604) -> c_int {
605    0
606}
607
608pub unsafe fn av_packet_rescale_ts(
609    _pkt: *mut AVPacket,
610    _tb_src: AVRational,
611    _tb_dst: AVRational,
612) {
613}
614
615// ── Wrapper module stubs ──────────────────────────────────────────────────────
616//
617// These mirror the safe wrapper modules in avformat.rs, avcodec.rs,
618// swresample.rs, and swscale.rs.  Signatures must exactly match those files.
619
620// ── libavfilter opaque types ──────────────────────────────────────────────────
621
622pub struct AVFilterGraph(());
623pub struct AVFilter(());
624
625pub struct AVFilterContext {
626    pub hw_device_ctx: *mut AVBufferRef,
627}
628
629// ── libavfilter constants ─────────────────────────────────────────────────────
630
631/// Flag for `av_buffersrc_add_frame_flags`: keep a reference to the frame.
632pub const AV_BUFFERSRC_FLAG_KEEP_REF: c_int = 8;
633
634// ── libavfilter functions ─────────────────────────────────────────────────────
635
636// SAFETY: docs.rs stubs — never called at runtime.
637
638pub unsafe fn avfilter_graph_alloc() -> *mut AVFilterGraph {
639    ptr::null_mut()
640}
641
642pub unsafe fn avfilter_graph_free(_graph: *mut *mut AVFilterGraph) {}
643
644pub unsafe fn avfilter_get_by_name(_name: *const c_char) -> *const AVFilter {
645    ptr::null()
646}
647
648pub unsafe fn avfilter_graph_create_filter(
649    _filt_ctx: *mut *mut AVFilterContext,
650    _filt: *const AVFilter,
651    _name: *const c_char,
652    _args: *const c_char,
653    _opaque: *mut c_void,
654    _graph_ctx: *mut AVFilterGraph,
655) -> c_int {
656    0
657}
658
659pub unsafe fn avfilter_link(
660    _src: *mut AVFilterContext,
661    _srcpad: c_uint,
662    _dst: *mut AVFilterContext,
663    _dstpad: c_uint,
664) -> c_int {
665    0
666}
667
668pub unsafe fn avfilter_graph_config(
669    _graphctx: *mut AVFilterGraph,
670    _log_ctx: *mut c_void,
671) -> c_int {
672    0
673}
674
675pub unsafe fn avfilter_graph_set_auto_convert(_graph: *mut AVFilterGraph, _flags: c_uint) {}
676
677pub unsafe fn avfilter_graph_send_command(
678    _graph: *mut AVFilterGraph,
679    _target: *const c_char,
680    _cmd: *const c_char,
681    _arg: *const c_char,
682    _res: *mut c_char,
683    _res_len: c_int,
684    _flags: c_int,
685) -> c_int {
686    0
687}
688
689pub unsafe fn av_buffersrc_add_frame_flags(
690    _ctx: *mut AVFilterContext,
691    _frame: *mut AVFrame,
692    _flags: c_int,
693) -> c_int {
694    0
695}
696
697pub unsafe fn av_buffersrc_close(
698    _ctx: *mut AVFilterContext,
699    _pts: i64,
700    _flags: c_uint,
701) -> c_int {
702    0
703}
704
705pub unsafe fn av_buffersink_get_frame(
706    _ctx: *mut AVFilterContext,
707    _frame: *mut AVFrame,
708) -> c_int {
709    // Return EAGAIN to signal no frame available
710    -11
711}
712
713pub unsafe fn av_buffersink_get_time_base(_ctx: *const AVFilterContext) -> AVRational {
714    AVRational { num: 0, den: 1 }
715}
716
717/// Stub `avformat` wrapper module.
718pub mod avformat {
719    use std::os::raw::c_int;
720    use std::path::Path;
721
722    use super::{AVFormatContext, AVIOContext, AVPacket};
723
724    pub fn srt_available() -> bool {
725        false
726    }
727
728    pub unsafe fn open_input(_path: &Path) -> Result<*mut AVFormatContext, c_int> {
729        Err(-1)
730    }
731
732    pub unsafe fn open_input_url(
733        _url: &str,
734        _connect_timeout: std::time::Duration,
735        _read_timeout: std::time::Duration,
736    ) -> Result<*mut AVFormatContext, c_int> {
737        Err(-1)
738    }
739
740    pub unsafe fn open_input_image_sequence(
741        _path: &Path,
742        _framerate: u32,
743    ) -> Result<*mut AVFormatContext, c_int> {
744        Err(-1)
745    }
746
747    pub unsafe fn close_input(_ctx: *mut *mut AVFormatContext) {}
748
749    pub unsafe fn find_stream_info(_ctx: *mut AVFormatContext) -> Result<(), c_int> {
750        Err(-1)
751    }
752
753    pub unsafe fn seek_frame(
754        _ctx: *mut AVFormatContext,
755        _stream_index: c_int,
756        _timestamp: i64,
757        _flags: c_int,
758    ) -> Result<(), c_int> {
759        Err(-1)
760    }
761
762    pub unsafe fn seek_file(
763        _ctx: *mut AVFormatContext,
764        _stream_index: c_int,
765        _min_ts: i64,
766        _ts: i64,
767        _max_ts: i64,
768        _flags: c_int,
769    ) -> Result<(), c_int> {
770        Err(-1)
771    }
772
773    pub unsafe fn read_frame(
774        _ctx: *mut AVFormatContext,
775        _pkt: *mut AVPacket,
776    ) -> Result<(), c_int> {
777        Err(-1)
778    }
779
780    pub unsafe fn write_frame(
781        _ctx: *mut AVFormatContext,
782        _pkt: *mut AVPacket,
783    ) -> Result<(), c_int> {
784        Err(-1)
785    }
786
787    pub unsafe fn open_output(_path: &Path, _flags: c_int) -> Result<*mut AVIOContext, c_int> {
788        Err(-1)
789    }
790
791    pub unsafe fn close_output(_pb: *mut *mut AVIOContext) {}
792
793    pub mod avio_flags {
794        use std::os::raw::c_int;
795        pub const READ: c_int = 1;
796        pub const WRITE: c_int = 2;
797        pub const READ_WRITE: c_int = 3;
798    }
799
800    pub mod seek_flags {
801        pub const BACKWARD: i32 = 1;
802        pub const BYTE: i32 = 2;
803        pub const ANY: i32 = 4;
804        pub const FRAME: i32 = 8;
805    }
806}
807
808/// Stub `avcodec` wrapper module.
809pub mod avcodec {
810    use std::os::raw::c_int;
811
812    use super::{AVCodec, AVCodecContext, AVCodecID, AVCodecParameters, AVDictionary, AVFrame, AVPacket};
813
814    pub unsafe fn find_decoder(_codec_id: AVCodecID) -> Option<*const AVCodec> {
815        None
816    }
817
818    pub unsafe fn find_decoder_by_name(_name: *const i8) -> Option<*const AVCodec> {
819        None
820    }
821
822    pub unsafe fn find_encoder(_codec_id: AVCodecID) -> Option<*const AVCodec> {
823        None
824    }
825
826    pub unsafe fn find_encoder_by_name(_name: *const i8) -> Option<*const AVCodec> {
827        None
828    }
829
830    pub unsafe fn alloc_context3(_codec: *const AVCodec) -> Result<*mut AVCodecContext, c_int> {
831        Err(-1)
832    }
833
834    pub unsafe fn free_context(_ctx: *mut *mut AVCodecContext) {}
835
836    pub unsafe fn parameters_to_context(
837        _codec_ctx: *mut AVCodecContext,
838        _par: *const AVCodecParameters,
839    ) -> Result<(), c_int> {
840        Err(-1)
841    }
842
843    pub unsafe fn open2(
844        _avctx: *mut AVCodecContext,
845        _codec: *const AVCodec,
846        _options: *mut *mut AVDictionary,
847    ) -> Result<(), c_int> {
848        Err(-1)
849    }
850
851    pub unsafe fn send_packet(
852        _ctx: *mut AVCodecContext,
853        _pkt: *const AVPacket,
854    ) -> Result<(), c_int> {
855        Err(-1)
856    }
857
858    pub unsafe fn receive_frame(
859        _ctx: *mut AVCodecContext,
860        _frame: *mut AVFrame,
861    ) -> Result<(), c_int> {
862        Err(-1)
863    }
864
865    pub unsafe fn send_frame(
866        _ctx: *mut AVCodecContext,
867        _frame: *const AVFrame,
868    ) -> Result<(), c_int> {
869        Err(-1)
870    }
871
872    pub unsafe fn receive_packet(
873        _ctx: *mut AVCodecContext,
874        _pkt: *mut AVPacket,
875    ) -> Result<(), c_int> {
876        Err(-1)
877    }
878
879    pub unsafe fn flush_buffers(_ctx: *mut AVCodecContext) {}
880
881    pub unsafe fn parameters_from_context(
882        _par: *mut AVCodecParameters,
883        _ctx: *const AVCodecContext,
884    ) -> Result<(), c_int> {
885        Err(-1)
886    }
887
888    pub mod codec_caps {
889        pub const EXPERIMENTAL: u32 = 1 << 9;
890        pub const HARDWARE: u32 = 1 << 10;
891        pub const HYBRID: u32 = 1 << 11;
892        pub const VARIABLE_FRAME_SIZE: u32 = 1 << 16;
893        pub const AVOID_PROBING: u32 = 1 << 17;
894    }
895}
896
897/// Stub `swresample` wrapper module.
898pub mod swresample {
899    use std::os::raw::c_int;
900
901    use super::{AVChannelLayout, AVSampleFormat, SwrContext};
902
903    pub unsafe fn alloc() -> Result<*mut SwrContext, c_int> {
904        Err(-1)
905    }
906
907    pub unsafe fn alloc_set_opts2(
908        _out_ch_layout: *const AVChannelLayout,
909        _out_sample_fmt: AVSampleFormat,
910        _out_sample_rate: c_int,
911        _in_ch_layout: *const AVChannelLayout,
912        _in_sample_fmt: AVSampleFormat,
913        _in_sample_rate: c_int,
914    ) -> Result<*mut SwrContext, c_int> {
915        Err(-1)
916    }
917
918    pub unsafe fn init(_ctx: *mut SwrContext) -> Result<(), c_int> {
919        Err(-1)
920    }
921
922    pub unsafe fn is_initialized(_ctx: *const SwrContext) -> bool {
923        false
924    }
925
926    pub unsafe fn free(_ctx: *mut *mut SwrContext) {}
927
928    pub unsafe fn convert(
929        _s: *mut SwrContext,
930        _out: *mut *mut u8,
931        _out_count: c_int,
932        _in_: *const *const u8,
933        _in_count: c_int,
934    ) -> Result<c_int, c_int> {
935        Err(-1)
936    }
937
938    pub unsafe fn get_delay(_ctx: *mut SwrContext, _base: i64) -> i64 {
939        0
940    }
941
942    pub fn estimate_output_samples(
943        _out_sample_rate: i32,
944        _in_sample_rate: i32,
945        _in_samples: i32,
946    ) -> i32 {
947        0
948    }
949
950    pub mod channel_layout {
951        use super::super::AVChannelLayout;
952
953        pub unsafe fn set_default(_ch_layout: *mut AVChannelLayout, _nb_channels: i32) {}
954        pub unsafe fn uninit(_ch_layout: *mut AVChannelLayout) {}
955        pub unsafe fn copy(
956            _dst: *mut AVChannelLayout,
957            _src: *const AVChannelLayout,
958        ) -> Result<(), i32> {
959            Err(-1)
960        }
961        pub unsafe fn is_equal(
962            _chl: *const AVChannelLayout,
963            _chl1: *const AVChannelLayout,
964        ) -> bool {
965            false
966        }
967        pub fn mono() -> AVChannelLayout {
968            AVChannelLayout::default()
969        }
970        pub fn stereo() -> AVChannelLayout {
971            AVChannelLayout::default()
972        }
973        pub fn with_channels(_nb_channels: i32) -> AVChannelLayout {
974            AVChannelLayout::default()
975        }
976        pub fn is_valid(ch_layout: &AVChannelLayout) -> bool {
977            ch_layout.nb_channels > 0
978        }
979        pub fn nb_channels(ch_layout: &AVChannelLayout) -> i32 {
980            ch_layout.nb_channels
981        }
982        pub fn is_native_order(_ch_layout: &AVChannelLayout) -> bool {
983            false
984        }
985    }
986
987    pub mod audio_fifo {
988        use std::ffi::c_void;
989        use std::os::raw::c_int;
990
991        use super::super::{AVAudioFifo, AVSampleFormat};
992
993        pub unsafe fn alloc(
994            _sample_fmt: AVSampleFormat,
995            _channels: c_int,
996            _nb_samples: c_int,
997        ) -> Result<*mut AVAudioFifo, c_int> {
998            Err(-1)
999        }
1000
1001        pub unsafe fn free(_fifo: *mut AVAudioFifo) {}
1002
1003        pub unsafe fn write(
1004            _fifo: *mut AVAudioFifo,
1005            _data: *const *mut c_void,
1006            _nb_samples: c_int,
1007        ) -> Result<c_int, c_int> {
1008            Err(-1)
1009        }
1010
1011        pub unsafe fn read(
1012            _fifo: *mut AVAudioFifo,
1013            _data: *const *mut c_void,
1014            _nb_samples: c_int,
1015        ) -> Result<c_int, c_int> {
1016            Err(-1)
1017        }
1018
1019        pub unsafe fn size(_fifo: *mut AVAudioFifo) -> c_int {
1020            0
1021        }
1022    }
1023
1024    pub mod sample_format {
1025        use super::super::{
1026            AVSampleFormat, AVSampleFormat_AV_SAMPLE_FMT_NONE, AVSampleFormat_AV_SAMPLE_FMT_U8,
1027            AVSampleFormat_AV_SAMPLE_FMT_S16, AVSampleFormat_AV_SAMPLE_FMT_S32,
1028            AVSampleFormat_AV_SAMPLE_FMT_FLT, AVSampleFormat_AV_SAMPLE_FMT_DBL,
1029            AVSampleFormat_AV_SAMPLE_FMT_U8P, AVSampleFormat_AV_SAMPLE_FMT_S16P,
1030            AVSampleFormat_AV_SAMPLE_FMT_S32P, AVSampleFormat_AV_SAMPLE_FMT_FLTP,
1031            AVSampleFormat_AV_SAMPLE_FMT_DBLP, AVSampleFormat_AV_SAMPLE_FMT_S64,
1032            AVSampleFormat_AV_SAMPLE_FMT_S64P,
1033        };
1034
1035        pub const NONE: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_NONE;
1036        pub const U8: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_U8;
1037        pub const S16: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S16;
1038        pub const S32: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S32;
1039        pub const FLT: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_FLT;
1040        pub const DBL: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_DBL;
1041        pub const U8P: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_U8P;
1042        pub const S16P: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S16P;
1043        pub const S32P: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S32P;
1044        pub const FLTP: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_FLTP;
1045        pub const DBLP: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_DBLP;
1046        pub const S64: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S64;
1047        pub const S64P: AVSampleFormat = AVSampleFormat_AV_SAMPLE_FMT_S64P;
1048
1049        pub fn bytes_per_sample(_sample_fmt: AVSampleFormat) -> i32 {
1050            0
1051        }
1052        pub fn is_planar(_sample_fmt: AVSampleFormat) -> bool {
1053            false
1054        }
1055    }
1056}
1057
1058/// Stub `swscale` wrapper module.
1059pub mod swscale {
1060    use std::os::raw::c_int;
1061
1062    use super::{AVPixelFormat, SwsContext};
1063
1064    pub unsafe fn get_context(
1065        _src_w: c_int,
1066        _src_h: c_int,
1067        _src_fmt: AVPixelFormat,
1068        _dst_w: c_int,
1069        _dst_h: c_int,
1070        _dst_fmt: AVPixelFormat,
1071        _flags: c_int,
1072    ) -> Result<*mut SwsContext, c_int> {
1073        Err(-1)
1074    }
1075
1076    pub unsafe fn free_context(_ctx: *mut SwsContext) {}
1077
1078    pub unsafe fn scale(
1079        _ctx: *mut SwsContext,
1080        _src: *const *const u8,
1081        _src_stride: *const c_int,
1082        _src_slice_y: c_int,
1083        _src_slice_h: c_int,
1084        _dst: *const *mut u8,
1085        _dst_stride: *const c_int,
1086    ) -> Result<c_int, c_int> {
1087        Err(-1)
1088    }
1089
1090    pub unsafe fn is_supported_input(_pix_fmt: AVPixelFormat) -> bool {
1091        false
1092    }
1093
1094    pub unsafe fn is_supported_output(_pix_fmt: AVPixelFormat) -> bool {
1095        false
1096    }
1097
1098    pub unsafe fn is_supported_endianness_conversion(_pix_fmt: AVPixelFormat) -> bool {
1099        false
1100    }
1101
1102    pub mod scale_flags {
1103        pub const FAST_BILINEAR: i32 = 1;
1104        pub const BILINEAR: i32 = 2;
1105        pub const BICUBIC: i32 = 4;
1106        pub const X: i32 = 8;
1107        pub const POINT: i32 = 16;
1108        pub const AREA: i32 = 32;
1109        pub const BICUBLIN: i32 = 64;
1110        pub const GAUSS: i32 = 128;
1111        pub const SINC: i32 = 256;
1112        pub const LANCZOS: i32 = 512;
1113        pub const SPLINE: i32 = 1024;
1114    }
1115}