vp3: use MD5 hash for VP3.1 test
[nihav.git] / nihav-duck / src / codecs / vp3.rs
index 8165e7f2f3e9037ca3a27bb897498288e16c1db3..7c859e277592f2f370fb377456c8ed0b15ccb63d 100644 (file)
@@ -960,15 +960,19 @@ println!("intra, ver {} (self {})", version, self.version);
         let mut cur_blk = 0;
         for _ in 0..self.y_blocks/4 {
             if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
-                for _ in 0..4 {
-                    let blk = &mut self.blocks[self.blk_addr[cur_blk] >> 2];
-                    if blk.coded {
-                        blk.mv = (read_mv)(br)?;
-                        last2_mv = last_mv;
-                        last_mv = blk.mv;
-                    }
-                    cur_blk += 1;
-                }
+                let a0 = self.blk_addr[cur_blk + 0] >> 2;
+                let a1 = self.blk_addr[cur_blk + 1] >> 2;
+                let a2 = self.blk_addr[cur_blk + 2] >> 2;
+                let a3 = self.blk_addr[cur_blk + 3] >> 2;
+                let first = a0.min(a1).min(a2).min(a3);
+                let last  = a0.max(a1).max(a2).max(a3);
+                self.blocks[first + 0].mv = (read_mv)(br)?;
+                self.blocks[first + 1].mv = (read_mv)(br)?;
+                self.blocks[last  - 1].mv = (read_mv)(br)?;
+                self.blocks[last  + 0].mv = (read_mv)(br)?;
+                last2_mv = last_mv;
+                last_mv = self.blocks[last].mv;
+                cur_blk += 4;
             } else {
                 let cur_mv;
                 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
@@ -1884,11 +1888,13 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         duck_register_all_codecs(&mut dec_reg);
 
-        let file = "assets/Duck/vp31.avi";
+//        let file = "assets/Duck/vp31.avi";
 //        let file = "assets/Duck/vp31_crash.avi";
 //        let file = "assets/Duck/01-vp31-0500.avi";
-        test_file_decoding("avi", file, Some(3), true, false, None/*Some("vp31")*/, &dmx_reg, &dec_reg);
+//        test_file_decoding("avi", file, Some(3), true, false, None/*Some("vp31")*/, &dmx_reg, &dec_reg);
 //panic!("end");
+        test_decoding("avi", "vp3", "assets/Duck/01-vp31-0500.avi", Some(16), &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0x65112f7e, 0x2914f29b, 0x2908ed2f, 0xce5fc8c5]));
     }
 
     #[test]