use crate::bitstream::BitstreamReader;
use crate::error::DecodeError;
#[derive(Debug, Clone, Copy)]
pub struct ProfileTierLevel {
pub general_profile_space: u8,
pub general_tier_flag: bool,
pub general_profile_idc: u8,
pub general_level_idc: u8,
}
pub fn parse_profile_tier_level(
reader: &mut BitstreamReader,
max_sub_layers_minus1: u8,
) -> Result<ProfileTierLevel, DecodeError> {
let general_profile_space = reader.read_bits(2)? as u8;
let general_tier_flag = reader.read_bit()? == 1;
let general_profile_idc = reader.read_bits(5)? as u8;
let _ = reader.read_bits(32)?;
let _general_progressive_source_flag = reader.read_bit()?;
let _general_interlaced_source_flag = reader.read_bit()?;
let _general_non_packed_constraint_flag = reader.read_bit()?;
let _general_frame_only_constraint_flag = reader.read_bit()?;
let _ = reader.read_bits(22)?;
let _ = reader.read_bits(22)?;
let general_level_idc = reader.read_bits(8)? as u8;
if max_sub_layers_minus1 > 0 {
let mut sub_layer_profile_present = [false; 7];
let mut sub_layer_level_present = [false; 7];
for i in 0..max_sub_layers_minus1 as usize {
sub_layer_profile_present[i] = reader.read_bit()? == 1;
sub_layer_level_present[i] = reader.read_bit()? == 1;
}
for _ in (max_sub_layers_minus1 as usize)..8 {
let _ = reader.read_bits(2)?;
}
for i in 0..max_sub_layers_minus1 as usize {
if sub_layer_profile_present[i] {
let _ = reader.read_bits(2)?; let _ = reader.read_bit()?; let _ = reader.read_bits(5)?; let _ = reader.read_bits(32)?; let _ = reader.read_bits(4)?; let _ = reader.read_bits(22)?; let _ = reader.read_bits(22)?;
}
if sub_layer_level_present[i] {
let _ = reader.read_bits(8)?; }
}
}
Ok(ProfileTierLevel {
general_profile_space,
general_tier_flag,
general_profile_idc,
general_level_idc,
})
}