Skip to content

Commit

Permalink
Move AV1 parse function to DoviRpu
Browse files Browse the repository at this point in the history
  • Loading branch information
quietvoid committed Mar 23, 2024
1 parent fd097b9 commit 4ff269e
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 12 deletions.
1 change: 1 addition & 0 deletions dolby_vision/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
- Changed AV1 function signatures to take slices as input and return a `Vec`.
- Added `write_av1_rpu_metadata_obu_t35_complete` function to encode RPUs in complete metadata OBU payloads.
- XML parser: support decimals when parsing Level6 MaxCLL/MaxFALL values.
- Added `DoviRpu::parse_itu_t35_dovi_metadata_obu` and deprecated `av1::parse_itu_t35_dovi_metadata_obu`.

C API:
- Added `dovi_write_av1_rpu_metadata_obu_t35_{payload,complete}` functions.
Expand Down
15 changes: 7 additions & 8 deletions dolby_vision/src/av1/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ const ITU_T35_DOVI_RPU_PAYLOAD_HEADER_LEN: usize = ITU_T35_DOVI_RPU_PAYLOAD_HEAD

/// Parse AV1 ITU-T T.35 metadata OBU into a `DoviRpu`
/// The payload is extracted out of the EMDF wrapper
#[deprecated(
since = "3.3.0",
note = "Replaced by DoviRpu::parse_itu_t35_dovi_metadata_obu"
)]
pub fn parse_itu_t35_dovi_metadata_obu(data: &[u8]) -> Result<DoviRpu> {
let data = validated_trimmed_data(data)?;
let converted_buf = convert_av1_rpu_payload_to_regular(data)?;

DoviRpu::parse_rpu(&converted_buf)
DoviRpu::parse_itu_t35_dovi_metadata_obu(data)
}

fn validated_trimmed_data(data: &[u8]) -> Result<&[u8]> {
pub(crate) fn av1_validated_trimmed_data(data: &[u8]) -> Result<&[u8]> {
if data.len() < 34 {
bail!("Invalid RPU length: {}", data.len());
}
Expand All @@ -47,10 +48,8 @@ fn validated_trimmed_data(data: &[u8]) -> Result<&[u8]> {
Ok(trimmed_data)
}

/// Internal function, use `parse_itu_t35_dovi_metadata_obu`
///
/// Returns the EMDF payload bytes representing the RPU buffer
fn convert_av1_rpu_payload_to_regular(data: &[u8]) -> Result<Vec<u8>> {
pub(crate) fn convert_av1_rpu_payload_to_regular(data: &[u8]) -> Result<Vec<u8>> {
let mut reader = BsIoSliceReader::from_slice(data);

let itu_t_t35_terminal_provider_code = reader.get_n::<u16>(16)?;
Expand Down
14 changes: 13 additions & 1 deletion dolby_vision/src/rpu/dovi_rpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ use super::rpu_data_nlq::{DoviELType, RpuDataNlq};
use super::vdr_dm_data::{vdr_dm_data_payload, VdrDmData};
use super::{compute_crc32, ConversionMode};

use crate::av1::convert_regular_rpu_to_av1_payload;
use crate::av1::{
av1_validated_trimmed_data, convert_av1_rpu_payload_to_regular,
convert_regular_rpu_to_av1_payload,
};
use crate::utils::{
add_start_code_emulation_prevention_3_byte, clear_start_code_emulation_prevention_3_byte,
};
Expand Down Expand Up @@ -90,6 +93,15 @@ impl DoviRpu {
DoviRpu::parse(&bytes)
}

/// Parse AV1 ITU-T T.35 metadata OBU into a `DoviRpu`
/// The payload is extracted out of the EMDF wrapper
pub fn parse_itu_t35_dovi_metadata_obu(data: &[u8]) -> Result<Self> {
let data = av1_validated_trimmed_data(data)?;
let converted_buf = convert_av1_rpu_payload_to_regular(data)?;

DoviRpu::parse(&converted_buf)
}

pub fn parse_rpu(data: &[u8]) -> Result<DoviRpu> {
let trimmed_data = DoviRpu::validated_trimmed_data(data)?;

Expand Down
5 changes: 2 additions & 3 deletions src/tests/av1_rpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use std::{io::Read, path::PathBuf};

use anyhow::Result;

use dolby_vision::av1::parse_itu_t35_dovi_metadata_obu;
use dolby_vision::rpu::dovi_rpu::DoviRpu;

pub fn _parse_file(input: PathBuf, hevc: bool) -> Result<(Vec<u8>, DoviRpu)> {
Expand All @@ -17,7 +16,7 @@ pub fn _parse_file(input: PathBuf, hevc: bool) -> Result<(Vec<u8>, DoviRpu)> {
let dovi_rpu = if hevc {
DoviRpu::parse_unspec62_nalu(&original_data)?
} else {
parse_itu_t35_dovi_metadata_obu(cloned_data.as_mut_slice())?
DoviRpu::parse_itu_t35_dovi_metadata_obu(cloned_data.as_mut_slice())?
};

Ok((original_data, dovi_rpu))
Expand Down Expand Up @@ -96,7 +95,7 @@ fn trailing_bytes_rpu() -> Result<()> {
assert_eq!(original_without_trailing.last().copied().unwrap(), 0x80);

let av1_payload = dovi_rpu.write_av1_rpu_metadata_obu_t35_payload()?;
let parsed_rpu = parse_itu_t35_dovi_metadata_obu(&av1_payload)?;
let parsed_rpu = DoviRpu::parse_itu_t35_dovi_metadata_obu(&av1_payload)?;

let rewritten_data = parsed_rpu.write_hevc_unspec62_nalu()?;
assert_eq!(&original_without_trailing[4..], &rewritten_data[2..]);
Expand Down

0 comments on commit 4ff269e

Please sign in to comment.