vp3: VP30 should update golden frames on low quants
[nihav.git] / nihav-duck / src / codecs / vp3.rs
index 7c859e277592f2f370fb377456c8ed0b15ccb63d..17365ff1d60dbcd29f7816a5516a2ed6dfc78f23 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,
@@ -611,7 +613,6 @@ impl VP34Decoder {
                 validate!(self.version == 3 || self.version == 30);
                 let mb_w                        = br.read(8)? as usize;
                 let mb_h                        = br.read(8)? as usize;
-println!(" VP30 {}x{} ({}x{})", mb_w, mb_h, self.mb_w, self.mb_h);
                 validate!(mb_w == self.mb_w && mb_h == self.mb_h);
                 if self.version == 3 {
                     self.version = 30;
@@ -619,7 +620,6 @@ println!(" VP30 {}x{} ({}x{})", mb_w, mb_h, self.mb_w, self.mb_h);
                 }
             } else {
                 let version                     = br.read(13)?;
-println!("intra, ver {} (self {})", version, self.version);
                 let coding_type                 = br.read(1)?;
                 validate!(coding_type == 0);
                                                   br.skip(2)?;
@@ -633,7 +633,6 @@ println!("intra, ver {} (self {})", version, self.version);
                     validate!(self.version == 4);
                     let mb_h                    = br.read(8)? as usize;
                     let mb_w                    = br.read(8)? as usize;
-//println!(" VP40 {}x{} ({}x{})", mb_w, mb_h, self.mb_w, self.mb_h);
                     validate!(mb_w == self.mb_w && mb_h == self.mb_h);
                     let fact1                   = br.read(5)?;
                     let fact2                   = br.read(3)?;
@@ -652,7 +651,6 @@ println!("intra, ver {} (self {})", version, self.version);
             } else {
                 VP40_LOOP_STRENGTH[self.quant]
             };
-//println!("decode frame({},{},{})", self.is_intra as u8, self.is_intra as u8, self.quant);
         Ok(())
     }
     fn vp30_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
@@ -1270,6 +1268,9 @@ println!("intra, ver {} (self {})", version, self.version);
         }
         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);
@@ -1839,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());