X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp3.rs;h=17365ff1d60dbcd29f7816a5516a2ed6dfc78f23;hb=afd175ff93417cf3f49d790af1c7f9d4198fed2c;hp=7c859e277592f2f370fb377456c8ed0b15ccb63d;hpb=0eb720555a05b589d0e04a52fa6f9d8d716de22d;p=nihav.git diff --git a/nihav-duck/src/codecs/vp3.rs b/nihav-duck/src/codecs/vp3.rs index 7c859e2..17365ff 100644 --- a/nihav-duck/src/codecs/vp3.rs +++ b/nihav-duck/src/codecs/vp3.rs @@ -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());