| 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}") |
| } |
| } |