in mp4parse/src/lib.rs [4813:4881]
fn read_vpcc<T: Read>(src: &mut BMFFBox<T>) -> Result<VPxConfigBox> {
let (version, _) = read_fullbox_extra(src)?;
let supported_versions = [0, 1];
if !supported_versions.contains(&version) {
return Err(Error::Unsupported("unknown vpcC version"));
}
let profile = src.read_u8()?;
let level = src.read_u8()?;
let (
bit_depth,
colour_primaries,
chroma_subsampling,
transfer_characteristics,
matrix_coefficients,
video_full_range_flag,
) = if version == 0 {
let (bit_depth, colour_primaries) = {
let byte = src.read_u8()?;
((byte >> 4) & 0x0f, byte & 0x0f)
};
// Note, transfer_characteristics was known as transfer_function in v0
let (chroma_subsampling, transfer_characteristics, video_full_range_flag) = {
let byte = src.read_u8()?;
((byte >> 4) & 0x0f, (byte >> 1) & 0x07, (byte & 1) == 1)
};
(
bit_depth,
colour_primaries,
chroma_subsampling,
transfer_characteristics,
None,
video_full_range_flag,
)
} else {
let (bit_depth, chroma_subsampling, video_full_range_flag) = {
let byte = src.read_u8()?;
((byte >> 4) & 0x0f, (byte >> 1) & 0x07, (byte & 1) == 1)
};
let colour_primaries = src.read_u8()?;
let transfer_characteristics = src.read_u8()?;
let matrix_coefficients = src.read_u8()?;
(
bit_depth,
colour_primaries,
chroma_subsampling,
transfer_characteristics,
Some(matrix_coefficients),
video_full_range_flag,
)
};
let codec_init_size = be_u16(src)?;
let codec_init = read_buf(src, codec_init_size.into())?;
// TODO(rillian): validate field value ranges.
Ok(VPxConfigBox {
profile,
level,
bit_depth,
colour_primaries,
chroma_subsampling,
transfer_characteristics,
matrix_coefficients,
video_full_range_flag,
codec_init,
})
}