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