ffmpeg_rs/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(feature = "ff_api_xvmc")]
29    XVMC_MPEG2_MC,
30    #[cfg(feature = "ff_api_xvmc")]
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(not(feature = "ff_api_xvmc"))]
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 = "rpi")]
372    RPI,
373    #[cfg(feature = "rpi")]
374    SAND128,
375    #[cfg(feature = "rpi")]
376    SAND64_10,
377    #[cfg(feature = "rpi")]
378    SAND64_16,
379    #[cfg(feature = "rpi")]
380    RPI4_8,
381    #[cfg(feature = "rpi")]
382    RPI4_10,
383}
384
385#[derive(Clone, Copy, PartialEq, Eq)]
386pub struct Descriptor {
387    ptr: *const AVPixFmtDescriptor,
388}
389
390unsafe impl Send for Descriptor {}
391unsafe impl Sync for Descriptor {}
392
393impl Pixel {
394    pub const Y400A: Pixel = Pixel::YA8;
395    pub const GRAY8A: Pixel = Pixel::YA8;
396    pub const GBR24P: Pixel = Pixel::GBRP;
397    #[cfg(feature = "ff_api_xvmc")]
398    pub const XVMC: Pixel = Pixel::XVMC_MPEG2_IDCT;
399
400    pub fn descriptor(self) -> Option<Descriptor> {
401        unsafe {
402            let ptr = av_pix_fmt_desc_get(self.into());
403
404            ptr.as_ref().map(|ptr| Descriptor { ptr })
405        }
406    }
407}
408
409impl Descriptor {
410    pub fn as_ptr(self) -> *const AVPixFmtDescriptor {
411        self.ptr
412    }
413
414    pub fn name(self) -> &'static str {
415        unsafe { from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).name).to_bytes()) }
416    }
417
418    pub fn nb_components(self) -> u8 {
419        unsafe { (*self.as_ptr()).nb_components }
420    }
421
422    pub fn log2_chroma_w(self) -> u8 {
423        unsafe { (*self.as_ptr()).log2_chroma_w }
424    }
425
426    pub fn log2_chroma_h(self) -> u8 {
427        unsafe { (*self.as_ptr()).log2_chroma_h }
428    }
429}
430
431impl From<AVPixelFormat> for Pixel {
432    #[inline]
433    fn from(value: AVPixelFormat) -> Self {
434        match value {
435            AV_PIX_FMT_NONE => Pixel::None,
436
437            AV_PIX_FMT_YUV420P => Pixel::YUV420P,
438            AV_PIX_FMT_YUYV422 => Pixel::YUYV422,
439            AV_PIX_FMT_RGB24 => Pixel::RGB24,
440            AV_PIX_FMT_BGR24 => Pixel::BGR24,
441            AV_PIX_FMT_YUV422P => Pixel::YUV422P,
442            AV_PIX_FMT_YUV444P => Pixel::YUV444P,
443            AV_PIX_FMT_YUV410P => Pixel::YUV410P,
444            AV_PIX_FMT_YUV411P => Pixel::YUV411P,
445            AV_PIX_FMT_GRAY8 => Pixel::GRAY8,
446            AV_PIX_FMT_MONOWHITE => Pixel::MonoWhite,
447            AV_PIX_FMT_MONOBLACK => Pixel::MonoBlack,
448            AV_PIX_FMT_PAL8 => Pixel::PAL8,
449            AV_PIX_FMT_YUVJ420P => Pixel::YUVJ420P,
450            AV_PIX_FMT_YUVJ422P => Pixel::YUVJ422P,
451            AV_PIX_FMT_YUVJ444P => Pixel::YUVJ444P,
452            #[cfg(not(feature = "ff_api_xvmc"))]
453            AV_PIX_FMT_XVMC => Pixel::XVMC,
454            #[cfg(feature = "ff_api_xvmc")]
455            AV_PIX_FMT_XVMC_MPEG2_MC => Pixel::XVMC_MPEG2_MC,
456            #[cfg(feature = "ff_api_xvmc")]
457            AV_PIX_FMT_XVMC_MPEG2_IDCT => Pixel::XVMC_MPEG2_IDCT,
458            AV_PIX_FMT_UYVY422 => Pixel::UYVY422,
459            AV_PIX_FMT_UYYVYY411 => Pixel::UYYVYY411,
460            AV_PIX_FMT_BGR8 => Pixel::BGR8,
461            AV_PIX_FMT_BGR4 => Pixel::BGR4,
462            AV_PIX_FMT_BGR4_BYTE => Pixel::BGR4_BYTE,
463            AV_PIX_FMT_RGB8 => Pixel::RGB8,
464            AV_PIX_FMT_RGB4 => Pixel::RGB4,
465            AV_PIX_FMT_RGB4_BYTE => Pixel::RGB4_BYTE,
466            AV_PIX_FMT_NV12 => Pixel::NV12,
467            AV_PIX_FMT_NV21 => Pixel::NV21,
468
469            AV_PIX_FMT_ARGB => Pixel::ARGB,
470            AV_PIX_FMT_RGBA => Pixel::RGBA,
471            AV_PIX_FMT_ABGR => Pixel::ABGR,
472            AV_PIX_FMT_BGRA => Pixel::BGRA,
473
474            AV_PIX_FMT_GRAY16BE => Pixel::GRAY16BE,
475            AV_PIX_FMT_GRAY16LE => Pixel::GRAY16LE,
476            AV_PIX_FMT_YUV440P => Pixel::YUV440P,
477            AV_PIX_FMT_YUVJ440P => Pixel::YUVJ440P,
478            AV_PIX_FMT_YUVA420P => Pixel::YUVA420P,
479            #[cfg(feature = "ff_api_vdpau")]
480            AV_PIX_FMT_VDPAU_H264 => Pixel::VDPAU_H264,
481            #[cfg(feature = "ff_api_vdpau")]
482            AV_PIX_FMT_VDPAU_MPEG1 => Pixel::VDPAU_MPEG1,
483            #[cfg(feature = "ff_api_vdpau")]
484            AV_PIX_FMT_VDPAU_MPEG2 => Pixel::VDPAU_MPEG2,
485            #[cfg(feature = "ff_api_vdpau")]
486            AV_PIX_FMT_VDPAU_WMV3 => Pixel::VDPAU_WMV3,
487            #[cfg(feature = "ff_api_vdpau")]
488            AV_PIX_FMT_VDPAU_VC1 => Pixel::VDPAU_VC1,
489            AV_PIX_FMT_RGB48BE => Pixel::RGB48BE,
490            AV_PIX_FMT_RGB48LE => Pixel::RGB48LE,
491
492            AV_PIX_FMT_RGB565BE => Pixel::RGB565BE,
493            AV_PIX_FMT_RGB565LE => Pixel::RGB565LE,
494            AV_PIX_FMT_RGB555BE => Pixel::RGB555BE,
495            AV_PIX_FMT_RGB555LE => Pixel::RGB555LE,
496
497            AV_PIX_FMT_BGR565BE => Pixel::BGR565BE,
498            AV_PIX_FMT_BGR565LE => Pixel::BGR565LE,
499            AV_PIX_FMT_BGR555BE => Pixel::BGR555BE,
500            AV_PIX_FMT_BGR555LE => Pixel::BGR555LE,
501
502            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
503            AV_PIX_FMT_VAAPI_MOCO => Pixel::VAAPI_MOCO,
504            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
505            AV_PIX_FMT_VAAPI_IDCT => Pixel::VAAPI_IDCT,
506            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
507            AV_PIX_FMT_VAAPI_VLD => Pixel::VAAPI_VLD,
508            #[cfg(any(not(feature = "ff_api_vaapi"), feature = "ffmpeg_5_0"))]
509            AV_PIX_FMT_VAAPI => Pixel::VAAPI,
510
511            AV_PIX_FMT_YUV420P16LE => Pixel::YUV420P16LE,
512            AV_PIX_FMT_YUV420P16BE => Pixel::YUV420P16BE,
513            AV_PIX_FMT_YUV422P16LE => Pixel::YUV422P16LE,
514            AV_PIX_FMT_YUV422P16BE => Pixel::YUV422P16BE,
515            AV_PIX_FMT_YUV444P16LE => Pixel::YUV444P16LE,
516            AV_PIX_FMT_YUV444P16BE => Pixel::YUV444P16BE,
517            #[cfg(feature = "ff_api_vdpau")]
518            AV_PIX_FMT_VDPAU_MPEG4 => Pixel::VDPAU_MPEG4,
519            AV_PIX_FMT_DXVA2_VLD => Pixel::DXVA2_VLD,
520
521            AV_PIX_FMT_RGB444LE => Pixel::RGB444LE,
522            AV_PIX_FMT_RGB444BE => Pixel::RGB444BE,
523            AV_PIX_FMT_BGR444LE => Pixel::BGR444LE,
524            AV_PIX_FMT_BGR444BE => Pixel::BGR444BE,
525            AV_PIX_FMT_YA8 => Pixel::YA8,
526
527            AV_PIX_FMT_BGR48BE => Pixel::BGR48BE,
528            AV_PIX_FMT_BGR48LE => Pixel::BGR48LE,
529
530            AV_PIX_FMT_YUV420P9BE => Pixel::YUV420P9BE,
531            AV_PIX_FMT_YUV420P9LE => Pixel::YUV420P9LE,
532            AV_PIX_FMT_YUV420P10BE => Pixel::YUV420P10BE,
533            AV_PIX_FMT_YUV420P10LE => Pixel::YUV420P10LE,
534            AV_PIX_FMT_YUV422P10BE => Pixel::YUV422P10BE,
535            AV_PIX_FMT_YUV422P10LE => Pixel::YUV422P10LE,
536            AV_PIX_FMT_YUV444P9BE => Pixel::YUV444P9BE,
537            AV_PIX_FMT_YUV444P9LE => Pixel::YUV444P9LE,
538            AV_PIX_FMT_YUV444P10BE => Pixel::YUV444P10BE,
539            AV_PIX_FMT_YUV444P10LE => Pixel::YUV444P10LE,
540            AV_PIX_FMT_YUV422P9BE => Pixel::YUV422P9BE,
541            AV_PIX_FMT_YUV422P9LE => Pixel::YUV422P9LE,
542            #[cfg(not(feature = "ffmpeg_4_0"))]
543            AV_PIX_FMT_VDA_VLD => Pixel::VDA_VLD,
544
545            AV_PIX_FMT_GBRP => Pixel::GBRP,
546            AV_PIX_FMT_GBRP9BE => Pixel::GBRP9BE,
547            AV_PIX_FMT_GBRP9LE => Pixel::GBRP9LE,
548            AV_PIX_FMT_GBRP10BE => Pixel::GBRP10BE,
549            AV_PIX_FMT_GBRP10LE => Pixel::GBRP10LE,
550            AV_PIX_FMT_GBRP16BE => Pixel::GBRP16BE,
551            AV_PIX_FMT_GBRP16LE => Pixel::GBRP16LE,
552
553            AV_PIX_FMT_YUVA420P9BE => Pixel::YUVA420P9BE,
554            AV_PIX_FMT_YUVA420P9LE => Pixel::YUVA420P9LE,
555            AV_PIX_FMT_YUVA422P9BE => Pixel::YUVA422P9BE,
556            AV_PIX_FMT_YUVA422P9LE => Pixel::YUVA422P9LE,
557            AV_PIX_FMT_YUVA444P9BE => Pixel::YUVA444P9BE,
558            AV_PIX_FMT_YUVA444P9LE => Pixel::YUVA444P9LE,
559            AV_PIX_FMT_YUVA420P10BE => Pixel::YUVA420P10BE,
560            AV_PIX_FMT_YUVA420P10LE => Pixel::YUVA420P10LE,
561            AV_PIX_FMT_YUVA422P10BE => Pixel::YUVA422P10BE,
562            AV_PIX_FMT_YUVA422P10LE => Pixel::YUVA422P10LE,
563            AV_PIX_FMT_YUVA444P10BE => Pixel::YUVA444P10BE,
564            AV_PIX_FMT_YUVA444P10LE => Pixel::YUVA444P10LE,
565            AV_PIX_FMT_YUVA420P16BE => Pixel::YUVA420P16BE,
566            AV_PIX_FMT_YUVA420P16LE => Pixel::YUVA420P16LE,
567            AV_PIX_FMT_YUVA422P16BE => Pixel::YUVA422P16BE,
568            AV_PIX_FMT_YUVA422P16LE => Pixel::YUVA422P16LE,
569            AV_PIX_FMT_YUVA444P16BE => Pixel::YUVA444P16BE,
570            AV_PIX_FMT_YUVA444P16LE => Pixel::YUVA444P16LE,
571
572            AV_PIX_FMT_VDPAU => Pixel::VDPAU,
573
574            AV_PIX_FMT_XYZ12LE => Pixel::XYZ12LE,
575            AV_PIX_FMT_XYZ12BE => Pixel::XYZ12BE,
576            AV_PIX_FMT_NV16 => Pixel::NV16,
577            AV_PIX_FMT_NV20LE => Pixel::NV20LE,
578            AV_PIX_FMT_NV20BE => Pixel::NV20BE,
579
580            AV_PIX_FMT_RGBA64BE => Pixel::RGBA64BE,
581            AV_PIX_FMT_RGBA64LE => Pixel::RGBA64LE,
582            AV_PIX_FMT_BGRA64BE => Pixel::BGRA64BE,
583            AV_PIX_FMT_BGRA64LE => Pixel::BGRA64LE,
584
585            AV_PIX_FMT_YVYU422 => Pixel::YVYU422,
586
587            #[cfg(not(feature = "ffmpeg_4_0"))]
588            AV_PIX_FMT_VDA => Pixel::VDA,
589
590            AV_PIX_FMT_YA16BE => Pixel::YA16BE,
591            AV_PIX_FMT_YA16LE => Pixel::YA16LE,
592
593            AV_PIX_FMT_QSV => Pixel::QSV,
594            AV_PIX_FMT_MMAL => Pixel::MMAL,
595
596            AV_PIX_FMT_D3D11VA_VLD => Pixel::D3D11VA_VLD,
597
598            AV_PIX_FMT_CUDA => Pixel::CUDA,
599
600            AV_PIX_FMT_0RGB => Pixel::ZRGB,
601            AV_PIX_FMT_RGB0 => Pixel::RGBZ,
602            AV_PIX_FMT_0BGR => Pixel::ZBGR,
603            AV_PIX_FMT_BGR0 => Pixel::BGRZ,
604            AV_PIX_FMT_YUVA444P => Pixel::YUVA444P,
605            AV_PIX_FMT_YUVA422P => Pixel::YUVA422P,
606
607            AV_PIX_FMT_YUV420P12BE => Pixel::YUV420P12BE,
608            AV_PIX_FMT_YUV420P12LE => Pixel::YUV420P12LE,
609            AV_PIX_FMT_YUV420P14BE => Pixel::YUV420P14BE,
610            AV_PIX_FMT_YUV420P14LE => Pixel::YUV420P14LE,
611            AV_PIX_FMT_YUV422P12BE => Pixel::YUV422P12BE,
612            AV_PIX_FMT_YUV422P12LE => Pixel::YUV422P12LE,
613            AV_PIX_FMT_YUV422P14BE => Pixel::YUV422P14BE,
614            AV_PIX_FMT_YUV422P14LE => Pixel::YUV422P14LE,
615            AV_PIX_FMT_YUV444P12BE => Pixel::YUV444P12BE,
616            AV_PIX_FMT_YUV444P12LE => Pixel::YUV444P12LE,
617            AV_PIX_FMT_YUV444P14BE => Pixel::YUV444P14BE,
618            AV_PIX_FMT_YUV444P14LE => Pixel::YUV444P14LE,
619            AV_PIX_FMT_GBRP12BE => Pixel::GBRP12BE,
620            AV_PIX_FMT_GBRP12LE => Pixel::GBRP12LE,
621            AV_PIX_FMT_GBRP14BE => Pixel::GBRP14BE,
622            AV_PIX_FMT_GBRP14LE => Pixel::GBRP14LE,
623            AV_PIX_FMT_GBRAP => Pixel::GBRAP,
624            AV_PIX_FMT_GBRAP16BE => Pixel::GBRAP16BE,
625            AV_PIX_FMT_GBRAP16LE => Pixel::GBRAP16LE,
626            AV_PIX_FMT_YUVJ411P => Pixel::YUVJ411P,
627
628            AV_PIX_FMT_BAYER_BGGR8 => Pixel::BAYER_BGGR8,
629            AV_PIX_FMT_BAYER_RGGB8 => Pixel::BAYER_RGGB8,
630            AV_PIX_FMT_BAYER_GBRG8 => Pixel::BAYER_GBRG8,
631            AV_PIX_FMT_BAYER_GRBG8 => Pixel::BAYER_GRBG8,
632            AV_PIX_FMT_BAYER_BGGR16LE => Pixel::BAYER_BGGR16LE,
633            AV_PIX_FMT_BAYER_BGGR16BE => Pixel::BAYER_BGGR16BE,
634            AV_PIX_FMT_BAYER_RGGB16LE => Pixel::BAYER_RGGB16LE,
635            AV_PIX_FMT_BAYER_RGGB16BE => Pixel::BAYER_RGGB16BE,
636            AV_PIX_FMT_BAYER_GBRG16LE => Pixel::BAYER_GBRG16LE,
637            AV_PIX_FMT_BAYER_GBRG16BE => Pixel::BAYER_GBRG16BE,
638            AV_PIX_FMT_BAYER_GRBG16LE => Pixel::BAYER_GRBG16LE,
639            AV_PIX_FMT_BAYER_GRBG16BE => Pixel::BAYER_GRBG16BE,
640
641            AV_PIX_FMT_YUV440P10LE => Pixel::YUV440P10LE,
642            AV_PIX_FMT_YUV440P10BE => Pixel::YUV440P10BE,
643            AV_PIX_FMT_YUV440P12LE => Pixel::YUV440P12LE,
644            AV_PIX_FMT_YUV440P12BE => Pixel::YUV440P12BE,
645            AV_PIX_FMT_AYUV64LE => Pixel::AYUV64LE,
646            AV_PIX_FMT_AYUV64BE => Pixel::AYUV64BE,
647
648            AV_PIX_FMT_VIDEOTOOLBOX => Pixel::VIDEOTOOLBOX,
649
650            AV_PIX_FMT_P010LE => Pixel::P010LE,
651            AV_PIX_FMT_P010BE => Pixel::P010BE,
652            AV_PIX_FMT_GBRAP12BE => Pixel::GBRAP12BE,
653            AV_PIX_FMT_GBRAP12LE => Pixel::GBRAP12LE,
654            AV_PIX_FMT_GBRAP10LE => Pixel::GBRAP10LE,
655            AV_PIX_FMT_GBRAP10BE => Pixel::GBRAP10BE,
656            AV_PIX_FMT_MEDIACODEC => Pixel::MEDIACODEC,
657            AV_PIX_FMT_GRAY12BE => Pixel::GRAY12BE,
658            AV_PIX_FMT_GRAY12LE => Pixel::GRAY12LE,
659            AV_PIX_FMT_GRAY10BE => Pixel::GRAY10BE,
660            AV_PIX_FMT_GRAY10LE => Pixel::GRAY10LE,
661            AV_PIX_FMT_P016LE => Pixel::P016LE,
662            AV_PIX_FMT_P016BE => Pixel::P016BE,
663
664            AV_PIX_FMT_NB => Pixel::None,
665
666            AV_PIX_FMT_D3D11 => Pixel::D3D11,
667            AV_PIX_FMT_GRAY9BE => Pixel::GRAY9BE,
668            AV_PIX_FMT_GRAY9LE => Pixel::GRAY9LE,
669            AV_PIX_FMT_GBRPF32BE => Pixel::GBRPF32BE,
670            AV_PIX_FMT_GBRPF32LE => Pixel::GBRPF32LE,
671            AV_PIX_FMT_GBRAPF32BE => Pixel::GBRAPF32BE,
672            AV_PIX_FMT_GBRAPF32LE => Pixel::GBRAPF32LE,
673            AV_PIX_FMT_DRM_PRIME => Pixel::DRM_PRIME,
674
675            #[cfg(feature = "ffmpeg_4_0")]
676            AV_PIX_FMT_OPENCL => Pixel::OPENCL,
677
678            #[cfg(feature = "ffmpeg_4_1")]
679            AV_PIX_FMT_GRAY14BE => Pixel::GRAY14BE,
680            #[cfg(feature = "ffmpeg_4_1")]
681            AV_PIX_FMT_GRAY14LE => Pixel::GRAY14LE,
682            #[cfg(feature = "ffmpeg_4_1")]
683            AV_PIX_FMT_GRAYF32BE => Pixel::GRAYF32BE,
684            #[cfg(feature = "ffmpeg_4_1")]
685            AV_PIX_FMT_GRAYF32LE => Pixel::GRAYF32LE,
686
687            #[cfg(feature = "ffmpeg_4_2")]
688            AV_PIX_FMT_YUVA422P12BE => Pixel::YUVA422P12BE,
689            #[cfg(feature = "ffmpeg_4_2")]
690            AV_PIX_FMT_YUVA422P12LE => Pixel::YUVA422P12LE,
691            #[cfg(feature = "ffmpeg_4_2")]
692            AV_PIX_FMT_YUVA444P12BE => Pixel::YUVA444P12BE,
693            #[cfg(feature = "ffmpeg_4_2")]
694            AV_PIX_FMT_YUVA444P12LE => Pixel::YUVA444P12LE,
695            #[cfg(feature = "ffmpeg_4_2")]
696            AV_PIX_FMT_NV24 => Pixel::NV24,
697            #[cfg(feature = "ffmpeg_4_2")]
698            AV_PIX_FMT_NV42 => Pixel::NV42,
699
700            #[cfg(feature = "ffmpeg_4_3")]
701            AV_PIX_FMT_VULKAN => Pixel::VULKAN,
702            #[cfg(feature = "ffmpeg_4_3")]
703            AV_PIX_FMT_Y210BE => Pixel::Y210BE,
704            #[cfg(feature = "ffmpeg_4_3")]
705            AV_PIX_FMT_Y210LE => Pixel::Y210LE,
706
707            #[cfg(feature = "ffmpeg_4_4")]
708            AV_PIX_FMT_X2RGB10LE => Pixel::X2RGB10LE,
709            #[cfg(feature = "ffmpeg_4_4")]
710            AV_PIX_FMT_X2RGB10BE => Pixel::X2RGB10BE,
711
712            #[cfg(feature = "ffmpeg_5_0")]
713            AV_PIX_FMT_X2BGR10LE => Pixel::X2BGR10LE,
714            #[cfg(feature = "ffmpeg_5_0")]
715            AV_PIX_FMT_X2BGR10BE => Pixel::X2BGR10BE,
716            #[cfg(feature = "ffmpeg_5_0")]
717            AV_PIX_FMT_P210BE => Pixel::P210BE,
718            #[cfg(feature = "ffmpeg_5_0")]
719            AV_PIX_FMT_P210LE => Pixel::P210LE,
720            #[cfg(feature = "ffmpeg_5_0")]
721            AV_PIX_FMT_P410BE => Pixel::P410BE,
722            #[cfg(feature = "ffmpeg_5_0")]
723            AV_PIX_FMT_P410LE => Pixel::P410LE,
724            #[cfg(feature = "ffmpeg_5_0")]
725            AV_PIX_FMT_P216BE => Pixel::P216BE,
726            #[cfg(feature = "ffmpeg_5_0")]
727            AV_PIX_FMT_P216LE => Pixel::P216LE,
728            #[cfg(feature = "ffmpeg_5_0")]
729            AV_PIX_FMT_P416BE => Pixel::P416BE,
730            #[cfg(feature = "ffmpeg_5_0")]
731            AV_PIX_FMT_P416LE => Pixel::P416LE,
732
733            #[cfg(feature = "rpi")]
734            AV_PIX_FMT_RPI => Pixel::RPI,
735            #[cfg(feature = "rpi")]
736            AV_PIX_FMT_SAND128 => Pixel::SAND128,
737            #[cfg(feature = "rpi")]
738            AV_PIX_FMT_SAND64_10 => Pixel::SAND64_10,
739            #[cfg(feature = "rpi")]
740            AV_PIX_FMT_SAND64_16 => Pixel::SAND64_16,
741            #[cfg(feature = "rpi")]
742            AV_PIX_FMT_RPI4_8 => Pixel::RPI4_8,
743            #[cfg(feature = "rpi")]
744            AV_PIX_FMT_RPI4_10 => Pixel::RPI4_10,
745        }
746    }
747}
748
749impl From<Pixel> for AVPixelFormat {
750    #[inline]
751    fn from(value: Pixel) -> AVPixelFormat {
752        match value {
753            Pixel::None => AV_PIX_FMT_NONE,
754
755            Pixel::YUV420P => AV_PIX_FMT_YUV420P,
756            Pixel::YUYV422 => AV_PIX_FMT_YUYV422,
757            Pixel::RGB24 => AV_PIX_FMT_RGB24,
758            Pixel::BGR24 => AV_PIX_FMT_BGR24,
759            Pixel::YUV422P => AV_PIX_FMT_YUV422P,
760            Pixel::YUV444P => AV_PIX_FMT_YUV444P,
761            Pixel::YUV410P => AV_PIX_FMT_YUV410P,
762            Pixel::YUV411P => AV_PIX_FMT_YUV411P,
763            Pixel::GRAY8 => AV_PIX_FMT_GRAY8,
764            Pixel::MonoWhite => AV_PIX_FMT_MONOWHITE,
765            Pixel::MonoBlack => AV_PIX_FMT_MONOBLACK,
766            Pixel::PAL8 => AV_PIX_FMT_PAL8,
767            Pixel::YUVJ420P => AV_PIX_FMT_YUVJ420P,
768            Pixel::YUVJ422P => AV_PIX_FMT_YUVJ422P,
769            Pixel::YUVJ444P => AV_PIX_FMT_YUVJ444P,
770            #[cfg(feature = "ff_api_xvmc")]
771            Pixel::XVMC_MPEG2_MC => AV_PIX_FMT_XVMC_MPEG2_MC,
772            #[cfg(feature = "ff_api_xvmc")]
773            Pixel::XVMC_MPEG2_IDCT => AV_PIX_FMT_XVMC_MPEG2_IDCT,
774            Pixel::UYVY422 => AV_PIX_FMT_UYVY422,
775            Pixel::UYYVYY411 => AV_PIX_FMT_UYYVYY411,
776            Pixel::BGR8 => AV_PIX_FMT_BGR8,
777            Pixel::BGR4 => AV_PIX_FMT_BGR4,
778            Pixel::BGR4_BYTE => AV_PIX_FMT_BGR4_BYTE,
779            Pixel::RGB8 => AV_PIX_FMT_RGB8,
780            Pixel::RGB4 => AV_PIX_FMT_RGB4,
781            Pixel::RGB4_BYTE => AV_PIX_FMT_RGB4_BYTE,
782            Pixel::NV12 => AV_PIX_FMT_NV12,
783            Pixel::NV21 => AV_PIX_FMT_NV21,
784
785            Pixel::ARGB => AV_PIX_FMT_ARGB,
786            Pixel::RGBA => AV_PIX_FMT_RGBA,
787            Pixel::ABGR => AV_PIX_FMT_ABGR,
788            Pixel::BGRA => AV_PIX_FMT_BGRA,
789
790            Pixel::GRAY16BE => AV_PIX_FMT_GRAY16BE,
791            Pixel::GRAY16LE => AV_PIX_FMT_GRAY16LE,
792            Pixel::YUV440P => AV_PIX_FMT_YUV440P,
793            Pixel::YUVJ440P => AV_PIX_FMT_YUVJ440P,
794            Pixel::YUVA420P => AV_PIX_FMT_YUVA420P,
795            #[cfg(feature = "ff_api_vdpau")]
796            Pixel::VDPAU_H264 => AV_PIX_FMT_VDPAU_H264,
797            #[cfg(feature = "ff_api_vdpau")]
798            Pixel::VDPAU_MPEG1 => AV_PIX_FMT_VDPAU_MPEG1,
799            #[cfg(feature = "ff_api_vdpau")]
800            Pixel::VDPAU_MPEG2 => AV_PIX_FMT_VDPAU_MPEG2,
801            #[cfg(feature = "ff_api_vdpau")]
802            Pixel::VDPAU_WMV3 => AV_PIX_FMT_VDPAU_WMV3,
803            #[cfg(feature = "ff_api_vdpau")]
804            Pixel::VDPAU_VC1 => AV_PIX_FMT_VDPAU_VC1,
805            Pixel::RGB48BE => AV_PIX_FMT_RGB48BE,
806            Pixel::RGB48LE => AV_PIX_FMT_RGB48LE,
807
808            Pixel::RGB565BE => AV_PIX_FMT_RGB565BE,
809            Pixel::RGB565LE => AV_PIX_FMT_RGB565LE,
810            Pixel::RGB555BE => AV_PIX_FMT_RGB555BE,
811            Pixel::RGB555LE => AV_PIX_FMT_RGB555LE,
812
813            Pixel::BGR565BE => AV_PIX_FMT_BGR565BE,
814            Pixel::BGR565LE => AV_PIX_FMT_BGR565LE,
815            Pixel::BGR555BE => AV_PIX_FMT_BGR555BE,
816            Pixel::BGR555LE => AV_PIX_FMT_BGR555LE,
817
818            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
819            Pixel::VAAPI_MOCO => AV_PIX_FMT_VAAPI_MOCO,
820            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
821            Pixel::VAAPI_IDCT => AV_PIX_FMT_VAAPI_IDCT,
822            #[cfg(all(feature = "ff_api_vaapi", not(feature = "ffmpeg_5_0")))]
823            Pixel::VAAPI_VLD => AV_PIX_FMT_VAAPI_VLD,
824            #[cfg(not(feature = "ff_api_vaapi"))]
825            Pixel::VAAPI => AV_PIX_FMT_VAAPI,
826
827            Pixel::YUV420P16LE => AV_PIX_FMT_YUV420P16LE,
828            Pixel::YUV420P16BE => AV_PIX_FMT_YUV420P16BE,
829            Pixel::YUV422P16LE => AV_PIX_FMT_YUV422P16LE,
830            Pixel::YUV422P16BE => AV_PIX_FMT_YUV422P16BE,
831            Pixel::YUV444P16LE => AV_PIX_FMT_YUV444P16LE,
832            Pixel::YUV444P16BE => AV_PIX_FMT_YUV444P16BE,
833            #[cfg(feature = "ff_api_vdpau")]
834            Pixel::VDPAU_MPEG4 => AV_PIX_FMT_VDPAU_MPEG4,
835            Pixel::DXVA2_VLD => AV_PIX_FMT_DXVA2_VLD,
836
837            Pixel::RGB444LE => AV_PIX_FMT_RGB444LE,
838            Pixel::RGB444BE => AV_PIX_FMT_RGB444BE,
839            Pixel::BGR444LE => AV_PIX_FMT_BGR444LE,
840            Pixel::BGR444BE => AV_PIX_FMT_BGR444BE,
841            Pixel::YA8 => AV_PIX_FMT_YA8,
842
843            Pixel::BGR48BE => AV_PIX_FMT_BGR48BE,
844            Pixel::BGR48LE => AV_PIX_FMT_BGR48LE,
845
846            Pixel::YUV420P9BE => AV_PIX_FMT_YUV420P9BE,
847            Pixel::YUV420P9LE => AV_PIX_FMT_YUV420P9LE,
848            Pixel::YUV420P10BE => AV_PIX_FMT_YUV420P10BE,
849            Pixel::YUV420P10LE => AV_PIX_FMT_YUV420P10LE,
850            Pixel::YUV422P10BE => AV_PIX_FMT_YUV422P10BE,
851            Pixel::YUV422P10LE => AV_PIX_FMT_YUV422P10LE,
852            Pixel::YUV444P9BE => AV_PIX_FMT_YUV444P9BE,
853            Pixel::YUV444P9LE => AV_PIX_FMT_YUV444P9LE,
854            Pixel::YUV444P10BE => AV_PIX_FMT_YUV444P10BE,
855            Pixel::YUV444P10LE => AV_PIX_FMT_YUV444P10LE,
856            Pixel::YUV422P9BE => AV_PIX_FMT_YUV422P9BE,
857            Pixel::YUV422P9LE => AV_PIX_FMT_YUV422P9LE,
858            #[cfg(not(feature = "ffmpeg_4_0"))]
859            Pixel::VDA_VLD => AV_PIX_FMT_VDA_VLD,
860
861            Pixel::GBRP => AV_PIX_FMT_GBRP,
862            Pixel::GBRP9BE => AV_PIX_FMT_GBRP9BE,
863            Pixel::GBRP9LE => AV_PIX_FMT_GBRP9LE,
864            Pixel::GBRP10BE => AV_PIX_FMT_GBRP10BE,
865            Pixel::GBRP10LE => AV_PIX_FMT_GBRP10LE,
866            Pixel::GBRP16BE => AV_PIX_FMT_GBRP16BE,
867            Pixel::GBRP16LE => AV_PIX_FMT_GBRP16LE,
868
869            Pixel::YUVA420P9BE => AV_PIX_FMT_YUVA420P9BE,
870            Pixel::YUVA420P9LE => AV_PIX_FMT_YUVA420P9LE,
871            Pixel::YUVA422P9BE => AV_PIX_FMT_YUVA422P9BE,
872            Pixel::YUVA422P9LE => AV_PIX_FMT_YUVA422P9LE,
873            Pixel::YUVA444P9BE => AV_PIX_FMT_YUVA444P9BE,
874            Pixel::YUVA444P9LE => AV_PIX_FMT_YUVA444P9LE,
875            Pixel::YUVA420P10BE => AV_PIX_FMT_YUVA420P10BE,
876            Pixel::YUVA420P10LE => AV_PIX_FMT_YUVA420P10LE,
877            Pixel::YUVA422P10BE => AV_PIX_FMT_YUVA422P10BE,
878            Pixel::YUVA422P10LE => AV_PIX_FMT_YUVA422P10LE,
879            Pixel::YUVA444P10BE => AV_PIX_FMT_YUVA444P10BE,
880            Pixel::YUVA444P10LE => AV_PIX_FMT_YUVA444P10LE,
881            Pixel::YUVA420P16BE => AV_PIX_FMT_YUVA420P16BE,
882            Pixel::YUVA420P16LE => AV_PIX_FMT_YUVA420P16LE,
883            Pixel::YUVA422P16BE => AV_PIX_FMT_YUVA422P16BE,
884            Pixel::YUVA422P16LE => AV_PIX_FMT_YUVA422P16LE,
885            Pixel::YUVA444P16BE => AV_PIX_FMT_YUVA444P16BE,
886            Pixel::YUVA444P16LE => AV_PIX_FMT_YUVA444P16LE,
887
888            Pixel::VDPAU => AV_PIX_FMT_VDPAU,
889
890            Pixel::XYZ12LE => AV_PIX_FMT_XYZ12LE,
891            Pixel::XYZ12BE => AV_PIX_FMT_XYZ12BE,
892            Pixel::NV16 => AV_PIX_FMT_NV16,
893            Pixel::NV20LE => AV_PIX_FMT_NV20LE,
894            Pixel::NV20BE => AV_PIX_FMT_NV20BE,
895
896            Pixel::RGBA64BE => AV_PIX_FMT_RGBA64BE,
897            Pixel::RGBA64LE => AV_PIX_FMT_RGBA64LE,
898            Pixel::BGRA64BE => AV_PIX_FMT_BGRA64BE,
899            Pixel::BGRA64LE => AV_PIX_FMT_BGRA64LE,
900
901            Pixel::YVYU422 => AV_PIX_FMT_YVYU422,
902
903            #[cfg(not(feature = "ffmpeg_4_0"))]
904            Pixel::VDA => AV_PIX_FMT_VDA,
905
906            Pixel::YA16BE => AV_PIX_FMT_YA16BE,
907            Pixel::YA16LE => AV_PIX_FMT_YA16LE,
908
909            Pixel::QSV => AV_PIX_FMT_QSV,
910            Pixel::MMAL => AV_PIX_FMT_MMAL,
911
912            Pixel::D3D11VA_VLD => AV_PIX_FMT_D3D11VA_VLD,
913
914            Pixel::CUDA => AV_PIX_FMT_CUDA,
915
916            Pixel::ZRGB => AV_PIX_FMT_0RGB,
917            Pixel::RGBZ => AV_PIX_FMT_RGB0,
918            Pixel::ZBGR => AV_PIX_FMT_0BGR,
919            Pixel::BGRZ => AV_PIX_FMT_BGR0,
920            Pixel::YUVA444P => AV_PIX_FMT_YUVA444P,
921            Pixel::YUVA422P => AV_PIX_FMT_YUVA422P,
922
923            Pixel::YUV420P12BE => AV_PIX_FMT_YUV420P12BE,
924            Pixel::YUV420P12LE => AV_PIX_FMT_YUV420P12LE,
925            Pixel::YUV420P14BE => AV_PIX_FMT_YUV420P14BE,
926            Pixel::YUV420P14LE => AV_PIX_FMT_YUV420P14LE,
927            Pixel::YUV422P12BE => AV_PIX_FMT_YUV422P12BE,
928            Pixel::YUV422P12LE => AV_PIX_FMT_YUV422P12LE,
929            Pixel::YUV422P14BE => AV_PIX_FMT_YUV422P14BE,
930            Pixel::YUV422P14LE => AV_PIX_FMT_YUV422P14LE,
931            Pixel::YUV444P12BE => AV_PIX_FMT_YUV444P12BE,
932            Pixel::YUV444P12LE => AV_PIX_FMT_YUV444P12LE,
933            Pixel::YUV444P14BE => AV_PIX_FMT_YUV444P14BE,
934            Pixel::YUV444P14LE => AV_PIX_FMT_YUV444P14LE,
935            Pixel::GBRP12BE => AV_PIX_FMT_GBRP12BE,
936            Pixel::GBRP12LE => AV_PIX_FMT_GBRP12LE,
937            Pixel::GBRP14BE => AV_PIX_FMT_GBRP14BE,
938            Pixel::GBRP14LE => AV_PIX_FMT_GBRP14LE,
939            Pixel::GBRAP => AV_PIX_FMT_GBRAP,
940            Pixel::GBRAP16BE => AV_PIX_FMT_GBRAP16BE,
941            Pixel::GBRAP16LE => AV_PIX_FMT_GBRAP16LE,
942            Pixel::YUVJ411P => AV_PIX_FMT_YUVJ411P,
943
944            Pixel::BAYER_BGGR8 => AV_PIX_FMT_BAYER_BGGR8,
945            Pixel::BAYER_RGGB8 => AV_PIX_FMT_BAYER_RGGB8,
946            Pixel::BAYER_GBRG8 => AV_PIX_FMT_BAYER_GBRG8,
947            Pixel::BAYER_GRBG8 => AV_PIX_FMT_BAYER_GRBG8,
948            Pixel::BAYER_BGGR16LE => AV_PIX_FMT_BAYER_BGGR16LE,
949            Pixel::BAYER_BGGR16BE => AV_PIX_FMT_BAYER_BGGR16BE,
950            Pixel::BAYER_RGGB16LE => AV_PIX_FMT_BAYER_RGGB16LE,
951            Pixel::BAYER_RGGB16BE => AV_PIX_FMT_BAYER_RGGB16BE,
952            Pixel::BAYER_GBRG16LE => AV_PIX_FMT_BAYER_GBRG16LE,
953            Pixel::BAYER_GBRG16BE => AV_PIX_FMT_BAYER_GBRG16BE,
954            Pixel::BAYER_GRBG16LE => AV_PIX_FMT_BAYER_GRBG16LE,
955            Pixel::BAYER_GRBG16BE => AV_PIX_FMT_BAYER_GRBG16BE,
956
957            Pixel::YUV440P10LE => AV_PIX_FMT_YUV440P10LE,
958            Pixel::YUV440P10BE => AV_PIX_FMT_YUV440P10BE,
959            Pixel::YUV440P12LE => AV_PIX_FMT_YUV440P12LE,
960            Pixel::YUV440P12BE => AV_PIX_FMT_YUV440P12BE,
961            Pixel::AYUV64LE => AV_PIX_FMT_AYUV64LE,
962            Pixel::AYUV64BE => AV_PIX_FMT_AYUV64BE,
963
964            Pixel::VIDEOTOOLBOX => AV_PIX_FMT_VIDEOTOOLBOX,
965
966            // --- defaults
967            #[cfg(not(feature = "ff_api_xvmc"))]
968            Pixel::XVMC => AV_PIX_FMT_XVMC,
969
970            Pixel::RGB32 => AV_PIX_FMT_RGB32,
971            Pixel::RGB32_1 => AV_PIX_FMT_RGB32_1,
972            Pixel::BGR32 => AV_PIX_FMT_BGR32,
973            Pixel::BGR32_1 => AV_PIX_FMT_BGR32_1,
974            Pixel::ZRGB32 => AV_PIX_FMT_0RGB32,
975            Pixel::ZBGR32 => AV_PIX_FMT_0BGR32,
976
977            Pixel::GRAY16 => AV_PIX_FMT_GRAY16,
978            Pixel::YA16 => AV_PIX_FMT_YA16,
979            Pixel::RGB48 => AV_PIX_FMT_RGB48,
980            Pixel::RGB565 => AV_PIX_FMT_RGB565,
981            Pixel::RGB555 => AV_PIX_FMT_RGB555,
982            Pixel::RGB444 => AV_PIX_FMT_RGB444,
983            Pixel::BGR48 => AV_PIX_FMT_BGR48,
984            Pixel::BGR565 => AV_PIX_FMT_BGR565,
985            Pixel::BGR555 => AV_PIX_FMT_BGR555,
986            Pixel::BGR444 => AV_PIX_FMT_BGR444,
987
988            Pixel::YUV420P9 => AV_PIX_FMT_YUV420P9,
989            Pixel::YUV422P9 => AV_PIX_FMT_YUV422P9,
990            Pixel::YUV444P9 => AV_PIX_FMT_YUV444P9,
991            Pixel::YUV420P10 => AV_PIX_FMT_YUV420P10,
992            Pixel::YUV422P10 => AV_PIX_FMT_YUV422P10,
993            Pixel::YUV440P10 => AV_PIX_FMT_YUV440P10,
994            Pixel::YUV444P10 => AV_PIX_FMT_YUV444P10,
995            Pixel::YUV420P12 => AV_PIX_FMT_YUV420P12,
996            Pixel::YUV422P12 => AV_PIX_FMT_YUV422P12,
997            Pixel::YUV440P12 => AV_PIX_FMT_YUV440P12,
998            Pixel::YUV444P12 => AV_PIX_FMT_YUV444P12,
999            Pixel::YUV420P14 => AV_PIX_FMT_YUV420P14,
1000            Pixel::YUV422P14 => AV_PIX_FMT_YUV422P14,
1001            Pixel::YUV444P14 => AV_PIX_FMT_YUV444P14,
1002            Pixel::YUV420P16 => AV_PIX_FMT_YUV420P16,
1003            Pixel::YUV422P16 => AV_PIX_FMT_YUV422P16,
1004            Pixel::YUV444P16 => AV_PIX_FMT_YUV444P16,
1005
1006            Pixel::GBRP9 => AV_PIX_FMT_GBRP9,
1007            Pixel::GBRP10 => AV_PIX_FMT_GBRP10,
1008            Pixel::GBRP12 => AV_PIX_FMT_GBRP12,
1009            Pixel::GBRP14 => AV_PIX_FMT_GBRP14,
1010            Pixel::GBRP16 => AV_PIX_FMT_GBRP16,
1011            Pixel::GBRAP16 => AV_PIX_FMT_GBRAP16,
1012
1013            Pixel::BAYER_BGGR16 => AV_PIX_FMT_BAYER_BGGR16,
1014            Pixel::BAYER_RGGB16 => AV_PIX_FMT_BAYER_RGGB16,
1015            Pixel::BAYER_GBRG16 => AV_PIX_FMT_BAYER_GBRG16,
1016            Pixel::BAYER_GRBG16 => AV_PIX_FMT_BAYER_GRBG16,
1017
1018            Pixel::YUVA420P9 => AV_PIX_FMT_YUVA420P9,
1019            Pixel::YUVA422P9 => AV_PIX_FMT_YUVA422P9,
1020            Pixel::YUVA444P9 => AV_PIX_FMT_YUVA444P9,
1021            Pixel::YUVA420P10 => AV_PIX_FMT_YUVA420P10,
1022            Pixel::YUVA422P10 => AV_PIX_FMT_YUVA422P10,
1023            Pixel::YUVA444P10 => AV_PIX_FMT_YUVA444P10,
1024            Pixel::YUVA420P16 => AV_PIX_FMT_YUVA420P16,
1025            Pixel::YUVA422P16 => AV_PIX_FMT_YUVA422P16,
1026            Pixel::YUVA444P16 => AV_PIX_FMT_YUVA444P16,
1027
1028            Pixel::XYZ12 => AV_PIX_FMT_XYZ12,
1029            Pixel::NV20 => AV_PIX_FMT_NV20,
1030            Pixel::AYUV64 => AV_PIX_FMT_AYUV64,
1031
1032            Pixel::P010LE => AV_PIX_FMT_P010LE,
1033            Pixel::P010BE => AV_PIX_FMT_P010BE,
1034            Pixel::GBRAP12BE => AV_PIX_FMT_GBRAP12BE,
1035            Pixel::GBRAP12LE => AV_PIX_FMT_GBRAP12LE,
1036            Pixel::GBRAP10LE => AV_PIX_FMT_GBRAP10LE,
1037            Pixel::GBRAP10BE => AV_PIX_FMT_GBRAP10BE,
1038            Pixel::MEDIACODEC => AV_PIX_FMT_MEDIACODEC,
1039            Pixel::GRAY12BE => AV_PIX_FMT_GRAY12BE,
1040            Pixel::GRAY12LE => AV_PIX_FMT_GRAY12LE,
1041            Pixel::GRAY10BE => AV_PIX_FMT_GRAY10BE,
1042            Pixel::GRAY10LE => AV_PIX_FMT_GRAY10LE,
1043            Pixel::P016LE => AV_PIX_FMT_P016LE,
1044            Pixel::P016BE => AV_PIX_FMT_P016BE,
1045
1046            Pixel::D3D11 => AV_PIX_FMT_D3D11,
1047            Pixel::GRAY9BE => AV_PIX_FMT_GRAY9BE,
1048            Pixel::GRAY9LE => AV_PIX_FMT_GRAY9LE,
1049            Pixel::GBRPF32BE => AV_PIX_FMT_GBRPF32BE,
1050            Pixel::GBRPF32LE => AV_PIX_FMT_GBRPF32LE,
1051            Pixel::GBRAPF32BE => AV_PIX_FMT_GBRAPF32BE,
1052            Pixel::GBRAPF32LE => AV_PIX_FMT_GBRAPF32LE,
1053            Pixel::DRM_PRIME => AV_PIX_FMT_DRM_PRIME,
1054
1055            #[cfg(feature = "ffmpeg_4_0")]
1056            Pixel::OPENCL => AV_PIX_FMT_OPENCL,
1057
1058            #[cfg(feature = "ffmpeg_4_1")]
1059            Pixel::GRAY14BE => AV_PIX_FMT_GRAY14BE,
1060            #[cfg(feature = "ffmpeg_4_1")]
1061            Pixel::GRAY14LE => AV_PIX_FMT_GRAY14LE,
1062            #[cfg(feature = "ffmpeg_4_1")]
1063            Pixel::GRAYF32BE => AV_PIX_FMT_GRAYF32BE,
1064            #[cfg(feature = "ffmpeg_4_1")]
1065            Pixel::GRAYF32LE => AV_PIX_FMT_GRAYF32LE,
1066
1067            #[cfg(feature = "ffmpeg_4_2")]
1068            Pixel::YUVA422P12BE => AV_PIX_FMT_YUVA422P12BE,
1069            #[cfg(feature = "ffmpeg_4_2")]
1070            Pixel::YUVA422P12LE => AV_PIX_FMT_YUVA422P12LE,
1071            #[cfg(feature = "ffmpeg_4_2")]
1072            Pixel::YUVA444P12BE => AV_PIX_FMT_YUVA444P12BE,
1073            #[cfg(feature = "ffmpeg_4_2")]
1074            Pixel::YUVA444P12LE => AV_PIX_FMT_YUVA444P12LE,
1075            #[cfg(feature = "ffmpeg_4_2")]
1076            Pixel::NV24 => AV_PIX_FMT_NV24,
1077            #[cfg(feature = "ffmpeg_4_2")]
1078            Pixel::NV42 => AV_PIX_FMT_NV42,
1079
1080            #[cfg(feature = "ffmpeg_4_3")]
1081            Pixel::VULKAN => AV_PIX_FMT_VULKAN,
1082            #[cfg(feature = "ffmpeg_4_3")]
1083            Pixel::Y210BE => AV_PIX_FMT_Y210BE,
1084            #[cfg(feature = "ffmpeg_4_3")]
1085            Pixel::Y210LE => AV_PIX_FMT_Y210LE,
1086
1087            #[cfg(feature = "ffmpeg_4_4")]
1088            Pixel::X2RGB10LE => AV_PIX_FMT_X2RGB10LE,
1089            #[cfg(feature = "ffmpeg_4_4")]
1090            Pixel::X2RGB10BE => AV_PIX_FMT_X2RGB10BE,
1091
1092            #[cfg(feature = "ffmpeg_5_0")]
1093            Pixel::X2BGR10LE => AV_PIX_FMT_X2BGR10LE,
1094            #[cfg(feature = "ffmpeg_5_0")]
1095            Pixel::X2BGR10BE => AV_PIX_FMT_X2BGR10BE,
1096            #[cfg(feature = "ffmpeg_5_0")]
1097            Pixel::P210BE => AV_PIX_FMT_P210BE,
1098            #[cfg(feature = "ffmpeg_5_0")]
1099            Pixel::P210LE => AV_PIX_FMT_P210LE,
1100            #[cfg(feature = "ffmpeg_5_0")]
1101            Pixel::P410BE => AV_PIX_FMT_P410BE,
1102            #[cfg(feature = "ffmpeg_5_0")]
1103            Pixel::P410LE => AV_PIX_FMT_P410LE,
1104            #[cfg(feature = "ffmpeg_5_0")]
1105            Pixel::P216BE => AV_PIX_FMT_P216BE,
1106            #[cfg(feature = "ffmpeg_5_0")]
1107            Pixel::P216LE => AV_PIX_FMT_P216LE,
1108            #[cfg(feature = "ffmpeg_5_0")]
1109            Pixel::P416BE => AV_PIX_FMT_P416BE,
1110            #[cfg(feature = "ffmpeg_5_0")]
1111            Pixel::P416LE => AV_PIX_FMT_P416LE,
1112
1113            #[cfg(feature = "rpi")]
1114            Pixel::RPI => AV_PIX_FMT_RPI,
1115            #[cfg(feature = "rpi")]
1116            Pixel::SAND128 => AV_PIX_FMT_SAND128,
1117            #[cfg(feature = "rpi")]
1118            Pixel::SAND64_10 => AV_PIX_FMT_SAND64_10,
1119            #[cfg(feature = "rpi")]
1120            Pixel::SAND64_16 => AV_PIX_FMT_SAND64_16,
1121            #[cfg(feature = "rpi")]
1122            Pixel::RPI4_8 => AV_PIX_FMT_RPI4_8,
1123            #[cfg(feature = "rpi")]
1124            Pixel::RPI4_10 => AV_PIX_FMT_RPI4_10,
1125        }
1126    }
1127}
1128
1129#[derive(Debug)]
1130pub enum ParsePixelError {
1131    NulError(NulError),
1132    UnknownFormat,
1133}
1134
1135impl fmt::Display for ParsePixelError {
1136    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1137        match *self {
1138            ParsePixelError::NulError(ref e) => e.fmt(f),
1139            ParsePixelError::UnknownFormat => write!(f, "unknown pixel format"),
1140        }
1141    }
1142}
1143
1144impl error::Error for ParsePixelError {
1145    fn cause(&self) -> Option<&dyn error::Error> {
1146        match *self {
1147            ParsePixelError::NulError(ref e) => Some(e),
1148            ParsePixelError::UnknownFormat => None,
1149        }
1150    }
1151}
1152
1153impl From<NulError> for ParsePixelError {
1154    fn from(x: NulError) -> ParsePixelError {
1155        ParsePixelError::NulError(x)
1156    }
1157}
1158
1159impl FromStr for Pixel {
1160    type Err = ParsePixelError;
1161
1162    #[inline(always)]
1163    fn from_str(s: &str) -> Result<Pixel, ParsePixelError> {
1164        let cstring = CString::new(s)?;
1165        let format = unsafe { av_get_pix_fmt(cstring.as_ptr()) }.into();
1166
1167        if format == Pixel::None {
1168            Err(ParsePixelError::UnknownFormat)
1169        } else {
1170            Ok(format)
1171        }
1172    }
1173}