]> git.nihav.org Git - nihav.git/commitdiff
h264: fix adaptive marking with log2_max_frame_num=16
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 5 Mar 2026 17:23:10 +0000 (18:23 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 5 Mar 2026 17:23:10 +0000 (18:23 +0100)
nihav-itu/src/codecs/h264/decoder_mt.rs
nihav-itu/src/codecs/h264/decoder_st.rs
nihav-itu/src/codecs/h264/pic_ref.rs
nihav-itu/src/codecs/h264/test/conformance.rs
nihav-itu/src/codecs/h264/test/conformance_mt.rs

index e6f1920bfad26910e6ba0be590ad4d65f725a54b..fd1a800150d24900ceae5b00691cd04a29708bc4 100644 (file)
@@ -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));
index 447abcfd4308d82c25f5931625d681a7ffe62b08..149cf7466896e113d81e2377ffc080eb319eca7f 100644 (file)
@@ -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();
index 852f9d021499af3cb4ead3e96d86a690d511d000..b19f6331a8ae573fb360b383170c176b73731fc3 100644 (file)
@@ -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() {
index 0e28914066086aabe26df6da874e8349a5458c99..d749f9de5e82994d69c9d0de54900f4e070568e9 100644 (file)
@@ -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]),
 ];
index cdbfb9cc8c313fa9fe16b90402b8e3707662e052..72eead6aa408625e1c3f5c81769dca0b334b28f4 100644 (file)
@@ -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]),
 ];