in mp4parse/src/lib.rs [3769:3817]
fn read_colr<T: Read>(
src: &mut BMFFBox<T>,
strictness: ParseStrictness,
) -> Result<ColourInformation> {
let colour_type = be_u32(src)?.to_be_bytes();
match &colour_type {
b"nclx" => {
const NUM_RESERVED_BITS: u8 = 7;
let colour_primaries = be_u16(src)?.try_into()?;
let transfer_characteristics = be_u16(src)?.try_into()?;
let matrix_coefficients = be_u16(src)?.try_into()?;
let bytes = src.read_into_try_vec()?;
let mut bit_reader = BitReader::new(&bytes);
let full_range_flag = bit_reader.read_bool()?;
if bit_reader.remaining() != NUM_RESERVED_BITS.into() {
error!(
"read_colr expected {} reserved bits, found {}",
NUM_RESERVED_BITS,
bit_reader.remaining()
);
return Status::ColrBadSize.into();
}
if bit_reader.read_u8(NUM_RESERVED_BITS)? != 0 {
fail_with_status_if(
strictness != ParseStrictness::Permissive,
Status::ColrReservedNonzero,
)?;
}
Ok(ColourInformation::Nclx(NclxColourInformation {
colour_primaries,
transfer_characteristics,
matrix_coefficients,
full_range_flag,
}))
}
b"rICC" | b"prof" => Ok(ColourInformation::Icc(
IccColourInformation {
bytes: src.read_into_try_vec()?,
},
FourCC::from(colour_type),
)),
_ => {
error!("read_colr colour_type: {:?}", colour_type);
Status::ColrBadType.into()
}
}
}