util: move SampleFormat and PixelFormat to util::format

This commit is contained in:
meh
2015-05-13 23:36:08 +02:00
parent e48ee1e3eb
commit 5c402a1256
7 changed files with 767 additions and 764 deletions

5
src/util/format/mod.rs Normal file
View File

@ -0,0 +1,5 @@
pub mod sample;
pub use self::sample::Sample;
pub mod pixel;
pub use self::pixel::Pixel;

718
src/util/format/pixel.rs Normal file
View File

@ -0,0 +1,718 @@
use ffi::*;
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub enum Pixel {
None,
YUV420P,
YUYV422,
RGB24,
BGR24,
YUV422P,
YUV444P,
YUV410P,
YUV411P,
GRAY8,
MonoWhite,
MonoBlack,
PAL8,
YUVJ420P,
YUVJ422P,
YUVJ444P,
XVMC_MPEG2_MC,
XVMC_MPEG2_IDCT,
UYVY422,
UYYVYY411,
BGR8,
BGR4,
BGR4_BYTE,
RGB8,
RGB4,
RGB4_BYTE,
NV12,
NV21,
ARGB,
RGBA,
ABGR,
BGRA,
GRAY16BE,
GRAY16LE,
YUV440P,
YUVJ440P,
YUVA420P,
VDPAU_H264,
VDPAU_MPEG1,
VDPAU_MPEG2,
VDPAU_WMV3,
VDPAU_VC1,
RGB48BE,
RGB48LE,
RGB565BE,
RGB565LE,
RGB555BE,
RGB555LE,
BGR565BE,
BGR565LE,
BGR555BE,
BGR555LE,
VAAPI_MOCO,
VAAPI_IDCT,
VAAPI_VLD,
YUV420P16LE,
YUV420P16BE,
YUV422P16LE,
YUV422P16BE,
YUV444P16LE,
YUV444P16BE,
VDPAU_MPEG4,
DXVA2_VLD,
RGB444LE,
RGB444BE,
BGR444LE,
BGR444BE,
YA8,
BGR48BE,
BGR48LE,
YUV420P9BE,
YUV420P9LE,
YUV420P10BE,
YUV420P10LE,
YUV422P10BE,
YUV422P10LE,
YUV444P9BE,
YUV444P9LE,
YUV444P10BE,
YUV444P10LE,
YUV422P9BE,
YUV422P9LE,
VDA_VLD,
GBRP,
GBRP9BE,
GBRP9LE,
GBRP10BE,
GBRP10LE,
GBRP16BE,
GBRP16LE,
YUVA422P_LIBAV,
YUVA444P_LIBAV,
YUVA420P9BE,
YUVA420P9LE,
YUVA422P9BE,
YUVA422P9LE,
YUVA444P9BE,
YUVA444P9LE,
YUVA420P10BE,
YUVA420P10LE,
YUVA422P10BE,
YUVA422P10LE,
YUVA444P10BE,
YUVA444P10LE,
YUVA420P16BE,
YUVA420P16LE,
YUVA422P16BE,
YUVA422P16LE,
YUVA444P16BE,
YUVA444P16LE,
VDPAU,
XYZ12LE,
XYZ12BE,
NV16,
NV20LE,
NV20BE,
RGBA64BE_LIBAV,
RGBA64LE_LIBAV,
BGRA64BE_LIBAV,
BGRA64LE_LIBAV,
YVYU422,
VDA,
YA16BE,
YA16LE,
GBRAP_LIBAV,
GBRAP16BE_LIBAV,
GBRAP16LE_LIBAV,
QSV,
ZRGB,
RGBZ,
ZBGR,
BGRZ,
YUVA444P,
YUVA422P,
YUV420P12BE,
YUV420P12LE,
YUV420P14BE,
YUV420P14LE,
YUV422P12BE,
YUV422P12LE,
YUV422P14BE,
YUV422P14LE,
YUV444P12BE,
YUV444P12LE,
YUV444P14BE,
YUV444P14LE,
GBRP12BE,
GBRP12LE,
GBRP14BE,
GBRP14LE,
GBRAP,
GBRAP16BE,
GBRAP16LE,
YUVJ411P,
BAYER_BGGR8,
BAYER_RGGB8,
BAYER_GBRG8,
BAYER_GRBG8,
BAYER_BGGR16LE,
BAYER_BGGR16BE,
BAYER_RGGB16LE,
BAYER_RGGB16BE,
BAYER_GBRG16LE,
BAYER_GBRG16BE,
BAYER_GRBG16LE,
BAYER_GRBG16BE,
// --- defaults
XVMC,
Y400A,
GRAY8A,
GBR24P,
RGB32,
RGB32_1,
BGR32,
BGR32_1,
ZRGB32,
ZBGR32,
GRAY16,
YA16,
RGB48,
RGB565,
RGB555,
RGB444,
BGR48,
BGR565,
BGR555,
BGR444,
YUV420P9,
YUV422P9,
YUV444P9,
YUV420P10,
YUV422P10,
YUV444P10,
YUV420P12,
YUV422P12,
YUV444P12,
YUV420P14,
YUV422P14,
YUV444P14,
YUV420P16,
YUV422P16,
YUV444P16,
GBRP9,
GBRP10,
GBRP12,
GBRP14,
GBRP16,
GBRAP16,
BAYER_BGGR16,
BAYER_RGGB16,
BAYER_GBRG16,
BAYER_GRBG16,
YUVA420P9,
YUVA422P9,
YUVA444P9,
YUVA420P10,
YUVA422P10,
YUVA444P10,
YUVA420P16,
YUVA422P16,
YUVA444P16,
XYZ12,
NV20,
}
impl From<AVPixelFormat> for Pixel {
fn from(value: AVPixelFormat) -> Self {
match value {
AV_PIX_FMT_NONE => Pixel::None,
AV_PIX_FMT_YUV420P => Pixel::YUV420P,
AV_PIX_FMT_YUYV422 => Pixel::YUYV422,
AV_PIX_FMT_RGB24 => Pixel::RGB24,
AV_PIX_FMT_BGR24 => Pixel::BGR24,
AV_PIX_FMT_YUV422P => Pixel::YUV422P,
AV_PIX_FMT_YUV444P => Pixel::YUV444P,
AV_PIX_FMT_YUV410P => Pixel::YUV410P,
AV_PIX_FMT_YUV411P => Pixel::YUV411P,
AV_PIX_FMT_GRAY8 => Pixel::GRAY8,
AV_PIX_FMT_MONOWHITE => Pixel::MonoWhite,
AV_PIX_FMT_MONOBLACK => Pixel::MonoBlack,
AV_PIX_FMT_PAL8 => Pixel::PAL8,
AV_PIX_FMT_YUVJ420P => Pixel::YUVJ420P,
AV_PIX_FMT_YUVJ422P => Pixel::YUVJ422P,
AV_PIX_FMT_YUVJ444P => Pixel::YUVJ444P,
AV_PIX_FMT_XVMC_MPEG2_MC => Pixel::XVMC_MPEG2_MC,
AV_PIX_FMT_XVMC_MPEG2_IDCT => Pixel::XVMC_MPEG2_IDCT,
AV_PIX_FMT_UYVY422 => Pixel::UYVY422,
AV_PIX_FMT_UYYVYY411 => Pixel::UYYVYY411,
AV_PIX_FMT_BGR8 => Pixel::BGR8,
AV_PIX_FMT_BGR4 => Pixel::BGR4,
AV_PIX_FMT_BGR4_BYTE => Pixel::BGR4_BYTE,
AV_PIX_FMT_RGB8 => Pixel::RGB8,
AV_PIX_FMT_RGB4 => Pixel::RGB4,
AV_PIX_FMT_RGB4_BYTE => Pixel::RGB4_BYTE,
AV_PIX_FMT_NV12 => Pixel::NV12,
AV_PIX_FMT_NV21 => Pixel::NV21,
AV_PIX_FMT_ARGB => Pixel::ARGB,
AV_PIX_FMT_RGBA => Pixel::RGBA,
AV_PIX_FMT_ABGR => Pixel::ABGR,
AV_PIX_FMT_BGRA => Pixel::BGRA,
AV_PIX_FMT_GRAY16BE => Pixel::GRAY16BE,
AV_PIX_FMT_GRAY16LE => Pixel::GRAY16LE,
AV_PIX_FMT_YUV440P => Pixel::YUV440P,
AV_PIX_FMT_YUVJ440P => Pixel::YUVJ440P,
AV_PIX_FMT_YUVA420P => Pixel::YUVA420P,
AV_PIX_FMT_VDPAU_H264 => Pixel::VDPAU_H264,
AV_PIX_FMT_VDPAU_MPEG1 => Pixel::VDPAU_MPEG1,
AV_PIX_FMT_VDPAU_MPEG2 => Pixel::VDPAU_MPEG2,
AV_PIX_FMT_VDPAU_WMV3 => Pixel::VDPAU_WMV3,
AV_PIX_FMT_VDPAU_VC1 => Pixel::VDPAU_VC1,
AV_PIX_FMT_RGB48BE => Pixel::RGB48BE,
AV_PIX_FMT_RGB48LE => Pixel::RGB48LE,
AV_PIX_FMT_RGB565BE => Pixel::RGB565BE,
AV_PIX_FMT_RGB565LE => Pixel::RGB565LE,
AV_PIX_FMT_RGB555BE => Pixel::RGB555BE,
AV_PIX_FMT_RGB555LE => Pixel::RGB555LE,
AV_PIX_FMT_BGR565BE => Pixel::BGR565BE,
AV_PIX_FMT_BGR565LE => Pixel::BGR565LE,
AV_PIX_FMT_BGR555BE => Pixel::BGR555BE,
AV_PIX_FMT_BGR555LE => Pixel::BGR555LE,
AV_PIX_FMT_VAAPI_MOCO => Pixel::VAAPI_MOCO,
AV_PIX_FMT_VAAPI_IDCT => Pixel::VAAPI_IDCT,
AV_PIX_FMT_VAAPI_VLD => Pixel::VAAPI_VLD,
AV_PIX_FMT_YUV420P16LE => Pixel::YUV420P16LE,
AV_PIX_FMT_YUV420P16BE => Pixel::YUV420P16BE,
AV_PIX_FMT_YUV422P16LE => Pixel::YUV422P16LE,
AV_PIX_FMT_YUV422P16BE => Pixel::YUV422P16BE,
AV_PIX_FMT_YUV444P16LE => Pixel::YUV444P16LE,
AV_PIX_FMT_YUV444P16BE => Pixel::YUV444P16BE,
AV_PIX_FMT_VDPAU_MPEG4 => Pixel::VDPAU_MPEG4,
AV_PIX_FMT_DXVA2_VLD => Pixel::DXVA2_VLD,
AV_PIX_FMT_RGB444LE => Pixel::RGB444LE,
AV_PIX_FMT_RGB444BE => Pixel::RGB444BE,
AV_PIX_FMT_BGR444LE => Pixel::BGR444LE,
AV_PIX_FMT_BGR444BE => Pixel::BGR444BE,
AV_PIX_FMT_YA8 => Pixel::YA8,
AV_PIX_FMT_BGR48BE => Pixel::BGR48BE,
AV_PIX_FMT_BGR48LE => Pixel::BGR48LE,
AV_PIX_FMT_YUV420P9BE => Pixel::YUV420P9BE,
AV_PIX_FMT_YUV420P9LE => Pixel::YUV420P9LE,
AV_PIX_FMT_YUV420P10BE => Pixel::YUV420P10BE,
AV_PIX_FMT_YUV420P10LE => Pixel::YUV420P10LE,
AV_PIX_FMT_YUV422P10BE => Pixel::YUV422P10BE,
AV_PIX_FMT_YUV422P10LE => Pixel::YUV422P10LE,
AV_PIX_FMT_YUV444P9BE => Pixel::YUV444P9BE,
AV_PIX_FMT_YUV444P9LE => Pixel::YUV444P9LE,
AV_PIX_FMT_YUV444P10BE => Pixel::YUV444P10BE,
AV_PIX_FMT_YUV444P10LE => Pixel::YUV444P10LE,
AV_PIX_FMT_YUV422P9BE => Pixel::YUV422P9BE,
AV_PIX_FMT_YUV422P9LE => Pixel::YUV422P9LE,
AV_PIX_FMT_VDA_VLD => Pixel::VDA_VLD,
AV_PIX_FMT_GBRP => Pixel::GBRP,
AV_PIX_FMT_GBRP9BE => Pixel::GBRP9BE,
AV_PIX_FMT_GBRP9LE => Pixel::GBRP9LE,
AV_PIX_FMT_GBRP10BE => Pixel::GBRP10BE,
AV_PIX_FMT_GBRP10LE => Pixel::GBRP10LE,
AV_PIX_FMT_GBRP16BE => Pixel::GBRP16BE,
AV_PIX_FMT_GBRP16LE => Pixel::GBRP16LE,
AV_PIX_FMT_YUVA422P_LIBAV => Pixel::YUVA422P_LIBAV,
AV_PIX_FMT_YUVA444P_LIBAV => Pixel::YUVA444P_LIBAV,
AV_PIX_FMT_YUVA420P9BE => Pixel::YUVA420P9BE,
AV_PIX_FMT_YUVA420P9LE => Pixel::YUVA420P9LE,
AV_PIX_FMT_YUVA422P9BE => Pixel::YUVA422P9BE,
AV_PIX_FMT_YUVA422P9LE => Pixel::YUVA422P9LE,
AV_PIX_FMT_YUVA444P9BE => Pixel::YUVA444P9BE,
AV_PIX_FMT_YUVA444P9LE => Pixel::YUVA444P9LE,
AV_PIX_FMT_YUVA420P10BE => Pixel::YUVA420P10BE,
AV_PIX_FMT_YUVA420P10LE => Pixel::YUVA420P10LE,
AV_PIX_FMT_YUVA422P10BE => Pixel::YUVA422P10BE,
AV_PIX_FMT_YUVA422P10LE => Pixel::YUVA422P10LE,
AV_PIX_FMT_YUVA444P10BE => Pixel::YUVA444P10BE,
AV_PIX_FMT_YUVA444P10LE => Pixel::YUVA444P10LE,
AV_PIX_FMT_YUVA420P16BE => Pixel::YUVA420P16BE,
AV_PIX_FMT_YUVA420P16LE => Pixel::YUVA420P16LE,
AV_PIX_FMT_YUVA422P16BE => Pixel::YUVA422P16BE,
AV_PIX_FMT_YUVA422P16LE => Pixel::YUVA422P16LE,
AV_PIX_FMT_YUVA444P16BE => Pixel::YUVA444P16BE,
AV_PIX_FMT_YUVA444P16LE => Pixel::YUVA444P16LE,
AV_PIX_FMT_VDPAU => Pixel::VDPAU,
AV_PIX_FMT_XYZ12LE => Pixel::XYZ12LE,
AV_PIX_FMT_XYZ12BE => Pixel::XYZ12BE,
AV_PIX_FMT_NV16 => Pixel::NV16,
AV_PIX_FMT_NV20LE => Pixel::NV20LE,
AV_PIX_FMT_NV20BE => Pixel::NV20BE,
AV_PIX_FMT_RGBA64BE_LIBAV => Pixel::RGBA64BE_LIBAV,
AV_PIX_FMT_RGBA64LE_LIBAV => Pixel::RGBA64LE_LIBAV,
AV_PIX_FMT_BGRA64BE_LIBAV => Pixel::BGRA64BE_LIBAV,
AV_PIX_FMT_BGRA64LE_LIBAV => Pixel::BGRA64LE_LIBAV,
AV_PIX_FMT_YVYU422 => Pixel::YVYU422,
AV_PIX_FMT_VDA => Pixel::VDA,
AV_PIX_FMT_YA16BE => Pixel::YA16BE,
AV_PIX_FMT_YA16LE => Pixel::YA16LE,
AV_PIX_FMT_GBRAP_LIBAV => Pixel::GBRAP_LIBAV,
AV_PIX_FMT_GBRAP16BE_LIBAV => Pixel::GBRAP16BE_LIBAV,
AV_PIX_FMT_GBRAP16LE_LIBAV => Pixel::GBRAP16LE_LIBAV,
AV_PIX_FMT_QSV => Pixel::QSV,
AV_PIX_FMT_0RGB => Pixel::ZRGB,
AV_PIX_FMT_RGB0 => Pixel::RGBZ,
AV_PIX_FMT_0BGR => Pixel::ZBGR,
AV_PIX_FMT_BGR0 => Pixel::BGRZ,
AV_PIX_FMT_YUVA444P => Pixel::YUVA444P,
AV_PIX_FMT_YUVA422P => Pixel::YUVA422P,
AV_PIX_FMT_YUV420P12BE => Pixel::YUV420P12BE,
AV_PIX_FMT_YUV420P12LE => Pixel::YUV420P12LE,
AV_PIX_FMT_YUV420P14BE => Pixel::YUV420P14BE,
AV_PIX_FMT_YUV420P14LE => Pixel::YUV420P14LE,
AV_PIX_FMT_YUV422P12BE => Pixel::YUV422P12BE,
AV_PIX_FMT_YUV422P12LE => Pixel::YUV422P12LE,
AV_PIX_FMT_YUV422P14BE => Pixel::YUV422P14BE,
AV_PIX_FMT_YUV422P14LE => Pixel::YUV422P14LE,
AV_PIX_FMT_YUV444P12BE => Pixel::YUV444P12BE,
AV_PIX_FMT_YUV444P12LE => Pixel::YUV444P12LE,
AV_PIX_FMT_YUV444P14BE => Pixel::YUV444P14BE,
AV_PIX_FMT_YUV444P14LE => Pixel::YUV444P14LE,
AV_PIX_FMT_GBRP12BE => Pixel::GBRP12BE,
AV_PIX_FMT_GBRP12LE => Pixel::GBRP12LE,
AV_PIX_FMT_GBRP14BE => Pixel::GBRP14BE,
AV_PIX_FMT_GBRP14LE => Pixel::GBRP14LE,
AV_PIX_FMT_GBRAP => Pixel::GBRAP,
AV_PIX_FMT_GBRAP16BE => Pixel::GBRAP16BE,
AV_PIX_FMT_GBRAP16LE => Pixel::GBRAP16LE,
AV_PIX_FMT_YUVJ411P => Pixel::YUVJ411P,
AV_PIX_FMT_BAYER_BGGR8 => Pixel::BAYER_BGGR8,
AV_PIX_FMT_BAYER_RGGB8 => Pixel::BAYER_RGGB8,
AV_PIX_FMT_BAYER_GBRG8 => Pixel::BAYER_GBRG8,
AV_PIX_FMT_BAYER_GRBG8 => Pixel::BAYER_GRBG8,
AV_PIX_FMT_BAYER_BGGR16LE => Pixel::BAYER_BGGR16LE,
AV_PIX_FMT_BAYER_BGGR16BE => Pixel::BAYER_BGGR16BE,
AV_PIX_FMT_BAYER_RGGB16LE => Pixel::BAYER_RGGB16LE,
AV_PIX_FMT_BAYER_RGGB16BE => Pixel::BAYER_RGGB16BE,
AV_PIX_FMT_BAYER_GBRG16LE => Pixel::BAYER_GBRG16LE,
AV_PIX_FMT_BAYER_GBRG16BE => Pixel::BAYER_GBRG16BE,
AV_PIX_FMT_BAYER_GRBG16LE => Pixel::BAYER_GRBG16LE,
AV_PIX_FMT_BAYER_GRBG16BE => Pixel::BAYER_GRBG16BE,
AV_PIX_FMT_NB => Pixel::None
}
}
}
impl Into<AVPixelFormat> for Pixel {
fn into(self) -> AVPixelFormat {
match self {
Pixel::None => AV_PIX_FMT_NONE,
Pixel::YUV420P => AV_PIX_FMT_YUV420P,
Pixel::YUYV422 => AV_PIX_FMT_YUYV422,
Pixel::RGB24 => AV_PIX_FMT_RGB24,
Pixel::BGR24 => AV_PIX_FMT_BGR24,
Pixel::YUV422P => AV_PIX_FMT_YUV422P,
Pixel::YUV444P => AV_PIX_FMT_YUV444P,
Pixel::YUV410P => AV_PIX_FMT_YUV410P,
Pixel::YUV411P => AV_PIX_FMT_YUV411P,
Pixel::GRAY8 => AV_PIX_FMT_GRAY8,
Pixel::MonoWhite => AV_PIX_FMT_MONOWHITE,
Pixel::MonoBlack => AV_PIX_FMT_MONOBLACK,
Pixel::PAL8 => AV_PIX_FMT_PAL8,
Pixel::YUVJ420P => AV_PIX_FMT_YUVJ420P,
Pixel::YUVJ422P => AV_PIX_FMT_YUVJ422P,
Pixel::YUVJ444P => AV_PIX_FMT_YUVJ444P,
Pixel::XVMC_MPEG2_MC => AV_PIX_FMT_XVMC_MPEG2_MC,
Pixel::XVMC_MPEG2_IDCT => AV_PIX_FMT_XVMC_MPEG2_IDCT,
Pixel::UYVY422 => AV_PIX_FMT_UYVY422,
Pixel::UYYVYY411 => AV_PIX_FMT_UYYVYY411,
Pixel::BGR8 => AV_PIX_FMT_BGR8,
Pixel::BGR4 => AV_PIX_FMT_BGR4,
Pixel::BGR4_BYTE => AV_PIX_FMT_BGR4_BYTE,
Pixel::RGB8 => AV_PIX_FMT_RGB8,
Pixel::RGB4 => AV_PIX_FMT_RGB4,
Pixel::RGB4_BYTE => AV_PIX_FMT_RGB4_BYTE,
Pixel::NV12 => AV_PIX_FMT_NV12,
Pixel::NV21 => AV_PIX_FMT_NV21,
Pixel::ARGB => AV_PIX_FMT_ARGB,
Pixel::RGBA => AV_PIX_FMT_RGBA,
Pixel::ABGR => AV_PIX_FMT_ABGR,
Pixel::BGRA => AV_PIX_FMT_BGRA,
Pixel::GRAY16BE => AV_PIX_FMT_GRAY16BE,
Pixel::GRAY16LE => AV_PIX_FMT_GRAY16LE,
Pixel::YUV440P => AV_PIX_FMT_YUV440P,
Pixel::YUVJ440P => AV_PIX_FMT_YUVJ440P,
Pixel::YUVA420P => AV_PIX_FMT_YUVA420P,
Pixel::VDPAU_H264 => AV_PIX_FMT_VDPAU_H264,
Pixel::VDPAU_MPEG1 => AV_PIX_FMT_VDPAU_MPEG1,
Pixel::VDPAU_MPEG2 => AV_PIX_FMT_VDPAU_MPEG2,
Pixel::VDPAU_WMV3 => AV_PIX_FMT_VDPAU_WMV3,
Pixel::VDPAU_VC1 => AV_PIX_FMT_VDPAU_VC1,
Pixel::RGB48BE => AV_PIX_FMT_RGB48BE,
Pixel::RGB48LE => AV_PIX_FMT_RGB48LE,
Pixel::RGB565BE => AV_PIX_FMT_RGB565BE,
Pixel::RGB565LE => AV_PIX_FMT_RGB565LE,
Pixel::RGB555BE => AV_PIX_FMT_RGB555BE,
Pixel::RGB555LE => AV_PIX_FMT_RGB555LE,
Pixel::BGR565BE => AV_PIX_FMT_BGR565BE,
Pixel::BGR565LE => AV_PIX_FMT_BGR565LE,
Pixel::BGR555BE => AV_PIX_FMT_BGR555BE,
Pixel::BGR555LE => AV_PIX_FMT_BGR555LE,
Pixel::VAAPI_MOCO => AV_PIX_FMT_VAAPI_MOCO,
Pixel::VAAPI_IDCT => AV_PIX_FMT_VAAPI_IDCT,
Pixel::VAAPI_VLD => AV_PIX_FMT_VAAPI_VLD,
Pixel::YUV420P16LE => AV_PIX_FMT_YUV420P16LE,
Pixel::YUV420P16BE => AV_PIX_FMT_YUV420P16BE,
Pixel::YUV422P16LE => AV_PIX_FMT_YUV422P16LE,
Pixel::YUV422P16BE => AV_PIX_FMT_YUV422P16BE,
Pixel::YUV444P16LE => AV_PIX_FMT_YUV444P16LE,
Pixel::YUV444P16BE => AV_PIX_FMT_YUV444P16BE,
Pixel::VDPAU_MPEG4 => AV_PIX_FMT_VDPAU_MPEG4,
Pixel::DXVA2_VLD => AV_PIX_FMT_DXVA2_VLD,
Pixel::RGB444LE => AV_PIX_FMT_RGB444LE,
Pixel::RGB444BE => AV_PIX_FMT_RGB444BE,
Pixel::BGR444LE => AV_PIX_FMT_BGR444LE,
Pixel::BGR444BE => AV_PIX_FMT_BGR444BE,
Pixel::YA8 => AV_PIX_FMT_YA8,
Pixel::BGR48BE => AV_PIX_FMT_BGR48BE,
Pixel::BGR48LE => AV_PIX_FMT_BGR48LE,
Pixel::YUV420P9BE => AV_PIX_FMT_YUV420P9BE,
Pixel::YUV420P9LE => AV_PIX_FMT_YUV420P9LE,
Pixel::YUV420P10BE => AV_PIX_FMT_YUV420P10BE,
Pixel::YUV420P10LE => AV_PIX_FMT_YUV420P10LE,
Pixel::YUV422P10BE => AV_PIX_FMT_YUV422P10BE,
Pixel::YUV422P10LE => AV_PIX_FMT_YUV422P10LE,
Pixel::YUV444P9BE => AV_PIX_FMT_YUV444P9BE,
Pixel::YUV444P9LE => AV_PIX_FMT_YUV444P9LE,
Pixel::YUV444P10BE => AV_PIX_FMT_YUV444P10BE,
Pixel::YUV444P10LE => AV_PIX_FMT_YUV444P10LE,
Pixel::YUV422P9BE => AV_PIX_FMT_YUV422P9BE,
Pixel::YUV422P9LE => AV_PIX_FMT_YUV422P9LE,
Pixel::VDA_VLD => AV_PIX_FMT_VDA_VLD,
Pixel::GBRP => AV_PIX_FMT_GBRP,
Pixel::GBRP9BE => AV_PIX_FMT_GBRP9BE,
Pixel::GBRP9LE => AV_PIX_FMT_GBRP9LE,
Pixel::GBRP10BE => AV_PIX_FMT_GBRP10BE,
Pixel::GBRP10LE => AV_PIX_FMT_GBRP10LE,
Pixel::GBRP16BE => AV_PIX_FMT_GBRP16BE,
Pixel::GBRP16LE => AV_PIX_FMT_GBRP16LE,
Pixel::YUVA422P_LIBAV => AV_PIX_FMT_YUVA422P_LIBAV,
Pixel::YUVA444P_LIBAV => AV_PIX_FMT_YUVA444P_LIBAV,
Pixel::YUVA420P9BE => AV_PIX_FMT_YUVA420P9BE,
Pixel::YUVA420P9LE => AV_PIX_FMT_YUVA420P9LE,
Pixel::YUVA422P9BE => AV_PIX_FMT_YUVA422P9BE,
Pixel::YUVA422P9LE => AV_PIX_FMT_YUVA422P9LE,
Pixel::YUVA444P9BE => AV_PIX_FMT_YUVA444P9BE,
Pixel::YUVA444P9LE => AV_PIX_FMT_YUVA444P9LE,
Pixel::YUVA420P10BE => AV_PIX_FMT_YUVA420P10BE,
Pixel::YUVA420P10LE => AV_PIX_FMT_YUVA420P10LE,
Pixel::YUVA422P10BE => AV_PIX_FMT_YUVA422P10BE,
Pixel::YUVA422P10LE => AV_PIX_FMT_YUVA422P10LE,
Pixel::YUVA444P10BE => AV_PIX_FMT_YUVA444P10BE,
Pixel::YUVA444P10LE => AV_PIX_FMT_YUVA444P10LE,
Pixel::YUVA420P16BE => AV_PIX_FMT_YUVA420P16BE,
Pixel::YUVA420P16LE => AV_PIX_FMT_YUVA420P16LE,
Pixel::YUVA422P16BE => AV_PIX_FMT_YUVA422P16BE,
Pixel::YUVA422P16LE => AV_PIX_FMT_YUVA422P16LE,
Pixel::YUVA444P16BE => AV_PIX_FMT_YUVA444P16BE,
Pixel::YUVA444P16LE => AV_PIX_FMT_YUVA444P16LE,
Pixel::VDPAU => AV_PIX_FMT_VDPAU,
Pixel::XYZ12LE => AV_PIX_FMT_XYZ12LE,
Pixel::XYZ12BE => AV_PIX_FMT_XYZ12BE,
Pixel::NV16 => AV_PIX_FMT_NV16,
Pixel::NV20LE => AV_PIX_FMT_NV20LE,
Pixel::NV20BE => AV_PIX_FMT_NV20BE,
Pixel::RGBA64BE_LIBAV => AV_PIX_FMT_RGBA64BE_LIBAV,
Pixel::RGBA64LE_LIBAV => AV_PIX_FMT_RGBA64LE_LIBAV,
Pixel::BGRA64BE_LIBAV => AV_PIX_FMT_BGRA64BE_LIBAV,
Pixel::BGRA64LE_LIBAV => AV_PIX_FMT_BGRA64LE_LIBAV,
Pixel::YVYU422 => AV_PIX_FMT_YVYU422,
Pixel::VDA => AV_PIX_FMT_VDA,
Pixel::YA16BE => AV_PIX_FMT_YA16BE,
Pixel::YA16LE => AV_PIX_FMT_YA16LE,
Pixel::GBRAP_LIBAV => AV_PIX_FMT_GBRAP_LIBAV,
Pixel::GBRAP16BE_LIBAV => AV_PIX_FMT_GBRAP16BE_LIBAV,
Pixel::GBRAP16LE_LIBAV => AV_PIX_FMT_GBRAP16LE_LIBAV,
Pixel::QSV => AV_PIX_FMT_QSV,
Pixel::ZRGB => AV_PIX_FMT_0RGB,
Pixel::RGBZ => AV_PIX_FMT_RGB0,
Pixel::ZBGR => AV_PIX_FMT_0BGR,
Pixel::BGRZ => AV_PIX_FMT_BGR0,
Pixel::YUVA444P => AV_PIX_FMT_YUVA444P,
Pixel::YUVA422P => AV_PIX_FMT_YUVA422P,
Pixel::YUV420P12BE => AV_PIX_FMT_YUV420P12BE,
Pixel::YUV420P12LE => AV_PIX_FMT_YUV420P12LE,
Pixel::YUV420P14BE => AV_PIX_FMT_YUV420P14BE,
Pixel::YUV420P14LE => AV_PIX_FMT_YUV420P14LE,
Pixel::YUV422P12BE => AV_PIX_FMT_YUV422P12BE,
Pixel::YUV422P12LE => AV_PIX_FMT_YUV422P12LE,
Pixel::YUV422P14BE => AV_PIX_FMT_YUV422P14BE,
Pixel::YUV422P14LE => AV_PIX_FMT_YUV422P14LE,
Pixel::YUV444P12BE => AV_PIX_FMT_YUV444P12BE,
Pixel::YUV444P12LE => AV_PIX_FMT_YUV444P12LE,
Pixel::YUV444P14BE => AV_PIX_FMT_YUV444P14BE,
Pixel::YUV444P14LE => AV_PIX_FMT_YUV444P14LE,
Pixel::GBRP12BE => AV_PIX_FMT_GBRP12BE,
Pixel::GBRP12LE => AV_PIX_FMT_GBRP12LE,
Pixel::GBRP14BE => AV_PIX_FMT_GBRP14BE,
Pixel::GBRP14LE => AV_PIX_FMT_GBRP14LE,
Pixel::GBRAP => AV_PIX_FMT_GBRAP,
Pixel::GBRAP16BE => AV_PIX_FMT_GBRAP16BE,
Pixel::GBRAP16LE => AV_PIX_FMT_GBRAP16LE,
Pixel::YUVJ411P => AV_PIX_FMT_YUVJ411P,
Pixel::BAYER_BGGR8 => AV_PIX_FMT_BAYER_BGGR8,
Pixel::BAYER_RGGB8 => AV_PIX_FMT_BAYER_RGGB8,
Pixel::BAYER_GBRG8 => AV_PIX_FMT_BAYER_GBRG8,
Pixel::BAYER_GRBG8 => AV_PIX_FMT_BAYER_GRBG8,
Pixel::BAYER_BGGR16LE => AV_PIX_FMT_BAYER_BGGR16LE,
Pixel::BAYER_BGGR16BE => AV_PIX_FMT_BAYER_BGGR16BE,
Pixel::BAYER_RGGB16LE => AV_PIX_FMT_BAYER_RGGB16LE,
Pixel::BAYER_RGGB16BE => AV_PIX_FMT_BAYER_RGGB16BE,
Pixel::BAYER_GBRG16LE => AV_PIX_FMT_BAYER_GBRG16LE,
Pixel::BAYER_GBRG16BE => AV_PIX_FMT_BAYER_GBRG16BE,
Pixel::BAYER_GRBG16LE => AV_PIX_FMT_BAYER_GRBG16LE,
Pixel::BAYER_GRBG16BE => AV_PIX_FMT_BAYER_GRBG16BE,
// --- defaults
Pixel::XVMC => AV_PIX_FMT_XVMC,
Pixel::Y400A => AV_PIX_FMT_Y400A,
Pixel::GRAY8A => AV_PIX_FMT_GRAY8A,
Pixel::GBR24P => AV_PIX_FMT_GBR24P,
Pixel::RGB32 => AV_PIX_FMT_RGB32,
Pixel::RGB32_1 => AV_PIX_FMT_RGB32_1,
Pixel::BGR32 => AV_PIX_FMT_BGR32,
Pixel::BGR32_1 => AV_PIX_FMT_BGR32_1,
Pixel::ZRGB32 => AV_PIX_FMT_0RGB32,
Pixel::ZBGR32 => AV_PIX_FMT_0BGR32,
Pixel::GRAY16 => AV_PIX_FMT_GRAY16,
Pixel::YA16 => AV_PIX_FMT_YA16,
Pixel::RGB48 => AV_PIX_FMT_RGB48,
Pixel::RGB565 => AV_PIX_FMT_RGB565,
Pixel::RGB555 => AV_PIX_FMT_RGB555,
Pixel::RGB444 => AV_PIX_FMT_RGB444,
Pixel::BGR48 => AV_PIX_FMT_BGR48,
Pixel::BGR565 => AV_PIX_FMT_BGR565,
Pixel::BGR555 => AV_PIX_FMT_BGR555,
Pixel::BGR444 => AV_PIX_FMT_BGR444,
Pixel::YUV420P9 => AV_PIX_FMT_YUV420P9,
Pixel::YUV422P9 => AV_PIX_FMT_YUV422P9,
Pixel::YUV444P9 => AV_PIX_FMT_YUV444P9,
Pixel::YUV420P10 => AV_PIX_FMT_YUV420P10,
Pixel::YUV422P10 => AV_PIX_FMT_YUV422P10,
Pixel::YUV444P10 => AV_PIX_FMT_YUV444P10,
Pixel::YUV420P12 => AV_PIX_FMT_YUV420P12,
Pixel::YUV422P12 => AV_PIX_FMT_YUV422P12,
Pixel::YUV444P12 => AV_PIX_FMT_YUV444P12,
Pixel::YUV420P14 => AV_PIX_FMT_YUV420P14,
Pixel::YUV422P14 => AV_PIX_FMT_YUV422P14,
Pixel::YUV444P14 => AV_PIX_FMT_YUV444P14,
Pixel::YUV420P16 => AV_PIX_FMT_YUV420P16,
Pixel::YUV422P16 => AV_PIX_FMT_YUV422P16,
Pixel::YUV444P16 => AV_PIX_FMT_YUV444P16,
Pixel::GBRP9 => AV_PIX_FMT_GBRP9,
Pixel::GBRP10 => AV_PIX_FMT_GBRP10,
Pixel::GBRP12 => AV_PIX_FMT_GBRP12,
Pixel::GBRP14 => AV_PIX_FMT_GBRP14,
Pixel::GBRP16 => AV_PIX_FMT_GBRP16,
Pixel::GBRAP16 => AV_PIX_FMT_GBRAP16,
Pixel::BAYER_BGGR16 => AV_PIX_FMT_BAYER_BGGR16,
Pixel::BAYER_RGGB16 => AV_PIX_FMT_BAYER_RGGB16,
Pixel::BAYER_GBRG16 => AV_PIX_FMT_BAYER_GBRG16,
Pixel::BAYER_GRBG16 => AV_PIX_FMT_BAYER_GRBG16,
Pixel::YUVA420P9 => AV_PIX_FMT_YUVA420P9,
Pixel::YUVA422P9 => AV_PIX_FMT_YUVA422P9,
Pixel::YUVA444P9 => AV_PIX_FMT_YUVA444P9,
Pixel::YUVA420P10 => AV_PIX_FMT_YUVA420P10,
Pixel::YUVA422P10 => AV_PIX_FMT_YUVA422P10,
Pixel::YUVA444P10 => AV_PIX_FMT_YUVA444P10,
Pixel::YUVA420P16 => AV_PIX_FMT_YUVA420P16,
Pixel::YUVA422P16 => AV_PIX_FMT_YUVA422P16,
Pixel::YUVA444P16 => AV_PIX_FMT_YUVA444P16,
Pixel::XYZ12 => AV_PIX_FMT_XYZ12,
Pixel::NV20 => AV_PIX_FMT_NV20,
}
}
}

