Skip to main content

ffmpeg_the_third/util/format/pixel/
mod.rs

1#[cfg(feature = "ffmpeg_8_1")]
2mod alpha_mode;
3#[cfg(feature = "ffmpeg_8_1")]
4pub use self::alpha_mode::AlphaMode;
5
6use std::error;
7use std::ffi::{CString, NulError};
8use std::fmt;
9use std::str::FromStr;
10
11use crate::ffi::*;
12use crate::utils;
13#[cfg(feature = "serialize")]
14use serde::{Deserialize, Serialize};
15
16#[derive(Eq, PartialEq, Copy, Clone, Debug)]
17#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
18pub enum Pixel {
19    None,
20
21    YUV420P,
22    YUYV422,
23    RGB24,
24    BGR24,
25    YUV422P,
26    YUV444P,
27    YUV410P,
28    YUV411P,
29    GRAY8,
30    MonoWhite,
31    MonoBlack,
32    PAL8,
33    YUVJ420P,
34    YUVJ422P,
35    YUVJ444P,
36    UYVY422,
37    UYYVYY411,
38    BGR8,
39    BGR4,
40    BGR4_BYTE,
41    RGB8,
42    RGB4,
43    RGB4_BYTE,
44    NV12,
45    NV21,
46
47    ARGB,
48    RGBA,
49    ABGR,
50    BGRA,
51
52    GRAY16BE,
53    GRAY16LE,
54    YUV440P,
55    YUVJ440P,
56    YUVA420P,
57    RGB48BE,
58    RGB48LE,
59
60    RGB565BE,
61    RGB565LE,
62    RGB555BE,
63    RGB555LE,
64
65    BGR565BE,
66    BGR565LE,
67    BGR555BE,
68    BGR555LE,
69
70    VAAPI,
71
72    YUV420P16LE,
73    YUV420P16BE,
74    YUV422P16LE,
75    YUV422P16BE,
76    YUV444P16LE,
77    YUV444P16BE,
78    DXVA2_VLD,
79
80    RGB444LE,
81    RGB444BE,
82    BGR444LE,
83    BGR444BE,
84    YA8,
85
86    BGR48BE,
87    BGR48LE,
88
89    YUV420P9BE,
90    YUV420P9LE,
91    YUV420P10BE,
92    YUV420P10LE,
93    YUV422P10BE,
94    YUV422P10LE,
95    YUV444P9BE,
96    YUV444P9LE,
97    YUV444P10BE,
98    YUV444P10LE,
99    YUV422P9BE,
100    YUV422P9LE,
101
102    GBRP,
103    GBRP9BE,
104    GBRP9LE,
105    GBRP10BE,
106    GBRP10LE,
107    GBRP16BE,
108    GBRP16LE,
109
110    YUVA420P9BE,
111    YUVA420P9LE,
112    YUVA422P9BE,
113    YUVA422P9LE,
114    YUVA444P9BE,
115    YUVA444P9LE,
116    YUVA420P10BE,
117    YUVA420P10LE,
118    YUVA422P10BE,
119    YUVA422P10LE,
120    YUVA444P10BE,
121    YUVA444P10LE,
122    YUVA420P16BE,
123    YUVA420P16LE,
124    YUVA422P16BE,
125    YUVA422P16LE,
126    YUVA444P16BE,
127    YUVA444P16LE,
128
129    VDPAU,
130
131    XYZ12LE,
132    XYZ12BE,
133    NV16,
134    NV20LE,
135    NV20BE,
136
137    RGBA64BE,
138    RGBA64LE,
139    BGRA64BE,
140    BGRA64LE,
141
142    YVYU422,
143
144    YA16BE,
145    YA16LE,
146
147    QSV,
148    MMAL,
149
150    D3D11VA_VLD,
151
152    CUDA,
153
154    ZRGB,
155    RGBZ,
156    ZBGR,
157    BGRZ,
158    YUVA444P,
159    YUVA422P,
160
161    YUV420P12BE,
162    YUV420P12LE,
163    YUV420P14BE,
164    YUV420P14LE,
165    YUV422P12BE,
166    YUV422P12LE,
167    YUV422P14BE,
168    YUV422P14LE,
169    YUV444P12BE,
170    YUV444P12LE,
171    YUV444P14BE,
172    YUV444P14LE,
173    GBRP12BE,
174    GBRP12LE,
175    GBRP14BE,
176    GBRP14LE,
177    GBRAP,
178    GBRAP16BE,
179    GBRAP16LE,
180    YUVJ411P,
181
182    BAYER_BGGR8,
183    BAYER_RGGB8,
184    BAYER_GBRG8,
185    BAYER_GRBG8,
186    BAYER_BGGR16LE,
187    BAYER_BGGR16BE,
188    BAYER_RGGB16LE,
189    BAYER_RGGB16BE,
190    BAYER_GBRG16LE,
191    BAYER_GBRG16BE,
192    BAYER_GRBG16LE,
193    BAYER_GRBG16BE,
194
195    YUV440P10LE,
196    YUV440P10BE,
197    YUV440P12LE,
198    YUV440P12BE,
199    AYUV64LE,
200    AYUV64BE,
201
202    VIDEOTOOLBOX,
203
204    // --- defaults
205    #[cfg(not(feature = "ffmpeg_7_0"))]
206    XVMC,
207
208    RGB32,
209    RGB32_1,
210    BGR32,
211    BGR32_1,
212    ZRGB32,
213    ZBGR32,
214
215    GRAY16,
216    YA16,
217    RGB48,
218    RGB565,
219    RGB555,
220    RGB444,
221    BGR48,
222    BGR565,
223    BGR555,
224    BGR444,
225
226    YUV420P9,
227    YUV422P9,
228    YUV444P9,
229    YUV420P10,
230    YUV422P10,
231    YUV440P10,
232    YUV444P10,
233    YUV420P12,
234    YUV422P12,
235    YUV440P12,
236    YUV444P12,
237    YUV420P14,
238    YUV422P14,
239    YUV444P14,
240    YUV420P16,
241    YUV422P16,
242    YUV444P16,
243
244    GBRP9,
245    GBRP10,
246    GBRP12,
247    GBRP14,
248    GBRP16,
249    GBRAP16,
250
251    BAYER_BGGR16,
252    BAYER_RGGB16,
253    BAYER_GBRG16,
254    BAYER_GRBG16,
255
256    YUVA420P9,
257    YUVA422P9,
258    YUVA444P9,
259    YUVA420P10,
260    YUVA422P10,
261    YUVA444P10,
262    YUVA420P16,
263    YUVA422P16,
264    YUVA444P16,
265
266    XYZ12,
267    NV20,
268    AYUV64,
269
270    P010LE,
271    P010BE,
272    GBRAP12BE,
273    GBRAP12LE,
274    GBRAP10LE,
275    GBRAP10BE,
276    MEDIACODEC,
277    GRAY12BE,
278    GRAY12LE,
279    GRAY10BE,
280    GRAY10LE,
281    P016LE,
282    P016BE,
283
284    D3D11,
285    GRAY9BE,
286    GRAY9LE,
287    GBRPF32BE,
288    GBRPF32LE,
289    GBRAPF32BE,
290    GBRAPF32LE,
291    DRM_PRIME,
292
293    OPENCL,
294
295    GRAY14BE,
296    GRAY14LE,
297    GRAYF32BE,
298    GRAYF32LE,
299
300    YUVA422P12BE,
301    YUVA422P12LE,
302    YUVA444P12BE,
303    YUVA444P12LE,
304    NV24,
305    NV42,
306
307    VULKAN,
308    Y210BE,
309    Y210LE,
310
311    X2RGB10LE,
312    X2RGB10BE,
313
314    X2BGR10LE,
315    X2BGR10BE,
316    P210BE,
317    P210LE,
318    P410BE,
319    P410LE,
320    P216BE,
321    P216LE,
322    P416BE,
323    P416LE,
324
325    #[cfg(feature = "ffmpeg_6_0")]
326    VUYA,
327    #[cfg(feature = "ffmpeg_6_0")]
328    RGBAF16BE,
329    #[cfg(feature = "ffmpeg_6_0")]
330    RGBAF16LE,
331    #[cfg(feature = "ffmpeg_6_0")]
332    VUYX,
333    #[cfg(feature = "ffmpeg_6_0")]
334    P012LE,
335    #[cfg(feature = "ffmpeg_6_0")]
336    P012BE,
337    #[cfg(feature = "ffmpeg_6_0")]
338    Y212BE,
339    #[cfg(feature = "ffmpeg_6_0")]
340    Y212LE,
341    #[cfg(feature = "ffmpeg_6_0")]
342    XV30BE,
343    #[cfg(feature = "ffmpeg_6_0")]
344    XV30LE,
345    #[cfg(feature = "ffmpeg_6_0")]
346    XV36BE,
347    #[cfg(feature = "ffmpeg_6_0")]
348    XV36LE,
349    #[cfg(feature = "ffmpeg_6_0")]
350    RGBF32BE,
351    #[cfg(feature = "ffmpeg_6_0")]
352    RGBF32LE,
353    #[cfg(feature = "ffmpeg_6_0")]
354    RGBAF32BE,
355    #[cfg(feature = "ffmpeg_6_0")]
356    RGBAF32LE,
357
358    #[cfg(feature = "ffmpeg_6_1")]
359    P212BE,
360    #[cfg(feature = "ffmpeg_6_1")]
361    P212LE,
362    #[cfg(feature = "ffmpeg_6_1")]
363    P412BE,
364    #[cfg(feature = "ffmpeg_6_1")]
365    P412LE,
366    #[cfg(feature = "ffmpeg_6_1")]
367    GBRAP14BE,
368    #[cfg(feature = "ffmpeg_6_1")]
369    GBRAP14LE,
370
371    #[cfg(feature = "ffmpeg_7_0")]
372    D3D12,
373
374    #[cfg(feature = "ffmpeg_8_0")]
375    AYUV,
376
377    #[cfg(feature = "ffmpeg_8_0")]
378    UYVA,
379
380    #[cfg(feature = "ffmpeg_8_0")]
381    VYU444,
382
383    #[cfg(feature = "ffmpeg_8_0")]
384    V30XBE,
385    #[cfg(feature = "ffmpeg_8_0")]
386    V30XLE,
387
388    #[cfg(feature = "ffmpeg_8_0")]
389    RGBF16BE,
390    #[cfg(feature = "ffmpeg_8_0")]
391    RGBF16LE,
392
393    #[cfg(feature = "ffmpeg_8_0")]
394    RGBA128BE,
395    #[cfg(feature = "ffmpeg_8_0")]
396    RGBA128LE,
397
398    #[cfg(feature = "ffmpeg_8_0")]
399    RGB96BE,
400    #[cfg(feature = "ffmpeg_8_0")]
401    RGB96LE,
402
403    #[cfg(feature = "ffmpeg_8_0")]
404    Y216BE,
405    #[cfg(feature = "ffmpeg_8_0")]
406    Y216LE,
407
408    #[cfg(feature = "ffmpeg_8_0")]
409    XV48BE,
410    #[cfg(feature = "ffmpeg_8_0")]
411    XV48LE,
412
413    #[cfg(feature = "ffmpeg_8_0")]
414    GBRPF16BE,
415    #[cfg(feature = "ffmpeg_8_0")]
416    GBRPF16LE,
417    #[cfg(feature = "ffmpeg_8_0")]
418    GBRAPF16BE,
419    #[cfg(feature = "ffmpeg_8_0")]
420    GBRAPF16LE,
421
422    #[cfg(feature = "ffmpeg_8_0")]
423    GRAYF16BE,
424    #[cfg(feature = "ffmpeg_8_0")]
425    GRAYF16LE,
426
427    #[cfg(feature = "ffmpeg_8_0")]
428    AMF_SURFACE,
429
430    #[cfg(feature = "ffmpeg_8_0")]
431    GRAY32BE,
432    #[cfg(feature = "ffmpeg_8_0")]
433    GRAY32LE,
434
435    #[cfg(feature = "ffmpeg_8_0")]
436    YAF32BE,
437    #[cfg(feature = "ffmpeg_8_0")]
438    YAF32LE,
439
440    #[cfg(feature = "ffmpeg_8_0")]
441    YAF16BE,
442    #[cfg(feature = "ffmpeg_8_0")]
443    YAF16LE,
444
445    #[cfg(feature = "ffmpeg_8_0")]
446    GBRAP32BE,
447    #[cfg(feature = "ffmpeg_8_0")]
448    GBRAP32LE,
449
450    #[cfg(feature = "ffmpeg_8_0")]
451    YUV444P10MSBBE,
452    #[cfg(feature = "ffmpeg_8_0")]
453    YUV444P10MSBLE,
454    #[cfg(feature = "ffmpeg_8_0")]
455    YUV444P12MSBBE,
456    #[cfg(feature = "ffmpeg_8_0")]
457    YUV444P12MSBLE,
458    #[cfg(feature = "ffmpeg_8_0")]
459    GBRP10MSBBE,
460    #[cfg(feature = "ffmpeg_8_0")]
461    GBRP10MSBLE,
462    #[cfg(feature = "ffmpeg_8_0")]
463    GBRP12MSBBE,
464    #[cfg(feature = "ffmpeg_8_0")]
465    GBRP12MSBLE,
466
467    #[cfg(feature = "ffmpeg_8_0")]
468    OHCODEC,
469
470    #[cfg(feature = "rpi")]
471    RPI,
472    #[cfg(feature = "rpi")]
473    SAND128,
474    #[cfg(feature = "rpi")]
475    SAND64_10,
476    #[cfg(feature = "rpi")]
477    SAND64_16,
478    #[cfg(feature = "rpi")]
479    RPI4_8,
480    #[cfg(feature = "rpi")]
481    RPI4_10,
482}
483
484#[derive(Clone, Copy, PartialEq, Eq)]
485pub struct Descriptor {
486    ptr: *const AVPixFmtDescriptor,
487}
488
489unsafe impl Send for Descriptor {}
490unsafe impl Sync for Descriptor {}
491
492impl Pixel {
493    pub const Y400A: Pixel = Pixel::YA8;
494    pub const GRAY8A: Pixel = Pixel::YA8;
495    pub const GBR24P: Pixel = Pixel::GBRP;
496
497    pub fn descriptor(self) -> Option<Descriptor> {
498        unsafe {
499            let ptr = av_pix_fmt_desc_get(self.into());
500            ptr.as_ref().map(|ptr| Descriptor { ptr })
501        }
502    }
503}
504
505impl Descriptor {
506    pub fn as_ptr(self) -> *const AVPixFmtDescriptor {
507        self.ptr
508    }
509
510    pub fn name(self) -> &'static str {
511        unsafe { utils::str_from_c_ptr((*self.as_ptr()).name) }
512    }
513
514    pub fn nb_components(self) -> u8 {
515        unsafe { (*self.as_ptr()).nb_components }
516    }
517
518    pub fn log2_chroma_w(self) -> u8 {
519        unsafe { (*self.as_ptr()).log2_chroma_w }
520    }
521
522    pub fn log2_chroma_h(self) -> u8 {
523        unsafe { (*self.as_ptr()).log2_chroma_h }
524    }
525}
526
527impl From<AVPixelFormat> for Pixel {
528    #[inline]
529    fn from(value: AVPixelFormat) -> Self {
530        use AVPixelFormat as AV;
531
532        match value {
533            AV::NONE => Pixel::None,
534
535            AV::YUV420P => Pixel::YUV420P,
536            AV::YUYV422 => Pixel::YUYV422,
537            AV::RGB24 => Pixel::RGB24,
538            AV::BGR24 => Pixel::BGR24,
539            AV::YUV422P => Pixel::YUV422P,
540            AV::YUV444P => Pixel::YUV444P,
541            AV::YUV410P => Pixel::YUV410P,
542            AV::YUV411P => Pixel::YUV411P,
543            AV::GRAY8 => Pixel::GRAY8,
544            AV::MONOWHITE => Pixel::MonoWhite,
545            AV::MONOBLACK => Pixel::MonoBlack,
546            AV::PAL8 => Pixel::PAL8,
547            AV::YUVJ420P => Pixel::YUVJ420P,
548            AV::YUVJ422P => Pixel::YUVJ422P,
549            AV::YUVJ444P => Pixel::YUVJ444P,
550            #[cfg(not(feature = "ffmpeg_7_0"))]
551            AV::XVMC => Pixel::XVMC,
552            AV::UYVY422 => Pixel::UYVY422,
553            AV::UYYVYY411 => Pixel::UYYVYY411,
554            AV::BGR8 => Pixel::BGR8,
555            AV::BGR4 => Pixel::BGR4,
556            AV::BGR4_BYTE => Pixel::BGR4_BYTE,
557            AV::RGB8 => Pixel::RGB8,
558            AV::RGB4 => Pixel::RGB4,
559            AV::RGB4_BYTE => Pixel::RGB4_BYTE,
560            AV::NV12 => Pixel::NV12,
561            AV::NV21 => Pixel::NV21,
562
563            AV::ARGB => Pixel::ARGB,
564            AV::RGBA => Pixel::RGBA,
565            AV::ABGR => Pixel::ABGR,
566            AV::BGRA => Pixel::BGRA,
567
568            AV::GRAY16BE => Pixel::GRAY16BE,
569            AV::GRAY16LE => Pixel::GRAY16LE,
570            AV::YUV440P => Pixel::YUV440P,
571            AV::YUVJ440P => Pixel::YUVJ440P,
572            AV::YUVA420P => Pixel::YUVA420P,
573            AV::RGB48BE => Pixel::RGB48BE,
574            AV::RGB48LE => Pixel::RGB48LE,
575
576            AV::RGB565BE => Pixel::RGB565BE,
577            AV::RGB565LE => Pixel::RGB565LE,
578            AV::RGB555BE => Pixel::RGB555BE,
579            AV::RGB555LE => Pixel::RGB555LE,
580
581            AV::BGR565BE => Pixel::BGR565BE,
582            AV::BGR565LE => Pixel::BGR565LE,
583            AV::BGR555BE => Pixel::BGR555BE,
584            AV::BGR555LE => Pixel::BGR555LE,
585
586            AV::VAAPI => Pixel::VAAPI,
587
588            AV::YUV420P16LE => Pixel::YUV420P16LE,
589            AV::YUV420P16BE => Pixel::YUV420P16BE,
590            AV::YUV422P16LE => Pixel::YUV422P16LE,
591            AV::YUV422P16BE => Pixel::YUV422P16BE,
592            AV::YUV444P16LE => Pixel::YUV444P16LE,
593            AV::YUV444P16BE => Pixel::YUV444P16BE,
594            AV::DXVA2_VLD => Pixel::DXVA2_VLD,
595
596            AV::RGB444LE => Pixel::RGB444LE,
597            AV::RGB444BE => Pixel::RGB444BE,
598            AV::BGR444LE => Pixel::BGR444LE,
599            AV::BGR444BE => Pixel::BGR444BE,
600            AV::YA8 => Pixel::YA8,
601
602            AV::BGR48BE => Pixel::BGR48BE,
603            AV::BGR48LE => Pixel::BGR48LE,
604
605            AV::YUV420P9BE => Pixel::YUV420P9BE,
606            AV::YUV420P9LE => Pixel::YUV420P9LE,
607            AV::YUV420P10BE => Pixel::YUV420P10BE,
608            AV::YUV420P10LE => Pixel::YUV420P10LE,
609            AV::YUV422P10BE => Pixel::YUV422P10BE,
610            AV::YUV422P10LE => Pixel::YUV422P10LE,
611            AV::YUV444P9BE => Pixel::YUV444P9BE,
612            AV::YUV444P9LE => Pixel::YUV444P9LE,
613            AV::YUV444P10BE => Pixel::YUV444P10BE,
614            AV::YUV444P10LE => Pixel::YUV444P10LE,
615            AV::YUV422P9BE => Pixel::YUV422P9BE,
616            AV::YUV422P9LE => Pixel::YUV422P9LE,
617
618            AV::GBRP => Pixel::GBRP,
619            AV::GBRP9BE => Pixel::GBRP9BE,
620            AV::GBRP9LE => Pixel::GBRP9LE,
621            AV::GBRP10BE => Pixel::GBRP10BE,
622            AV::GBRP10LE => Pixel::GBRP10LE,
623            AV::GBRP16BE => Pixel::GBRP16BE,
624            AV::GBRP16LE => Pixel::GBRP16LE,
625
626            AV::YUVA420P9BE => Pixel::YUVA420P9BE,
627            AV::YUVA420P9LE => Pixel::YUVA420P9LE,
628            AV::YUVA422P9BE => Pixel::YUVA422P9BE,
629            AV::YUVA422P9LE => Pixel::YUVA422P9LE,
630            AV::YUVA444P9BE => Pixel::YUVA444P9BE,
631            AV::YUVA444P9LE => Pixel::YUVA444P9LE,
632            AV::YUVA420P10BE => Pixel::YUVA420P10BE,
633            AV::YUVA420P10LE => Pixel::YUVA420P10LE,
634            AV::YUVA422P10BE => Pixel::YUVA422P10BE,
635            AV::YUVA422P10LE => Pixel::YUVA422P10LE,
636            AV::YUVA444P10BE => Pixel::YUVA444P10BE,
637            AV::YUVA444P10LE => Pixel::YUVA444P10LE,
638            AV::YUVA420P16BE => Pixel::YUVA420P16BE,
639            AV::YUVA420P16LE => Pixel::YUVA420P16LE,
640            AV::YUVA422P16BE => Pixel::YUVA422P16BE,
641            AV::YUVA422P16LE => Pixel::YUVA422P16LE,
642            AV::YUVA444P16BE => Pixel::YUVA444P16BE,
643            AV::YUVA444P16LE => Pixel::YUVA444P16LE,
644
645            AV::VDPAU => Pixel::VDPAU,
646
647            AV::XYZ12LE => Pixel::XYZ12LE,
648            AV::XYZ12BE => Pixel::XYZ12BE,
649            AV::NV16 => Pixel::NV16,
650            AV::NV20LE => Pixel::NV20LE,
651            AV::NV20BE => Pixel::NV20BE,
652
653            AV::RGBA64BE => Pixel::RGBA64BE,
654            AV::RGBA64LE => Pixel::RGBA64LE,
655            AV::BGRA64BE => Pixel::BGRA64BE,
656            AV::BGRA64LE => Pixel::BGRA64LE,
657
658            AV::YVYU422 => Pixel::YVYU422,
659
660            AV::YA16BE => Pixel::YA16BE,
661            AV::YA16LE => Pixel::YA16LE,
662
663            AV::QSV => Pixel::QSV,
664            AV::MMAL => Pixel::MMAL,
665
666            AV::D3D11VA_VLD => Pixel::D3D11VA_VLD,
667
668            AV::CUDA => Pixel::CUDA,
669
670            AV::_0RGB => Pixel::ZRGB,
671            AV::RGB0 => Pixel::RGBZ,
672            AV::_0BGR => Pixel::ZBGR,
673            AV::BGR0 => Pixel::BGRZ,
674            AV::YUVA444P => Pixel::YUVA444P,
675            AV::YUVA422P => Pixel::YUVA422P,
676
677            AV::YUV420P12BE => Pixel::YUV420P12BE,
678            AV::YUV420P12LE => Pixel::YUV420P12LE,
679            AV::YUV420P14BE => Pixel::YUV420P14BE,
680            AV::YUV420P14LE => Pixel::YUV420P14LE,
681            AV::YUV422P12BE => Pixel::YUV422P12BE,
682            AV::YUV422P12LE => Pixel::YUV422P12LE,
683            AV::YUV422P14BE => Pixel::YUV422P14BE,
684            AV::YUV422P14LE => Pixel::YUV422P14LE,
685            AV::YUV444P12BE => Pixel::YUV444P12BE,
686            AV::YUV444P12LE => Pixel::YUV444P12LE,
687            AV::YUV444P14BE => Pixel::YUV444P14BE,
688            AV::YUV444P14LE => Pixel::YUV444P14LE,
689            AV::GBRP12BE => Pixel::GBRP12BE,
690            AV::GBRP12LE => Pixel::GBRP12LE,
691            AV::GBRP14BE => Pixel::GBRP14BE,
692            AV::GBRP14LE => Pixel::GBRP14LE,
693            AV::GBRAP => Pixel::GBRAP,
694            AV::GBRAP16BE => Pixel::GBRAP16BE,
695            AV::GBRAP16LE => Pixel::GBRAP16LE,
696            AV::YUVJ411P => Pixel::YUVJ411P,
697
698            AV::BAYER_BGGR8 => Pixel::BAYER_BGGR8,
699            AV::BAYER_RGGB8 => Pixel::BAYER_RGGB8,
700            AV::BAYER_GBRG8 => Pixel::BAYER_GBRG8,
701            AV::BAYER_GRBG8 => Pixel::BAYER_GRBG8,
702            AV::BAYER_BGGR16LE => Pixel::BAYER_BGGR16LE,
703            AV::BAYER_BGGR16BE => Pixel::BAYER_BGGR16BE,
704            AV::BAYER_RGGB16LE => Pixel::BAYER_RGGB16LE,
705            AV::BAYER_RGGB16BE => Pixel::BAYER_RGGB16BE,
706            AV::BAYER_GBRG16LE => Pixel::BAYER_GBRG16LE,
707            AV::BAYER_GBRG16BE => Pixel::BAYER_GBRG16BE,
708            AV::BAYER_GRBG16LE => Pixel::BAYER_GRBG16LE,
709            AV::BAYER_GRBG16BE => Pixel::BAYER_GRBG16BE,
710
711            AV::YUV440P10LE => Pixel::YUV440P10LE,
712            AV::YUV440P10BE => Pixel::YUV440P10BE,
713            AV::YUV440P12LE => Pixel::YUV440P12LE,
714            AV::YUV440P12BE => Pixel::YUV440P12BE,
715            AV::AYUV64LE => Pixel::AYUV64LE,
716            AV::AYUV64BE => Pixel::AYUV64BE,
717
718            AV::VIDEOTOOLBOX => Pixel::VIDEOTOOLBOX,
719
720            AV::P010LE => Pixel::P010LE,
721            AV::P010BE => Pixel::P010BE,
722            AV::GBRAP12BE => Pixel::GBRAP12BE,
723            AV::GBRAP12LE => Pixel::GBRAP12LE,
724            AV::GBRAP10LE => Pixel::GBRAP10LE,
725            AV::GBRAP10BE => Pixel::GBRAP10BE,
726            AV::MEDIACODEC => Pixel::MEDIACODEC,
727            AV::GRAY12BE => Pixel::GRAY12BE,
728            AV::GRAY12LE => Pixel::GRAY12LE,
729            AV::GRAY10BE => Pixel::GRAY10BE,
730            AV::GRAY10LE => Pixel::GRAY10LE,
731            AV::P016LE => Pixel::P016LE,
732            AV::P016BE => Pixel::P016BE,
733
734            AV::NB => Pixel::None,
735
736            AV::D3D11 => Pixel::D3D11,
737            AV::GRAY9BE => Pixel::GRAY9BE,
738            AV::GRAY9LE => Pixel::GRAY9LE,
739            AV::GBRPF32BE => Pixel::GBRPF32BE,
740            AV::GBRPF32LE => Pixel::GBRPF32LE,
741            AV::GBRAPF32BE => Pixel::GBRAPF32BE,
742            AV::GBRAPF32LE => Pixel::GBRAPF32LE,
743            AV::DRM_PRIME => Pixel::DRM_PRIME,
744
745            AV::OPENCL => Pixel::OPENCL,
746
747            AV::GRAY14BE => Pixel::GRAY14BE,
748            AV::GRAY14LE => Pixel::GRAY14LE,
749            AV::GRAYF32BE => Pixel::GRAYF32BE,
750            AV::GRAYF32LE => Pixel::GRAYF32LE,
751
752            AV::YUVA422P12BE => Pixel::YUVA422P12BE,
753            AV::YUVA422P12LE => Pixel::YUVA422P12LE,
754            AV::YUVA444P12BE => Pixel::YUVA444P12BE,
755            AV::YUVA444P12LE => Pixel::YUVA444P12LE,
756            AV::NV24 => Pixel::NV24,
757            AV::NV42 => Pixel::NV42,
758
759            AV::VULKAN => Pixel::VULKAN,
760            AV::Y210BE => Pixel::Y210BE,
761            AV::Y210LE => Pixel::Y210LE,
762
763            AV::X2RGB10LE => Pixel::X2RGB10LE,
764            AV::X2RGB10BE => Pixel::X2RGB10BE,
765
766            AV::X2BGR10LE => Pixel::X2BGR10LE,
767            AV::X2BGR10BE => Pixel::X2BGR10BE,
768            AV::P210BE => Pixel::P210BE,
769            AV::P210LE => Pixel::P210LE,
770            AV::P410BE => Pixel::P410BE,
771            AV::P410LE => Pixel::P410LE,
772            AV::P216BE => Pixel::P216BE,
773            AV::P216LE => Pixel::P216LE,
774            AV::P416BE => Pixel::P416BE,
775            AV::P416LE => Pixel::P416LE,
776
777            #[cfg(feature = "ffmpeg_6_0")]
778            AV::VUYA => Pixel::VUYA,
779            #[cfg(feature = "ffmpeg_6_0")]
780            AV::RGBAF16BE => Pixel::RGBAF16BE,
781            #[cfg(feature = "ffmpeg_6_0")]
782            AV::RGBAF16LE => Pixel::RGBAF16LE,
783            #[cfg(feature = "ffmpeg_6_0")]
784            AV::VUYX => Pixel::VUYX,
785            #[cfg(feature = "ffmpeg_6_0")]
786            AV::P012LE => Pixel::P012LE,
787            #[cfg(feature = "ffmpeg_6_0")]
788            AV::P012BE => Pixel::P012BE,
789            #[cfg(feature = "ffmpeg_6_0")]
790            AV::Y212BE => Pixel::Y212BE,
791            #[cfg(feature = "ffmpeg_6_0")]
792            AV::Y212LE => Pixel::Y212LE,
793            #[cfg(feature = "ffmpeg_6_0")]
794            AV::XV30BE => Pixel::XV30BE,
795            #[cfg(feature = "ffmpeg_6_0")]
796            AV::XV30LE => Pixel::XV30LE,
797            #[cfg(feature = "ffmpeg_6_0")]
798            AV::XV36BE => Pixel::XV36BE,
799            #[cfg(feature = "ffmpeg_6_0")]
800            AV::XV36LE => Pixel::XV36LE,
801            #[cfg(feature = "ffmpeg_6_0")]
802            AV::RGBF32BE => Pixel::RGBF32BE,
803            #[cfg(feature = "ffmpeg_6_0")]
804            AV::RGBF32LE => Pixel::RGBF32LE,
805            #[cfg(feature = "ffmpeg_6_0")]
806            AV::RGBAF32BE => Pixel::RGBAF32BE,
807            #[cfg(feature = "ffmpeg_6_0")]
808            AV::RGBAF32LE => Pixel::RGBAF32LE,
809
810            #[cfg(feature = "ffmpeg_6_1")]
811            AV::P212BE => Pixel::P212BE,
812            #[cfg(feature = "ffmpeg_6_1")]
813            AV::P212LE => Pixel::P212LE,
814            #[cfg(feature = "ffmpeg_6_1")]
815            AV::P412BE => Pixel::P412BE,
816            #[cfg(feature = "ffmpeg_6_1")]
817            AV::P412LE => Pixel::P412LE,
818            #[cfg(feature = "ffmpeg_6_1")]
819            AV::GBRAP14BE => Pixel::GBRAP14BE,
820            #[cfg(feature = "ffmpeg_6_1")]
821            AV::GBRAP14LE => Pixel::GBRAP14LE,
822
823            #[cfg(feature = "ffmpeg_7_0")]
824            AV::D3D12 => Pixel::D3D12,
825
826            #[cfg(feature = "ffmpeg_8_0")]
827            AV::AYUV => Pixel::AYUV,
828
829            #[cfg(feature = "ffmpeg_8_0")]
830            AV::UYVA => Pixel::UYVA,
831
832            #[cfg(feature = "ffmpeg_8_0")]
833            AV::VYU444 => Pixel::VYU444,
834
835            #[cfg(feature = "ffmpeg_8_0")]
836            AV::V30XBE => Pixel::V30XBE,
837            #[cfg(feature = "ffmpeg_8_0")]
838            AV::V30XLE => Pixel::V30XLE,
839
840            #[cfg(feature = "ffmpeg_8_0")]
841            AV::RGBF16BE => Pixel::RGBF16BE,
842            #[cfg(feature = "ffmpeg_8_0")]
843            AV::RGBF16LE => Pixel::RGBF16LE,
844
845            #[cfg(feature = "ffmpeg_8_0")]
846            AV::RGBA128BE => Pixel::RGBA128BE,
847            #[cfg(feature = "ffmpeg_8_0")]
848            AV::RGBA128LE => Pixel::RGBA128LE,
849
850            #[cfg(feature = "ffmpeg_8_0")]
851            AV::RGB96BE => Pixel::RGB96BE,
852            #[cfg(feature = "ffmpeg_8_0")]
853            AV::RGB96LE => Pixel::RGB96LE,
854
855            #[cfg(feature = "ffmpeg_8_0")]
856            AV::Y216BE => Pixel::Y216BE,
857            #[cfg(feature = "ffmpeg_8_0")]
858            AV::Y216LE => Pixel::Y216LE,
859
860            #[cfg(feature = "ffmpeg_8_0")]
861            AV::XV48BE => Pixel::XV48BE,
862            #[cfg(feature = "ffmpeg_8_0")]
863            AV::XV48LE => Pixel::XV48LE,
864
865            #[cfg(feature = "ffmpeg_8_0")]
866            AV::GBRPF16BE => Pixel::GBRPF16BE,
867            #[cfg(feature = "ffmpeg_8_0")]
868            AV::GBRPF16LE => Pixel::GBRPF16LE,
869            #[cfg(feature = "ffmpeg_8_0")]
870            AV::GBRAPF16BE => Pixel::GBRAPF16BE,
871            #[cfg(feature = "ffmpeg_8_0")]
872            AV::GBRAPF16LE => Pixel::GBRAPF16LE,
873
874            #[cfg(feature = "ffmpeg_8_0")]
875            AV::GRAYF16BE => Pixel::GRAYF16BE,
876            #[cfg(feature = "ffmpeg_8_0")]
877            AV::GRAYF16LE => Pixel::GRAYF16LE,
878
879            #[cfg(feature = "ffmpeg_8_0")]
880            AV::AMF_SURFACE => Pixel::AMF_SURFACE,
881
882            #[cfg(feature = "ffmpeg_8_0")]
883            AV::GRAY32BE => Pixel::GRAY32BE,
884            #[cfg(feature = "ffmpeg_8_0")]
885            AV::GRAY32LE => Pixel::GRAY32LE,
886
887            #[cfg(feature = "ffmpeg_8_0")]
888            AV::YAF32BE => Pixel::YAF32BE,
889            #[cfg(feature = "ffmpeg_8_0")]
890            AV::YAF32LE => Pixel::YAF32LE,
891
892            #[cfg(feature = "ffmpeg_8_0")]
893            AV::YAF16BE => Pixel::YAF16BE,
894            #[cfg(feature = "ffmpeg_8_0")]
895            AV::YAF16LE => Pixel::YAF16LE,
896
897            #[cfg(feature = "ffmpeg_8_0")]
898            AV::GBRAP32BE => Pixel::GBRAP32BE,
899            #[cfg(feature = "ffmpeg_8_0")]
900            AV::GBRAP32LE => Pixel::GBRAP32LE,
901
902            #[cfg(feature = "ffmpeg_8_0")]
903            AV::YUV444P10MSBBE => Pixel::YUV444P10MSBBE,
904            #[cfg(feature = "ffmpeg_8_0")]
905            AV::YUV444P10MSBLE => Pixel::YUV444P10MSBLE,
906            #[cfg(feature = "ffmpeg_8_0")]
907            AV::YUV444P12MSBBE => Pixel::YUV444P12MSBBE,
908            #[cfg(feature = "ffmpeg_8_0")]
909            AV::YUV444P12MSBLE => Pixel::YUV444P12MSBLE,
910            #[cfg(feature = "ffmpeg_8_0")]
911            AV::GBRP10MSBBE => Pixel::GBRP10MSBBE,
912            #[cfg(feature = "ffmpeg_8_0")]
913            AV::GBRP10MSBLE => Pixel::GBRP10MSBLE,
914            #[cfg(feature = "ffmpeg_8_0")]
915            AV::GBRP12MSBBE => Pixel::GBRP12MSBBE,
916            #[cfg(feature = "ffmpeg_8_0")]
917            AV::GBRP12MSBLE => Pixel::GBRP12MSBLE,
918
919            #[cfg(feature = "ffmpeg_8_0")]
920            AV::OHCODEC => Pixel::OHCODEC,
921
922            #[cfg(feature = "rpi")]
923            AV::RPI => Pixel::RPI,
924            #[cfg(feature = "rpi")]
925            AV::SAND128 => Pixel::SAND128,
926            #[cfg(feature = "rpi")]
927            AV::SAND64_10 => Pixel::SAND64_10,
928            #[cfg(feature = "rpi")]
929            AV::SAND64_16 => Pixel::SAND64_16,
930            #[cfg(feature = "rpi")]
931            AV::RPI4_8 => Pixel::RPI4_8,
932            #[cfg(feature = "rpi")]
933            AV::RPI4_10 => Pixel::RPI4_10,
934
935            _ => unimplemented!(),
936        }
937    }
938}
939
940impl From<Pixel> for AVPixelFormat {
941    #[inline]
942    fn from(value: Pixel) -> AVPixelFormat {
943        use AVPixelFormat as AV;
944
945        match value {
946            Pixel::None => AV::NONE,
947
948            Pixel::YUV420P => AV::YUV420P,
949            Pixel::YUYV422 => AV::YUYV422,
950            Pixel::RGB24 => AV::RGB24,
951            Pixel::BGR24 => AV::BGR24,
952            Pixel::YUV422P => AV::YUV422P,
953            Pixel::YUV444P => AV::YUV444P,
954            Pixel::YUV410P => AV::YUV410P,
955            Pixel::YUV411P => AV::YUV411P,
956            Pixel::GRAY8 => AV::GRAY8,
957            Pixel::MonoWhite => AV::MONOWHITE,
958            Pixel::MonoBlack => AV::MONOBLACK,
959            Pixel::PAL8 => AV::PAL8,
960            Pixel::YUVJ420P => AV::YUVJ420P,
961            Pixel::YUVJ422P => AV::YUVJ422P,
962            Pixel::YUVJ444P => AV::YUVJ444P,
963            Pixel::UYVY422 => AV::UYVY422,
964            Pixel::UYYVYY411 => AV::UYYVYY411,
965            Pixel::BGR8 => AV::BGR8,
966            Pixel::BGR4 => AV::BGR4,
967            Pixel::BGR4_BYTE => AV::BGR4_BYTE,
968            Pixel::RGB8 => AV::RGB8,
969            Pixel::RGB4 => AV::RGB4,
970            Pixel::RGB4_BYTE => AV::RGB4_BYTE,
971            Pixel::NV12 => AV::NV12,
972            Pixel::NV21 => AV::NV21,
973
974            Pixel::ARGB => AV::ARGB,
975            Pixel::RGBA => AV::RGBA,
976            Pixel::ABGR => AV::ABGR,
977            Pixel::BGRA => AV::BGRA,
978
979            Pixel::GRAY16BE => AV::GRAY16BE,
980            Pixel::GRAY16LE => AV::GRAY16LE,
981            Pixel::YUV440P => AV::YUV440P,
982            Pixel::YUVJ440P => AV::YUVJ440P,
983            Pixel::YUVA420P => AV::YUVA420P,
984            Pixel::RGB48BE => AV::RGB48BE,
985            Pixel::RGB48LE => AV::RGB48LE,
986
987            Pixel::RGB565BE => AV::RGB565BE,
988            Pixel::RGB565LE => AV::RGB565LE,
989            Pixel::RGB555BE => AV::RGB555BE,
990            Pixel::RGB555LE => AV::RGB555LE,
991
992            Pixel::BGR565BE => AV::BGR565BE,
993            Pixel::BGR565LE => AV::BGR565LE,
994            Pixel::BGR555BE => AV::BGR555BE,
995            Pixel::BGR555LE => AV::BGR555LE,
996
997            Pixel::VAAPI => AV::VAAPI,
998
999            Pixel::YUV420P16LE => AV::YUV420P16LE,
1000            Pixel::YUV420P16BE => AV::YUV420P16BE,
1001            Pixel::YUV422P16LE => AV::YUV422P16LE,
1002            Pixel::YUV422P16BE => AV::YUV422P16BE,
1003            Pixel::YUV444P16LE => AV::YUV444P16LE,
1004            Pixel::YUV444P16BE => AV::YUV444P16BE,
1005            Pixel::DXVA2_VLD => AV::DXVA2_VLD,
1006
1007            Pixel::RGB444LE => AV::RGB444LE,
1008            Pixel::RGB444BE => AV::RGB444BE,
1009            Pixel::BGR444LE => AV::BGR444LE,
1010            Pixel::BGR444BE => AV::BGR444BE,
1011            Pixel::YA8 => AV::YA8,
1012
1013            Pixel::BGR48BE => AV::BGR48BE,
1014            Pixel::BGR48LE => AV::BGR48LE,
1015
1016            Pixel::YUV420P9BE => AV::YUV420P9BE,
1017            Pixel::YUV420P9LE => AV::YUV420P9LE,
1018            Pixel::YUV420P10BE => AV::YUV420P10BE,
1019            Pixel::YUV420P10LE => AV::YUV420P10LE,
1020            Pixel::YUV422P10BE => AV::YUV422P10BE,
1021            Pixel::YUV422P10LE => AV::YUV422P10LE,
1022            Pixel::YUV444P9BE => AV::YUV444P9BE,
1023            Pixel::YUV444P9LE => AV::YUV444P9LE,
1024            Pixel::YUV444P10BE => AV::YUV444P10BE,
1025            Pixel::YUV444P10LE => AV::YUV444P10LE,
1026            Pixel::YUV422P9BE => AV::YUV422P9BE,
1027            Pixel::YUV422P9LE => AV::YUV422P9LE,
1028
1029            Pixel::GBRP => AV::GBRP,
1030            Pixel::GBRP9BE => AV::GBRP9BE,
1031            Pixel::GBRP9LE => AV::GBRP9LE,
1032            Pixel::GBRP10BE => AV::GBRP10BE,
1033            Pixel::GBRP10LE => AV::GBRP10LE,
1034            Pixel::GBRP16BE => AV::GBRP16BE,
1035            Pixel::GBRP16LE => AV::GBRP16LE,
1036
1037            Pixel::YUVA420P9BE => AV::YUVA420P9BE,
1038            Pixel::YUVA420P9LE => AV::YUVA420P9LE,
1039            Pixel::YUVA422P9BE => AV::YUVA422P9BE,
1040            Pixel::YUVA422P9LE => AV::YUVA422P9LE,
1041            Pixel::YUVA444P9BE => AV::YUVA444P9BE,
1042            Pixel::YUVA444P9LE => AV::YUVA444P9LE,
1043            Pixel::YUVA420P10BE => AV::YUVA420P10BE,
1044            Pixel::YUVA420P10LE => AV::YUVA420P10LE,
1045            Pixel::YUVA422P10BE => AV::YUVA422P10BE,
1046            Pixel::YUVA422P10LE => AV::YUVA422P10LE,
1047            Pixel::YUVA444P10BE => AV::YUVA444P10BE,
1048            Pixel::YUVA444P10LE => AV::YUVA444P10LE,
1049            Pixel::YUVA420P16BE => AV::YUVA420P16BE,
1050            Pixel::YUVA420P16LE => AV::YUVA420P16LE,
1051            Pixel::YUVA422P16BE => AV::YUVA422P16BE,
1052            Pixel::YUVA422P16LE => AV::YUVA422P16LE,
1053            Pixel::YUVA444P16BE => AV::YUVA444P16BE,
1054            Pixel::YUVA444P16LE => AV::YUVA444P16LE,
1055
1056            Pixel::VDPAU => AV::VDPAU,
1057
1058            Pixel::XYZ12LE => AV::XYZ12LE,
1059            Pixel::XYZ12BE => AV::XYZ12BE,
1060            Pixel::NV16 => AV::NV16,
1061            Pixel::NV20LE => AV::NV20LE,
1062            Pixel::NV20BE => AV::NV20BE,
1063
1064            Pixel::RGBA64BE => AV::RGBA64BE,
1065            Pixel::RGBA64LE => AV::RGBA64LE,
1066            Pixel::BGRA64BE => AV::BGRA64BE,
1067            Pixel::BGRA64LE => AV::BGRA64LE,
1068
1069            Pixel::YVYU422 => AV::YVYU422,
1070
1071            Pixel::YA16BE => AV::YA16BE,
1072            Pixel::YA16LE => AV::YA16LE,
1073
1074            Pixel::QSV => AV::QSV,
1075            Pixel::MMAL => AV::MMAL,
1076
1077            Pixel::D3D11VA_VLD => AV::D3D11VA_VLD,
1078
1079            Pixel::CUDA => AV::CUDA,
1080
1081            Pixel::ZRGB => AV::_0RGB,
1082            Pixel::RGBZ => AV::RGB0,
1083            Pixel::ZBGR => AV::_0BGR,
1084            Pixel::BGRZ => AV::BGR0,
1085            Pixel::YUVA444P => AV::YUVA444P,
1086            Pixel::YUVA422P => AV::YUVA422P,
1087
1088            Pixel::YUV420P12BE => AV::YUV420P12BE,
1089            Pixel::YUV420P12LE => AV::YUV420P12LE,
1090            Pixel::YUV420P14BE => AV::YUV420P14BE,
1091            Pixel::YUV420P14LE => AV::YUV420P14LE,
1092            Pixel::YUV422P12BE => AV::YUV422P12BE,
1093            Pixel::YUV422P12LE => AV::YUV422P12LE,
1094            Pixel::YUV422P14BE => AV::YUV422P14BE,
1095            Pixel::YUV422P14LE => AV::YUV422P14LE,
1096            Pixel::YUV444P12BE => AV::YUV444P12BE,
1097            Pixel::YUV444P12LE => AV::YUV444P12LE,
1098            Pixel::YUV444P14BE => AV::YUV444P14BE,
1099            Pixel::YUV444P14LE => AV::YUV444P14LE,
1100            Pixel::GBRP12BE => AV::GBRP12BE,
1101            Pixel::GBRP12LE => AV::GBRP12LE,
1102            Pixel::GBRP14BE => AV::GBRP14BE,
1103            Pixel::GBRP14LE => AV::GBRP14LE,
1104            Pixel::GBRAP => AV::GBRAP,
1105            Pixel::GBRAP16BE => AV::GBRAP16BE,
1106            Pixel::GBRAP16LE => AV::GBRAP16LE,
1107            Pixel::YUVJ411P => AV::YUVJ411P,
1108
1109            Pixel::BAYER_BGGR8 => AV::BAYER_BGGR8,
1110            Pixel::BAYER_RGGB8 => AV::BAYER_RGGB8,
1111            Pixel::BAYER_GBRG8 => AV::BAYER_GBRG8,
1112            Pixel::BAYER_GRBG8 => AV::BAYER_GRBG8,
1113            Pixel::BAYER_BGGR16LE => AV::BAYER_BGGR16LE,
1114            Pixel::BAYER_BGGR16BE => AV::BAYER_BGGR16BE,
1115            Pixel::BAYER_RGGB16LE => AV::BAYER_RGGB16LE,
1116            Pixel::BAYER_RGGB16BE => AV::BAYER_RGGB16BE,
1117            Pixel::BAYER_GBRG16LE => AV::BAYER_GBRG16LE,
1118            Pixel::BAYER_GBRG16BE => AV::BAYER_GBRG16BE,
1119            Pixel::BAYER_GRBG16LE => AV::BAYER_GRBG16LE,
1120            Pixel::BAYER_GRBG16BE => AV::BAYER_GRBG16BE,
1121
1122            Pixel::YUV440P10LE => AV::YUV440P10LE,
1123            Pixel::YUV440P10BE => AV::YUV440P10BE,
1124            Pixel::YUV440P12LE => AV::YUV440P12LE,
1125            Pixel::YUV440P12BE => AV::YUV440P12BE,
1126            Pixel::AYUV64LE => AV::AYUV64LE,
1127            Pixel::AYUV64BE => AV::AYUV64BE,
1128
1129            Pixel::VIDEOTOOLBOX => AV::VIDEOTOOLBOX,
1130
1131            // --- defaults
1132            #[cfg(not(feature = "ffmpeg_7_0"))]
1133            Pixel::XVMC => AV::XVMC,
1134
1135            Pixel::RGB32 => AV::RGB32,
1136            Pixel::RGB32_1 => AV::RGB32_1,
1137            Pixel::BGR32 => AV::BGR32,
1138            Pixel::BGR32_1 => AV::BGR32_1,
1139            Pixel::ZRGB32 => AV::_0RGB32,
1140            Pixel::ZBGR32 => AV::_0BGR32,
1141
1142            Pixel::GRAY16 => AV::GRAY16,
1143            Pixel::YA16 => AV::YA16,
1144            Pixel::RGB48 => AV::RGB48,
1145            Pixel::RGB565 => AV::RGB565,
1146            Pixel::RGB555 => AV::RGB555,
1147            Pixel::RGB444 => AV::RGB444,
1148            Pixel::BGR48 => AV::BGR48,
1149            Pixel::BGR565 => AV::BGR565,
1150            Pixel::BGR555 => AV::BGR555,
1151            Pixel::BGR444 => AV::BGR444,
1152
1153            Pixel::YUV420P9 => AV::YUV420P9,
1154            Pixel::YUV422P9 => AV::YUV422P9,
1155            Pixel::YUV444P9 => AV::YUV444P9,
1156            Pixel::YUV420P10 => AV::YUV420P10,
1157            Pixel::YUV422P10 => AV::YUV422P10,
1158            Pixel::YUV440P10 => AV::YUV440P10,
1159            Pixel::YUV444P10 => AV::YUV444P10,
1160            Pixel::YUV420P12 => AV::YUV420P12,
1161            Pixel::YUV422P12 => AV::YUV422P12,
1162            Pixel::YUV440P12 => AV::YUV440P12,
1163            Pixel::YUV444P12 => AV::YUV444P12,
1164            Pixel::YUV420P14 => AV::YUV420P14,
1165            Pixel::YUV422P14 => AV::YUV422P14,
1166            Pixel::YUV444P14 => AV::YUV444P14,
1167            Pixel::YUV420P16 => AV::YUV420P16,
1168            Pixel::YUV422P16 => AV::YUV422P16,
1169            Pixel::YUV444P16 => AV::YUV444P16,
1170
1171            Pixel::GBRP9 => AV::GBRP9,
1172            Pixel::GBRP10 => AV::GBRP10,
1173            Pixel::GBRP12 => AV::GBRP12,
1174            Pixel::GBRP14 => AV::GBRP14,
1175            Pixel::GBRP16 => AV::GBRP16,
1176            Pixel::GBRAP16 => AV::GBRAP16,
1177
1178            Pixel::BAYER_BGGR16 => AV::BAYER_BGGR16,
1179            Pixel::BAYER_RGGB16 => AV::BAYER_RGGB16,
1180            Pixel::BAYER_GBRG16 => AV::BAYER_GBRG16,
1181            Pixel::BAYER_GRBG16 => AV::BAYER_GRBG16,
1182
1183            Pixel::YUVA420P9 => AV::YUVA420P9,
1184            Pixel::YUVA422P9 => AV::YUVA422P9,
1185            Pixel::YUVA444P9 => AV::YUVA444P9,
1186            Pixel::YUVA420P10 => AV::YUVA420P10,
1187            Pixel::YUVA422P10 => AV::YUVA422P10,
1188            Pixel::YUVA444P10 => AV::YUVA444P10,
1189            Pixel::YUVA420P16 => AV::YUVA420P16,
1190            Pixel::YUVA422P16 => AV::YUVA422P16,
1191            Pixel::YUVA444P16 => AV::YUVA444P16,
1192
1193            Pixel::XYZ12 => AV::XYZ12,
1194            Pixel::NV20 => AV::NV20,
1195            Pixel::AYUV64 => AV::AYUV64,
1196
1197            Pixel::P010LE => AV::P010LE,
1198            Pixel::P010BE => AV::P010BE,
1199            Pixel::GBRAP12BE => AV::GBRAP12BE,
1200            Pixel::GBRAP12LE => AV::GBRAP12LE,
1201            Pixel::GBRAP10LE => AV::GBRAP10LE,
1202            Pixel::GBRAP10BE => AV::GBRAP10BE,
1203            Pixel::MEDIACODEC => AV::MEDIACODEC,
1204            Pixel::GRAY12BE => AV::GRAY12BE,
1205            Pixel::GRAY12LE => AV::GRAY12LE,
1206            Pixel::GRAY10BE => AV::GRAY10BE,
1207            Pixel::GRAY10LE => AV::GRAY10LE,
1208            Pixel::P016LE => AV::P016LE,
1209            Pixel::P016BE => AV::P016BE,
1210
1211            Pixel::D3D11 => AV::D3D11,
1212            Pixel::GRAY9BE => AV::GRAY9BE,
1213            Pixel::GRAY9LE => AV::GRAY9LE,
1214            Pixel::GBRPF32BE => AV::GBRPF32BE,
1215            Pixel::GBRPF32LE => AV::GBRPF32LE,
1216            Pixel::GBRAPF32BE => AV::GBRAPF32BE,
1217            Pixel::GBRAPF32LE => AV::GBRAPF32LE,
1218            Pixel::DRM_PRIME => AV::DRM_PRIME,
1219
1220            Pixel::OPENCL => AV::OPENCL,
1221
1222            Pixel::GRAY14BE => AV::GRAY14BE,
1223            Pixel::GRAY14LE => AV::GRAY14LE,
1224            Pixel::GRAYF32BE => AV::GRAYF32BE,
1225            Pixel::GRAYF32LE => AV::GRAYF32LE,
1226
1227            Pixel::YUVA422P12BE => AV::YUVA422P12BE,
1228            Pixel::YUVA422P12LE => AV::YUVA422P12LE,
1229            Pixel::YUVA444P12BE => AV::YUVA444P12BE,
1230            Pixel::YUVA444P12LE => AV::YUVA444P12LE,
1231            Pixel::NV24 => AV::NV24,
1232            Pixel::NV42 => AV::NV42,
1233
1234            Pixel::VULKAN => AV::VULKAN,
1235            Pixel::Y210BE => AV::Y210BE,
1236            Pixel::Y210LE => AV::Y210LE,
1237
1238            Pixel::X2RGB10LE => AV::X2RGB10LE,
1239            Pixel::X2RGB10BE => AV::X2RGB10BE,
1240
1241            Pixel::X2BGR10LE => AV::X2BGR10LE,
1242            Pixel::X2BGR10BE => AV::X2BGR10BE,
1243            Pixel::P210BE => AV::P210BE,
1244            Pixel::P210LE => AV::P210LE,
1245            Pixel::P410BE => AV::P410BE,
1246            Pixel::P410LE => AV::P410LE,
1247            Pixel::P216BE => AV::P216BE,
1248            Pixel::P216LE => AV::P216LE,
1249            Pixel::P416BE => AV::P416BE,
1250            Pixel::P416LE => AV::P416LE,
1251
1252            #[cfg(feature = "ffmpeg_6_0")]
1253            Pixel::VUYA => AV::VUYA,
1254            #[cfg(feature = "ffmpeg_6_0")]
1255            Pixel::RGBAF16BE => AV::RGBAF16BE,
1256            #[cfg(feature = "ffmpeg_6_0")]
1257            Pixel::RGBAF16LE => AV::RGBAF16LE,
1258            #[cfg(feature = "ffmpeg_6_0")]
1259            Pixel::VUYX => AV::VUYX,
1260            #[cfg(feature = "ffmpeg_6_0")]
1261            Pixel::P012LE => AV::P012LE,
1262            #[cfg(feature = "ffmpeg_6_0")]
1263            Pixel::P012BE => AV::P012BE,
1264            #[cfg(feature = "ffmpeg_6_0")]
1265            Pixel::Y212BE => AV::Y212BE,
1266            #[cfg(feature = "ffmpeg_6_0")]
1267            Pixel::Y212LE => AV::Y212LE,
1268            #[cfg(feature = "ffmpeg_6_0")]
1269            Pixel::XV30BE => AV::XV30BE,
1270            #[cfg(feature = "ffmpeg_6_0")]
1271            Pixel::XV30LE => AV::XV30LE,
1272            #[cfg(feature = "ffmpeg_6_0")]
1273            Pixel::XV36BE => AV::XV36BE,
1274            #[cfg(feature = "ffmpeg_6_0")]
1275            Pixel::XV36LE => AV::XV36LE,
1276            #[cfg(feature = "ffmpeg_6_0")]
1277            Pixel::RGBF32BE => AV::RGBF32BE,
1278            #[cfg(feature = "ffmpeg_6_0")]
1279            Pixel::RGBF32LE => AV::RGBF32LE,
1280            #[cfg(feature = "ffmpeg_6_0")]
1281            Pixel::RGBAF32BE => AV::RGBAF32BE,
1282            #[cfg(feature = "ffmpeg_6_0")]
1283            Pixel::RGBAF32LE => AV::RGBAF32LE,
1284
1285            #[cfg(feature = "ffmpeg_6_1")]
1286            Pixel::P212BE => AV::P212BE,
1287            #[cfg(feature = "ffmpeg_6_1")]
1288            Pixel::P212LE => AV::P212LE,
1289            #[cfg(feature = "ffmpeg_6_1")]
1290            Pixel::P412BE => AV::P412BE,
1291            #[cfg(feature = "ffmpeg_6_1")]
1292            Pixel::P412LE => AV::P412LE,
1293            #[cfg(feature = "ffmpeg_6_1")]
1294            Pixel::GBRAP14BE => AV::GBRAP14BE,
1295            #[cfg(feature = "ffmpeg_6_1")]
1296            Pixel::GBRAP14LE => AV::GBRAP14LE,
1297
1298            #[cfg(feature = "ffmpeg_7_0")]
1299            Pixel::D3D12 => AV::D3D12,
1300
1301            #[cfg(feature = "ffmpeg_8_0")]
1302            Pixel::AYUV => AV::AYUV,
1303
1304            #[cfg(feature = "ffmpeg_8_0")]
1305            Pixel::UYVA => AV::UYVA,
1306
1307            #[cfg(feature = "ffmpeg_8_0")]
1308            Pixel::VYU444 => AV::VYU444,
1309
1310            #[cfg(feature = "ffmpeg_8_0")]
1311            Pixel::V30XBE => AV::V30XBE,
1312            #[cfg(feature = "ffmpeg_8_0")]
1313            Pixel::V30XLE => AV::V30XLE,
1314
1315            #[cfg(feature = "ffmpeg_8_0")]
1316            Pixel::RGBF16BE => AV::RGBF16BE,
1317            #[cfg(feature = "ffmpeg_8_0")]
1318            Pixel::RGBF16LE => AV::RGBF16LE,
1319
1320            #[cfg(feature = "ffmpeg_8_0")]
1321            Pixel::RGBA128BE => AV::RGBA128BE,
1322            #[cfg(feature = "ffmpeg_8_0")]
1323            Pixel::RGBA128LE => AV::RGBA128LE,
1324
1325            #[cfg(feature = "ffmpeg_8_0")]
1326            Pixel::RGB96BE => AV::RGB96BE,
1327            #[cfg(feature = "ffmpeg_8_0")]
1328            Pixel::RGB96LE => AV::RGB96LE,
1329
1330            #[cfg(feature = "ffmpeg_8_0")]
1331            Pixel::Y216BE => AV::Y216BE,
1332            #[cfg(feature = "ffmpeg_8_0")]
1333            Pixel::Y216LE => AV::Y216LE,
1334
1335            #[cfg(feature = "ffmpeg_8_0")]
1336            Pixel::XV48BE => AV::XV48BE,
1337            #[cfg(feature = "ffmpeg_8_0")]
1338            Pixel::XV48LE => AV::XV48LE,
1339
1340            #[cfg(feature = "ffmpeg_8_0")]
1341            Pixel::GBRPF16BE => AV::GBRPF16BE,
1342            #[cfg(feature = "ffmpeg_8_0")]
1343            Pixel::GBRPF16LE => AV::GBRPF16LE,
1344            #[cfg(feature = "ffmpeg_8_0")]
1345            Pixel::GBRAPF16BE => AV::GBRAPF16BE,
1346            #[cfg(feature = "ffmpeg_8_0")]
1347            Pixel::GBRAPF16LE => AV::GBRAPF16LE,
1348
1349            #[cfg(feature = "ffmpeg_8_0")]
1350            Pixel::GRAYF16BE => AV::GRAYF16BE,
1351            #[cfg(feature = "ffmpeg_8_0")]
1352            Pixel::GRAYF16LE => AV::GRAYF16LE,
1353
1354            #[cfg(feature = "ffmpeg_8_0")]
1355            Pixel::AMF_SURFACE => AV::AMF_SURFACE,
1356
1357            #[cfg(feature = "ffmpeg_8_0")]
1358            Pixel::GRAY32BE => AV::GRAY32BE,
1359            #[cfg(feature = "ffmpeg_8_0")]
1360            Pixel::GRAY32LE => AV::GRAY32LE,
1361
1362            #[cfg(feature = "ffmpeg_8_0")]
1363            Pixel::YAF32BE => AV::YAF32BE,
1364            #[cfg(feature = "ffmpeg_8_0")]
1365            Pixel::YAF32LE => AV::YAF32LE,
1366
1367            #[cfg(feature = "ffmpeg_8_0")]
1368            Pixel::YAF16BE => AV::YAF16BE,
1369            #[cfg(feature = "ffmpeg_8_0")]
1370            Pixel::YAF16LE => AV::YAF16LE,
1371
1372            #[cfg(feature = "ffmpeg_8_0")]
1373            Pixel::GBRAP32BE => AV::GBRAP32BE,
1374            #[cfg(feature = "ffmpeg_8_0")]
1375            Pixel::GBRAP32LE => AV::GBRAP32LE,
1376
1377            #[cfg(feature = "ffmpeg_8_0")]
1378            Pixel::YUV444P10MSBBE => AV::YUV444P10MSBBE,
1379            #[cfg(feature = "ffmpeg_8_0")]
1380            Pixel::YUV444P10MSBLE => AV::YUV444P10MSBLE,
1381            #[cfg(feature = "ffmpeg_8_0")]
1382            Pixel::YUV444P12MSBBE => AV::YUV444P12MSBBE,
1383            #[cfg(feature = "ffmpeg_8_0")]
1384            Pixel::YUV444P12MSBLE => AV::YUV444P12MSBLE,
1385            #[cfg(feature = "ffmpeg_8_0")]
1386            Pixel::GBRP10MSBBE => AV::GBRP10MSBBE,
1387            #[cfg(feature = "ffmpeg_8_0")]
1388            Pixel::GBRP10MSBLE => AV::GBRP10MSBLE,
1389            #[cfg(feature = "ffmpeg_8_0")]
1390            Pixel::GBRP12MSBBE => AV::GBRP12MSBBE,
1391            #[cfg(feature = "ffmpeg_8_0")]
1392            Pixel::GBRP12MSBLE => AV::GBRP12MSBLE,
1393
1394            #[cfg(feature = "ffmpeg_8_0")]
1395            Pixel::OHCODEC => AV::OHCODEC,
1396
1397            #[cfg(feature = "rpi")]
1398            Pixel::RPI => AV::RPI,
1399            #[cfg(feature = "rpi")]
1400            Pixel::SAND128 => AV::SAND128,
1401            #[cfg(feature = "rpi")]
1402            Pixel::SAND64_10 => AV::SAND64_10,
1403            #[cfg(feature = "rpi")]
1404            Pixel::SAND64_16 => AV::SAND64_16,
1405            #[cfg(feature = "rpi")]
1406            Pixel::RPI4_8 => AV::RPI4_8,
1407            #[cfg(feature = "rpi")]
1408            Pixel::RPI4_10 => AV::RPI4_10,
1409        }
1410    }
1411}
1412
1413#[derive(Debug)]
1414pub enum ParsePixelError {
1415    NulError(NulError),
1416    UnknownFormat,
1417}
1418
1419impl fmt::Display for ParsePixelError {
1420    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1421        match *self {
1422            ParsePixelError::NulError(ref e) => e.fmt(f),
1423            ParsePixelError::UnknownFormat => write!(f, "unknown pixel format"),
1424        }
1425    }
1426}
1427
1428impl error::Error for ParsePixelError {
1429    fn cause(&self) -> Option<&dyn error::Error> {
1430        match *self {
1431            ParsePixelError::NulError(ref e) => Some(e),
1432            ParsePixelError::UnknownFormat => None,
1433        }
1434    }
1435}
1436
1437impl From<NulError> for ParsePixelError {
1438    fn from(x: NulError) -> ParsePixelError {
1439        ParsePixelError::NulError(x)
1440    }
1441}
1442
1443impl FromStr for Pixel {
1444    type Err = ParsePixelError;
1445
1446    #[inline(always)]
1447    fn from_str(s: &str) -> Result<Pixel, ParsePixelError> {
1448        let cstring = CString::new(s)?;
1449        let format = unsafe { av_get_pix_fmt(cstring.as_ptr()) }.into();
1450
1451        if format == Pixel::None {
1452            Err(ParsePixelError::UnknownFormat)
1453        } else {
1454            Ok(format)
1455        }
1456    }
1457}