Skip to content

Commit de6b03d

Browse files
committed
dovi: support level 18 extension metadata block
1 parent c5aed79 commit de6b03d

File tree

7 files changed

+90
-3
lines changed

7 files changed

+90
-3
lines changed

dolby_vision/src/c_structs/extension_metadata.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ impl DmData {
115115
ExtMetadataBlock::Level17(_) => {
116116
// TODO
117117
}
118+
ExtMetadataBlock::Level18(_) => {
119+
// TODO
120+
}
118121
ExtMetadataBlock::Level254(b) => {
119122
self.level254 =
120123
Box::into_raw(Box::new(b.clone())) as *const ExtMetadataBlockLevel254

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,6 @@ impl ExtMetadataBlockInfo for ExtMetadataBlockLevel15 {
8787
}
8888

8989
fn required_bits(&self) -> u64 {
90-
11 * 8
90+
88
9191
}
9292
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,6 @@ impl ExtMetadataBlockInfo for ExtMetadataBlockLevel17 {
7676
}
7777

7878
fn required_bits(&self) -> u64 {
79-
9 * 8
79+
72
8080
}
8181
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use anyhow::{Result, ensure};
2+
use bitvec_helpers::{
3+
bitstream_io_reader::BsIoSliceReader, bitstream_io_writer::BitstreamIoWriter,
4+
};
5+
6+
#[cfg(feature = "serde")]
7+
use serde::{Deserialize, Serialize};
8+
9+
use super::{ExtMetadataBlock, ExtMetadataBlockInfo};
10+
11+
/// Creative environment metadata
12+
#[repr(C)]
13+
#[derive(Debug, Default, Clone)]
14+
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
15+
pub struct ExtMetadataBlockLevel18 {
16+
pub surround_luminance_pq: u16,
17+
pub min_preserved_luminance_pq: u16,
18+
pub adaptation_luminance_pq: u16,
19+
pub max_preserved_luminance_pq: u16,
20+
21+
/// 4 bits
22+
pub revision: u8,
23+
/// 4 bits
24+
pub reserved: u8,
25+
}
26+
27+
impl ExtMetadataBlockLevel18 {
28+
pub(crate) fn parse(reader: &mut BsIoSliceReader) -> Result<ExtMetadataBlock> {
29+
let block = Self {
30+
surround_luminance_pq: reader.read::<12, u16>()?,
31+
min_preserved_luminance_pq: reader.read::<12, u16>()?,
32+
adaptation_luminance_pq: reader.read::<12, u16>()?,
33+
max_preserved_luminance_pq: reader.read::<12, u16>()?,
34+
revision: reader.read::<4, u8>()?,
35+
reserved: reader.read::<4, u8>()?,
36+
};
37+
38+
Ok(ExtMetadataBlock::Level18(block))
39+
}
40+
41+
pub fn write(&self, writer: &mut BitstreamIoWriter) -> Result<()> {
42+
self.validate()?;
43+
44+
writer.write::<12, u16>(self.surround_luminance_pq)?;
45+
writer.write::<12, u16>(self.min_preserved_luminance_pq)?;
46+
writer.write::<12, u16>(self.adaptation_luminance_pq)?;
47+
writer.write::<12, u16>(self.max_preserved_luminance_pq)?;
48+
writer.write::<4, u8>(self.revision)?;
49+
writer.write::<4, u8>(self.reserved)?;
50+
51+
Ok(())
52+
}
53+
54+
pub fn validate(&self) -> Result<()> {
55+
ensure!(self.reserved == 0);
56+
57+
Ok(())
58+
}
59+
}
60+
61+
impl ExtMetadataBlockInfo for ExtMetadataBlockLevel18 {
62+
fn level(&self) -> u8 {
63+
18
64+
}
65+
66+
fn bytes_size(&self) -> u64 {
67+
7
68+
}
69+
70+
fn required_bits(&self) -> u64 {
71+
56
72+
}
73+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub mod level11;
1212
pub mod level15;
1313
pub mod level16;
1414
pub mod level17;
15+
pub mod level18;
1516
pub mod level2;
1617
pub mod level254;
1718
pub mod level255;
@@ -36,6 +37,7 @@ pub use level11::ExtMetadataBlockLevel11;
3637
pub use level15::ExtMetadataBlockLevel15;
3738
pub use level16::ExtMetadataBlockLevel16;
3839
pub use level17::ExtMetadataBlockLevel17;
40+
pub use level18::ExtMetadataBlockLevel18;
3941
pub use level254::ExtMetadataBlockLevel254;
4042
pub use level255::ExtMetadataBlockLevel255;
4143
pub use reserved::ReservedExtMetadataBlock;
@@ -61,6 +63,7 @@ pub enum ExtMetadataBlock {
6163
Level15(ExtMetadataBlockLevel15),
6264
Level16(ExtMetadataBlockLevel16),
6365
Level17(ExtMetadataBlockLevel17),
66+
Level18(ExtMetadataBlockLevel18),
6467
Level254(ExtMetadataBlockLevel254),
6568
Level255(ExtMetadataBlockLevel255),
6669
Reserved(ReservedExtMetadataBlock),
@@ -96,6 +99,7 @@ impl ExtMetadataBlock {
9699
Self::Level15(b) => b.bytes_size(),
97100
Self::Level16(b) => b.bytes_size(),
98101
Self::Level17(b) => b.bytes_size(),
102+
Self::Level18(b) => b.bytes_size(),
99103
Self::Level254(b) => b.bytes_size(),
100104
Self::Level255(b) => b.bytes_size(),
101105
Self::Reserved(b) => b.bytes_size(),
@@ -117,6 +121,7 @@ impl ExtMetadataBlock {
117121
Self::Level15(b) => b.bits_size(),
118122
Self::Level16(b) => b.bits_size(),
119123
Self::Level17(b) => b.bits_size(),
124+
Self::Level18(b) => b.bits_size(),
120125
Self::Level254(b) => b.bits_size(),
121126
Self::Level255(b) => b.bits_size(),
122127
Self::Reserved(b) => b.bits_size(),
@@ -138,6 +143,7 @@ impl ExtMetadataBlock {
138143
Self::Level15(b) => b.required_bits(),
139144
Self::Level16(b) => b.required_bits(),
140145
Self::Level17(b) => b.required_bits(),
146+
Self::Level18(b) => b.required_bits(),
141147
Self::Level254(b) => b.required_bits(),
142148
Self::Level255(b) => b.required_bits(),
143149
Self::Reserved(b) => b.required_bits(),
@@ -159,6 +165,7 @@ impl ExtMetadataBlock {
159165
Self::Level15(b) => b.level(),
160166
Self::Level16(b) => b.level(),
161167
Self::Level17(b) => b.level(),
168+
Self::Level18(b) => b.level(),
162169
Self::Level254(b) => b.level(),
163170
Self::Level255(b) => b.level(),
164171
Self::Reserved(b) => b.level(),
@@ -180,6 +187,7 @@ impl ExtMetadataBlock {
180187
Self::Level15(b) => b.sort_key(),
181188
Self::Level16(b) => b.sort_key(),
182189
Self::Level17(b) => b.sort_key(),
190+
Self::Level18(b) => b.sort_key(),
183191
Self::Level254(b) => b.sort_key(),
184192
Self::Level255(b) => b.sort_key(),
185193
Self::Reserved(b) => b.sort_key(),
@@ -201,6 +209,7 @@ impl ExtMetadataBlock {
201209
Self::Level15(b) => b.write(writer),
202210
Self::Level16(b) => b.write(writer),
203211
Self::Level17(b) => b.write(writer),
212+
Self::Level18(b) => b.write(writer),
204213
Self::Level254(b) => b.write(writer),
205214
Self::Level255(b) => b.write(writer),
206215
Self::Reserved(b) => b.write(writer),

dolby_vision/src/rpu/extension_metadata/cmv40.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub struct CmV40DmData {
1616

1717
impl WithExtMetadataBlocks for CmV40DmData {
1818
const VERSION: &'static str = "CM v4.0";
19-
const ALLOWED_BLOCK_LEVELS: &'static [u8] = &[3, 8, 9, 10, 11, 15, 16, 17, 254];
19+
const ALLOWED_BLOCK_LEVELS: &'static [u8] = &[3, 8, 9, 10, 11, 15, 16, 17, 18, 254];
2020

2121
fn with_blocks_allocation(num_ext_blocks: u64) -> Self {
2222
Self {
@@ -54,6 +54,7 @@ impl WithExtMetadataBlocks for CmV40DmData {
5454
15 => level15::ExtMetadataBlockLevel15::parse(reader)?,
5555
16 => level16::ExtMetadataBlockLevel16::parse(reader)?,
5656
17 => level17::ExtMetadataBlockLevel17::parse(reader)?,
57+
18 => level18::ExtMetadataBlockLevel18::parse(reader)?,
5758
254 => level254::ExtMetadataBlockLevel254::parse(reader)?,
5859
1 | 2 | 4 | 5 | 6 | 255 => bail!(
5960
"Invalid block level {} for {} RPU",

dolby_vision/src/rpu/vdr_dm_data.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ impl VdrDmData {
391391
ExtMetadataBlock::Level15(_) => self.replace_metadata_level(block),
392392
ExtMetadataBlock::Level16(_) => self.replace_metadata_level(block),
393393
ExtMetadataBlock::Level17(_) => self.replace_metadata_level(block),
394+
ExtMetadataBlock::Level18(_) => self.replace_metadata_level(block),
394395
ExtMetadataBlock::Level254(_) => self.replace_metadata_level(block),
395396
ExtMetadataBlock::Level255(_) => self.replace_metadata_level(block),
396397
ExtMetadataBlock::Reserved(_) => bail!("Cannot replace specific reserved block"),

0 commit comments

Comments
 (0)