Skip to content

Commit

Permalink
Update bitvec_helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
quietvoid committed Nov 29, 2021
1 parent 7f86bd6 commit b61b076
Show file tree
Hide file tree
Showing 11 changed files with 266 additions and 223 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "hevc_parser"
version = "0.2.1"
version = "0.3.0"
authors = ["quietvoid"]
edition = "2018"
license = "MIT"
Expand All @@ -9,5 +9,5 @@ repository = "https://github.com/quietvoid/hevc_parser"

[dependencies]
nom = "7.1.0"
bitvec_helpers = "0.1.1"
bitvec_helpers = "1.0.0"
anyhow = "1.0.45"
41 changes: 25 additions & 16 deletions src/hevc/hrd_parameters.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
use super::BitVecReader;
use anyhow::Result;

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

pub struct SubLayerHrdParameter {}

impl HrdParameters {
pub fn parse(bs: &mut BitVecReader, common_inf_present: bool, vps_max_sub_layers: u8) {
pub fn parse(
bs: &mut BitVecReader,
common_inf_present: bool,
vps_max_sub_layers: u8,
) -> Result<()> {
let mut nal_params_present = false;
let mut vcl_params_present = false;
let mut subpic_params_present = false;

if common_inf_present {
nal_params_present = bs.get();
vcl_params_present = bs.get();
nal_params_present = bs.get()?;
vcl_params_present = bs.get()?;

if nal_params_present || vcl_params_present {
subpic_params_present = bs.get();
subpic_params_present = bs.get()?;

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

if !fixed_rate {
fixed_rate = bs.get();
fixed_rate = bs.get()?;
}

if fixed_rate {
bs.get_ue();
bs.get_ue()?;
} else {
low_delay = bs.get();
low_delay = bs.get()?;
}

if !low_delay {
nb_cpb = bs.get_ue() + 1;
nb_cpb = bs.get_ue()? + 1;
}

if nal_params_present {
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present);
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
}

if vcl_params_present {
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present);
SubLayerHrdParameter::parse(bs, nb_cpb, subpic_params_present)?;
}
}

Ok(())
}
}