184
src/util/format/sample.rs Normal file
View File

@ -0,0 +1,184 @@
use std::ffi::{CStr, CString};
use std::str::from_utf8_unchecked;
use std::ops::Index;
use std::ptr;
use std::slice;
use std::mem;
use libc::{c_int, uint8_t};
use ffi::*;
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub enum Sample {
None,
U8,
S16,
S32,
FLT,
DBL,
U8P,
S16P,
S32P,
FLTP,
DBLP,
}
impl Sample {
pub fn name(&self) -> &'static str {
unsafe {
from_utf8_unchecked(CStr::from_ptr(av_get_sample_fmt_name((*self).into())).to_bytes())
}
}
pub fn packed(&self) -> Self {
unsafe {
Sample::from(av_get_packed_sample_fmt((*self).into()))
}
}
pub fn planar(&self) -> Self {
unsafe {
Sample::from(av_get_planar_sample_fmt((*self).into()))
}
}
pub fn is_planar(&self) -> bool {
unsafe {
av_sample_fmt_is_planar((*self).into()) == 1
}
}
pub fn bytes(&self) -> usize {
unsafe {
av_get_bytes_per_sample((*self).into()) as usize
}
}
pub fn buffer(&self, channels: usize, samples: usize, align: bool) -> Buffer {
Buffer::new(*self, channels, samples, align)
}
}
impl From<AVSampleFormat> for Sample {
fn from(value: AVSampleFormat) -> Self {
match value {
AV_SAMPLE_FMT_NONE => Sample::None,
AV_SAMPLE_FMT_U8 => Sample::U8,
AV_SAMPLE_FMT_S16 => Sample::S16,
AV_SAMPLE_FMT_S32 => Sample::S32,
AV_SAMPLE_FMT_FLT => Sample::FLT,
AV_SAMPLE_FMT_DBL => Sample::DBL,
AV_SAMPLE_FMT_U8P => Sample::U8P,
AV_SAMPLE_FMT_S16P => Sample::S16P,
AV_SAMPLE_FMT_S32P => Sample::S32P,
AV_SAMPLE_FMT_FLTP => Sample::FLTP,
AV_SAMPLE_FMT_DBLP => Sample::DBLP,
AV_SAMPLE_FMT_NB => Sample::None
}
}
}
impl From<&'static str> for Sample {
fn from(value: &'static str) -> Self {
unsafe {
Sample::from(av_get_sample_fmt(CString::new(value).unwrap().as_ptr()))
}
}
}
impl Into<AVSampleFormat> for Sample {
fn into(self) -> AVSampleFormat {
match self {
Sample::None => AV_SAMPLE_FMT_NONE,
Sample::U8 => AV_SAMPLE_FMT_U8,
Sample::S16 => AV_SAMPLE_FMT_S16,
Sample::S32 => AV_SAMPLE_FMT_S32,
Sample::FLT => AV_SAMPLE_FMT_FLT,
Sample::DBL => AV_SAMPLE_FMT_DBL,
Sample::U8P => AV_SAMPLE_FMT_U8P,
Sample::S16P => AV_SAMPLE_FMT_S16P,
Sample::S32P => AV_SAMPLE_FMT_S32P,
Sample::FLTP => AV_SAMPLE_FMT_FLTP,
Sample::DBLP => AV_SAMPLE_FMT_DBLP,
}
}
}
pub struct Buffer {
pub format: Sample,
pub channels: usize,
pub samples: usize,
pub align: bool,
buffer: *mut *mut uint8_t,
size: c_int,
}
impl Buffer {
pub fn size(format: Sample, channels: usize, samples: usize, align: bool) -> usize {
unsafe {
av_samples_get_buffer_size(ptr::null_mut(), channels as c_int, samples as c_int, format.into(), !align as c_int) as usize
}
}
pub fn new(format: Sample, channels: usize, samples: usize, align: bool) -> Self {
unsafe {
let mut buf = Buffer {
format: format,
channels: channels,
samples: samples,
align: align,
buffer: ptr::null_mut(),
size: 0,
};
av_samples_alloc_array_and_samples(&mut buf.buffer, &mut buf.size,
channels as c_int, samples as c_int,
format.into(), !align as c_int);
buf
}
}
}
impl Index<usize> for Buffer {
type Output = [u8];
fn index(&self, index: usize) -> &[u8] {
if index >= self.samples {
panic!("out of bounds");
}
unsafe {
slice::from_raw_parts(*self.buffer.offset(index as isize), self.size as usize)
}
}
}
impl Clone for Buffer {
fn clone(&self) -> Self {
let mut buf = Buffer::new(self.format, self.channels, self.samples, self.align);
buf.clone_from(self);
buf
}
fn clone_from(&mut self, source: &Self) {
unsafe {
av_samples_copy(self.buffer, mem::transmute(source.buffer), 0, 0, source.samples as c_int, source.channels as c_int, source.format.into());
}
}
}
impl Drop for Buffer {
fn drop(&mut self) {
unsafe {
av_freep(mem::transmute(self.buffer));
}
}
}