|
1 | 1 | use super::{scaling_list_data::ScalingListData, BitVecReader}; |
| 2 | +use anyhow::Result; |
2 | 3 |
|
3 | 4 | #[derive(Default, Debug, PartialEq)] |
4 | 5 | pub struct PPSNAL { |
@@ -50,85 +51,85 @@ pub struct PPSNAL { |
50 | 51 | } |
51 | 52 |
|
52 | 53 | impl PPSNAL { |
53 | | - pub fn parse(bs: &mut BitVecReader) -> PPSNAL { |
| 54 | + pub fn parse(bs: &mut BitVecReader) -> Result<PPSNAL> { |
54 | 55 | 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()?, |
57 | 58 | ..Default::default() |
58 | 59 | }; |
59 | 60 |
|
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()?; |
62 | 63 | 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()?; |
71 | 72 |
|
72 | 73 | pps.diff_cu_qp_delta_depth = if pps.cu_qp_delta_enabled_flag { |
73 | | - bs.get_ue() |
| 74 | + bs.get_ue()? |
74 | 75 | } else { |
75 | 76 | 0 |
76 | 77 | }; |
77 | 78 |
|
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()?; |
80 | 81 |
|
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()?; |
84 | 85 |
|
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()?; |
88 | 89 |
|
89 | 90 | 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; |
92 | 93 |
|
93 | | - pps.uniform_spacing_flag = bs.get(); |
| 94 | + pps.uniform_spacing_flag = bs.get()?; |
94 | 95 |
|
95 | 96 | if !pps.uniform_spacing_flag { |
96 | 97 | 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); |
98 | 99 | } |
99 | 100 |
|
100 | 101 | 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); |
102 | 103 | } |
103 | 104 | } |
104 | 105 |
|
105 | | - pps.loop_filter_across_tiles_enabled_flag = bs.get(); |
| 106 | + pps.loop_filter_across_tiles_enabled_flag = bs.get()?; |
106 | 107 | } |
107 | 108 |
|
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()?; |
110 | 111 |
|
111 | 112 | 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()?; |
114 | 115 |
|
115 | 116 | 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()?; |
118 | 119 | } |
119 | 120 | } |
120 | 121 |
|
121 | | - pps.scaling_list_data_present_flag = bs.get(); |
| 122 | + pps.scaling_list_data_present_flag = bs.get()?; |
122 | 123 | if pps.scaling_list_data_present_flag { |
123 | | - pps.scaling_list_data = ScalingListData::parse(bs); |
| 124 | + pps.scaling_list_data = ScalingListData::parse(bs)?; |
124 | 125 | } |
125 | 126 |
|
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; |
128 | 129 |
|
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()?; |
131 | 132 |
|
132 | | - pps |
| 133 | + Ok(pps) |
133 | 134 | } |
134 | 135 | } |
0 commit comments