From: Kostya Shishkov Date: Thu, 5 Mar 2026 17:23:10 +0000 (+0100) Subject: h264: fix adaptive marking with log2_max_frame_num=16 X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=40e1e3f10e007fb4afeaa7c0cd1b582a76e93f4c;p=nihav.git h264: fix adaptive marking with log2_max_frame_num=16 --- diff --git a/nihav-itu/src/codecs/h264/decoder_mt.rs b/nihav-itu/src/codecs/h264/decoder_mt.rs index e6f1920..fd1a800 100644 --- a/nihav-itu/src/codecs/h264/decoder_mt.rs +++ b/nihav-itu/src/codecs/h264/decoder_mt.rs @@ -663,7 +663,7 @@ impl H264MTDecoder { self.frame_refs.select_refs(sps, &slice_hdr, full_id); if slice_hdr.adaptive_ref_pic_marking_mode { - self.frame_refs.apply_adaptive_marking(&slice_hdr.adaptive_ref_pic_marking, slice_hdr.frame_num, 1 << self.sps[self.cur_sps].log2_max_frame_num)?; + self.frame_refs.apply_adaptive_marking(&slice_hdr.adaptive_ref_pic_marking, slice_hdr.frame_num, ((1u32 << self.sps[self.cur_sps].log2_max_frame_num) - 1) as u16)?; } if let Some(ref mut fdec) = self.cur_fdec { fdec.slices.push((slice_hdr, hdr_size, self.frame_refs.cur_refs.clone(), src)); diff --git a/nihav-itu/src/codecs/h264/decoder_st.rs b/nihav-itu/src/codecs/h264/decoder_st.rs index 447abcf..149cf74 100644 --- a/nihav-itu/src/codecs/h264/decoder_st.rs +++ b/nihav-itu/src/codecs/h264/decoder_st.rs @@ -184,7 +184,7 @@ println!("PAFF?"); self.frame_refs.select_refs(sps, &slice_hdr, full_id); if slice_hdr.adaptive_ref_pic_marking_mode { - self.frame_refs.apply_adaptive_marking(&slice_hdr.adaptive_ref_pic_marking, slice_hdr.frame_num, 1 << self.sps[self.cur_sps].log2_max_frame_num)?; + self.frame_refs.apply_adaptive_marking(&slice_hdr.adaptive_ref_pic_marking, slice_hdr.frame_num, ((1u32 << self.sps[self.cur_sps].log2_max_frame_num) - 1) as u16)?; } if slice_hdr.first_mb_in_slice == 0 { let ret = supp.pool_u8.get_free(); diff --git a/nihav-itu/src/codecs/h264/pic_ref.rs b/nihav-itu/src/codecs/h264/pic_ref.rs index 852f9d0..b19f633 100644 --- a/nihav-itu/src/codecs/h264/pic_ref.rs +++ b/nihav-itu/src/codecs/h264/pic_ref.rs @@ -413,13 +413,13 @@ impl FrameRefs { }, } } - pub fn apply_adaptive_marking(&mut self, marking: &AdaptiveMarking, cur_id: u16, max_id: u16) -> DecoderResult<()> { + pub fn apply_adaptive_marking(&mut self, marking: &AdaptiveMarking, cur_id: u16, max_id_mask: u16) -> DecoderResult<()> { let all_ref_pics = self.ref_pics.clone(); for (&op, (&arg1, &arg2)) in marking.memory_management_control_op.iter().zip(marking.operation_arg.iter().zip(marking.operation_arg2.iter())).take(marking.num_ops) { match op { 1 => { - let src_id = cur_id.wrapping_sub(arg1) & (max_id - 1); + let src_id = cur_id.wrapping_sub(arg1) & max_id_mask; let mut found = false; let mut idx = 0; for (i, pic) in self.ref_pics.iter().enumerate() { @@ -440,7 +440,7 @@ impl FrameRefs { } }, 3 => { - let src_id = cur_id.wrapping_sub(arg1) & (max_id - 1); + let src_id = cur_id.wrapping_sub(arg1) & max_id_mask; let didx = arg2 as usize; for pic in all_ref_pics.iter() { diff --git a/nihav-itu/src/codecs/h264/test/conformance.rs b/nihav-itu/src/codecs/h264/test/conformance.rs index 0e28914..d749f9d 100644 --- a/nihav-itu/src/codecs/h264/test/conformance.rs +++ b/nihav-itu/src/codecs/h264/test/conformance.rs @@ -352,7 +352,7 @@ const FREXT_420_8_TEST_STREAMS: &[(&str, [u32; 4])] = &[ ("FRext/Freh12_B.264", [0x73DEE4EE, 0x216B40CB, 0xF7647E2B, 0xCD2BBBD3]), /*("FRext/FREXT01_JVC_D.264", [0;4]), //MBAFF ("FRext/FREXT02_JVC_C.264", [0;4]),*/ - ("FRext/FRExt_MMCO4_Sony_B.264", [0xD4048185, 0xA358D7E7, 0x95EA950D, 0x27C66788]), + ("FRext/FRExt_MMCO4_Sony_B.264", [0x3AE5AF4C, 0x2F7AB756, 0x6DD311C3, 0x0E963B2D]), ("FRext/test8b43.264", [0x921C816C, 0x14170EAD, 0x03C19C5C, 0x9ED3C0A4]), ]; diff --git a/nihav-itu/src/codecs/h264/test/conformance_mt.rs b/nihav-itu/src/codecs/h264/test/conformance_mt.rs index cdbfb9c..72eead6 100644 --- a/nihav-itu/src/codecs/h264/test/conformance_mt.rs +++ b/nihav-itu/src/codecs/h264/test/conformance_mt.rs @@ -352,7 +352,7 @@ const FREXT_420_8_TEST_STREAMS: &[(&str, [u32; 4])] = &[ ("FRext/Freh12_B.264", [0x73DEE4EE, 0x216B40CB, 0xF7647E2B, 0xCD2BBBD3]), /*("FRext/FREXT01_JVC_D.264", [0;4]), //MBAFF ("FRext/FREXT02_JVC_C.264", [0;4]),*/ - ("FRext/FRExt_MMCO4_Sony_B.264", [0xD4048185, 0xA358D7E7, 0x95EA950D, 0x27C66788]), + ("FRext/FRExt_MMCO4_Sony_B.264", [0x3AE5AF4C, 0x2F7AB756, 0x6DD311C3, 0x0E963B2D]), ("FRext/test8b43.264", [0x921C816C, 0x14170EAD, 0x03C19C5C, 0x9ED3C0A4]), ];