Skip to content

Commit b61b076

Browse files
committed
Update bitvec_helpers
1 parent 7f86bd6 commit b61b076

File tree

11 files changed

+266
-223
lines changed

11 files changed

+266
-223
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "hevc_parser"
3-
version = "0.2.1"
3+
version = "0.3.0"
44
authors = ["quietvoid"]
55
edition = "2018"
66
license = "MIT"
@@ -9,5 +9,5 @@ repository = "https://github.com/quietvoid/hevc_parser"
99

1010
[dependencies]
1111
nom = "7.1.0"
12-
bitvec_helpers = "0.1.1"
12+
bitvec_helpers = "1.0.0"
1313
anyhow = "1.0.45"

src/hevc/hrd_parameters.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
use super::BitVecReader;
2+
use anyhow::Result;
23

34
#[derive(Default)]
45
pub struct HrdParameters {}
56

67
pub struct SubLayerHrdParameter {}
78

89
impl HrdParameters {
9-
pub fn parse(bs: &mut BitVecReader, common_inf_present: bool, vps_max_sub_layers: u8) {
10+
pub fn parse(
11+
bs: &mut BitVecReader,
12+
common_inf_present: bool,
13+
vps_max_sub_layers: u8,
14+
) -> Result<()> {
1015
let mut nal_params_present = false;
1116
let mut vcl_params_present = false;
1217
let mut subpic_params_present = false;
1318

1419
if common_inf_present {
15-
nal_params_present = bs.get();
16-
vcl_params_present = bs.get();
20+
nal_params_present = bs.get()?;
21+
vcl_params_present = bs.get()?;
1722

1823
if nal_params_present || vcl_params_present {
19-
subpic_params_present = bs.get();
24+
subpic_params_present = bs.get()?;
2025

2126
if subpic_params_present {
2227
bs.skip_n(8); // tick_divisor_minus2
@@ -41,45 +46,49 @@ impl HrdParameters {
4146
for _ in 0..vps_max_sub_layers {
4247
let mut low_delay = false;
4348
let mut nb_cpb = 1;
44-
let mut fixed_rate = bs.get();
49+
let mut fixed_rate = bs.get()?;
4550

4651
if !fixed_rate {
47-
fixed_rate = bs.get();
52+
fixed_rate = bs.get()?;
4853
}
4954

5055
if fixed_rate {
51-
bs.get_ue();
56+
bs.get_ue()?;
5257
} else {
53-
low_delay = bs.get();
58+
low_delay = bs.get()?;
5459
}
5560

5661
if !low_delay {
57-
nb_cpb = bs.get_ue() + 1;
62+
nb_cpb = bs.get_ue()? + 1;
5863
}
5964

6065
if nal_params_present {
61-
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present);
66+
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
6267
}
6368

6469
if vcl_params_present {
65-
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present);
70+
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
6671
}
6772
}
73+
74+
Ok(())
6875
}
6976
}
7077

7178
impl SubLayerHrdParameter {
72-
pub fn parse(bs: &mut BitVecReader, nb_cpb: u64, subpic_params_present: bool) {
79+
pub fn parse(bs: &mut BitVecReader, nb_cpb: u64, subpic_params_present: bool) -> Result<()> {
7380
for _ in 0..nb_cpb {
74-
bs.get_ue(); // bit_rate_value_minus1
75-
bs.get_ue(); // cpb_size_value_minus1
81+
bs.get_ue()?; // bit_rate_value_minus1
82+
bs.get_ue()?; // cpb_size_value_minus1
7683

7784
if subpic_params_present {
78-
bs.get_ue(); // cpb_size_du_value_minus1
79-
bs.get_ue(); // bit_rate_du_value_minus1
85+
bs.get_ue()?; // cpb_size_du_value_minus1
86+
bs.get_ue()?; // bit_rate_du_value_minus1
8087
}
8188

8289
bs.skip_n(1); // cbr_flag
8390
}
91+
92+
Ok(())
8493
}
8594
}

src/hevc/pps.rs

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::{scaling_list_data::ScalingListData, BitVecReader};
2+
use anyhow::Result;
23

34
#[derive(Default, Debug, PartialEq)]
45
pub struct PPSNAL {
@@ -50,85 +51,85 @@ pub struct PPSNAL {
5051
}
5152

5253
impl PPSNAL {
53-
pub fn parse(bs: &mut BitVecReader) -> PPSNAL {
54+
pub fn parse(bs: &mut BitVecReader) -> Result<PPSNAL> {
5455
let mut pps = PPSNAL {
55-
pps_id: bs.get_ue(),
56-
sps_id: bs.get_ue(),
56+
pps_id: bs.get_ue()?,
57+
sps_id: bs.get_ue()?,
5758
..Default::default()
5859
};
5960

60-
pps.dependent_slice_segments_enabled_flag = bs.get();
61-
pps.output_flag_present_flag = bs.get();
61+
pps.dependent_slice_segments_enabled_flag = bs.get()?;
62+
pps.output_flag_present_flag = bs.get()?;
6263
pps.num_extra_slice_header_bits = bs.get_n(3);
63-
pps.sign_data_hiding_flag = bs.get();
64-
pps.cabac_init_present_flag = bs.get();
65-
pps.num_ref_idx_l0_default_active = bs.get_ue() + 1;
66-
pps.num_ref_idx_l1_default_active = bs.get_ue() + 1;
67-
pps.pic_init_qp_minus26 = bs.get_se();
68-
pps.constrained_intra_pred_flag = bs.get();
69-
pps.transform_skip_enabled_flag = bs.get();
70-
pps.cu_qp_delta_enabled_flag = bs.get();
64+
pps.sign_data_hiding_flag = bs.get()?;
65+
pps.cabac_init_present_flag = bs.get()?;
66+
pps.num_ref_idx_l0_default_active = bs.get_ue()? + 1;
67+
pps.num_ref_idx_l1_default_active = bs.get_ue()? + 1;
68+
pps.pic_init_qp_minus26 = bs.get_se()?;
69+
pps.constrained_intra_pred_flag = bs.get()?;
70+
pps.transform_skip_enabled_flag = bs.get()?;
71+
pps.cu_qp_delta_enabled_flag = bs.get()?;
7172

7273
pps.diff_cu_qp_delta_depth = if pps.cu_qp_delta_enabled_flag {
73-
bs.get_ue()
74+
bs.get_ue()?
7475
} else {
7576
0
7677
};
7778

78-
pps.cb_qp_offset = bs.get_se();
79-
pps.cr_qp_offset = bs.get_se();
79+
pps.cb_qp_offset = bs.get_se()?;
80+
pps.cr_qp_offset = bs.get_se()?;
8081

81-
pps.pic_slice_level_chroma_qp_offsets_present_flag = bs.get();
82-
pps.weighted_pred_flag = bs.get();
83-
pps.weighted_bipred_flag = bs.get();
82+
pps.pic_slice_level_chroma_qp_offsets_present_flag = bs.get()?;
83+
pps.weighted_pred_flag = bs.get()?;
84+
pps.weighted_bipred_flag = bs.get()?;
8485

85-
pps.transquant_bypass_enable_flag = bs.get();
86-
pps.tiles_enabled_flag = bs.get();
87-
pps.entropy_coding_sync_enabled_flag = bs.get();
86+
pps.transquant_bypass_enable_flag = bs.get()?;
87+
pps.tiles_enabled_flag = bs.get()?;
88+
pps.entropy_coding_sync_enabled_flag = bs.get()?;
8889

8990
if pps.tiles_enabled_flag {
90-
pps.num_tile_columns = bs.get_ue() + 1;
91-
pps.num_tile_rows = bs.get_ue() + 1;
91+
pps.num_tile_columns = bs.get_ue()? + 1;
92+
pps.num_tile_rows = bs.get_ue()? + 1;
9293

93-
pps.uniform_spacing_flag = bs.get();
94+
pps.uniform_spacing_flag = bs.get()?;
9495

9596
if !pps.uniform_spacing_flag {
9697
for _ in 0..pps.num_tile_columns - 1 {
97-
pps.column_widths.push(bs.get_ue() + 1);
98+
pps.column_widths.push(bs.get_ue()? + 1);
9899
}
99100

100101
for _ in 0..pps.num_tile_rows - 1 {
101-
pps.row_heights.push(bs.get_ue() + 1);
102+
pps.row_heights.push(bs.get_ue()? + 1);
102103
}
103104
}
104105

105-
pps.loop_filter_across_tiles_enabled_flag = bs.get();
106+
pps.loop_filter_across_tiles_enabled_flag = bs.get()?;
106107
}
107108

108-
pps.seq_loop_filter_across_slices_enabled_flag = bs.get();
109-
pps.deblocking_filter_control_present_flag = bs.get();
109+
pps.seq_loop_filter_across_slices_enabled_flag = bs.get()?;
110+
pps.deblocking_filter_control_present_flag = bs.get()?;
110111

111112
if pps.deblocking_filter_control_present_flag {
112-
pps.deblocking_filter_override_enabled_flag = bs.get();
113-
pps.disable_dbf = bs.get();
113+
pps.deblocking_filter_override_enabled_flag = bs.get()?;
114+
pps.disable_dbf = bs.get()?;
114115

115116
if !pps.disable_dbf {
116-
pps.beta_offset = 2 * bs.get_se();
117-
pps.tc_offset = 2 * bs.get_se();
117+
pps.beta_offset = 2 * bs.get_se()?;
118+
pps.tc_offset = 2 * bs.get_se()?;
118119
}
119120
}
120121

121-
pps.scaling_list_data_present_flag = bs.get();
122+
pps.scaling_list_data_present_flag = bs.get()?;
122123
if pps.scaling_list_data_present_flag {
123-
pps.scaling_list_data = ScalingListData::parse(bs);
124+
pps.scaling_list_data = ScalingListData::parse(bs)?;
124125
}
125126

126-
pps.lists_modification_present_flag = bs.get();
127-
pps.log2_parallel_merge_level = bs.get_ue() + 2;
127+
pps.lists_modification_present_flag = bs.get()?;
128+
pps.log2_parallel_merge_level = bs.get_ue()? + 2;
128129

129-
pps.slice_header_extension_present_flag = bs.get();
130-
pps.pps_extension_present_flag = bs.get();
130+
pps.slice_header_extension_present_flag = bs.get()?;
131+
pps.pps_extension_present_flag = bs.get()?;
131132

132-
pps
133+
Ok(pps)
133134
}
134135
}

src/hevc/profile_tier_level.rs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::BitVecReader;
2+
use anyhow::Result;
23

34
#[derive(Default, Debug, PartialEq, Clone)]
45
pub struct ProfileTierLevel {
@@ -26,27 +27,27 @@ pub struct ProfileTierLevel {
2627
}
2728

2829
impl ProfileTierLevel {
29-
pub fn parse(&mut self, bs: &mut BitVecReader, max_sub_layers: u8) {
30+
pub fn parse(&mut self, bs: &mut BitVecReader, max_sub_layers: u8) -> Result<()> {
3031
self.general_profile_space = bs.get_n(2);
31-
self.general_tier_flag = bs.get();
32+
self.general_tier_flag = bs.get()?;
3233
self.general_profile_idc = bs.get_n(5);
3334

3435
for _ in 0..32 {
35-
self.general_profile_compatibility_flag.push(bs.get());
36+
self.general_profile_compatibility_flag.push(bs.get()?);
3637
}
3738

38-
self.general_progressive_source_flag = bs.get();
39-
self.general_interlaced_source_flag = bs.get();
40-
self.general_non_packed_constraint_flag = bs.get();
41-
self.general_frame_only_constraint_flag = bs.get();
39+
self.general_progressive_source_flag = bs.get()?;
40+
self.general_interlaced_source_flag = bs.get()?;
41+
self.general_non_packed_constraint_flag = bs.get()?;
42+
self.general_frame_only_constraint_flag = bs.get()?;
4243
bs.skip_n(32);
4344
bs.skip_n(12);
4445
self.general_level_idc = bs.get_n(8);
4546

4647
let max_sub_layers_minus1 = max_sub_layers - 1;
4748
for _ in 0..max_sub_layers_minus1 {
48-
self.sub_layer_profile_present_flag.push(bs.get());
49-
self.sub_layer_level_present_flag.push(bs.get());
49+
self.sub_layer_profile_present_flag.push(bs.get()?);
50+
self.sub_layer_level_present_flag.push(bs.get()?);
5051
}
5152

5253
if max_sub_layers_minus1 > 0 {
@@ -58,17 +59,17 @@ impl ProfileTierLevel {
5859
for i in 0..max_sub_layers_minus1 as usize {
5960
if self.sub_layer_profile_present_flag[i] {
6061
self.sub_layer_profile_space.push(bs.get_n(2));
61-
self.sub_layer_tier_flag.push(bs.get());
62+
self.sub_layer_tier_flag.push(bs.get()?);
6263
self.sub_layer_profile_idc.push(bs.get_n(5));
6364

6465
for _ in 0..32 {
65-
self.sub_layer_profile_compatibility_flag.push(bs.get());
66+
self.sub_layer_profile_compatibility_flag.push(bs.get()?);
6667
}
6768

68-
self.sub_layer_progressive_source_flag.push(bs.get());
69-
self.sub_layer_interlaced_source_flag.push(bs.get());
70-
self.sub_layer_non_packed_constraint_flag.push(bs.get());
71-
self.sub_layer_frame_only_constraint_flag.push(bs.get());
69+
self.sub_layer_progressive_source_flag.push(bs.get()?);
70+
self.sub_layer_interlaced_source_flag.push(bs.get()?);
71+
self.sub_layer_non_packed_constraint_flag.push(bs.get()?);
72+
self.sub_layer_frame_only_constraint_flag.push(bs.get()?);
7273

7374
bs.skip_n(32);
7475
bs.skip_n(12);
@@ -80,5 +81,7 @@ impl ProfileTierLevel {
8081
self.sub_layer_level_idc.push(1);
8182
}
8283
}
84+
85+
Ok(())
8386
}
8487
}

src/hevc/scaling_list_data.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
use super::BitVecReader;
1+
use anyhow::Result;
22
use std::cmp::min;
33

4+
use super::BitVecReader;
5+
46
#[derive(Default, Debug, PartialEq, Clone)]
57
pub struct ScalingListData {
68
scaling_list_pred_mode_flag: Vec<Vec<bool>>,
@@ -10,7 +12,7 @@ pub struct ScalingListData {
1012
}
1113

1214
impl ScalingListData {
13-
pub fn parse(bs: &mut BitVecReader) -> ScalingListData {
15+
pub fn parse(bs: &mut BitVecReader) -> Result<ScalingListData> {
1416
let mut scl = ScalingListData::default();
1517

1618
scl.scaling_list_pred_mode_flag.resize(4, Vec::new());
@@ -30,27 +32,27 @@ impl ScalingListData {
3032
}
3133

3234
for matrix_id in 0..matrix_size {
33-
scl.scaling_list_pred_mode_flag[size_id][matrix_id] = bs.get();
35+
scl.scaling_list_pred_mode_flag[size_id][matrix_id] = bs.get()?;
3436

3537
if !scl.scaling_list_pred_mode_flag[size_id][matrix_id] {
36-
scl.scaling_list_pred_matrix_id_delta[size_id][matrix_id] = bs.get_ue();
38+
scl.scaling_list_pred_matrix_id_delta[size_id][matrix_id] = bs.get_ue()?;
3739
} else {
3840
let _next_coef = 8;
3941
let coef_num = min(64, 1 << (4 + (size_id << 1)));
4042

4143
if size_id > 1 {
42-
scl.scaling_list_dc_coef_minus8[size_id - 2][matrix_id] = bs.get_se();
44+
scl.scaling_list_dc_coef_minus8[size_id - 2][matrix_id] = bs.get_se()?;
4345
}
4446

4547
scl.scaling_list_delta_coef[size_id][matrix_id].resize(coef_num, 0);
4648

4749
for i in 0..coef_num {
48-
scl.scaling_list_delta_coef[size_id][matrix_id][i] = bs.get_se();
50+
scl.scaling_list_delta_coef[size_id][matrix_id][i] = bs.get_se()?;
4951
}
5052
}
5153
}
5254
}
5355

54-
scl
56+
Ok(scl)
5557
}
5658
}

0 commit comments

Comments
 (0)