#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MediaType {
Audio,
Video,
Subtitle,
Data,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum SampleFormat {
U8,
S8,
S16,
S24,
S32,
F32,
F64,
U8P,
S16P,
S32P,
F32P,
F64P,
}
impl SampleFormat {
pub fn is_planar(&self) -> bool {
matches!(
self,
Self::U8P | Self::S16P | Self::S32P | Self::F32P | Self::F64P
)
}
pub fn bytes_per_sample(&self) -> usize {
match self {
Self::U8 | Self::U8P | Self::S8 => 1,
Self::S16 | Self::S16P => 2,
Self::S24 => 3,
Self::S32 | Self::S32P | Self::F32 | Self::F32P => 4,
Self::F64 | Self::F64P => 8,
}
}
pub fn is_float(&self) -> bool {
matches!(self, Self::F32 | Self::F64 | Self::F32P | Self::F64P)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum PixelFormat {
Yuv420P,
Yuv422P,
Yuv444P,
Rgb24,
Rgba,
Gray8,
Pal8,
Bgr24,
Bgra,
Argb,
Abgr,
Rgb48Le,
Rgba64Le,
Gray16Le,
Gray10Le,
Gray12Le,
Yuv420P10Le,
Yuv422P10Le,
Yuv444P10Le,
Yuv420P12Le,
YuvJ420P,
YuvJ422P,
YuvJ444P,
Nv12,
Nv21,
Ya8,
Yuva420P,
MonoBlack,
MonoWhite,
Yuyv422,
Uyvy422,
}
impl PixelFormat {
pub fn is_planar(&self) -> bool {
matches!(
self,
Self::Yuv420P
| Self::Yuv422P
| Self::Yuv444P
| Self::Yuv420P10Le
| Self::Yuv422P10Le
| Self::Yuv444P10Le
| Self::Yuv420P12Le
| Self::YuvJ420P
| Self::YuvJ422P
| Self::YuvJ444P
| Self::Nv12
| Self::Nv21
| Self::Yuva420P
)
}
pub fn is_palette(&self) -> bool {
matches!(self, Self::Pal8)
}
pub fn has_alpha(&self) -> bool {
matches!(
self,
Self::Rgba
| Self::Bgra
| Self::Argb
| Self::Abgr
| Self::Rgba64Le
| Self::Ya8
| Self::Yuva420P
)
}
pub fn plane_count(&self) -> usize {
match self {
Self::Nv12 | Self::Nv21 => 2,
Self::Yuv420P
| Self::Yuv422P
| Self::Yuv444P
| Self::Yuv420P10Le
| Self::Yuv422P10Le
| Self::Yuv444P10Le
| Self::Yuv420P12Le
| Self::YuvJ420P
| Self::YuvJ422P
| Self::YuvJ444P => 3,
Self::Yuva420P => 4,
_ => 1,
}
}
pub fn bits_per_pixel_approx(&self) -> u32 {
match self {
Self::MonoBlack | Self::MonoWhite => 1,
Self::Gray8 | Self::Pal8 => 8,
Self::Ya8 => 16,
Self::Gray16Le | Self::Gray10Le | Self::Gray12Le => 16,
Self::Rgb24 | Self::Bgr24 => 24,
Self::Rgba | Self::Bgra | Self::Argb | Self::Abgr => 32,
Self::Rgb48Le => 48,
Self::Rgba64Le => 64,
Self::Yuyv422 | Self::Uyvy422 => 16,
Self::Yuv420P | Self::YuvJ420P | Self::Nv12 | Self::Nv21 => 12,
Self::Yuv422P | Self::YuvJ422P => 16,
Self::Yuv444P | Self::YuvJ444P => 24,
Self::Yuv420P10Le | Self::Yuv420P12Le => 24,
Self::Yuv422P10Le => 32,
Self::Yuv444P10Le => 48,
Self::Yuva420P => 20,
}
}
}