Skip to content

Commit 27bb95d

Browse files
committed
P block parsing progress
1 parent 0f62590 commit 27bb95d

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

src/h264/macroblock.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ impl IMb {
461461
#[allow(non_snake_case)]
462462
impl PMb {
463463
#[inline]
464-
pub fn MbPartPredMode(&self, partition: usize) -> MbPredictionMode {
464+
pub const fn MbPartPredMode(&self, partition: usize) -> MbPredictionMode {
465465
match self.mb_type {
466466
PMbType::P_Skip
467467
| PMbType::P_L0_16x16
@@ -470,6 +470,15 @@ impl PMb {
470470
PMbType::P_8x8ref0 | PMbType::P_8x8 => MbPredictionMode::None,
471471
}
472472
}
473+
474+
#[inline]
475+
pub const fn NumMbPart(&self) -> usize {
476+
match self.mb_type {
477+
PMbType::P_Skip | PMbType::P_L0_16x16 => 1,
478+
PMbType::P_L0_L0_16x8 | PMbType::P_L0_L0_8x16 => 2,
479+
PMbType::P_8x8ref0 | PMbType::P_8x8 => 4,
480+
}
481+
}
473482
}
474483

475484
#[allow(non_snake_case)]

src/h264/parser.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,20 @@ pub fn parse_slice_header(
604604
read_value!(input, header.redundant_pic_cnt, ue);
605605
}
606606

607+
if matches!(header.slice_type, SliceType::P | SliceType::SP | SliceType::B) {
608+
let num_ref_idx_active_override_flag: bool;
609+
read_value!(input, num_ref_idx_active_override_flag, f);
610+
if num_ref_idx_active_override_flag {
611+
read_value!(input, header.num_ref_idx_l0_active_minus1, ue);
612+
if header.slice_type == SliceType::B {
613+
read_value!(input, header.num_ref_idx_l1_active_minus1, ue);
614+
}
615+
} else {
616+
header.num_ref_idx_l0_active_minus1 = pps.num_ref_idx_l0_default_active_minus1;
617+
header.num_ref_idx_l1_active_minus1 = pps.num_ref_idx_l1_default_active_minus1;
618+
}
619+
}
620+
607621
if nal.nal_ref_idc != 0 {
608622
header.dec_ref_pic_marking = Some(parse_dec_ref_pic_marking(input, idr_pic_flag)?);
609623
}
@@ -743,6 +757,7 @@ fn calc_prev_intra4x4_pred_mode(
743757
result
744758
}
745759

760+
// Section 7.3.5 Macroblock layer syntax
746761
pub fn parse_macroblock(input: &mut BitReader, slice: &Slice) -> ParseResult<Macroblock> {
747762
let mb_type_val: u32;
748763
read_value!(input, mb_type_val, ue);
@@ -763,8 +778,22 @@ pub fn parse_p_macroblock(
763778
) -> ParseResult<Macroblock> {
764779
let mut block = PMb { mb_type, ..PMb::default() };
765780
let this_mb_addr = slice.get_next_mb_addr();
781+
let num_mb_part = block.NumMbPart();
782+
766783
/*
767784
TODO: Parse motion vectors here
785+
786+
787+
let ref_idx_l0 = [0u8;4];
788+
let ref_idx_l1 = [0u8;4];
789+
for part_idx in 0..num_mb_part {
790+
if slice.header.num_ref_idx_l0_active_minus1 > 0 &&
791+
block.MbPartPredMode(part_idx) != MbPredictionMode::Pred_L1 {
792+
793+
}
794+
795+
}
796+
768797
*/
769798

770799
let coded_block_pattern_num: u8;

src/h264/slice.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ pub struct SliceHeader {
8585
pub redundant_pic_cnt: Option<u32>,
8686

8787
//pub direct_spatial_mv_pred_flag: Option<bool>,
88-
//pub num_ref_idx_active: Option<NumRefIdxActive>,
88+
pub num_ref_idx_l0_active_minus1: u32,
89+
pub num_ref_idx_l1_active_minus1: u32,
90+
8991
// may become an enum rather than Option in future (for ref_pic_list_mvc_modification)
9092
//pub ref_pic_list_modification: Option<RefPicListModifications>,
9193
//pub pred_weight_table: Option<PredWeightTable>,

0 commit comments

Comments
 (0)