ffmpeg_next/util/format/
pixel.rs

1use std::error;
2use std::ffi::{CStr, CString, NulError};
3use std::fmt;
4use std::str::{from_utf8_unchecked, FromStr};
5
6use ffi::AVPixelFormat::*;
7use ffi::*;
8
9#[derive(Eq, PartialEq, Copy, Clone, Debug)]
10pub enum Pixel {
11    None,
12
13    YUV420P,
14    YUYV422,
15    RGB24,
16    BGR24,
17    YUV422P,
18    YUV444P,
19    YUV410P,
20    YUV411P,
21    GRAY8,
22    MonoWhite,
23    MonoBlack,
24    PAL8,
25    YUVJ420P,
26    YUVJ422P,
27    YUVJ444P,
28    #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
29    XVMC_MPEG2_MC,
30    #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
31    XVMC_MPEG2_IDCT,
32    UYVY422,
33    UYYVYY411,
34    BGR8,
35    BGR4,
36    BGR4_BYTE,
37    RGB8,
38    RGB4,
39    RGB4_BYTE,
40    NV12,
41    NV21,
42
43    ARGB,
44    RGBA,
45    ABGR,
46    BGRA,
47
48    GRAY16BE,
49    GRAY16LE,
50    YUV440P,
51    YUVJ440P,
52    YUVA420P,
53    #[cfg(feature = "ff_api_vdpau")]
54    VDPAU_H264,
55    #[cfg(feature = "ff_api_vdpau")]
56    VDPAU_MPEG1,
57    #[cfg(feature = "ff_api_vdpau")]
58    VDPAU_MPEG2,
59    #[cfg(feature = "ff_api_vdpau")]
60    VDPAU_WMV3,
61    #[cfg(feature = "ff_api_vdpau")]
62    VDPAU_VC1,
63    RGB48BE,
64    RGB48LE,
65
66    RGB565BE,
67    RGB565LE,
68    RGB555BE,
69    RGB555LE,
70
71    BGR565BE,
72    BGR565LE,
73    BGR555BE,
74    BGR555LE,
75
76    #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
77    VAAPI_MOCO,
78    #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
79    VAAPI_IDCT,
80    #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
81    VAAPI_VLD,
82    #[cfg(any(not(feature = "ff_api_vaapi"), feature = "ffmpeg_5_0"))]
83    VAAPI,
84
85    YUV420P16LE,
86    YUV420P16BE,
87    YUV422P16LE,
88    YUV422P16BE,
89    YUV444P16LE,
90    YUV444P16BE,
91    #[cfg(feature = "ff_api_vdpau")]
92    VDPAU_MPEG4,
93    DXVA2_VLD,
94
95    RGB444LE,
96    RGB444BE,
97    BGR444LE,
98    BGR444BE,
99    YA8,
100
101    BGR48BE,
102    BGR48LE,
103
104    YUV420P9BE,
105    YUV420P9LE,
106    YUV420P10BE,
107    YUV420P10LE,
108    YUV422P10BE,
109    YUV422P10LE,
110    YUV444P9BE,
111    YUV444P9LE,
112    YUV444P10BE,
113    YUV444P10LE,
114    YUV422P9BE,
115    YUV422P9LE,
116    #[cfg(not(feature = "ffmpeg_4_0"))]
117    VDA_VLD,
118
119    GBRP,
120    GBRP9BE,
121    GBRP9LE,
122    GBRP10BE,
123    GBRP10LE,
124    GBRP16BE,
125    GBRP16LE,
126
127    YUVA420P9BE,
128    YUVA420P9LE,
129    YUVA422P9BE,
130    YUVA422P9LE,
131    YUVA444P9BE,
132    YUVA444P9LE,
133    YUVA420P10BE,
134    YUVA420P10LE,
135    YUVA422P10BE,
136    YUVA422P10LE,
137    YUVA444P10BE,
138    YUVA444P10LE,
139    YUVA420P16BE,
140    YUVA420P16LE,
141    YUVA422P16BE,
142    YUVA422P16LE,
143    YUVA444P16BE,
144    YUVA444P16LE,
145
146    VDPAU,
147
148    XYZ12LE,
149    XYZ12BE,
150    NV16,
151    NV20LE,
152    NV20BE,
153
154    RGBA64BE,
155    RGBA64LE,
156    BGRA64BE,
157    BGRA64LE,
158
159    YVYU422,
160
161    #[cfg(not(feature = "ffmpeg_4_0"))]
162    VDA,
163
164    YA16BE,
165    YA16LE,
166
167    QSV,
168    MMAL,
169
170    D3D11VA_VLD,
171
172    CUDA,
173
174    ZRGB,
175    RGBZ,
176    ZBGR,
177    BGRZ,
178    YUVA444P,
179    YUVA422P,
180
181    YUV420P12BE,
182    YUV420P12LE,
183    YUV420P14BE,
184    YUV420P14LE,
185    YUV422P12BE,
186    YUV422P12LE,
187    YUV422P14BE,
188    YUV422P14LE,
189    YUV444P12BE,
190    YUV444P12LE,
191    YUV444P14BE,
192    YUV444P14LE,
193    GBRP12BE,
194    GBRP12LE,
195    GBRP14BE,
196    GBRP14LE,
197    GBRAP,
198    GBRAP16BE,
199    GBRAP16LE,
200    YUVJ411P,
201
202    BAYER_BGGR8,
203    BAYER_RGGB8,
204    BAYER_GBRG8,
205    BAYER_GRBG8,
206    BAYER_BGGR16LE,
207    BAYER_BGGR16BE,
208    BAYER_RGGB16LE,
209    BAYER_RGGB16BE,
210    BAYER_GBRG16LE,
211    BAYER_GBRG16BE,
212    BAYER_GRBG16LE,
213    BAYER_GRBG16BE,
214
215    YUV440P10LE,
216    YUV440P10BE,
217    YUV440P12LE,
218    YUV440P12BE,
219    AYUV64LE,
220    AYUV64BE,
221
222    VIDEOTOOLBOX,
223
224    // --- defaults
225    #[cfg(all(feature = "ffmpeg_4_0", not(feature = "ffmpeg_7_0")))]
226    XVMC,
227
228    RGB32,
229    RGB32_1,
230    BGR32,
231    BGR32_1,
232    ZRGB32,
233    ZBGR32,
234
235    GRAY16,
236    YA16,
237    RGB48,
238    RGB565,
239    RGB555,
240    RGB444,
241    BGR48,
242    BGR565,
243    BGR555,
244    BGR444,
245
246    YUV420P9,
247    YUV422P9,
248    YUV444P9,
249    YUV420P10,
250    YUV422P10,
251    YUV440P10,
252    YUV444P10,
253    YUV420P12,
254    YUV422P12,
255    YUV440P12,
256    YUV444P12,
257    YUV420P14,
258    YUV422P14,
259    YUV444P14,
260    YUV420P16,
261    YUV422P16,
262    YUV444P16,
263
264    GBRP9,
265    GBRP10,
266    GBRP12,
267    GBRP14,
268    GBRP16,
269    GBRAP16,
270
271    BAYER_BGGR16,
272    BAYER_RGGB16,
273    BAYER_GBRG16,
274    BAYER_GRBG16,
275
276    YUVA420P9,
277    YUVA422P9,
278    YUVA444P9,
279    YUVA420P10,
280    YUVA422P10,
281    YUVA444P10,
282    YUVA420P16,
283    YUVA422P16,
284    YUVA444P16,
285
286    XYZ12,
287    NV20,
288    AYUV64,
289
290    P010LE,
291    P010BE,
292    GBRAP12BE,
293    GBRAP12LE,
294    GBRAP10LE,
295    GBRAP10BE,
296    MEDIACODEC,
297    GRAY12BE,
298    GRAY12LE,
299    GRAY10BE,
300    GRAY10LE,
301    P016LE,
302    P016BE,
303
304    D3D11,
305    GRAY9BE,
306    GRAY9LE,
307    GBRPF32BE,
308    GBRPF32LE,
309    GBRAPF32BE,
310    GBRAPF32LE,
311    DRM_PRIME,
312
313    #[cfg(feature = "ffmpeg_4_0")]
314    OPENCL,
315
316    #[cfg(feature = "ffmpeg_4_1")]
317    GRAY14BE,
318    #[cfg(feature = "ffmpeg_4_1")]
319    GRAY14LE,
320    #[cfg(feature = "ffmpeg_4_1")]
321    GRAYF32BE,
322    #[cfg(feature = "ffmpeg_4_1")]
323    GRAYF32LE,
324
325    #[cfg(feature = "ffmpeg_4_2")]
326    YUVA422P12BE,
327    #[cfg(feature = "ffmpeg_4_2")]
328    YUVA422P12LE,
329    #[cfg(feature = "ffmpeg_4_2")]
330    YUVA444P12BE,
331    #[cfg(feature = "ffmpeg_4_2")]
332    YUVA444P12LE,
333    #[cfg(feature = "ffmpeg_4_2")]
334    NV24,
335    #[cfg(feature = "ffmpeg_4_2")]
336    NV42,
337
338    #[cfg(feature = "ffmpeg_4_3")]
339    VULKAN,
340    #[cfg(feature = "ffmpeg_4_3")]
341    Y210BE,
342    #[cfg(feature = "ffmpeg_4_3")]
343    Y210LE,
344
345    #[cfg(feature = "ffmpeg_4_4")]
346    X2RGB10LE,
347    #[cfg(feature = "ffmpeg_4_4")]
348    X2RGB10BE,
349
350    #[cfg(feature = "ffmpeg_5_0")]
351    X2BGR10LE,
352    #[cfg(feature = "ffmpeg_5_0")]
353    X2BGR10BE,
354    #[cfg(feature = "ffmpeg_5_0")]
355    P210BE,
356    #[cfg(feature = "ffmpeg_5_0")]
357    P210LE,
358    #[cfg(feature = "ffmpeg_5_0")]
359    P410BE,
360    #[cfg(feature = "ffmpeg_5_0")]
361    P410LE,
362    #[cfg(feature = "ffmpeg_5_0")]
363    P216BE,
364    #[cfg(feature = "ffmpeg_5_0")]
365    P216LE,
366    #[cfg(feature = "ffmpeg_5_0")]
367    P416BE,
368    #[cfg(feature = "ffmpeg_5_0")]
369    P416LE,
370
371    #[cfg(feature = "ffmpeg_6_0")]
372    VUYA,
373    #[cfg(feature = "ffmpeg_6_0")]
374    RGBAF16BE,
375    #[cfg(feature = "ffmpeg_6_0")]
376    RGBAF16LE,
377    #[cfg(feature = "ffmpeg_6_0")]
378    VUYX,
379    #[cfg(feature = "ffmpeg_6_0")]
380    P012LE,
381    #[cfg(feature = "ffmpeg_6_0")]
382    P012BE,
383    #[cfg(feature = "ffmpeg_6_0")]
384    Y212BE,
385    #[cfg(feature = "ffmpeg_6_0")]
386    Y212LE,
387    #[cfg(feature = "ffmpeg_6_0")]
388    XV30BE,
389    #[cfg(feature = "ffmpeg_6_0")]
390    XV30LE,
391    #[cfg(feature = "ffmpeg_6_0")]
392    XV36BE,
393    #[cfg(feature = "ffmpeg_6_0")]
394    XV36LE,
395    #[cfg(feature = "ffmpeg_6_0")]
396    RGBF32BE,
397    #[cfg(feature = "ffmpeg_6_0")]
398    RGBF32LE,
399    #[cfg(feature = "ffmpeg_6_0")]
400    RGBAF32BE,
401    #[cfg(feature = "ffmpeg_6_0")]
402    RGBAF32LE,
403
404    #[cfg(feature = "ffmpeg_6_1")]
405    P212BE,
406    #[cfg(feature = "ffmpeg_6_1")]
407    P212LE,
408    #[cfg(feature = "ffmpeg_6_1")]
409    P412BE,
410    #[cfg(feature = "ffmpeg_6_1")]
411    P412LE,
412    #[cfg(feature = "ffmpeg_6_1")]
413    GBRAP14BE,
414    #[cfg(feature = "ffmpeg_6_1")]
415    GBRAP14LE,
416
417    #[cfg(feature = "ffmpeg_7_0")]
418    D3D12,
419
420    #[cfg(feature = "rpi")]
421    SAND128,
422    #[cfg(feature = "rpi")]
423    SAND64_10,
424    #[cfg(feature = "rpi")]
425    SAND64_16,
426    #[cfg(feature = "rpi")]
427    RPI4_8,
428    #[cfg(feature = "rpi")]
429    RPI4_10,
430}
431
432#[derive(Clone, Copy, PartialEq, Eq)]
433pub struct Descriptor {
434    ptr: *const AVPixFmtDescriptor,
435}
436
437unsafe impl Send for Descriptor {}
438unsafe impl Sync for Descriptor {}
439
440impl Pixel {
441    pub const Y400A: Pixel = Pixel::YA8;
442    pub const GRAY8A: Pixel = Pixel::YA8;
443    pub const GBR24P: Pixel = Pixel::GBRP;
444    #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
445    pub const XVMC: Pixel = Pixel::XVMC_MPEG2_IDCT;
446
447    pub fn descriptor(self) -> Option<Descriptor> {
448        unsafe {
449            let ptr = av_pix_fmt_desc_get(self.into());
450
451            ptr.as_ref().map(|ptr| Descriptor { ptr })
452        }
453    }
454}
455
456impl Descriptor {
457    pub fn as_ptr(self) -> *const AVPixFmtDescriptor {
458        self.ptr
459    }
460
461    pub fn name(self) -> &'static str {
462        unsafe { from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).name).to_bytes()) }
463    }
464
465    pub fn nb_components(self) -> u8 {
466        unsafe { (*self.as_ptr()).nb_components }
467    }
468
469    pub fn log2_chroma_w(self) -> u8 {
470        unsafe { (*self.as_ptr()).log2_chroma_w }
471    }
472
473    pub fn log2_chroma_h(self) -> u8 {
474        unsafe { (*self.as_ptr()).log2_chroma_h }
475    }
476}
477
478impl From<AVPixelFormat> for Pixel {
479    #[inline]
480    fn from(value: AVPixelFormat) -> Self {
481        match value {
482            AV_PIX_FMT_NONE => Pixel::None,
483
484            AV_PIX_FMT_YUV420P => Pixel::YUV420P,
485            AV_PIX_FMT_YUYV422 => Pixel::YUYV422,
486            AV_PIX_FMT_RGB24 => Pixel::RGB24,
487            AV_PIX_FMT_BGR24 => Pixel::BGR24,
488            AV_PIX_FMT_YUV422P => Pixel::YUV422P,
489            AV_PIX_FMT_YUV444P => Pixel::YUV444P,
490            AV_PIX_FMT_YUV410P => Pixel::YUV410P,
491            AV_PIX_FMT_YUV411P => Pixel::YUV411P,
492            AV_PIX_FMT_GRAY8 => Pixel::GRAY8,
493            AV_PIX_FMT_MONOWHITE => Pixel::MonoWhite,
494            AV_PIX_FMT_MONOBLACK => Pixel::MonoBlack,
495            AV_PIX_FMT_PAL8 => Pixel::PAL8,
496            AV_PIX_FMT_YUVJ420P => Pixel::YUVJ420P,
497            AV_PIX_FMT_YUVJ422P => Pixel::YUVJ422P,
498            AV_PIX_FMT_YUVJ444P => Pixel::YUVJ444P,
499            #[cfg(all(feature = "ffmpeg_4_0", not(feature = "ffmpeg_7_0")))]
500            AV_PIX_FMT_XVMC => Pixel::XVMC,
501            #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
502            AV_PIX_FMT_XVMC_MPEG2_MC => Pixel::XVMC_MPEG2_MC,
503            #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
504            AV_PIX_FMT_XVMC_MPEG2_IDCT => Pixel::XVMC_MPEG2_IDCT,
505            AV_PIX_FMT_UYVY422 => Pixel::UYVY422,
506            AV_PIX_FMT_UYYVYY411 => Pixel::UYYVYY411,
507            AV_PIX_FMT_BGR8 => Pixel::BGR8,
508            AV_PIX_FMT_BGR4 => Pixel::BGR4,
509            AV_PIX_FMT_BGR4_BYTE => Pixel::BGR4_BYTE,
510            AV_PIX_FMT_RGB8 => Pixel::RGB8,
511            AV_PIX_FMT_RGB4 => Pixel::RGB4,
512            AV_PIX_FMT_RGB4_BYTE => Pixel::RGB4_BYTE,
513            AV_PIX_FMT_NV12 => Pixel::NV12,
514            AV_PIX_FMT_NV21 => Pixel::NV21,
515
516            AV_PIX_FMT_ARGB => Pixel::ARGB,
517            AV_PIX_FMT_RGBA => Pixel::RGBA,
518            AV_PIX_FMT_ABGR => Pixel::ABGR,
519            AV_PIX_FMT_BGRA => Pixel::BGRA,
520
521            AV_PIX_FMT_GRAY16BE => Pixel::GRAY16BE,
522            AV_PIX_FMT_GRAY16LE => Pixel::GRAY16LE,
523            AV_PIX_FMT_YUV440P => Pixel::YUV440P,
524            AV_PIX_FMT_YUVJ440P => Pixel::YUVJ440P,
525            AV_PIX_FMT_YUVA420P => Pixel::YUVA420P,
526            #[cfg(feature = "ff_api_vdpau")]
527            AV_PIX_FMT_VDPAU_H264 => Pixel::VDPAU_H264,
528            #[cfg(feature = "ff_api_vdpau")]
529            AV_PIX_FMT_VDPAU_MPEG1 => Pixel::VDPAU_MPEG1,
530            #[cfg(feature = "ff_api_vdpau")]
531            AV_PIX_FMT_VDPAU_MPEG2 => Pixel::VDPAU_MPEG2,
532            #[cfg(feature = "ff_api_vdpau")]
533            AV_PIX_FMT_VDPAU_WMV3 => Pixel::VDPAU_WMV3,
534            #[cfg(feature = "ff_api_vdpau")]
535            AV_PIX_FMT_VDPAU_VC1 => Pixel::VDPAU_VC1,
536            AV_PIX_FMT_RGB48BE => Pixel::RGB48BE,
537            AV_PIX_FMT_RGB48LE => Pixel::RGB48LE,
538
539            AV_PIX_FMT_RGB565BE => Pixel::RGB565BE,
540            AV_PIX_FMT_RGB565LE => Pixel::RGB565LE,
541            AV_PIX_FMT_RGB555BE => Pixel::RGB555BE,
542            AV_PIX_FMT_RGB555LE => Pixel::RGB555LE,
543
544            AV_PIX_FMT_BGR565BE => Pixel::BGR565BE,
545            AV_PIX_FMT_BGR565LE => Pixel::BGR565LE,
546            AV_PIX_FMT_BGR555BE => Pixel::BGR555BE,
547            AV_PIX_FMT_BGR555LE => Pixel::BGR555LE,
548
549            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
550            AV_PIX_FMT_VAAPI_MOCO => Pixel::VAAPI_MOCO,
551            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
552            AV_PIX_FMT_VAAPI_IDCT => Pixel::VAAPI_IDCT,
553            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
554            AV_PIX_FMT_VAAPI_VLD => Pixel::VAAPI_VLD,
555            #[cfg(any(not(feature = "ff_api_vaapi"), feature = "ffmpeg_5_0"))]
556            AV_PIX_FMT_VAAPI => Pixel::VAAPI,
557
558            AV_PIX_FMT_YUV420P16LE => Pixel::YUV420P16LE,
559            AV_PIX_FMT_YUV420P16BE => Pixel::YUV420P16BE,
560            AV_PIX_FMT_YUV422P16LE => Pixel::YUV422P16LE,
561            AV_PIX_FMT_YUV422P16BE => Pixel::YUV422P16BE,
562            AV_PIX_FMT_YUV444P16LE => Pixel::YUV444P16LE,
563            AV_PIX_FMT_YUV444P16BE => Pixel::YUV444P16BE,
564            #[cfg(feature = "ff_api_vdpau")]
565            AV_PIX_FMT_VDPAU_MPEG4 => Pixel::VDPAU_MPEG4,
566            AV_PIX_FMT_DXVA2_VLD => Pixel::DXVA2_VLD,
567
568            AV_PIX_FMT_RGB444LE => Pixel::RGB444LE,
569            AV_PIX_FMT_RGB444BE => Pixel::RGB444BE,
570            AV_PIX_FMT_BGR444LE => Pixel::BGR444LE,
571            AV_PIX_FMT_BGR444BE => Pixel::BGR444BE,
572            AV_PIX_FMT_YA8 => Pixel::YA8,
573
574            AV_PIX_FMT_BGR48BE => Pixel::BGR48BE,
575            AV_PIX_FMT_BGR48LE => Pixel::BGR48LE,
576
577            AV_PIX_FMT_YUV420P9BE => Pixel::YUV420P9BE,
578            AV_PIX_FMT_YUV420P9LE => Pixel::YUV420P9LE,
579            AV_PIX_FMT_YUV420P10BE => Pixel::YUV420P10BE,
580            AV_PIX_FMT_YUV420P10LE => Pixel::YUV420P10LE,
581            AV_PIX_FMT_YUV422P10BE => Pixel::YUV422P10BE,
582            AV_PIX_FMT_YUV422P10LE => Pixel::YUV422P10LE,
583            AV_PIX_FMT_YUV444P9BE => Pixel::YUV444P9BE,
584            AV_PIX_FMT_YUV444P9LE => Pixel::YUV444P9LE,
585            AV_PIX_FMT_YUV444P10BE => Pixel::YUV444P10BE,
586            AV_PIX_FMT_YUV444P10LE => Pixel::YUV444P10LE,
587            AV_PIX_FMT_YUV422P9BE => Pixel::YUV422P9BE,
588            AV_PIX_FMT_YUV422P9LE => Pixel::YUV422P9LE,
589            #[cfg(not(feature = "ffmpeg_4_0"))]
590            AV_PIX_FMT_VDA_VLD => Pixel::VDA_VLD,
591
592            AV_PIX_FMT_GBRP => Pixel::GBRP,
593            AV_PIX_FMT_GBRP9BE => Pixel::GBRP9BE,
594            AV_PIX_FMT_GBRP9LE => Pixel::GBRP9LE,
595            AV_PIX_FMT_GBRP10BE => Pixel::GBRP10BE,
596            AV_PIX_FMT_GBRP10LE => Pixel::GBRP10LE,
597            AV_PIX_FMT_GBRP16BE => Pixel::GBRP16BE,
598            AV_PIX_FMT_GBRP16LE => Pixel::GBRP16LE,
599
600            AV_PIX_FMT_YUVA420P9BE => Pixel::YUVA420P9BE,
601            AV_PIX_FMT_YUVA420P9LE => Pixel::YUVA420P9LE,
602            AV_PIX_FMT_YUVA422P9BE => Pixel::YUVA422P9BE,
603            AV_PIX_FMT_YUVA422P9LE => Pixel::YUVA422P9LE,
604            AV_PIX_FMT_YUVA444P9BE => Pixel::YUVA444P9BE,
605            AV_PIX_FMT_YUVA444P9LE => Pixel::YUVA444P9LE,
606            AV_PIX_FMT_YUVA420P10BE => Pixel::YUVA420P10BE,
607            AV_PIX_FMT_YUVA420P10LE => Pixel::YUVA420P10LE,
608            AV_PIX_FMT_YUVA422P10BE => Pixel::YUVA422P10BE,
609            AV_PIX_FMT_YUVA422P10LE => Pixel::YUVA422P10LE,
610            AV_PIX_FMT_YUVA444P10BE => Pixel::YUVA444P10BE,
611            AV_PIX_FMT_YUVA444P10LE => Pixel::YUVA444P10LE,
612            AV_PIX_FMT_YUVA420P16BE => Pixel::YUVA420P16BE,
613            AV_PIX_FMT_YUVA420P16LE => Pixel::YUVA420P16LE,
614            AV_PIX_FMT_YUVA422P16BE => Pixel::YUVA422P16BE,
615            AV_PIX_FMT_YUVA422P16LE => Pixel::YUVA422P16LE,
616            AV_PIX_FMT_YUVA444P16BE => Pixel::YUVA444P16BE,
617            AV_PIX_FMT_YUVA444P16LE => Pixel::YUVA444P16LE,
618
619            AV_PIX_FMT_VDPAU => Pixel::VDPAU,
620
621            AV_PIX_FMT_XYZ12LE => Pixel::XYZ12LE,
622            AV_PIX_FMT_XYZ12BE => Pixel::XYZ12BE,
623            AV_PIX_FMT_NV16 => Pixel::NV16,
624            AV_PIX_FMT_NV20LE => Pixel::NV20LE,
625            AV_PIX_FMT_NV20BE => Pixel::NV20BE,
626
627            AV_PIX_FMT_RGBA64BE => Pixel::RGBA64BE,
628            AV_PIX_FMT_RGBA64LE => Pixel::RGBA64LE,
629            AV_PIX_FMT_BGRA64BE => Pixel::BGRA64BE,
630            AV_PIX_FMT_BGRA64LE => Pixel::BGRA64LE,
631
632            AV_PIX_FMT_YVYU422 => Pixel::YVYU422,
633
634            #[cfg(not(feature = "ffmpeg_4_0"))]
635            AV_PIX_FMT_VDA => Pixel::VDA,
636
637            AV_PIX_FMT_YA16BE => Pixel::YA16BE,
638            AV_PIX_FMT_YA16LE => Pixel::YA16LE,
639
640            AV_PIX_FMT_QSV => Pixel::QSV,
641            AV_PIX_FMT_MMAL => Pixel::MMAL,
642
643            AV_PIX_FMT_D3D11VA_VLD => Pixel::D3D11VA_VLD,
644
645            AV_PIX_FMT_CUDA => Pixel::CUDA,
646
647            AV_PIX_FMT_0RGB => Pixel::ZRGB,
648            AV_PIX_FMT_RGB0 => Pixel::RGBZ,
649            AV_PIX_FMT_0BGR => Pixel::ZBGR,
650            AV_PIX_FMT_BGR0 => Pixel::BGRZ,
651            AV_PIX_FMT_YUVA444P => Pixel::YUVA444P,
652            AV_PIX_FMT_YUVA422P => Pixel::YUVA422P,
653
654            AV_PIX_FMT_YUV420P12BE => Pixel::YUV420P12BE,
655            AV_PIX_FMT_YUV420P12LE => Pixel::YUV420P12LE,
656            AV_PIX_FMT_YUV420P14BE => Pixel::YUV420P14BE,
657            AV_PIX_FMT_YUV420P14LE => Pixel::YUV420P14LE,
658            AV_PIX_FMT_YUV422P12BE => Pixel::YUV422P12BE,
659            AV_PIX_FMT_YUV422P12LE => Pixel::YUV422P12LE,
660            AV_PIX_FMT_YUV422P14BE => Pixel::YUV422P14BE,
661            AV_PIX_FMT_YUV422P14LE => Pixel::YUV422P14LE,
662            AV_PIX_FMT_YUV444P12BE => Pixel::YUV444P12BE,
663            AV_PIX_FMT_YUV444P12LE => Pixel::YUV444P12LE,
664            AV_PIX_FMT_YUV444P14BE => Pixel::YUV444P14BE,
665            AV_PIX_FMT_YUV444P14LE => Pixel::YUV444P14LE,
666            AV_PIX_FMT_GBRP12BE => Pixel::GBRP12BE,
667            AV_PIX_FMT_GBRP12LE => Pixel::GBRP12LE,
668            AV_PIX_FMT_GBRP14BE => Pixel::GBRP14BE,
669            AV_PIX_FMT_GBRP14LE => Pixel::GBRP14LE,
670            AV_PIX_FMT_GBRAP => Pixel::GBRAP,
671            AV_PIX_FMT_GBRAP16BE => Pixel::GBRAP16BE,
672            AV_PIX_FMT_GBRAP16LE => Pixel::GBRAP16LE,
673            AV_PIX_FMT_YUVJ411P => Pixel::YUVJ411P,
674
675            AV_PIX_FMT_BAYER_BGGR8 => Pixel::BAYER_BGGR8,
676            AV_PIX_FMT_BAYER_RGGB8 => Pixel::BAYER_RGGB8,
677            AV_PIX_FMT_BAYER_GBRG8 => Pixel::BAYER_GBRG8,
678            AV_PIX_FMT_BAYER_GRBG8 => Pixel::BAYER_GRBG8,
679            AV_PIX_FMT_BAYER_BGGR16LE => Pixel::BAYER_BGGR16LE,
680            AV_PIX_FMT_BAYER_BGGR16BE => Pixel::BAYER_BGGR16BE,
681            AV_PIX_FMT_BAYER_RGGB16LE => Pixel::BAYER_RGGB16LE,
682            AV_PIX_FMT_BAYER_RGGB16BE => Pixel::BAYER_RGGB16BE,
683            AV_PIX_FMT_BAYER_GBRG16LE => Pixel::BAYER_GBRG16LE,
684            AV_PIX_FMT_BAYER_GBRG16BE => Pixel::BAYER_GBRG16BE,
685            AV_PIX_FMT_BAYER_GRBG16LE => Pixel::BAYER_GRBG16LE,
686            AV_PIX_FMT_BAYER_GRBG16BE => Pixel::BAYER_GRBG16BE,
687
688            AV_PIX_FMT_YUV440P10LE => Pixel::YUV440P10LE,
689            AV_PIX_FMT_YUV440P10BE => Pixel::YUV440P10BE,
690            AV_PIX_FMT_YUV440P12LE => Pixel::YUV440P12LE,
691            AV_PIX_FMT_YUV440P12BE => Pixel::YUV440P12BE,
692            AV_PIX_FMT_AYUV64LE => Pixel::AYUV64LE,
693            AV_PIX_FMT_AYUV64BE => Pixel::AYUV64BE,
694
695            AV_PIX_FMT_VIDEOTOOLBOX => Pixel::VIDEOTOOLBOX,
696
697            AV_PIX_FMT_P010LE => Pixel::P010LE,
698            AV_PIX_FMT_P010BE => Pixel::P010BE,
699            AV_PIX_FMT_GBRAP12BE => Pixel::GBRAP12BE,
700            AV_PIX_FMT_GBRAP12LE => Pixel::GBRAP12LE,
701            AV_PIX_FMT_GBRAP10LE => Pixel::GBRAP10LE,
702            AV_PIX_FMT_GBRAP10BE => Pixel::GBRAP10BE,
703            AV_PIX_FMT_MEDIACODEC => Pixel::MEDIACODEC,
704            AV_PIX_FMT_GRAY12BE => Pixel::GRAY12BE,
705            AV_PIX_FMT_GRAY12LE => Pixel::GRAY12LE,
706            AV_PIX_FMT_GRAY10BE => Pixel::GRAY10BE,
707            AV_PIX_FMT_GRAY10LE => Pixel::GRAY10LE,
708            AV_PIX_FMT_P016LE => Pixel::P016LE,
709            AV_PIX_FMT_P016BE => Pixel::P016BE,
710
711            AV_PIX_FMT_NB => Pixel::None,
712
713            AV_PIX_FMT_D3D11 => Pixel::D3D11,
714            AV_PIX_FMT_GRAY9BE => Pixel::GRAY9BE,
715            AV_PIX_FMT_GRAY9LE => Pixel::GRAY9LE,
716            AV_PIX_FMT_GBRPF32BE => Pixel::GBRPF32BE,
717            AV_PIX_FMT_GBRPF32LE => Pixel::GBRPF32LE,
718            AV_PIX_FMT_GBRAPF32BE => Pixel::GBRAPF32BE,
719            AV_PIX_FMT_GBRAPF32LE => Pixel::GBRAPF32LE,
720            AV_PIX_FMT_DRM_PRIME => Pixel::DRM_PRIME,
721
722            #[cfg(feature = "ffmpeg_4_0")]
723            AV_PIX_FMT_OPENCL => Pixel::OPENCL,
724
725            #[cfg(feature = "ffmpeg_4_1")]
726            AV_PIX_FMT_GRAY14BE => Pixel::GRAY14BE,
727            #[cfg(feature = "ffmpeg_4_1")]
728            AV_PIX_FMT_GRAY14LE => Pixel::GRAY14LE,
729            #[cfg(feature = "ffmpeg_4_1")]
730            AV_PIX_FMT_GRAYF32BE => Pixel::GRAYF32BE,
731            #[cfg(feature = "ffmpeg_4_1")]
732            AV_PIX_FMT_GRAYF32LE => Pixel::GRAYF32LE,
733
734            #[cfg(feature = "ffmpeg_4_2")]
735            AV_PIX_FMT_YUVA422P12BE => Pixel::YUVA422P12BE,
736            #[cfg(feature = "ffmpeg_4_2")]
737            AV_PIX_FMT_YUVA422P12LE => Pixel::YUVA422P12LE,
738            #[cfg(feature = "ffmpeg_4_2")]
739            AV_PIX_FMT_YUVA444P12BE => Pixel::YUVA444P12BE,
740            #[cfg(feature = "ffmpeg_4_2")]
741            AV_PIX_FMT_YUVA444P12LE => Pixel::YUVA444P12LE,
742            #[cfg(feature = "ffmpeg_4_2")]
743            AV_PIX_FMT_NV24 => Pixel::NV24,
744            #[cfg(feature = "ffmpeg_4_2")]
745            AV_PIX_FMT_NV42 => Pixel::NV42,
746
747            #[cfg(feature = "ffmpeg_4_3")]
748            AV_PIX_FMT_VULKAN => Pixel::VULKAN,
749            #[cfg(feature = "ffmpeg_4_3")]
750            AV_PIX_FMT_Y210BE => Pixel::Y210BE,
751            #[cfg(feature = "ffmpeg_4_3")]
752            AV_PIX_FMT_Y210LE => Pixel::Y210LE,
753
754            #[cfg(feature = "ffmpeg_4_4")]
755            AV_PIX_FMT_X2RGB10LE => Pixel::X2RGB10LE,
756            #[cfg(feature = "ffmpeg_4_4")]
757            AV_PIX_FMT_X2RGB10BE => Pixel::X2RGB10BE,
758
759            #[cfg(feature = "ffmpeg_5_0")]
760            AV_PIX_FMT_X2BGR10LE => Pixel::X2BGR10LE,
761            #[cfg(feature = "ffmpeg_5_0")]
762            AV_PIX_FMT_X2BGR10BE => Pixel::X2BGR10BE,
763            #[cfg(feature = "ffmpeg_5_0")]
764            AV_PIX_FMT_P210BE => Pixel::P210BE,
765            #[cfg(feature = "ffmpeg_5_0")]
766            AV_PIX_FMT_P210LE => Pixel::P210LE,
767            #[cfg(feature = "ffmpeg_5_0")]
768            AV_PIX_FMT_P410BE => Pixel::P410BE,
769            #[cfg(feature = "ffmpeg_5_0")]
770            AV_PIX_FMT_P410LE => Pixel::P410LE,
771            #[cfg(feature = "ffmpeg_5_0")]
772            AV_PIX_FMT_P216BE => Pixel::P216BE,
773            #[cfg(feature = "ffmpeg_5_0")]
774            AV_PIX_FMT_P216LE => Pixel::P216LE,
775            #[cfg(feature = "ffmpeg_5_0")]
776            AV_PIX_FMT_P416BE => Pixel::P416BE,
777            #[cfg(feature = "ffmpeg_5_0")]
778            AV_PIX_FMT_P416LE => Pixel::P416LE,
779
780            #[cfg(feature = "ffmpeg_6_0")]
781            AV_PIX_FMT_VUYA => Pixel::VUYA,
782            #[cfg(feature = "ffmpeg_6_0")]
783            AV_PIX_FMT_RGBAF16BE => Pixel::RGBAF16BE,
784            #[cfg(feature = "ffmpeg_6_0")]
785            AV_PIX_FMT_RGBAF16LE => Pixel::RGBAF16LE,
786            #[cfg(feature = "ffmpeg_6_0")]
787            AV_PIX_FMT_VUYX => Pixel::VUYX,
788            #[cfg(feature = "ffmpeg_6_0")]
789            AV_PIX_FMT_P012LE => Pixel::P012LE,
790            #[cfg(feature = "ffmpeg_6_0")]
791            AV_PIX_FMT_P012BE => Pixel::P012BE,
792            #[cfg(feature = "ffmpeg_6_0")]
793            AV_PIX_FMT_Y212BE => Pixel::Y212BE,
794            #[cfg(feature = "ffmpeg_6_0")]
795            AV_PIX_FMT_Y212LE => Pixel::Y212LE,
796            #[cfg(feature = "ffmpeg_6_0")]
797            AV_PIX_FMT_XV30BE => Pixel::XV30BE,
798            #[cfg(feature = "ffmpeg_6_0")]
799            AV_PIX_FMT_XV30LE => Pixel::XV30LE,
800            #[cfg(feature = "ffmpeg_6_0")]
801            AV_PIX_FMT_XV36BE => Pixel::XV36BE,
802            #[cfg(feature = "ffmpeg_6_0")]
803            AV_PIX_FMT_XV36LE => Pixel::XV36LE,
804            #[cfg(feature = "ffmpeg_6_0")]
805            AV_PIX_FMT_RGBF32BE => Pixel::RGBF32BE,
806            #[cfg(feature = "ffmpeg_6_0")]
807            AV_PIX_FMT_RGBF32LE => Pixel::RGBF32LE,
808            #[cfg(feature = "ffmpeg_6_0")]
809            AV_PIX_FMT_RGBAF32BE => Pixel::RGBAF32BE,
810            #[cfg(feature = "ffmpeg_6_0")]
811            AV_PIX_FMT_RGBAF32LE => Pixel::RGBAF32LE,
812
813            #[cfg(feature = "ffmpeg_6_1")]
814            AV_PIX_FMT_P212BE => Pixel::P212BE,
815            #[cfg(feature = "ffmpeg_6_1")]
816            AV_PIX_FMT_P212LE => Pixel::P212LE,
817            #[cfg(feature = "ffmpeg_6_1")]
818            AV_PIX_FMT_P412BE => Pixel::P412BE,
819            #[cfg(feature = "ffmpeg_6_1")]
820            AV_PIX_FMT_P412LE => Pixel::P412LE,
821            #[cfg(feature = "ffmpeg_6_1")]
822            AV_PIX_FMT_GBRAP14BE => Pixel::GBRAP14BE,
823            #[cfg(feature = "ffmpeg_6_1")]
824            AV_PIX_FMT_GBRAP14LE => Pixel::GBRAP14LE,
825
826            #[cfg(feature = "ffmpeg_7_0")]
827            AV_PIX_FMT_D3D12 => Pixel::D3D12,
828
829            #[cfg(feature = "rpi")]
830            AV_PIX_FMT_SAND128 => Pixel::SAND128,
831            #[cfg(feature = "rpi")]
832            AV_PIX_FMT_SAND64_10 => Pixel::SAND64_10,
833            #[cfg(feature = "rpi")]
834            AV_PIX_FMT_SAND64_16 => Pixel::SAND64_16,
835            #[cfg(feature = "rpi")]
836            AV_PIX_FMT_RPI4_8 => Pixel::RPI4_8,
837            #[cfg(feature = "rpi")]
838            AV_PIX_FMT_RPI4_10 => Pixel::RPI4_10,
839        }
840    }
841}
842
843impl From<Pixel> for AVPixelFormat {
844    #[inline]
845    fn from(value: Pixel) -> AVPixelFormat {
846        match value {
847            Pixel::None => AV_PIX_FMT_NONE,
848
849            Pixel::YUV420P => AV_PIX_FMT_YUV420P,
850            Pixel::YUYV422 => AV_PIX_FMT_YUYV422,
851            Pixel::RGB24 => AV_PIX_FMT_RGB24,
852            Pixel::BGR24 => AV_PIX_FMT_BGR24,
853            Pixel::YUV422P => AV_PIX_FMT_YUV422P,
854            Pixel::YUV444P => AV_PIX_FMT_YUV444P,
855            Pixel::YUV410P => AV_PIX_FMT_YUV410P,
856            Pixel::YUV411P => AV_PIX_FMT_YUV411P,
857            Pixel::GRAY8 => AV_PIX_FMT_GRAY8,
858            Pixel::MonoWhite => AV_PIX_FMT_MONOWHITE,
859            Pixel::MonoBlack => AV_PIX_FMT_MONOBLACK,
860            Pixel::PAL8 => AV_PIX_FMT_PAL8,
861            Pixel::YUVJ420P => AV_PIX_FMT_YUVJ420P,
862            Pixel::YUVJ422P => AV_PIX_FMT_YUVJ422P,
863            Pixel::YUVJ444P => AV_PIX_FMT_YUVJ444P,
864            #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
865            Pixel::XVMC_MPEG2_MC => AV_PIX_FMT_XVMC_MPEG2_MC,
866            #[cfg(all(feature = "ff_api_xvmc", not(feature = "ffmpeg_5_0")))]
867            Pixel::XVMC_MPEG2_IDCT => AV_PIX_FMT_XVMC_MPEG2_IDCT,
868            Pixel::UYVY422 => AV_PIX_FMT_UYVY422,
869            Pixel::UYYVYY411 => AV_PIX_FMT_UYYVYY411,
870            Pixel::BGR8 => AV_PIX_FMT_BGR8,
871            Pixel::BGR4 => AV_PIX_FMT_BGR4,
872            Pixel::BGR4_BYTE => AV_PIX_FMT_BGR4_BYTE,
873            Pixel::RGB8 => AV_PIX_FMT_RGB8,
874            Pixel::RGB4 => AV_PIX_FMT_RGB4,
875            Pixel::RGB4_BYTE => AV_PIX_FMT_RGB4_BYTE,
876            Pixel::NV12 => AV_PIX_FMT_NV12,
877            Pixel::NV21 => AV_PIX_FMT_NV21,
878
879            Pixel::ARGB => AV_PIX_FMT_ARGB,
880            Pixel::RGBA => AV_PIX_FMT_RGBA,
881            Pixel::ABGR => AV_PIX_FMT_ABGR,
882            Pixel::BGRA => AV_PIX_FMT_BGRA,
883
884            Pixel::GRAY16BE => AV_PIX_FMT_GRAY16BE,
885            Pixel::GRAY16LE => AV_PIX_FMT_GRAY16LE,
886            Pixel::YUV440P => AV_PIX_FMT_YUV440P,
887            Pixel::YUVJ440P => AV_PIX_FMT_YUVJ440P,
888            Pixel::YUVA420P => AV_PIX_FMT_YUVA420P,
889            #[cfg(feature = "ff_api_vdpau")]
890            Pixel::VDPAU_H264 => AV_PIX_FMT_VDPAU_H264,
891            #[cfg(feature = "ff_api_vdpau")]
892            Pixel::VDPAU_MPEG1 => AV_PIX_FMT_VDPAU_MPEG1,
893            #[cfg(feature = "ff_api_vdpau")]
894            Pixel::VDPAU_MPEG2 => AV_PIX_FMT_VDPAU_MPEG2,
895            #[cfg(feature = "ff_api_vdpau")]
896            Pixel::VDPAU_WMV3 => AV_PIX_FMT_VDPAU_WMV3,
897            #[cfg(feature = "ff_api_vdpau")]
898            Pixel::VDPAU_VC1 => AV_PIX_FMT_VDPAU_VC1,
899            Pixel::RGB48BE => AV_PIX_FMT_RGB48BE,
900            Pixel::RGB48LE => AV_PIX_FMT_RGB48LE,
901
902            Pixel::RGB565BE => AV_PIX_FMT_RGB565BE,
903            Pixel::RGB565LE => AV_PIX_FMT_RGB565LE,
904            Pixel::RGB555BE => AV_PIX_FMT_RGB555BE,
905            Pixel::RGB555LE => AV_PIX_FMT_RGB555LE,
906
907            Pixel::BGR565BE => AV_PIX_FMT_BGR565BE,
908            Pixel::BGR565LE => AV_PIX_FMT_BGR565LE,
909            Pixel::BGR555BE => AV_PIX_FMT_BGR555BE,
910            Pixel::BGR555LE => AV_PIX_FMT_BGR555LE,
911
912            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
913            Pixel::VAAPI_MOCO => AV_PIX_FMT_VAAPI_MOCO,
914            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
915            Pixel::VAAPI_IDCT => AV_PIX_FMT_VAAPI_IDCT,
916            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
917            Pixel::VAAPI_VLD => AV_PIX_FMT_VAAPI_VLD,
918            #[cfg(not(feature = "ff_api_vaapi"))]
919            Pixel::VAAPI => AV_PIX_FMT_VAAPI,
920
921            Pixel::YUV420P16LE => AV_PIX_FMT_YUV420P16LE,
922            Pixel::YUV420P16BE => AV_PIX_FMT_YUV420P16BE,
923            Pixel::YUV422P16LE => AV_PIX_FMT_YUV422P16LE,
924            Pixel::YUV422P16BE => AV_PIX_FMT_YUV422P16BE,
925            Pixel::YUV444P16LE => AV_PIX_FMT_YUV444P16LE,
926            Pixel::YUV444P16BE => AV_PIX_FMT_YUV444P16BE,
927            #[cfg(feature = "ff_api_vdpau")]
928            Pixel::VDPAU_MPEG4 => AV_PIX_FMT_VDPAU_MPEG4,
929            Pixel::DXVA2_VLD => AV_PIX_FMT_DXVA2_VLD,
930
931            Pixel::RGB444LE => AV_PIX_FMT_RGB444LE,
932            Pixel::RGB444BE => AV_PIX_FMT_RGB444BE,
933            Pixel::BGR444LE => AV_PIX_FMT_BGR444LE,
934            Pixel::BGR444BE => AV_PIX_FMT_BGR444BE,
935            Pixel::YA8 => AV_PIX_FMT_YA8,
936
937            Pixel::BGR48BE => AV_PIX_FMT_BGR48BE,
938            Pixel::BGR48LE => AV_PIX_FMT_BGR48LE,
939
940            Pixel::YUV420P9BE => AV_PIX_FMT_YUV420P9BE,
941            Pixel::YUV420P9LE => AV_PIX_FMT_YUV420P9LE,
942            Pixel::YUV420P10BE => AV_PIX_FMT_YUV420P10BE,
943            Pixel::YUV420P10LE => AV_PIX_FMT_YUV420P10LE,
944            Pixel::YUV422P10BE => AV_PIX_FMT_YUV422P10BE,
945            Pixel::YUV422P10LE => AV_PIX_FMT_YUV422P10LE,
946            Pixel::YUV444P9BE => AV_PIX_FMT_YUV444P9BE,
947            Pixel::YUV444P9LE => AV_PIX_FMT_YUV444P9LE,
948            Pixel::YUV444P10BE => AV_PIX_FMT_YUV444P10BE,
949            Pixel::YUV444P10LE => AV_PIX_FMT_YUV444P10LE,
950            Pixel::YUV422P9BE => AV_PIX_FMT_YUV422P9BE,
951            Pixel::YUV422P9LE => AV_PIX_FMT_YUV422P9LE,
952            #[cfg(not(feature = "ffmpeg_4_0"))]
953            Pixel::VDA_VLD => AV_PIX_FMT_VDA_VLD,
954
955            Pixel::GBRP => AV_PIX_FMT_GBRP,
956            Pixel::GBRP9BE => AV_PIX_FMT_GBRP9BE,
957            Pixel::GBRP9LE => AV_PIX_FMT_GBRP9LE,
958            Pixel::GBRP10BE => AV_PIX_FMT_GBRP10BE,
959            Pixel::GBRP10LE => AV_PIX_FMT_GBRP10LE,
960            Pixel::GBRP16BE => AV_PIX_FMT_GBRP16BE,
961            Pixel::GBRP16LE => AV_PIX_FMT_GBRP16LE,
962
963            Pixel::YUVA420P9BE => AV_PIX_FMT_YUVA420P9BE,
964            Pixel::YUVA420P9LE => AV_PIX_FMT_YUVA420P9LE,
965            Pixel::YUVA422P9BE => AV_PIX_FMT_YUVA422P9BE,
966            Pixel::YUVA422P9LE => AV_PIX_FMT_YUVA422P9LE,
967            Pixel::YUVA444P9BE => AV_PIX_FMT_YUVA444P9BE,
968            Pixel::YUVA444P9LE => AV_PIX_FMT_YUVA444P9LE,
969            Pixel::YUVA420P10BE => AV_PIX_FMT_YUVA420P10BE,
970            Pixel::YUVA420P10LE => AV_PIX_FMT_YUVA420P10LE,
971            Pixel::YUVA422P10BE => AV_PIX_FMT_YUVA422P10BE,
972            Pixel::YUVA422P10LE => AV_PIX_FMT_YUVA422P10LE,
973            Pixel::YUVA444P10BE => AV_PIX_FMT_YUVA444P10BE,
974            Pixel::YUVA444P10LE => AV_PIX_FMT_YUVA444P10LE,
975            Pixel::YUVA420P16BE => AV_PIX_FMT_YUVA420P16BE,
976            Pixel::YUVA420P16LE => AV_PIX_FMT_YUVA420P16LE,
977            Pixel::YUVA422P16BE => AV_PIX_FMT_YUVA422P16BE,
978            Pixel::YUVA422P16LE => AV_PIX_FMT_YUVA422P16LE,
979            Pixel::YUVA444P16BE => AV_PIX_FMT_YUVA444P16BE,
980            Pixel::YUVA444P16LE => AV_PIX_FMT_YUVA444P16LE,
981
982            Pixel::VDPAU => AV_PIX_FMT_VDPAU,
983
984            Pixel::XYZ12LE => AV_PIX_FMT_XYZ12LE,
985            Pixel::XYZ12BE => AV_PIX_FMT_XYZ12BE,
986            Pixel::NV16 => AV_PIX_FMT_NV16,
987            Pixel::NV20LE => AV_PIX_FMT_NV20LE,
988            Pixel::NV20BE => AV_PIX_FMT_NV20BE,
989
990            Pixel::RGBA64BE => AV_PIX_FMT_RGBA64BE,
991            Pixel::RGBA64LE => AV_PIX_FMT_RGBA64LE,
992            Pixel::BGRA64BE => AV_PIX_FMT_BGRA64BE,
993            Pixel::BGRA64LE => AV_PIX_FMT_BGRA64LE,
994
995            Pixel::YVYU422 => AV_PIX_FMT_YVYU422,
996
997            #[cfg(not(feature = "ffmpeg_4_0"))]
998            Pixel::VDA => AV_PIX_FMT_VDA,
999
1000            Pixel::YA16BE => AV_PIX_FMT_YA16BE,
1001            Pixel::YA16LE => AV_PIX_FMT_YA16LE,
1002
1003            Pixel::QSV => AV_PIX_FMT_QSV,
1004            Pixel::MMAL => AV_PIX_FMT_MMAL,
1005
1006            Pixel::D3D11VA_VLD => AV_PIX_FMT_D3D11VA_VLD,
1007
1008            Pixel::CUDA => AV_PIX_FMT_CUDA,
1009
1010            Pixel::ZRGB => AV_PIX_FMT_0RGB,
1011            Pixel::RGBZ => AV_PIX_FMT_RGB0,
1012            Pixel::ZBGR => AV_PIX_FMT_0BGR,
1013            Pixel::BGRZ => AV_PIX_FMT_BGR0,
1014            Pixel::YUVA444P => AV_PIX_FMT_YUVA444P,
1015            Pixel::YUVA422P => AV_PIX_FMT_YUVA422P,
1016
1017            Pixel::YUV420P12BE => AV_PIX_FMT_YUV420P12BE,
1018            Pixel::YUV420P12LE => AV_PIX_FMT_YUV420P12LE,
1019            Pixel::YUV420P14BE => AV_PIX_FMT_YUV420P14BE,
1020            Pixel::YUV420P14LE => AV_PIX_FMT_YUV420P14LE,
1021            Pixel::YUV422P12BE => AV_PIX_FMT_YUV422P12BE,
1022            Pixel::YUV422P12LE => AV_PIX_FMT_YUV422P12LE,
1023            Pixel::YUV422P14BE => AV_PIX_FMT_YUV422P14BE,
1024            Pixel::YUV422P14LE => AV_PIX_FMT_YUV422P14LE,
1025            Pixel::YUV444P12BE => AV_PIX_FMT_YUV444P12BE,
1026            Pixel::YUV444P12LE => AV_PIX_FMT_YUV444P12LE,
1027            Pixel::YUV444P14BE => AV_PIX_FMT_YUV444P14BE,
1028            Pixel::YUV444P14LE => AV_PIX_FMT_YUV444P14LE,
1029            Pixel::GBRP12BE => AV_PIX_FMT_GBRP12BE,
1030            Pixel::GBRP12LE => AV_PIX_FMT_GBRP12LE,
1031            Pixel::GBRP14BE => AV_PIX_FMT_GBRP14BE,
1032            Pixel::GBRP14LE => AV_PIX_FMT_GBRP14LE,
1033            Pixel::GBRAP => AV_PIX_FMT_GBRAP,
1034            Pixel::GBRAP16BE => AV_PIX_FMT_GBRAP16BE,
1035            Pixel::GBRAP16LE => AV_PIX_FMT_GBRAP16LE,
1036            Pixel::YUVJ411P => AV_PIX_FMT_YUVJ411P,
1037
1038            Pixel::BAYER_BGGR8 => AV_PIX_FMT_BAYER_BGGR8,
1039            Pixel::BAYER_RGGB8 => AV_PIX_FMT_BAYER_RGGB8,
1040            Pixel::BAYER_GBRG8 => AV_PIX_FMT_BAYER_GBRG8,
1041            Pixel::BAYER_GRBG8 => AV_PIX_FMT_BAYER_GRBG8,
1042            Pixel::BAYER_BGGR16LE => AV_PIX_FMT_BAYER_BGGR16LE,
1043            Pixel::BAYER_BGGR16BE => AV_PIX_FMT_BAYER_BGGR16BE,
1044            Pixel::BAYER_RGGB16LE => AV_PIX_FMT_BAYER_RGGB16LE,
1045            Pixel::BAYER_RGGB16BE => AV_PIX_FMT_BAYER_RGGB16BE,
1046            Pixel::BAYER_GBRG16LE => AV_PIX_FMT_BAYER_GBRG16LE,
1047            Pixel::BAYER_GBRG16BE => AV_PIX_FMT_BAYER_GBRG16BE,
1048            Pixel::BAYER_GRBG16LE => AV_PIX_FMT_BAYER_GRBG16LE,
1049            Pixel::BAYER_GRBG16BE => AV_PIX_FMT_BAYER_GRBG16BE,
1050
1051            Pixel::YUV440P10LE => AV_PIX_FMT_YUV440P10LE,
1052            Pixel::YUV440P10BE => AV_PIX_FMT_YUV440P10BE,
1053            Pixel::YUV440P12LE => AV_PIX_FMT_YUV440P12LE,
1054            Pixel::YUV440P12BE => AV_PIX_FMT_YUV440P12BE,
1055            Pixel::AYUV64LE => AV_PIX_FMT_AYUV64LE,
1056            Pixel::AYUV64BE => AV_PIX_FMT_AYUV64BE,
1057
1058            Pixel::VIDEOTOOLBOX => AV_PIX_FMT_VIDEOTOOLBOX,
1059
1060            // --- defaults
1061            #[cfg(all(feature = "ffmpeg_4_0", not(feature = "ffmpeg_7_0")))]
1062            Pixel::XVMC => AV_PIX_FMT_XVMC,
1063
1064            Pixel::RGB32 => AV_PIX_FMT_RGB32,
1065            Pixel::RGB32_1 => AV_PIX_FMT_RGB32_1,
1066            Pixel::BGR32 => AV_PIX_FMT_BGR32,
1067            Pixel::BGR32_1 => AV_PIX_FMT_BGR32_1,
1068            Pixel::ZRGB32 => AV_PIX_FMT_0RGB32,
1069            Pixel::ZBGR32 => AV_PIX_FMT_0BGR32,
1070
1071            Pixel::GRAY16 => AV_PIX_FMT_GRAY16,
1072            Pixel::YA16 => AV_PIX_FMT_YA16,
1073            Pixel::RGB48 => AV_PIX_FMT_RGB48,
1074            Pixel::RGB565 => AV_PIX_FMT_RGB565,
1075            Pixel::RGB555 => AV_PIX_FMT_RGB555,
1076            Pixel::RGB444 => AV_PIX_FMT_RGB444,
1077            Pixel::BGR48 => AV_PIX_FMT_BGR48,
1078            Pixel::BGR565 => AV_PIX_FMT_BGR565,
1079            Pixel::BGR555 => AV_PIX_FMT_BGR555,
1080            Pixel::BGR444 => AV_PIX_FMT_BGR444,
1081
1082            Pixel::YUV420P9 => AV_PIX_FMT_YUV420P9,
1083            Pixel::YUV422P9 => AV_PIX_FMT_YUV422P9,
1084            Pixel::YUV444P9 => AV_PIX_FMT_YUV444P9,
1085            Pixel::YUV420P10 => AV_PIX_FMT_YUV420P10,
1086            Pixel::YUV422P10 => AV_PIX_FMT_YUV422P10,
1087            Pixel::YUV440P10 => AV_PIX_FMT_YUV440P10,
1088            Pixel::YUV444P10 => AV_PIX_FMT_YUV444P10,
1089            Pixel::YUV420P12 => AV_PIX_FMT_YUV420P12,
1090            Pixel::YUV422P12 => AV_PIX_FMT_YUV422P12,
1091            Pixel::YUV440P12 => AV_PIX_FMT_YUV440P12,
1092            Pixel::YUV444P12 => AV_PIX_FMT_YUV444P12,
1093            Pixel::YUV420P14 => AV_PIX_FMT_YUV420P14,
1094            Pixel::YUV422P14 => AV_PIX_FMT_YUV422P14,
1095            Pixel::YUV444P14 => AV_PIX_FMT_YUV444P14,
1096            Pixel::YUV420P16 => AV_PIX_FMT_YUV420P16,
1097            Pixel::YUV422P16 => AV_PIX_FMT_YUV422P16,
1098            Pixel::YUV444P16 => AV_PIX_FMT_YUV444P16,
1099
1100            Pixel::GBRP9 => AV_PIX_FMT_GBRP9,
1101            Pixel::GBRP10 => AV_PIX_FMT_GBRP10,
1102            Pixel::GBRP12 => AV_PIX_FMT_GBRP12,
1103            Pixel::GBRP14 => AV_PIX_FMT_GBRP14,
1104            Pixel::GBRP16 => AV_PIX_FMT_GBRP16,
1105            Pixel::GBRAP16 => AV_PIX_FMT_GBRAP16,
1106
1107            Pixel::BAYER_BGGR16 => AV_PIX_FMT_BAYER_BGGR16,
1108            Pixel::BAYER_RGGB16 => AV_PIX_FMT_BAYER_RGGB16,
1109            Pixel::BAYER_GBRG16 => AV_PIX_FMT_BAYER_GBRG16,
1110            Pixel::BAYER_GRBG16 => AV_PIX_FMT_BAYER_GRBG16,
1111
1112            Pixel::YUVA420P9 => AV_PIX_FMT_YUVA420P9,
1113            Pixel::YUVA422P9 => AV_PIX_FMT_YUVA422P9,
1114            Pixel::YUVA444P9 => AV_PIX_FMT_YUVA444P9,
1115            Pixel::YUVA420P10 => AV_PIX_FMT_YUVA420P10,
1116            Pixel::YUVA422P10 => AV_PIX_FMT_YUVA422P10,
1117            Pixel::YUVA444P10 => AV_PIX_FMT_YUVA444P10,
1118            Pixel::YUVA420P16 => AV_PIX_FMT_YUVA420P16,
1119            Pixel::YUVA422P16 => AV_PIX_FMT_YUVA422P16,
1120            Pixel::YUVA444P16 => AV_PIX_FMT_YUVA444P16,
1121
1122            Pixel::XYZ12 => AV_PIX_FMT_XYZ12,
1123            Pixel::NV20 => AV_PIX_FMT_NV20,
1124            Pixel::AYUV64 => AV_PIX_FMT_AYUV64,
1125
1126            Pixel::P010LE => AV_PIX_FMT_P010LE,
1127            Pixel::P010BE => AV_PIX_FMT_P010BE,
1128            Pixel::GBRAP12BE => AV_PIX_FMT_GBRAP12BE,
1129            Pixel::GBRAP12LE => AV_PIX_FMT_GBRAP12LE,
1130            Pixel::GBRAP10LE => AV_PIX_FMT_GBRAP10LE,
1131            Pixel::GBRAP10BE => AV_PIX_FMT_GBRAP10BE,
1132            Pixel::MEDIACODEC => AV_PIX_FMT_MEDIACODEC,
1133            Pixel::GRAY12BE => AV_PIX_FMT_GRAY12BE,
1134            Pixel::GRAY12LE => AV_PIX_FMT_GRAY12LE,
1135            Pixel::GRAY10BE => AV_PIX_FMT_GRAY10BE,
1136            Pixel::GRAY10LE => AV_PIX_FMT_GRAY10LE,
1137            Pixel::P016LE => AV_PIX_FMT_P016LE,
1138            Pixel::P016BE => AV_PIX_FMT_P016BE,
1139
1140            Pixel::D3D11 => AV_PIX_FMT_D3D11,
1141            Pixel::GRAY9BE => AV_PIX_FMT_GRAY9BE,
1142            Pixel::GRAY9LE => AV_PIX_FMT_GRAY9LE,
1143            Pixel::GBRPF32BE => AV_PIX_FMT_GBRPF32BE,
1144            Pixel::GBRPF32LE => AV_PIX_FMT_GBRPF32LE,
1145            Pixel::GBRAPF32BE => AV_PIX_FMT_GBRAPF32BE,
1146            Pixel::GBRAPF32LE => AV_PIX_FMT_GBRAPF32LE,
1147            Pixel::DRM_PRIME => AV_PIX_FMT_DRM_PRIME,
1148
1149            #[cfg(feature = "ffmpeg_4_0")]
1150            Pixel::OPENCL => AV_PIX_FMT_OPENCL,
1151
1152            #[cfg(feature = "ffmpeg_4_1")]
1153            Pixel::GRAY14BE => AV_PIX_FMT_GRAY14BE,
1154            #[cfg(feature = "ffmpeg_4_1")]
1155            Pixel::GRAY14LE => AV_PIX_FMT_GRAY14LE,
1156            #[cfg(feature = "ffmpeg_4_1")]
1157            Pixel::GRAYF32BE => AV_PIX_FMT_GRAYF32BE,
1158            #[cfg(feature = "ffmpeg_4_1")]
1159            Pixel::GRAYF32LE => AV_PIX_FMT_GRAYF32LE,
1160
1161            #[cfg(feature = "ffmpeg_4_2")]
1162            Pixel::YUVA422P12BE => AV_PIX_FMT_YUVA422P12BE,
1163            #[cfg(feature = "ffmpeg_4_2")]
1164            Pixel::YUVA422P12LE => AV_PIX_FMT_YUVA422P12LE,
1165            #[cfg(feature = "ffmpeg_4_2")]
1166            Pixel::YUVA444P12BE => AV_PIX_FMT_YUVA444P12BE,
1167            #[cfg(feature = "ffmpeg_4_2")]
1168            Pixel::YUVA444P12LE => AV_PIX_FMT_YUVA444P12LE,
1169            #[cfg(feature = "ffmpeg_4_2")]
1170            Pixel::NV24 => AV_PIX_FMT_NV24,
1171            #[cfg(feature = "ffmpeg_4_2")]
1172            Pixel::NV42 => AV_PIX_FMT_NV42,
1173
1174            #[cfg(feature = "ffmpeg_4_3")]
1175            Pixel::VULKAN => AV_PIX_FMT_VULKAN,
1176            #[cfg(feature = "ffmpeg_4_3")]
1177            Pixel::Y210BE => AV_PIX_FMT_Y210BE,
1178            #[cfg(feature = "ffmpeg_4_3")]
1179            Pixel::Y210LE => AV_PIX_FMT_Y210LE,
1180
1181            #[cfg(feature = "ffmpeg_4_4")]
1182            Pixel::X2RGB10LE => AV_PIX_FMT_X2RGB10LE,
1183            #[cfg(feature = "ffmpeg_4_4")]
1184            Pixel::X2RGB10BE => AV_PIX_FMT_X2RGB10BE,
1185
1186            #[cfg(feature = "ffmpeg_5_0")]
1187            Pixel::X2BGR10LE => AV_PIX_FMT_X2BGR10LE,
1188            #[cfg(feature = "ffmpeg_5_0")]
1189            Pixel::X2BGR10BE => AV_PIX_FMT_X2BGR10BE,
1190            #[cfg(feature = "ffmpeg_5_0")]
1191            Pixel::P210BE => AV_PIX_FMT_P210BE,
1192            #[cfg(feature = "ffmpeg_5_0")]
1193            Pixel::P210LE => AV_PIX_FMT_P210LE,
1194            #[cfg(feature = "ffmpeg_5_0")]
1195            Pixel::P410BE => AV_PIX_FMT_P410BE,
1196            #[cfg(feature = "ffmpeg_5_0")]
1197            Pixel::P410LE => AV_PIX_FMT_P410LE,
1198            #[cfg(feature = "ffmpeg_5_0")]
1199            Pixel::P216BE => AV_PIX_FMT_P216BE,
1200            #[cfg(feature = "ffmpeg_5_0")]
1201            Pixel::P216LE => AV_PIX_FMT_P216LE,
1202            #[cfg(feature = "ffmpeg_5_0")]
1203            Pixel::P416BE => AV_PIX_FMT_P416BE,
1204            #[cfg(feature = "ffmpeg_5_0")]
1205            Pixel::P416LE => AV_PIX_FMT_P416LE,
1206
1207            #[cfg(feature = "ffmpeg_6_0")]
1208            Pixel::VUYA => AV_PIX_FMT_VUYA,
1209            #[cfg(feature = "ffmpeg_6_0")]
1210            Pixel::RGBAF16BE => AV_PIX_FMT_RGBAF16BE,
1211            #[cfg(feature = "ffmpeg_6_0")]
1212            Pixel::RGBAF16LE => AV_PIX_FMT_RGBAF16LE,
1213            #[cfg(feature = "ffmpeg_6_0")]
1214            Pixel::VUYX => AV_PIX_FMT_VUYX,
1215            #[cfg(feature = "ffmpeg_6_0")]
1216            Pixel::P012LE => AV_PIX_FMT_P012LE,
1217            #[cfg(feature = "ffmpeg_6_0")]
1218            Pixel::P012BE => AV_PIX_FMT_P012BE,
1219            #[cfg(feature = "ffmpeg_6_0")]
1220            Pixel::Y212BE => AV_PIX_FMT_Y212BE,
1221            #[cfg(feature = "ffmpeg_6_0")]
1222            Pixel::Y212LE => AV_PIX_FMT_Y212LE,
1223            #[cfg(feature = "ffmpeg_6_0")]
1224            Pixel::XV30BE => AV_PIX_FMT_XV30BE,
1225            #[cfg(feature = "ffmpeg_6_0")]
1226            Pixel::XV30LE => AV_PIX_FMT_XV30LE,
1227            #[cfg(feature = "ffmpeg_6_0")]
1228            Pixel::XV36BE => AV_PIX_FMT_XV36BE,
1229            #[cfg(feature = "ffmpeg_6_0")]
1230            Pixel::XV36LE => AV_PIX_FMT_XV36LE,
1231            #[cfg(feature = "ffmpeg_6_0")]
1232            Pixel::RGBF32BE => AV_PIX_FMT_RGBF32BE,
1233            #[cfg(feature = "ffmpeg_6_0")]
1234            Pixel::RGBF32LE => AV_PIX_FMT_RGBF32LE,
1235            #[cfg(feature = "ffmpeg_6_0")]
1236            Pixel::RGBAF32BE => AV_PIX_FMT_RGBAF32BE,
1237            #[cfg(feature = "ffmpeg_6_0")]
1238            Pixel::RGBAF32LE => AV_PIX_FMT_RGBAF32LE,
1239
1240            #[cfg(feature = "ffmpeg_6_1")]
1241            Pixel::P212BE => AV_PIX_FMT_P212BE,
1242            #[cfg(feature = "ffmpeg_6_1")]
1243            Pixel::P212LE => AV_PIX_FMT_P212LE,
1244            #[cfg(feature = "ffmpeg_6_1")]
1245            Pixel::P412BE => AV_PIX_FMT_P412BE,
1246            #[cfg(feature = "ffmpeg_6_1")]
1247            Pixel::P412LE => AV_PIX_FMT_P412LE,
1248            #[cfg(feature = "ffmpeg_6_1")]
1249            Pixel::GBRAP14BE => AV_PIX_FMT_GBRAP14BE,
1250            #[cfg(feature = "ffmpeg_6_1")]
1251            Pixel::GBRAP14LE => AV_PIX_FMT_GBRAP14LE,
1252
1253            #[cfg(feature = "ffmpeg_7_0")]
1254            Pixel::D3D12 => AV_PIX_FMT_D3D12,
1255
1256            #[cfg(feature = "rpi")]
1257            Pixel::SAND128 => AV_PIX_FMT_SAND128,
1258            #[cfg(feature = "rpi")]
1259            Pixel::SAND64_10 => AV_PIX_FMT_SAND64_10,
1260            #[cfg(feature = "rpi")]
1261            Pixel::SAND64_16 => AV_PIX_FMT_SAND64_16,
1262            #[cfg(feature = "rpi")]
1263            Pixel::RPI4_8 => AV_PIX_FMT_RPI4_8,
1264            #[cfg(feature = "rpi")]
1265            Pixel::RPI4_10 => AV_PIX_FMT_RPI4_10,
1266        }
1267    }
1268}
1269
1270#[derive(Debug)]
1271pub enum ParsePixelError {
1272    NulError(NulError),
1273    UnknownFormat,
1274}
1275
1276impl fmt::Display for ParsePixelError {
1277    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1278        match *self {
1279            ParsePixelError::NulError(ref e) => e.fmt(f),
1280            ParsePixelError::UnknownFormat => write!(f, "unknown pixel format"),
1281        }
1282    }
1283}
1284
1285impl error::Error for ParsePixelError {
1286    fn cause(&self) -> Option<&dyn error::Error> {
1287        match *self {
1288            ParsePixelError::NulError(ref e) => Some(e),
1289            ParsePixelError::UnknownFormat => None,
1290        }
1291    }
1292}
1293
1294impl From<NulError> for ParsePixelError {
1295    fn from(x: NulError) -> ParsePixelError {
1296        ParsePixelError::NulError(x)
1297    }
1298}
1299
1300impl FromStr for Pixel {
1301    type Err = ParsePixelError;
1302
1303    #[inline(always)]
1304    fn from_str(s: &str) -> Result<Pixel, ParsePixelError> {
1305        let cstring = CString::new(s)?;
1306        let format = unsafe { av_get_pix_fmt(cstring.as_ptr()) }.into();
1307
1308        if format == Pixel::None {
1309            Err(ParsePixelError::UnknownFormat)
1310        } else {
1311            Ok(format)
1312        }
1313    }
1314}