Skip to content

Commit c5aed79

Browse files
committed
dovi: support level 17 extension metadata block
1 parent cbea888 commit c5aed79

File tree

5 files changed

+96
-1
lines changed

5 files changed

+96
-1
lines changed

dolby_vision/src/c_structs/extension_metadata.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ impl DmData {
112112
ExtMetadataBlock::Level16(_) => {
113113
// TODO
114114
}
115+
ExtMetadataBlock::Level17(_) => {
116+
// TODO
117+
}
115118
ExtMetadataBlock::Level254(b) => {
116119
self.level254 =
117120
Box::into_raw(Box::new(b.clone())) as *const ExtMetadataBlockLevel254
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use anyhow::Result;
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+
/// Up mapping metadata
12+
#[repr(C)]
13+
#[derive(Debug, Default, Clone)]
14+
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
15+
pub struct ExtMetadataBlockLevel17 {
16+
pub mid_boost: u8,
17+
pub highlight_stretch: u8,
18+
pub shadow_drop: u8,
19+
pub contrast_boost: u8,
20+
pub saturation_boost: u8,
21+
pub detail_boost: u8,
22+
pub chroma_indicator: u8,
23+
24+
/// 12 bits
25+
pub intensity_indicator_pq: u16,
26+
27+
/// 4 bits
28+
pub revision: u8,
29+
}
30+
31+
impl ExtMetadataBlockLevel17 {
32+
pub(crate) fn parse(reader: &mut BsIoSliceReader) -> Result<ExtMetadataBlock> {
33+
let block = Self {
34+
mid_boost: reader.read::<8, u8>()?,
35+
highlight_stretch: reader.read::<8, u8>()?,
36+
shadow_drop: reader.read::<8, u8>()?,
37+
contrast_boost: reader.read::<8, u8>()?,
38+
saturation_boost: reader.read::<8, u8>()?,
39+
detail_boost: reader.read::<8, u8>()?,
40+
chroma_indicator: reader.read::<8, u8>()?,
41+
intensity_indicator_pq: reader.read::<12, u16>()?,
42+
revision: reader.read::<4, u8>()?,
43+
};
44+
45+
Ok(ExtMetadataBlock::Level17(block))
46+
}
47+
48+
pub fn write(&self, writer: &mut BitstreamIoWriter) -> Result<()> {
49+
self.validate()?;
50+
51+
writer.write::<8, u8>(self.mid_boost)?;
52+
writer.write::<8, u8>(self.highlight_stretch)?;
53+
writer.write::<8, u8>(self.shadow_drop)?;
54+
writer.write::<8, u8>(self.contrast_boost)?;
55+
writer.write::<8, u8>(self.saturation_boost)?;
56+
writer.write::<8, u8>(self.detail_boost)?;
57+
writer.write::<8, u8>(self.chroma_indicator)?;
58+
writer.write::<12, u16>(self.intensity_indicator_pq)?;
59+
writer.write::<4, u8>(self.revision)?;
60+
61+
Ok(())
62+
}
63+
64+
pub fn validate(&self) -> Result<()> {
65+
Ok(())
66+
}
67+
}
68+
69+
impl ExtMetadataBlockInfo for ExtMetadataBlockLevel17 {
70+
fn level(&self) -> u8 {
71+
17
72+
}
73+
74+
fn bytes_size(&self) -> u64 {
75+
9
76+
}
77+
78+
fn required_bits(&self) -> u64 {
79+
9 * 8
80+
}
81+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub mod level10;
1111
pub mod level11;
1212
pub mod level15;
1313
pub mod level16;
14+
pub mod level17;
1415
pub mod level2;
1516
pub mod level254;
1617
pub mod level255;
@@ -34,6 +35,7 @@ pub use level10::ExtMetadataBlockLevel10;
3435
pub use level11::ExtMetadataBlockLevel11;
3536
pub use level15::ExtMetadataBlockLevel15;
3637
pub use level16::ExtMetadataBlockLevel16;
38+
pub use level17::ExtMetadataBlockLevel17;
3739
pub use level254::ExtMetadataBlockLevel254;
3840
pub use level255::ExtMetadataBlockLevel255;
3941
pub use reserved::ReservedExtMetadataBlock;
@@ -58,6 +60,7 @@ pub enum ExtMetadataBlock {
5860
Level11(ExtMetadataBlockLevel11),
5961
Level15(ExtMetadataBlockLevel15),
6062
Level16(ExtMetadataBlockLevel16),
63+
Level17(ExtMetadataBlockLevel17),
6164
Level254(ExtMetadataBlockLevel254),
6265
Level255(ExtMetadataBlockLevel255),
6366
Reserved(ReservedExtMetadataBlock),
@@ -92,6 +95,7 @@ impl ExtMetadataBlock {
9295
Self::Level11(b) => b.bytes_size(),
9396
Self::Level15(b) => b.bytes_size(),
9497
Self::Level16(b) => b.bytes_size(),
98+
Self::Level17(b) => b.bytes_size(),
9599
Self::Level254(b) => b.bytes_size(),
96100
Self::Level255(b) => b.bytes_size(),
97101
Self::Reserved(b) => b.bytes_size(),
@@ -112,6 +116,7 @@ impl ExtMetadataBlock {
112116
Self::Level11(b) => b.bits_size(),
113117
Self::Level15(b) => b.bits_size(),
114118
Self::Level16(b) => b.bits_size(),
119+
Self::Level17(b) => b.bits_size(),
115120
Self::Level254(b) => b.bits_size(),
116121
Self::Level255(b) => b.bits_size(),
117122
Self::Reserved(b) => b.bits_size(),
@@ -132,6 +137,7 @@ impl ExtMetadataBlock {
132137
Self::Level11(b) => b.required_bits(),
133138
Self::Level15(b) => b.required_bits(),
134139
Self::Level16(b) => b.required_bits(),
140+
Self::Level17(b) => b.required_bits(),
135141
Self::Level254(b) => b.required_bits(),
136142
Self::Level255(b) => b.required_bits(),
137143
Self::Reserved(b) => b.required_bits(),
@@ -152,6 +158,7 @@ impl ExtMetadataBlock {
152158
Self::Level11(b) => b.level(),
153159
Self::Level15(b) => b.level(),
154160
Self::Level16(b) => b.level(),
161+
Self::Level17(b) => b.level(),
155162
Self::Level254(b) => b.level(),
156163
Self::Level255(b) => b.level(),
157164
Self::Reserved(b) => b.level(),
@@ -172,6 +179,7 @@ impl ExtMetadataBlock {
172179
Self::Level11(b) => b.sort_key(),
173180
Self::Level15(b) => b.sort_key(),
174181
Self::Level16(b) => b.sort_key(),
182+
Self::Level17(b) => b.sort_key(),
175183
Self::Level254(b) => b.sort_key(),
176184
Self::Level255(b) => b.sort_key(),
177185
Self::Reserved(b) => b.sort_key(),
@@ -192,6 +200,7 @@ impl ExtMetadataBlock {
192200
Self::Level11(b) => b.write(writer),
193201
Self::Level15(b) => b.write(writer),
194202
Self::Level16(b) => b.write(writer),
203+
Self::Level17(b) => b.write(writer),
195204
Self::Level254(b) => b.write(writer),
196205
Self::Level255(b) => b.write(writer),
197206
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, 254];
19+
const ALLOWED_BLOCK_LEVELS: &'static [u8] = &[3, 8, 9, 10, 11, 15, 16, 17, 254];
2020

2121
fn with_blocks_allocation(num_ext_blocks: u64) -> Self {
2222
Self {
@@ -53,6 +53,7 @@ impl WithExtMetadataBlocks for CmV40DmData {
5353
11 => level11::ExtMetadataBlockLevel11::parse(reader)?,
5454
15 => level15::ExtMetadataBlockLevel15::parse(reader)?,
5555
16 => level16::ExtMetadataBlockLevel16::parse(reader)?,
56+
17 => level17::ExtMetadataBlockLevel17::parse(reader)?,
5657
254 => level254::ExtMetadataBlockLevel254::parse(reader)?,
5758
1 | 2 | 4 | 5 | 6 | 255 => bail!(
5859
"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
@@ -390,6 +390,7 @@ impl VdrDmData {
390390
ExtMetadataBlock::Level11(_) => self.replace_metadata_level(block),
391391
ExtMetadataBlock::Level15(_) => self.replace_metadata_level(block),
392392
ExtMetadataBlock::Level16(_) => self.replace_metadata_level(block),
393+
ExtMetadataBlock::Level17(_) => self.replace_metadata_level(block),
393394
ExtMetadataBlock::Level254(_) => self.replace_metadata_level(block),
394395
ExtMetadataBlock::Level255(_) => self.replace_metadata_level(block),
395396
ExtMetadataBlock::Reserved(_) => bail!("Cannot replace specific reserved block"),

0 commit comments

Comments
 (0)