blob: 025dd5ff4f09f4c8dea0497066b68106cb19dd6f [file] [log] [blame]
use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Serialize, Deserialize)]
pub enum Plane {
Y,
U,
V,
}
impl Plane {
pub fn as_str(&self) -> &str {
match self {
Plane::Y => "Y plane",
Plane::U => "U plane",
Plane::V => "V plane",
}
}
pub fn from_i32(i: i32) -> Self {
match i {
0 => Plane::Y,
1 => Plane::U,
2 => Plane::V,
_ => panic!("Bad plane id: {i}"),
}
}
pub fn to_i32(&self) -> i32 {
match self {
Plane::Y => 0,
Plane::U => 1,
Plane::V => 2,
}
}
pub fn to_usize(&self) -> usize {
self.to_i32() as usize
}
pub fn is_chroma(&self) -> bool {
match self {
Plane::Y => false,
Plane::U | Plane::V => true,
}
}
pub fn subsampled(&self, dimension: i32) -> i32 {
if self.is_chroma() {
(dimension + 1) / 2
} else {
dimension
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PlaneType {
Planar(Plane),
#[default]
Rgb,
}
impl PlaneType {
// For partition tree selection
pub fn use_chroma(&self) -> bool {
match self {
PlaneType::Rgb | PlaneType::Planar(Plane::Y) => false,
PlaneType::Planar(Plane::U) | PlaneType::Planar(Plane::V) => true,
}
}
pub fn to_plane(&self) -> Plane {
match self {
PlaneType::Rgb => Plane::Y,
PlaneType::Planar(plane) => *plane,
}
}
}
impl fmt::Display for PlaneType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let text = match self {
PlaneType::Planar(Plane::Y) => "Y",
PlaneType::Planar(Plane::U) => "U",
PlaneType::Planar(Plane::V) => "V",
PlaneType::Rgb => "YUV",
};
write!(f, "{text}")
}
}