hevc_parser/hevc/
hrd_parameters.rs

1use 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)?; // tick_divisor_minus2
28                    bs.skip_n(5)?; // du_cpb_removal_delay_increment_length_minus1
29                    bs.skip_n(1)?; // sub_pic_cpb_params_in_pic_timing_sei_flag
30                    bs.skip_n(5)?; // dpb_output_delay_du_length_minus1
31                }
32
33                bs.skip_n(4)?; // bit_rate_scale
34                bs.skip_n(4)?; // cpb_size_scale
35
36                if subpic_params_present {
37                    bs.skip_n(4)?; // cpb_size_du_scale
38                }
39
40                bs.skip_n(5)?; // initial_cpb_removal_delay_length_minus1
41                bs.skip_n(5)?; // au_cpb_removal_delay_length_minus1
42                bs.skip_n(5)?; // dpb_output_delay_length_minus1
43            }
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()?; // bit_rate_value_minus1
82            bs.read_ue()?; // cpb_size_value_minus1
83
84            if subpic_params_present {
85                bs.read_ue()?; // cpb_size_du_value_minus1
86                bs.read_ue()?; // bit_rate_du_value_minus1
87            }
88
89            bs.skip_n(1)?; // cbr_flag
90        }
91
92        Ok(())
93    }
94}