From 6c38f1a50348b7e2474a4bed72b592d0496a6273 Mon Sep 17 00:00:00 2001 From: Folkert Date: Wed, 6 Mar 2024 20:02:01 +0100 Subject: [PATCH] `enum Rav1dChromaSamplePosition`: make a real enum --- include/dav1d/headers.rs | 41 +++++++++++++++++++++++++++++++--------- src/obu.rs | 9 ++++----- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/include/dav1d/headers.rs b/include/dav1d/headers.rs index 2cb311117..371dcfd41 100644 --- a/include/dav1d/headers.rs +++ b/include/dav1d/headers.rs @@ -562,14 +562,37 @@ pub(crate) const _RAV1D_MC_BT709: Rav1dMatrixCoefficients = DAV1D_MC_BT709; pub(crate) const RAV1D_MC_IDENTITY: Rav1dMatrixCoefficients = DAV1D_MC_IDENTITY; pub type Dav1dChromaSamplePosition = c_uint; -pub const DAV1D_CHR_COLOCATED: Dav1dChromaSamplePosition = 2; -pub const DAV1D_CHR_VERTICAL: Dav1dChromaSamplePosition = 1; -pub const DAV1D_CHR_UNKNOWN: Dav1dChromaSamplePosition = 0; +pub const DAV1D_CHR_UNKNOWN: Dav1dChromaSamplePosition = + Rav1dChromaSamplePosition::Unknown as Dav1dChromaSamplePosition; +pub const DAV1D_CHR_VERTICAL: Dav1dChromaSamplePosition = + Rav1dChromaSamplePosition::_Vertical as Dav1dChromaSamplePosition; +pub const DAV1D_CHR_COLOCATED: Dav1dChromaSamplePosition = + Rav1dChromaSamplePosition::_Colocated as Dav1dChromaSamplePosition; -pub(crate) type Rav1dChromaSamplePosition = c_uint; -pub(crate) const _RAV1D_CHR_COLOCATED: Rav1dChromaSamplePosition = DAV1D_CHR_COLOCATED; -pub(crate) const _RAV1D_CHR_VERTICAL: Rav1dChromaSamplePosition = DAV1D_CHR_VERTICAL; -pub(crate) const RAV1D_CHR_UNKNOWN: Rav1dChromaSamplePosition = DAV1D_CHR_UNKNOWN; +#[derive(Clone, Copy, PartialEq, Eq, FromRepr)] +pub enum Rav1dChromaSamplePosition { + Unknown = 0, + /// Horizontally co-located with (0, 0) luma sample, vertical position + /// in the middle between two luma samples + _Vertical = 1, + /// co-located with (0, 0) luma sample + _Colocated = 2, + _Reserved = 3, +} + +impl From for Dav1dChromaSamplePosition { + fn from(value: Rav1dChromaSamplePosition) -> Self { + value as Dav1dChromaSamplePosition + } +} + +impl TryFrom for Rav1dChromaSamplePosition { + type Error = (); + + fn try_from(value: Dav1dChromaSamplePosition) -> Result { + Self::from_repr(value as usize).ok_or(()) + } +} #[repr(C)] pub struct Rav1dContentLightLevel { @@ -1039,7 +1062,7 @@ impl From for Rav1dSequenceHeader { pri, trc, mtrx, - chr, + chr: chr.try_into().unwrap(), hbd, color_range, num_operating_points, @@ -1154,7 +1177,7 @@ impl From for Dav1dSequenceHeader { pri, trc, mtrx, - chr, + chr: chr.into(), hbd, color_range, num_operating_points, diff --git a/src/obu.rs b/src/obu.rs index 5d4594e01..bc719d923 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -41,7 +41,6 @@ use crate::include::dav1d::headers::Rav1dSequenceHeaderOperatingPoint; use crate::include::dav1d::headers::Rav1dTransferCharacteristics; use crate::include::dav1d::headers::Rav1dTxfmMode; use crate::include::dav1d::headers::Rav1dWarpedMotionParams; -use crate::include::dav1d::headers::RAV1D_CHR_UNKNOWN; use crate::include::dav1d::headers::RAV1D_COLOR_PRI_BT709; use crate::include::dav1d::headers::RAV1D_COLOR_PRI_UNKNOWN; use crate::include::dav1d::headers::RAV1D_MAX_CDEF_STRENGTHS; @@ -415,7 +414,7 @@ fn parse_seq_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult Rav1dResult Rav1dResult unreachable!(), // TODO(kkysen) Make `profile` an `enum` so this isn't needed. } chr = if ss_hor & ss_ver != 0 { - gb.get_bits(2) as Rav1dChromaSamplePosition + Rav1dChromaSamplePosition::from_repr(gb.get_bits(2) as usize).unwrap() } else { - RAV1D_CHR_UNKNOWN + Rav1dChromaSamplePosition::Unknown }; } if c.strict_std_compliance && mtrx == RAV1D_MC_IDENTITY && layout != Rav1dPixelLayout::I444 {