use ffmpeg_next::ffi::{
AV_PIX_FMT_FLAG_BAYER, AV_PIX_FMT_FLAG_BITSTREAM, AV_PIX_FMT_FLAG_HWACCEL, AV_PIX_FMT_FLAG_PAL,
AVPixelFormat, av_image_fill_linesizes, av_image_fill_plane_sizes, av_pix_fmt_count_planes,
av_pix_fmt_desc_get,
};
use mediadecode::PixelFormat;
pub(crate) const MAX_PLANES: usize = 4;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct PlaneGeometry {
pub(crate) count: usize,
pub(crate) row_bytes: [usize; MAX_PLANES],
pub(crate) height: [usize; MAX_PLANES],
}
pub(crate) fn is_deliverable(pix_fmt: PixelFormat) -> bool {
geometry_descriptor(pix_fmt).is_some()
}
fn geometry_descriptor(pix_fmt: PixelFormat) -> Option<AVPixelFormat> {
let av = to_av_pixel_format(pix_fmt)?;
let desc = unsafe { av_pix_fmt_desc_get(av) };
if desc.is_null() {
return None;
}
let flags = unsafe { (*desc).flags };
let nb_components = unsafe { (*desc).nb_components };
let rejected = AV_PIX_FMT_FLAG_HWACCEL
| AV_PIX_FMT_FLAG_BAYER
| AV_PIX_FMT_FLAG_PAL
| AV_PIX_FMT_FLAG_BITSTREAM;
if flags & (rejected as u64) != 0 {
return None;
}
if nb_components == 0 {
return None;
}
Some(av)
}
pub(crate) fn plane_geometry(
pix_fmt: PixelFormat,
width: usize,
height: usize,
) -> Option<PlaneGeometry> {
let av = geometry_descriptor(pix_fmt)?;
let width_i = i32::try_from(width).ok()?;
let height_i = i32::try_from(height).ok()?;
if width_i <= 0 || height_i <= 0 {
return None;
}
let count_raw = unsafe { av_pix_fmt_count_planes(av) };
if count_raw <= 0 || count_raw as usize > MAX_PLANES {
return None;
}
let count = count_raw as usize;
let mut linesizes_i: [core::ffi::c_int; MAX_PLANES] = [0; MAX_PLANES];
let ret = unsafe { av_image_fill_linesizes(linesizes_i.as_mut_ptr(), av, width_i) };
if ret < 0 {
return None;
}
let mut linesizes_isize: [isize; MAX_PLANES] = [0; MAX_PLANES];
for i in 0..MAX_PLANES {
if linesizes_i[i] < 0 {
return None;
}
linesizes_isize[i] = linesizes_i[i] as isize;
}
let mut sizes: [usize; MAX_PLANES] = [0; MAX_PLANES];
let ret = unsafe {
av_image_fill_plane_sizes(sizes.as_mut_ptr(), av, height_i, linesizes_isize.as_ptr())
};
if ret < 0 {
return None;
}
let mut row_bytes = [0usize; MAX_PLANES];
let mut plane_height = [0usize; MAX_PLANES];
for i in 0..count {
let ls = linesizes_i[i] as usize;
let size = sizes[i];
if ls == 0 {
return None;
}
if !size.is_multiple_of(ls) {
return None;
}
row_bytes[i] = ls;
plane_height[i] = size / ls;
if plane_height[i] == 0 {
return None;
}
}
Some(PlaneGeometry {
count,
row_bytes,
height: plane_height,
})
}
pub(crate) const fn to_av_pixel_format(pix_fmt: PixelFormat) -> Option<AVPixelFormat> {
use AVPixelFormat as F;
Some(match pix_fmt {
PixelFormat::Yuv420p => F::AV_PIX_FMT_YUV420P,
PixelFormat::Yuv422p => F::AV_PIX_FMT_YUV422P,
PixelFormat::Yuv440p => F::AV_PIX_FMT_YUV440P,
PixelFormat::Yuv444p => F::AV_PIX_FMT_YUV444P,
PixelFormat::Yuv411p => F::AV_PIX_FMT_YUV411P,
PixelFormat::Yuv410p => F::AV_PIX_FMT_YUV410P,
PixelFormat::Yuvj411p => F::AV_PIX_FMT_YUVJ411P,
PixelFormat::Yuvj420p => F::AV_PIX_FMT_YUVJ420P,
PixelFormat::Yuvj422p => F::AV_PIX_FMT_YUVJ422P,
PixelFormat::Yuvj440p => F::AV_PIX_FMT_YUVJ440P,
PixelFormat::Yuvj444p => F::AV_PIX_FMT_YUVJ444P,
PixelFormat::Yuv420p9Le => F::AV_PIX_FMT_YUV420P9LE,
PixelFormat::Yuv420p9Be => F::AV_PIX_FMT_YUV420P9BE,
PixelFormat::Yuv420p10Le => F::AV_PIX_FMT_YUV420P10LE,
PixelFormat::Yuv420p10Be => F::AV_PIX_FMT_YUV420P10BE,
PixelFormat::Yuv420p12Le => F::AV_PIX_FMT_YUV420P12LE,
PixelFormat::Yuv420p12Be => F::AV_PIX_FMT_YUV420P12BE,
PixelFormat::Yuv420p14Le => F::AV_PIX_FMT_YUV420P14LE,
PixelFormat::Yuv420p14Be => F::AV_PIX_FMT_YUV420P14BE,
PixelFormat::Yuv420p16Le => F::AV_PIX_FMT_YUV420P16LE,
PixelFormat::Yuv420p16Be => F::AV_PIX_FMT_YUV420P16BE,
PixelFormat::Yuv422p9Le => F::AV_PIX_FMT_YUV422P9LE,
PixelFormat::Yuv422p9Be => F::AV_PIX_FMT_YUV422P9BE,
PixelFormat::Yuv422p10Le => F::AV_PIX_FMT_YUV422P10LE,
PixelFormat::Yuv422p10Be => F::AV_PIX_FMT_YUV422P10BE,
PixelFormat::Yuv422p12Le => F::AV_PIX_FMT_YUV422P12LE,
PixelFormat::Yuv422p12Be => F::AV_PIX_FMT_YUV422P12BE,
PixelFormat::Yuv422p14Le => F::AV_PIX_FMT_YUV422P14LE,
PixelFormat::Yuv422p14Be => F::AV_PIX_FMT_YUV422P14BE,
PixelFormat::Yuv422p16Le => F::AV_PIX_FMT_YUV422P16LE,
PixelFormat::Yuv422p16Be => F::AV_PIX_FMT_YUV422P16BE,
PixelFormat::Yuv440p10Le => F::AV_PIX_FMT_YUV440P10LE,
PixelFormat::Yuv440p10Be => F::AV_PIX_FMT_YUV440P10BE,
PixelFormat::Yuv440p12Le => F::AV_PIX_FMT_YUV440P12LE,
PixelFormat::Yuv440p12Be => F::AV_PIX_FMT_YUV440P12BE,
PixelFormat::Yuv444p9Le => F::AV_PIX_FMT_YUV444P9LE,
PixelFormat::Yuv444p9Be => F::AV_PIX_FMT_YUV444P9BE,
PixelFormat::Yuv444p10Le => F::AV_PIX_FMT_YUV444P10LE,
PixelFormat::Yuv444p10Be => F::AV_PIX_FMT_YUV444P10BE,
PixelFormat::Yuv444p12Le => F::AV_PIX_FMT_YUV444P12LE,
PixelFormat::Yuv444p12Be => F::AV_PIX_FMT_YUV444P12BE,
PixelFormat::Yuv444p14Le => F::AV_PIX_FMT_YUV444P14LE,
PixelFormat::Yuv444p14Be => F::AV_PIX_FMT_YUV444P14BE,
PixelFormat::Yuv444p16Le => F::AV_PIX_FMT_YUV444P16LE,
PixelFormat::Yuv444p16Be => F::AV_PIX_FMT_YUV444P16BE,
PixelFormat::Yuv444p10MsbLe => F::AV_PIX_FMT_YUV444P10MSBLE,
PixelFormat::Yuv444p10MsbBe => F::AV_PIX_FMT_YUV444P10MSBBE,
PixelFormat::Yuv444p12MsbLe => F::AV_PIX_FMT_YUV444P12MSBLE,
PixelFormat::Yuv444p12MsbBe => F::AV_PIX_FMT_YUV444P12MSBBE,
PixelFormat::Yuva420p => F::AV_PIX_FMT_YUVA420P,
PixelFormat::Yuva422p => F::AV_PIX_FMT_YUVA422P,
PixelFormat::Yuva444p => F::AV_PIX_FMT_YUVA444P,
PixelFormat::Yuva420p9Le => F::AV_PIX_FMT_YUVA420P9LE,
PixelFormat::Yuva420p9Be => F::AV_PIX_FMT_YUVA420P9BE,
PixelFormat::Yuva422p9Le => F::AV_PIX_FMT_YUVA422P9LE,
PixelFormat::Yuva422p9Be => F::AV_PIX_FMT_YUVA422P9BE,
PixelFormat::Yuva444p9Le => F::AV_PIX_FMT_YUVA444P9LE,
PixelFormat::Yuva444p9Be => F::AV_PIX_FMT_YUVA444P9BE,
PixelFormat::Yuva420p10Le => F::AV_PIX_FMT_YUVA420P10LE,
PixelFormat::Yuva420p10Be => F::AV_PIX_FMT_YUVA420P10BE,
PixelFormat::Yuva422p10Le => F::AV_PIX_FMT_YUVA422P10LE,
PixelFormat::Yuva422p10Be => F::AV_PIX_FMT_YUVA422P10BE,
PixelFormat::Yuva444p10Le => F::AV_PIX_FMT_YUVA444P10LE,
PixelFormat::Yuva444p10Be => F::AV_PIX_FMT_YUVA444P10BE,
PixelFormat::Yuva422p12Le => F::AV_PIX_FMT_YUVA422P12LE,
PixelFormat::Yuva422p12Be => F::AV_PIX_FMT_YUVA422P12BE,
PixelFormat::Yuva444p12Le => F::AV_PIX_FMT_YUVA444P12LE,
PixelFormat::Yuva444p12Be => F::AV_PIX_FMT_YUVA444P12BE,
PixelFormat::Yuva420p16Le => F::AV_PIX_FMT_YUVA420P16LE,
PixelFormat::Yuva420p16Be => F::AV_PIX_FMT_YUVA420P16BE,
PixelFormat::Yuva422p16Le => F::AV_PIX_FMT_YUVA422P16LE,
PixelFormat::Yuva422p16Be => F::AV_PIX_FMT_YUVA422P16BE,
PixelFormat::Yuva444p16Le => F::AV_PIX_FMT_YUVA444P16LE,
PixelFormat::Yuva444p16Be => F::AV_PIX_FMT_YUVA444P16BE,
PixelFormat::Nv12 => F::AV_PIX_FMT_NV12,
PixelFormat::Nv21 => F::AV_PIX_FMT_NV21,
PixelFormat::Nv16 => F::AV_PIX_FMT_NV16,
PixelFormat::Nv24 => F::AV_PIX_FMT_NV24,
PixelFormat::Nv42 => F::AV_PIX_FMT_NV42,
PixelFormat::Nv20Le => F::AV_PIX_FMT_NV20LE,
PixelFormat::Nv20Be => F::AV_PIX_FMT_NV20BE,
PixelFormat::P010Le => F::AV_PIX_FMT_P010LE,
PixelFormat::P010Be => F::AV_PIX_FMT_P010BE,
PixelFormat::P012Le => F::AV_PIX_FMT_P012LE,
PixelFormat::P012Be => F::AV_PIX_FMT_P012BE,
PixelFormat::P016Le => F::AV_PIX_FMT_P016LE,
PixelFormat::P016Be => F::AV_PIX_FMT_P016BE,
PixelFormat::P210Le => F::AV_PIX_FMT_P210LE,
PixelFormat::P210Be => F::AV_PIX_FMT_P210BE,
PixelFormat::P212Le => F::AV_PIX_FMT_P212LE,
PixelFormat::P212Be => F::AV_PIX_FMT_P212BE,
PixelFormat::P216Le => F::AV_PIX_FMT_P216LE,
PixelFormat::P216Be => F::AV_PIX_FMT_P216BE,
PixelFormat::P410Le => F::AV_PIX_FMT_P410LE,
PixelFormat::P410Be => F::AV_PIX_FMT_P410BE,
PixelFormat::P412Le => F::AV_PIX_FMT_P412LE,
PixelFormat::P412Be => F::AV_PIX_FMT_P412BE,
PixelFormat::P416Le => F::AV_PIX_FMT_P416LE,
PixelFormat::P416Be => F::AV_PIX_FMT_P416BE,
PixelFormat::Yuyv422 => F::AV_PIX_FMT_YUYV422,
PixelFormat::Uyvy422 => F::AV_PIX_FMT_UYVY422,
PixelFormat::Yvyu422 => F::AV_PIX_FMT_YVYU422,
PixelFormat::Uyyvyy411 => F::AV_PIX_FMT_UYYVYY411,
PixelFormat::Y210Le => F::AV_PIX_FMT_Y210LE,
PixelFormat::Y210Be => F::AV_PIX_FMT_Y210BE,
PixelFormat::Y212Le => F::AV_PIX_FMT_Y212LE,
PixelFormat::Y212Be => F::AV_PIX_FMT_Y212BE,
PixelFormat::Y216Le => F::AV_PIX_FMT_Y216LE,
PixelFormat::Y216Be => F::AV_PIX_FMT_Y216BE,
PixelFormat::Xv30Le => F::AV_PIX_FMT_XV30LE,
PixelFormat::Xv30Be => F::AV_PIX_FMT_XV30BE,
PixelFormat::V30xLe => F::AV_PIX_FMT_V30XLE,
PixelFormat::V30xBe => F::AV_PIX_FMT_V30XBE,
PixelFormat::Xv36Le => F::AV_PIX_FMT_XV36LE,
PixelFormat::Xv36Be => F::AV_PIX_FMT_XV36BE,
PixelFormat::Xv48Le => F::AV_PIX_FMT_XV48LE,
PixelFormat::Xv48Be => F::AV_PIX_FMT_XV48BE,
PixelFormat::Vuya => F::AV_PIX_FMT_VUYA,
PixelFormat::Vuyx => F::AV_PIX_FMT_VUYX,
PixelFormat::Ayuv => F::AV_PIX_FMT_AYUV,
PixelFormat::Ayuv64Le => F::AV_PIX_FMT_AYUV64LE,
PixelFormat::Ayuv64Be => F::AV_PIX_FMT_AYUV64BE,
PixelFormat::Uyva => F::AV_PIX_FMT_UYVA,
PixelFormat::Vyu444 => F::AV_PIX_FMT_VYU444,
PixelFormat::Xyz12Le => F::AV_PIX_FMT_XYZ12LE,
PixelFormat::Xyz12Be => F::AV_PIX_FMT_XYZ12BE,
PixelFormat::Rgb24 => F::AV_PIX_FMT_RGB24,
PixelFormat::Bgr24 => F::AV_PIX_FMT_BGR24,
PixelFormat::Rgba => F::AV_PIX_FMT_RGBA,
PixelFormat::Bgra => F::AV_PIX_FMT_BGRA,
PixelFormat::Argb => F::AV_PIX_FMT_ARGB,
PixelFormat::Abgr => F::AV_PIX_FMT_ABGR,
PixelFormat::Rgbx => F::AV_PIX_FMT_RGB0,
PixelFormat::Bgrx => F::AV_PIX_FMT_BGR0,
PixelFormat::Xrgb => F::AV_PIX_FMT_0RGB,
PixelFormat::Xbgr => F::AV_PIX_FMT_0BGR,
PixelFormat::X2Rgb10Le => F::AV_PIX_FMT_X2RGB10LE,
PixelFormat::X2Rgb10Be => F::AV_PIX_FMT_X2RGB10BE,
PixelFormat::X2Bgr10Le => F::AV_PIX_FMT_X2BGR10LE,
PixelFormat::X2Bgr10Be => F::AV_PIX_FMT_X2BGR10BE,
PixelFormat::Gbr24p => F::AV_PIX_FMT_GBR24P,
PixelFormat::Rgb48Le => F::AV_PIX_FMT_RGB48LE,
PixelFormat::Rgb48Be => F::AV_PIX_FMT_RGB48BE,
PixelFormat::Bgr48Le => F::AV_PIX_FMT_BGR48LE,
PixelFormat::Bgr48Be => F::AV_PIX_FMT_BGR48BE,
PixelFormat::Rgba64Le => F::AV_PIX_FMT_RGBA64LE,
PixelFormat::Rgba64Be => F::AV_PIX_FMT_RGBA64BE,
PixelFormat::Bgra64Le => F::AV_PIX_FMT_BGRA64LE,
PixelFormat::Bgra64Be => F::AV_PIX_FMT_BGRA64BE,
PixelFormat::Rgb96Le => F::AV_PIX_FMT_RGB96LE,
PixelFormat::Rgb96Be => F::AV_PIX_FMT_RGB96BE,
PixelFormat::Rgba128Le => F::AV_PIX_FMT_RGBA128LE,
PixelFormat::Rgba128Be => F::AV_PIX_FMT_RGBA128BE,
PixelFormat::Rgbf16Le => F::AV_PIX_FMT_RGBF16LE,
PixelFormat::Rgbf16Be => F::AV_PIX_FMT_RGBF16BE,
PixelFormat::Rgbf32Le => F::AV_PIX_FMT_RGBF32LE,
PixelFormat::Rgbf32Be => F::AV_PIX_FMT_RGBF32BE,
PixelFormat::Rgbaf16Le => F::AV_PIX_FMT_RGBAF16LE,
PixelFormat::Rgbaf16Be => F::AV_PIX_FMT_RGBAF16BE,
PixelFormat::Rgbaf32Le => F::AV_PIX_FMT_RGBAF32LE,
PixelFormat::Rgbaf32Be => F::AV_PIX_FMT_RGBAF32BE,
PixelFormat::Gbrp => F::AV_PIX_FMT_GBRP,
PixelFormat::Gbrp9Le => F::AV_PIX_FMT_GBRP9LE,
PixelFormat::Gbrp9Be => F::AV_PIX_FMT_GBRP9BE,
PixelFormat::Gbrp10Le => F::AV_PIX_FMT_GBRP10LE,
PixelFormat::Gbrp10Be => F::AV_PIX_FMT_GBRP10BE,
PixelFormat::Gbrp10MsbLe => F::AV_PIX_FMT_GBRP10MSBLE,
PixelFormat::Gbrp10MsbBe => F::AV_PIX_FMT_GBRP10MSBBE,
PixelFormat::Gbrp12Le => F::AV_PIX_FMT_GBRP12LE,
PixelFormat::Gbrp12Be => F::AV_PIX_FMT_GBRP12BE,
PixelFormat::Gbrp12MsbLe => F::AV_PIX_FMT_GBRP12MSBLE,
PixelFormat::Gbrp12MsbBe => F::AV_PIX_FMT_GBRP12MSBBE,
PixelFormat::Gbrp14Le => F::AV_PIX_FMT_GBRP14LE,
PixelFormat::Gbrp14Be => F::AV_PIX_FMT_GBRP14BE,
PixelFormat::Gbrp16Le => F::AV_PIX_FMT_GBRP16LE,
PixelFormat::Gbrp16Be => F::AV_PIX_FMT_GBRP16BE,
PixelFormat::Gbrpf16Le => F::AV_PIX_FMT_GBRPF16LE,
PixelFormat::Gbrpf16Be => F::AV_PIX_FMT_GBRPF16BE,
PixelFormat::Gbrpf32Le => F::AV_PIX_FMT_GBRPF32LE,
PixelFormat::Gbrpf32Be => F::AV_PIX_FMT_GBRPF32BE,
PixelFormat::Gbrap => F::AV_PIX_FMT_GBRAP,
PixelFormat::Gbrap10Le => F::AV_PIX_FMT_GBRAP10LE,
PixelFormat::Gbrap10Be => F::AV_PIX_FMT_GBRAP10BE,
PixelFormat::Gbrap12Le => F::AV_PIX_FMT_GBRAP12LE,
PixelFormat::Gbrap12Be => F::AV_PIX_FMT_GBRAP12BE,
PixelFormat::Gbrap14Le => F::AV_PIX_FMT_GBRAP14LE,
PixelFormat::Gbrap14Be => F::AV_PIX_FMT_GBRAP14BE,
PixelFormat::Gbrap16Le => F::AV_PIX_FMT_GBRAP16LE,
PixelFormat::Gbrap16Be => F::AV_PIX_FMT_GBRAP16BE,
PixelFormat::Gbrap32Le => F::AV_PIX_FMT_GBRAP32LE,
PixelFormat::Gbrap32Be => F::AV_PIX_FMT_GBRAP32BE,
PixelFormat::Gbrapf16Le => F::AV_PIX_FMT_GBRAPF16LE,
PixelFormat::Gbrapf16Be => F::AV_PIX_FMT_GBRAPF16BE,
PixelFormat::Gbrapf32Le => F::AV_PIX_FMT_GBRAPF32LE,
PixelFormat::Gbrapf32Be => F::AV_PIX_FMT_GBRAPF32BE,
PixelFormat::Gray8 => F::AV_PIX_FMT_GRAY8,
PixelFormat::Gray9Le => F::AV_PIX_FMT_GRAY9LE,
PixelFormat::Gray9Be => F::AV_PIX_FMT_GRAY9BE,
PixelFormat::Gray10Le => F::AV_PIX_FMT_GRAY10LE,
PixelFormat::Gray10Be => F::AV_PIX_FMT_GRAY10BE,
PixelFormat::Gray12Le => F::AV_PIX_FMT_GRAY12LE,
PixelFormat::Gray12Be => F::AV_PIX_FMT_GRAY12BE,
PixelFormat::Gray14Le => F::AV_PIX_FMT_GRAY14LE,
PixelFormat::Gray14Be => F::AV_PIX_FMT_GRAY14BE,
PixelFormat::Gray16Le => F::AV_PIX_FMT_GRAY16LE,
PixelFormat::Gray16Be => F::AV_PIX_FMT_GRAY16BE,
PixelFormat::Gray32Le => F::AV_PIX_FMT_GRAY32LE,
PixelFormat::Gray32Be => F::AV_PIX_FMT_GRAY32BE,
PixelFormat::Grayf16Le => F::AV_PIX_FMT_GRAYF16LE,
PixelFormat::Grayf16Be => F::AV_PIX_FMT_GRAYF16BE,
PixelFormat::Grayf32Le => F::AV_PIX_FMT_GRAYF32LE,
PixelFormat::Grayf32Be => F::AV_PIX_FMT_GRAYF32BE,
PixelFormat::Ya8 | PixelFormat::Gray8a | PixelFormat::Y400a => F::AV_PIX_FMT_YA8,
PixelFormat::Ya16Le => F::AV_PIX_FMT_YA16LE,
PixelFormat::Ya16Be => F::AV_PIX_FMT_YA16BE,
PixelFormat::Yaf16Le => F::AV_PIX_FMT_YAF16LE,
PixelFormat::Yaf16Be => F::AV_PIX_FMT_YAF16BE,
PixelFormat::Yaf32Le => F::AV_PIX_FMT_YAF32LE,
PixelFormat::Yaf32Be => F::AV_PIX_FMT_YAF32BE,
PixelFormat::Monowhite => F::AV_PIX_FMT_MONOWHITE,
PixelFormat::Monoblack => F::AV_PIX_FMT_MONOBLACK,
PixelFormat::Pal8 => F::AV_PIX_FMT_PAL8,
PixelFormat::Rgb4 => F::AV_PIX_FMT_RGB4,
PixelFormat::Rgb4Byte => F::AV_PIX_FMT_RGB4_BYTE,
PixelFormat::Rgb8 => F::AV_PIX_FMT_RGB8,
PixelFormat::Bgr4 => F::AV_PIX_FMT_BGR4,
PixelFormat::Bgr4Byte => F::AV_PIX_FMT_BGR4_BYTE,
PixelFormat::Bgr8 => F::AV_PIX_FMT_BGR8,
PixelFormat::Rgb444Le => F::AV_PIX_FMT_RGB444LE,
PixelFormat::Rgb444Be => F::AV_PIX_FMT_RGB444BE,
PixelFormat::Bgr444Le => F::AV_PIX_FMT_BGR444LE,
PixelFormat::Bgr444Be => F::AV_PIX_FMT_BGR444BE,
PixelFormat::Rgb555Le => F::AV_PIX_FMT_RGB555LE,
PixelFormat::Rgb555Be => F::AV_PIX_FMT_RGB555BE,
PixelFormat::Bgr555Le => F::AV_PIX_FMT_BGR555LE,
PixelFormat::Bgr555Be => F::AV_PIX_FMT_BGR555BE,
PixelFormat::Rgb565Le => F::AV_PIX_FMT_RGB565LE,
PixelFormat::Rgb565Be => F::AV_PIX_FMT_RGB565BE,
PixelFormat::Bgr565Le => F::AV_PIX_FMT_BGR565LE,
PixelFormat::Bgr565Be => F::AV_PIX_FMT_BGR565BE,
PixelFormat::BayerBggr8 => F::AV_PIX_FMT_BAYER_BGGR8,
PixelFormat::BayerRggb8 => F::AV_PIX_FMT_BAYER_RGGB8,
PixelFormat::BayerGbrg8 => F::AV_PIX_FMT_BAYER_GBRG8,
PixelFormat::BayerGrbg8 => F::AV_PIX_FMT_BAYER_GRBG8,
PixelFormat::BayerBggr16Le => F::AV_PIX_FMT_BAYER_BGGR16LE,
PixelFormat::BayerBggr16Be => F::AV_PIX_FMT_BAYER_BGGR16BE,
PixelFormat::BayerRggb16Le => F::AV_PIX_FMT_BAYER_RGGB16LE,
PixelFormat::BayerRggb16Be => F::AV_PIX_FMT_BAYER_RGGB16BE,
PixelFormat::BayerGbrg16Le => F::AV_PIX_FMT_BAYER_GBRG16LE,
PixelFormat::BayerGbrg16Be => F::AV_PIX_FMT_BAYER_GBRG16BE,
PixelFormat::BayerGrbg16Le => F::AV_PIX_FMT_BAYER_GRBG16LE,
PixelFormat::BayerGrbg16Be => F::AV_PIX_FMT_BAYER_GRBG16BE,
_ => return None,
})
}
#[cfg(test)]
mod tests;