hevc_parser/hevc/
hrd_parameters.rs1use super::BsIoVecReader;
2use anyhow::Result;
3
4#[derive(Default)]
5pub struct HrdParameters {}
6
7pub struct SubLayerHrdParameter {}
8
9impl HrdParameters {
10 pub fn parse(
11 bs: &mut BsIoVecReader,
12 common_inf_present: bool,
13 vps_max_sub_layers: u8,
14 ) -> Result<()> {
15 let mut nal_params_present = false;
16 let mut vcl_params_present = false;
17 let mut subpic_params_present = false;
18
19 if common_inf_present {
20 nal_params_present = bs.read_bit()?;
21 vcl_params_present = bs.read_bit()?;
22
23 if nal_params_present || vcl_params_present {
24 subpic_params_present = bs.read_bit()?;
25
26 if subpic_params_present {
27 bs.skip_n(8)?; bs.skip_n(5)?; bs.skip_n(1)?; bs.skip_n(5)?; }
32
33 bs.skip_n(4)?; bs.skip_n(4)?; if subpic_params_present {
37 bs.skip_n(4)?; }
39
40 bs.skip_n(5)?; bs.skip_n(5)?; bs.skip_n(5)?; }
44 }
45
46 for _ in 0..vps_max_sub_layers {
47 let mut low_delay = false;
48 let mut nb_cpb = 1;
49 let mut fixed_rate = bs.read_bit()?;
50
51 if !fixed_rate {
52 fixed_rate = bs.read_bit()?;
53 }
54
55 if fixed_rate {
56 bs.read_ue()?;
57 } else {
58 low_delay = bs.read_bit()?;
59 }
60
61 if !low_delay {
62 nb_cpb = bs.read_ue()? + 1;
63 }
64
65 if nal_params_present {
66 SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
67 }
68
69 if vcl_params_present {
70 SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
71 }
72 }
73
74 Ok(())
75 }
76}
77
78impl SubLayerHrdParameter {
79 pub fn parse(bs: &mut BsIoVecReader, nb_cpb: u64, subpic_params_present: bool) -> Result<()> {
80 for _ in 0..nb_cpb {
81 bs.read_ue()?; bs.read_ue()?; if subpic_params_present {
85 bs.read_ue()?; bs.read_ue()?; }
88
89 bs.skip_n(1)?; }
91
92 Ok(())
93 }
94}