Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions dolby_vision/src/rpu/extension_metadata/blocks/level11.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ use serde::{Deserialize, Serialize};

use super::{ExtMetadataBlock, ExtMetadataBlockInfo};

const MAX_WHITEPOINT_VALUE: u8 = 15;

/// Content type metadata level
#[repr(C)]
#[derive(Debug, Default, Clone)]
Expand All @@ -29,31 +27,21 @@ impl ExtMetadataBlockLevel11 {
pub(crate) fn parse(reader: &mut BsIoSliceReader) -> Result<ExtMetadataBlock> {
let mut l11 = Self {
content_type: reader.read::<8, u8>()?,
whitepoint: reader.read::<8, u8>()?,
reserved_byte2: reader.read::<8, u8>()?,
reserved_byte3: reader.read::<8, u8>()?,
..Default::default()
};

if l11.whitepoint > MAX_WHITEPOINT_VALUE {
l11.reference_mode_flag = true;
l11.whitepoint -= MAX_WHITEPOINT_VALUE + 1;
}
l11.decode_byte1(reader.read::<8, u8>()?);
l11.reserved_byte2 = reader.read::<8, u8>()?;
l11.reserved_byte3 = reader.read::<8, u8>()?;

Ok(ExtMetadataBlock::Level11(l11))
}

pub fn write(&self, writer: &mut BitstreamIoWriter) -> Result<()> {
self.validate()?;

let mut wp = self.whitepoint;

if self.reference_mode_flag {
wp += MAX_WHITEPOINT_VALUE + 1
}

writer.write::<8, u8>(self.content_type)?;
writer.write::<8, u8>(wp)?;
writer.write::<8, u8>(self.encode_byte1())?;
writer.write::<8, u8>(self.reserved_byte2)?;
writer.write::<8, u8>(self.reserved_byte3)?;

Expand All @@ -63,7 +51,6 @@ impl ExtMetadataBlockLevel11 {
pub fn validate(&self) -> Result<()> {
ensure!(self.content_type <= 15);
ensure!(self.whitepoint <= 15);
ensure!(self.reserved_byte2 == 0);
ensure!(self.reserved_byte3 == 0);

Ok(())
Expand All @@ -79,6 +66,19 @@ impl ExtMetadataBlockLevel11 {
reserved_byte3: 0,
}
}

const fn decode_byte1(&mut self, v: u8) {
// lowest 4 bits
self.whitepoint = v & 0x0F;

let remaining = v >> 4;
self.reference_mode_flag = remaining & 0x01 == 1;
}

const fn encode_byte1(&self) -> u8 {
let reference_mode_flag = self.reference_mode_flag as u8;
reference_mode_flag << 4 | self.whitepoint
}
}

impl ExtMetadataBlockInfo for ExtMetadataBlockLevel11 {
Expand Down