Skip to content

Commit

Permalink
Add ColorPrimaries struct, fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
quietvoid committed Jan 6, 2022
1 parent 73a6f45 commit d9626c0
Show file tree
Hide file tree
Showing 10 changed files with 188 additions and 156 deletions.
1 change: 1 addition & 0 deletions assets/generator_examples/full_example.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
},
{
"Level9": {
"length": 1,
"source_primary_index": 0
}
},
Expand Down
1 change: 1 addition & 0 deletions assets/generator_examples/no_duration.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
},
{
"Level9": {
"length": 1,
"source_primary_index": 0
}
}
Expand Down
74 changes: 31 additions & 43 deletions dolby_vision/src/rpu/extension_metadata/blocks/level10.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use bitvec_helpers::{bitvec_reader::BitVecReader, bitvec_writer::BitVecWriter};
#[cfg(feature = "serde_feature")]
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};

use super::{level6::MAX_PQ_LUMINANCE, ExtMetadataBlock, ExtMetadataBlockInfo};
use super::{level6::MAX_PQ_LUMINANCE, ColorPrimaries, ExtMetadataBlock, ExtMetadataBlockInfo};

pub const PRESET_TARGET_DISPLAYS: &[u8] = &[1, 16, 18, 21, 27, 28, 37, 38, 42, 48, 49];

Expand Down Expand Up @@ -40,14 +40,7 @@ pub struct ExtMetadataBlockLevel10 {
pub target_min_pq: u16,
pub target_primary_index: u8,

pub target_primary_red_x: u16,
pub target_primary_red_y: u16,
pub target_primary_green_x: u16,
pub target_primary_green_y: u16,
pub target_primary_blue_x: u16,
pub target_primary_blue_y: u16,
pub target_primary_white_x: u16,
pub target_primary_white_y: u16,
pub target_primaries: Option<ColorPrimaries>,
}

