Skip to content

Commit 586635f

Browse files
committed
dovi/level11: improve byte1 parsing and remove byte2 validation
Some devices do set byte2, the minimum we can do is allow it through. TODO: Figure out what it means. Improves situation for #251, #381.
1 parent a0989ca commit 586635f

File tree

1 file changed

+14
-17
lines changed
  • dolby_vision/src/rpu/extension_metadata/blocks

1 file changed

+14
-17
lines changed

dolby_vision/src/rpu/extension_metadata/blocks/level11.rs

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ use serde::{Deserialize, Serialize};
88

99
use super::{ExtMetadataBlock, ExtMetadataBlockInfo};
1010

11-
const MAX_WHITEPOINT_VALUE: u8 = 15;
12-
1311
/// Content type metadata level
1412
#[repr(C)]
1513
#[derive(Debug, Default, Clone)]
@@ -29,31 +27,21 @@ impl ExtMetadataBlockLevel11 {
2927
pub(crate) fn parse(reader: &mut BsIoSliceReader) -> Result<ExtMetadataBlock> {
3028
let mut l11 = Self {
3129
content_type: reader.read::<8, u8>()?,
32-
whitepoint: reader.read::<8, u8>()?,
33-
reserved_byte2: reader.read::<8, u8>()?,
34-
reserved_byte3: reader.read::<8, u8>()?,
3530
..Default::default()
3631
};
3732

38-
if l11.whitepoint > MAX_WHITEPOINT_VALUE {
39-
l11.reference_mode_flag = true;
40-
l11.whitepoint -= MAX_WHITEPOINT_VALUE + 1;
41-
}
33+
l11.decode_byte1(reader.read::<8, u8>()?);
34+
l11.reserved_byte2 = reader.read::<8, u8>()?;
35+
l11.reserved_byte3 = reader.read::<8, u8>()?;
4236

4337
Ok(ExtMetadataBlock::Level11(l11))
4438
}
4539

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

49-
let mut wp = self.whitepoint;
50-
51-
if self.reference_mode_flag {
52-
wp += MAX_WHITEPOINT_VALUE + 1
53-
}
54-
5543
writer.write::<8, u8>(self.content_type)?;
56-
writer.write::<8, u8>(wp)?;
44+
writer.write::<8, u8>(self.encode_byte1())?;
5745
writer.write::<8, u8>(self.reserved_byte2)?;
5846
writer.write::<8, u8>(self.reserved_byte3)?;
5947

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

6956
Ok(())
@@ -79,6 +66,16 @@ impl ExtMetadataBlockLevel11 {
7966
reserved_byte3: 0,
8067
}
8168
}
69+
70+
const fn decode_byte1(&mut self, v: u8) {
71+
self.whitepoint = v & 0x0F;
72+
self.reference_mode_flag = ((v >> 4) & 0x01) == 1;
73+
}
74+
75+
const fn encode_byte1(&self) -> u8 {
76+
let reference_mode_flag = self.reference_mode_flag as u8;
77+
reference_mode_flag << 4 | self.whitepoint
78+
}
8279
}
8380

8481
impl ExtMetadataBlockInfo for ExtMetadataBlockLevel11 {

0 commit comments

Comments
 (0)