]> git.nihav.org Git - nihav.git/blobdiff - nihav-duck/src/codecs/vp3.rs
duck/vpcommon: hopefully fix vp_copy_block()
[nihav.git] / nihav-duck / src / codecs / vp3.rs
index eace89e0c2383ebb7a77e89bddaa15482e0fb600..0e4a6bb79059219e99c6e560d1897df7130bad98 100644 (file)
@@ -312,6 +312,7 @@ struct VP34Decoder {
     mb_h:       usize,
     version:    u8,
     is_intra:   bool,
+    update_gf:  bool,
     quant:      usize,
     shuf:       VPShuffler,
     codes:      Codes,
@@ -573,6 +574,7 @@ impl VP34Decoder {
             mb_h:       0,
             version,
             is_intra:   true,
+            update_gf:  false,
             quant:      0,
             shuf:       VPShuffler::new(),
             codes:      Codes::None,
@@ -1266,6 +1268,9 @@ impl VP34Decoder {
         }
         let dc_quant = VP30_DC_SCALES[self.quant] * 10;
         let ac_quant = VP30_AC_SCALES[self.quant];
+
+        self.update_gf = ac_quant <= 50;
+
         rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant, 2);
         rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant, 2);
         rescale_qmat(&mut self.qmat_y_p, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
@@ -1835,7 +1840,7 @@ impl NADecoder for VP34Decoder {
              _ => return Err(DecoderError::Bug),
         }
 
-        if self.is_intra {
+        if self.is_intra || self.update_gf {
             self.shuf.add_golden_frame(buf.clone());
         }
         self.shuf.add_frame(buf.clone());
@@ -1873,8 +1878,8 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         duck_register_all_codecs(&mut dec_reg);
 
-        let file = "assets/Duck/vp30-logo.avi";
-        test_file_decoding("avi", file, Some(23), true, false, None/*Some("vp30")*/, &dmx_reg, &dec_reg);
+        test_decoding("avi", "vp3", "assets/Duck/vp30-logo.avi", Some(23), &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0x51aba7df, 0x6e42534d, 0xef6c5b13, 0x26c38d1f]));
     }
 
     #[test]