impl SubLayerHrdParameter {
pub fn parse(bs: &mut BitVecReader, nb_cpb: u64, subpic_params_present: bool) {
pub fn parse(bs: &mut BitVecReader, nb_cpb: u64, subpic_params_present: bool) -> Result<()> {
for _ in 0..nb_cpb {
bs.get_ue(); // bit_rate_value_minus1
bs.get_ue(); // cpb_size_value_minus1
bs.get_ue()?; // bit_rate_value_minus1
bs.get_ue()?; // cpb_size_value_minus1

if subpic_params_present {
bs.get_ue(); // cpb_size_du_value_minus1
bs.get_ue(); // bit_rate_du_value_minus1
bs.get_ue()?; // cpb_size_du_value_minus1
bs.get_ue()?; // bit_rate_du_value_minus1
}

bs.skip_n(1); // cbr_flag
}

Ok(())
}
}
83 changes: 42 additions & 41 deletions src/hevc/pps.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{scaling_list_data::ScalingListData, BitVecReader};
use anyhow::Result;

#[derive(Default, Debug, PartialEq)]
pub struct PPSNAL {
Expand Down Expand Up @@ -50,85 +51,85 @@ pub struct PPSNAL {
}

impl PPSNAL {
pub fn parse(bs: &mut BitVecReader) -> PPSNAL {
pub fn parse(bs: &mut BitVecReader) -> Result<PPSNAL> {
let mut pps = PPSNAL {
pps_id: bs.get_ue(),
sps_id: bs.get_ue(),
pps_id: bs.get_ue()?,
sps_id: bs.get_ue()?,
..Default::default()
};

pps.dependent_slice_segments_enabled_flag = bs.get();
pps.output_flag_present_flag = bs.get();
pps.dependent_slice_segments_enabled_flag = bs.get()?;
pps.output_flag_present_flag = bs.get()?;
pps.num_extra_slice_header_bits = bs.get_n(3);
pps.sign_data_hiding_flag = bs.get();
pps.cabac_init_present_flag = bs.get();
pps.num_ref_idx_l0_default_active = bs.get_ue() + 1;
pps.num_ref_idx_l1_default_active = bs.get_ue() + 1;
pps.pic_init_qp_minus26 = bs.get_se();
pps.constrained_intra_pred_flag = bs.get();
pps.transform_skip_enabled_flag = bs.get();
pps.cu_qp_delta_enabled_flag = bs.get();
pps.sign_data_hiding_flag = bs.get()?;
pps.cabac_init_present_flag = bs.get()?;
pps.num_ref_idx_l0_default_active = bs.get_ue()? + 1;
pps.num_ref_idx_l1_default_active = bs.get_ue()? + 1;
pps.pic_init_qp_minus26 = bs.get_se()?;
pps.constrained_intra_pred_flag = bs.get()?;
pps.transform_skip_enabled_flag = bs.get()?;
pps.cu_qp_delta_enabled_flag = bs.get()?;

pps.diff_cu_qp_delta_depth = if pps.cu_qp_delta_enabled_flag {
bs.get_ue()
bs.get_ue()?
} else {
0
};

pps.cb_qp_offset = bs.get_se();
pps.cr_qp_offset = bs.get_se();
pps.cb_qp_offset = bs.get_se()?;
pps.cr_qp_offset = bs.get_se()?;

pps.pic_slice_level_chroma_qp_offsets_present_flag = bs.get();
pps.weighted_pred_flag = bs.get();
pps.weighted_bipred_flag = bs.get();
pps.pic_slice_level_chroma_qp_offsets_present_flag = bs.get()?;
pps.weighted_pred_flag = bs.get()?;
pps.weighted_bipred_flag = bs.get()?;

pps.transquant_bypass_enable_flag = bs.get();
pps.tiles_enabled_flag = bs.get();
pps.entropy_coding_sync_enabled_flag = bs.get();
pps.transquant_bypass_enable_flag = bs.get()?;
pps.tiles_enabled_flag = bs.get()?;
pps.entropy_coding_sync_enabled_flag = bs.get()?;

if pps.tiles_enabled_flag {
pps.num_tile_columns = bs.get_ue() + 1;
pps.num_tile_rows = bs.get_ue() + 1;
pps.num_tile_columns = bs.get_ue()? + 1;
pps.num_tile_rows = bs.get_ue()? + 1;

pps.uniform_spacing_flag = bs.get();
pps.uniform_spacing_flag = bs.get()?;

if !pps.uniform_spacing_flag {
for _ in 0..pps.num_tile_columns - 1 {
pps.column_widths.push(bs.get_ue() + 1);
pps.column_widths.push(bs.get_ue()? + 1);
}

for _ in 0..pps.num_tile_rows - 1 {
pps.row_heights.push(bs.get_ue() + 1);
pps.row_heights.push(bs.get_ue()? + 1);
}
}

pps.loop_filter_across_tiles_enabled_flag = bs.get();
pps.loop_filter_across_tiles_enabled_flag = bs.get()?;
}

pps.seq_loop_filter_across_slices_enabled_flag = bs.get();
pps.deblocking_filter_control_present_flag = bs.get();
pps.seq_loop_filter_across_slices_enabled_flag = bs.get()?;
pps.deblocking_filter_control_present_flag = bs.get()?;

if pps.deblocking_filter_control_present_flag {
pps.deblocking_filter_override_enabled_flag = bs.get();
pps.disable_dbf = bs.get();
pps.deblocking_filter_override_enabled_flag = bs.get()?;
pps.disable_dbf = bs.get()?;

if !pps.disable_dbf {
pps.beta_offset = 2 * bs.get_se();
pps.tc_offset = 2 * bs.get_se();
pps.beta_offset = 2 * bs.get_se()?;
pps.tc_offset = 2 * bs.get_se()?;
}
}

pps.scaling_list_data_present_flag = bs.get();
pps.scaling_list_data_present_flag = bs.get()?;
if pps.scaling_list_data_present_flag {
pps.scaling_list_data = ScalingListData::parse(bs);
pps.scaling_list_data = ScalingListData::parse(bs)?;
}

pps.lists_modification_present_flag = bs.get();
pps.log2_parallel_merge_level = bs.get_ue() + 2;
pps.lists_modification_present_flag = bs.get()?;
pps.log2_parallel_merge_level = bs.get_ue()? + 2;

pps.slice_header_extension_present_flag = bs.get();
pps.pps_extension_present_flag = bs.get();
pps.slice_header_extension_present_flag = bs.get()?;
pps.pps_extension_present_flag = bs.get()?;

pps
Ok(pps)
}
}
33 changes: 18 additions & 15 deletions src/hevc/profile_tier_level.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::BitVecReader;
use anyhow::Result;

#[derive(Default, Debug, PartialEq, Clone)]
pub struct ProfileTierLevel {
Expand Down Expand Up @@ -26,27 +27,27 @@ pub struct ProfileTierLevel {
}

impl ProfileTierLevel {
pub fn parse(&mut self, bs: &mut BitVecReader, max_sub_layers: u8) {
pub fn parse(&mut self, bs: &mut BitVecReader, max_sub_layers: u8) -> Result<()> {
self.general_profile_space = bs.get_n(2);
self.general_tier_flag = bs.get();
self.general_tier_flag = bs.get()?;
self.general_profile_idc = bs.get_n(5);

for _ in 0..32 {
self.general_profile_compatibility_flag.push(bs.get());
self.general_profile_compatibility_flag.push(bs.get()?);
}

self.general_progressive_source_flag = bs.get();
self.general_interlaced_source_flag = bs.get();
self.general_non_packed_constraint_flag = bs.get();
self.general_frame_only_constraint_flag = bs.get();
self.general_progressive_source_flag = bs.get()?;
self.general_interlaced_source_flag = bs.get()?;
self.general_non_packed_constraint_flag = bs.get()?;
self.general_frame_only_constraint_flag = bs.get()?;
bs.skip_n(32);
bs.skip_n(12);
self.general_level_idc = bs.get_n(8);

let max_sub_layers_minus1 = max_sub_layers - 1;
for _ in 0..max_sub_layers_minus1 {
self.sub_layer_profile_present_flag.push(bs.get());
self.sub_layer_level_present_flag.push(bs.get());
self.sub_layer_profile_present_flag.push(bs.get()?);
self.sub_layer_level_present_flag.push(bs.get()?);
}

if max_sub_layers_minus1 > 0 {
Expand All @@ -58,17 +59,17 @@ impl ProfileTierLevel {
for i in 0..max_sub_layers_minus1 as usize {
if self.sub_layer_profile_present_flag[i] {
self.sub_layer_profile_space.push(bs.get_n(2));
self.sub_layer_tier_flag.push(bs.get());
self.sub_layer_tier_flag.push(bs.get()?);
self.sub_layer_profile_idc.push(bs.get_n(5));

for _ in 0..32 {
self.sub_layer_profile_compatibility_flag.push(bs.get());
self.sub_layer_profile_compatibility_flag.push(bs.get()?);
}

self.sub_layer_progressive_source_flag.push(bs.get());
self.sub_layer_interlaced_source_flag.push(bs.get());
self.sub_layer_non_packed_constraint_flag.push(bs.get());
self.sub_layer_frame_only_constraint_flag.push(bs.get());
self.sub_layer_progressive_source_flag.push(bs.get()?);
self.sub_layer_interlaced_source_flag.push(bs.get()?);
self.sub_layer_non_packed_constraint_flag.push(bs.get()?);
self.sub_layer_frame_only_constraint_flag.push(bs.get()?);

bs.skip_n(32);
bs.skip_n(12);
Expand All @@ -80,5 +81,7 @@ impl ProfileTierLevel {
self.sub_layer_level_idc.push(1);
}
}

Ok(())
}
}
16 changes: 9 additions & 7 deletions src/hevc/scaling_list_data.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use super::BitVecReader;
use anyhow::Result;
use std::cmp::min;

use super::BitVecReader;

#[derive(Default, Debug, PartialEq, Clone)]
pub struct ScalingListData {
scaling_list_pred_mode_flag: Vec<Vec<bool>>,
Expand All @@ -10,7 +12,7 @@ pub struct ScalingListData {
}

impl ScalingListData {
pub fn parse(bs: &mut BitVecReader) -> ScalingListData {
pub fn parse(bs: &mut BitVecReader) -> Result<ScalingListData> {
let mut scl = ScalingListData::default();

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

for matrix_id in 0..matrix_size {
scl.scaling_list_pred_mode_flag[size_id][matrix_id] = bs.get();
scl.scaling_list_pred_mode_flag[size_id][matrix_id] = bs.get()?;

if !scl.scaling_list_pred_mode_flag[size_id][matrix_id] {
scl.scaling_list_pred_matrix_id_delta[size_id][matrix_id] = bs.get_ue();
scl.scaling_list_pred_matrix_id_delta[size_id][matrix_id] = bs.get_ue()?;
} else {
let _next_coef = 8;
let coef_num = min(64, 1 << (4 + (size_id << 1)));

if size_id > 1 {
scl.scaling_list_dc_coef_minus8[size_id - 2][matrix_id] = bs.get_se();
scl.scaling_list_dc_coef_minus8[size_id - 2][matrix_id] = bs.get_se()?;
}

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

for i in 0..coef_num {
scl.scaling_list_delta_coef[size_id][matrix_id][i] = bs.get_se();
scl.scaling_list_delta_coef[size_id][matrix_id][i] = bs.get_se()?;
}
}
}
}

scl
Ok(scl)
}
}
Loading

0 comments on commit b61b076

Please sign in to comment.