impl ExtMetadataBlockLevel10 {
Expand All @@ -62,14 +55,7 @@ impl ExtMetadataBlockLevel10 {
};

if length > 5 {
block.target_primary_red_x = reader.get_n(16);
block.target_primary_red_y = reader.get_n(16);
block.target_primary_green_x = reader.get_n(16);
block.target_primary_green_y = reader.get_n(16);
block.target_primary_blue_x = reader.get_n(16);
block.target_primary_blue_y = reader.get_n(16);
block.target_primary_white_x = reader.get_n(16);
block.target_primary_white_y = reader.get_n(16);
block.target_primaries = Some(ColorPrimaries::parse(reader));
}

ExtMetadataBlock::Level10(block)
Expand All @@ -84,14 +70,9 @@ impl ExtMetadataBlockLevel10 {
writer.write_n(&self.target_primary_index.to_be_bytes(), 8);

if self.length > 5 {
writer.write_n(&self.target_primary_red_x.to_be_bytes(), 16);
writer.write_n(&self.target_primary_red_y.to_be_bytes(), 16);
writer.write_n(&self.target_primary_green_x.to_be_bytes(), 16);
writer.write_n(&self.target_primary_green_y.to_be_bytes(), 16);
writer.write_n(&self.target_primary_blue_x.to_be_bytes(), 16);
writer.write_n(&self.target_primary_blue_y.to_be_bytes(), 16);
writer.write_n(&self.target_primary_white_x.to_be_bytes(), 16);
writer.write_n(&self.target_primary_white_y.to_be_bytes(), 16);
if let Some(primaries) = &self.target_primaries {
primaries.write(writer);
}
}

Ok(())
Expand All @@ -102,6 +83,17 @@ impl ExtMetadataBlockLevel10 {
ensure!(self.target_max_pq <= MAX_PQ_LUMINANCE);
ensure!(self.target_min_pq <= MAX_PQ_LUMINANCE);

if self.length > 5 {
ensure!(self.target_primary_index == 255);
ensure!(self.target_primaries.is_some());

if let Some(primaries) = &self.target_primaries {
primaries.validate()?;
}
} else {
ensure!(self.target_primary_index != 255);
}

Ok(())
}
}
Expand Down Expand Up @@ -136,14 +128,7 @@ impl Default for ExtMetadataBlockLevel10 {
target_max_pq: 2081,
target_min_pq: 0,
target_primary_index: 2,
target_primary_red_x: 0,
target_primary_red_y: 0,
target_primary_green_x: 0,
target_primary_green_y: 0,
target_primary_blue_x: 0,
target_primary_blue_y: 0,
target_primary_white_x: 0,
target_primary_white_y: 0,
target_primaries: None,
}
}
}
Expand All @@ -156,27 +141,30 @@ impl Serialize for ExtMetadataBlockLevel10 {
{
let name = "ExtMetadataBlockLevel9";
let fields_count = match self.length {
5 => 4,
21 => 12,
5 => 5,
21 => 13,
_ => unreachable!(),
};

let mut state = serializer.serialize_struct(name, fields_count)?;

state.serialize_field("length", &self.length)?;
state.serialize_field("target_display_index", &self.target_display_index)?;
state.serialize_field("target_max_pq", &self.target_max_pq)?;
state.serialize_field("target_min_pq", &self.target_min_pq)?;
state.serialize_field("target_primary_index", &self.target_primary_index)?;

if self.length > 5 {
state.serialize_field("target_primary_red_x", &self.target_primary_red_x)?;
state.serialize_field("target_primary_red_y", &self.target_primary_white_y)?;
state.serialize_field("target_primary_green_x", &self.target_primary_green_x)?;
state.serialize_field("target_primary_green_y", &self.target_primary_green_y)?;
state.serialize_field("target_primary_blue_x", &self.target_primary_blue_x)?;
state.serialize_field("target_primary_blue_y", &self.target_primary_blue_y)?;
state.serialize_field("target_primary_white_x", &self.target_primary_white_x)?;
state.serialize_field("target_primary_white_y", &self.target_primary_white_y)?;
if let Some(primaries) = &self.target_primaries {
state.serialize_field("target_primary_red_x", &primaries.red_x)?;
state.serialize_field("target_primary_red_y", &primaries.white_y)?;
state.serialize_field("target_primary_green_x", &primaries.green_x)?;
state.serialize_field("target_primary_green_y", &primaries.green_y)?;
state.serialize_field("target_primary_blue_x", &primaries.blue_x)?;
state.serialize_field("target_primary_blue_y", &primaries.blue_y)?;
state.serialize_field("target_primary_white_x", &primaries.white_x)?;
state.serialize_field("target_primary_white_y", &primaries.white_y)?;
}
}

state.end()
Expand Down
11 changes: 6 additions & 5 deletions dolby_vision/src/rpu/extension_metadata/blocks/level8.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,16 +199,17 @@ impl Serialize for ExtMetadataBlockLevel8 {
{
let name = "ExtMetadataBlockLevel8";
let fields_count = match self.length {
25 => 21,
19 => 15,
13 => 9,
12 => 8,
10 => 7,
25 => 22,
19 => 16,
13 => 10,
12 => 9,
10 => 8,
_ => unreachable!(),
};

let mut state = serializer.serialize_struct(name, fields_count)?;

state.serialize_field("length", &self.length)?;
state.serialize_field("target_display_index", &self.target_display_index)?;
state.serialize_field("trim_slope", &self.trim_slope)?;
state.serialize_field("trim_offset", &self.trim_offset)?;
Expand Down
81 changes: 28 additions & 53 deletions dolby_vision/src/rpu/extension_metadata/blocks/level9.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use bitvec_helpers::{bitvec_reader::BitVecReader, bitvec_writer::BitVecWriter};
#[cfg(feature = "serde_feature")]
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};

use super::{ExtMetadataBlock, ExtMetadataBlockInfo};
use super::{ColorPrimaries, ExtMetadataBlock, ExtMetadataBlockInfo};

pub const PREDEFINED_COLORSPACE_PRIMARIES: &[[f64; 8]] = &[
[0.68, 0.32, 0.265, 0.69, 0.15, 0.06, 0.3127, 0.329], // 0, DCI-P3 D65
Expand All @@ -26,14 +26,7 @@ pub struct ExtMetadataBlockLevel9 {
pub length: u64,
pub source_primary_index: u8,

pub source_primary_red_x: u16,
pub source_primary_red_y: u16,
pub source_primary_green_x: u16,
pub source_primary_green_y: u16,
pub source_primary_blue_x: u16,
pub source_primary_blue_y: u16,
pub source_primary_white_x: u16,
pub source_primary_white_y: u16,
pub source_primaries: Option<ColorPrimaries>,
}

impl ExtMetadataBlockLevel9 {
Expand All @@ -45,14 +38,7 @@ impl ExtMetadataBlockLevel9 {
};

if length > 1 {
block.source_primary_red_x = reader.get_n(16);
block.source_primary_red_y = reader.get_n(16);
block.source_primary_green_x = reader.get_n(16);
block.source_primary_green_y = reader.get_n(16);
block.source_primary_blue_x = reader.get_n(16);
block.source_primary_blue_y = reader.get_n(16);
block.source_primary_white_x = reader.get_n(16);
block.source_primary_white_y = reader.get_n(16);
block.source_primaries = Some(ColorPrimaries::parse(reader));
}

ExtMetadataBlock::Level9(block)
Expand All @@ -64,31 +50,23 @@ impl ExtMetadataBlockLevel9 {
writer.write_n(&self.source_primary_index.to_be_bytes(), 8);

if self.length > 1 {
writer.write_n(&self.source_primary_red_x.to_be_bytes(), 16);
writer.write_n(&self.source_primary_red_y.to_be_bytes(), 16);
writer.write_n(&self.source_primary_green_x.to_be_bytes(), 16);
writer.write_n(&self.source_primary_green_y.to_be_bytes(), 16);
writer.write_n(&self.source_primary_blue_x.to_be_bytes(), 16);
writer.write_n(&self.source_primary_blue_y.to_be_bytes(), 16);
writer.write_n(&self.source_primary_white_x.to_be_bytes(), 16);
writer.write_n(&self.source_primary_white_y.to_be_bytes(), 16);
if let Some(primaries) = &self.source_primaries {
primaries.write(writer);
}
}

Ok(())
}

pub fn validate(&self) -> Result<()> {
if self.length > 1 {
// Custom primaries
// Custom primaries required
ensure!(self.source_primary_index == 255);
ensure!(self.source_primary_red_x > 0);
ensure!(self.source_primary_red_y > 0);
ensure!(self.source_primary_green_x > 0);
ensure!(self.source_primary_green_y > 0);
ensure!(self.source_primary_blue_x > 0);
ensure!(self.source_primary_blue_y > 0);
ensure!(self.source_primary_white_x > 0);
ensure!(self.source_primary_white_y > 0);
ensure!(self.source_primaries.is_some());

if let Some(primaries) = &self.source_primaries {
primaries.validate()?;
}
} else {
// Should be a preset primary between 0-8?
// But not custom primaries
Expand All @@ -111,7 +89,7 @@ impl ExtMetadataBlockInfo for ExtMetadataBlockLevel9 {
fn required_bits(&self) -> u64 {
match self.length {
1 => 8,
9 => 136,
17 => 136,
_ => unreachable!(),
}
}
Expand All @@ -127,14 +105,7 @@ impl Default for ExtMetadataBlockLevel9 {
Self {
length: 1,
source_primary_index: 0,
source_primary_red_x: 0,
source_primary_red_y: 0,
source_primary_green_x: 0,
source_primary_green_y: 0,
source_primary_blue_x: 0,
source_primary_blue_y: 0,
source_primary_white_x: 0,
source_primary_white_y: 0,
source_primaries: None,
}
}
}
Expand All @@ -147,23 +118,27 @@ impl Serialize for ExtMetadataBlockLevel9 {
{
let name = "ExtMetadataBlockLevel9";
let fields_count = match self.length {
1 => 1,
9 => 9,
1 => 2,
17 => 10,
_ => unreachable!(),
};

let mut state = serializer.serialize_struct(name, fields_count)?;

state.serialize_field("length", &self.length)?;
state.serialize_field("source_primary_index", &self.source_primary_index)?;

if self.length > 1 {
state.serialize_field("source_primary_red_x", &self.source_primary_red_x)?;
state.serialize_field("source_primary_red_y", &self.source_primary_white_y)?;
state.serialize_field("source_primary_green_x", &self.source_primary_green_x)?;
state.serialize_field("source_primary_green_y", &self.source_primary_green_y)?;
state.serialize_field("source_primary_blue_x", &self.source_primary_blue_x)?;
state.serialize_field("source_primary_blue_y", &self.source_primary_blue_y)?;
state.serialize_field("source_primary_white_x", &self.source_primary_white_x)?;
state.serialize_field("source_primary_white_y", &self.source_primary_white_y)?;
if let Some(primaries) = &self.source_primaries {
state.serialize_field("source_primary_red_x", &primaries.red_x)?;
state.serialize_field("source_primary_red_y", &primaries.white_y)?;
state.serialize_field("source_primary_green_x", &primaries.green_x)?;
state.serialize_field("source_primary_green_y", &primaries.green_y)?;
state.serialize_field("source_primary_blue_x", &primaries.blue_x)?;
state.serialize_field("source_primary_blue_y", &primaries.blue_y)?;
state.serialize_field("source_primary_white_x", &primaries.white_x)?;
state.serialize_field("source_primary_white_y", &primaries.white_y)?;
}
}

state.end()
Expand Down
Loading

0 comments on commit d9626c0

Please sign in to comment.