X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;ds=sidebyside;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp7.rs;h=50fe5db8f983cae96cf3f4d8e5a1393c1bd8e581;hb=4726ca2c24097a4545b92c8e95556166def945c5;hp=ccdb5dd22c519721ae5e337af7c7fe23f5977d8b;hpb=587a6d789be865f24bd31ef65aabf1b9d5809965;p=nihav.git diff --git a/nihav-duck/src/codecs/vp7.rs b/nihav-duck/src/codecs/vp7.rs index ccdb5dd..50fe5db 100644 --- a/nihav-duck/src/codecs/vp7.rs +++ b/nihav-duck/src/codecs/vp7.rs @@ -544,15 +544,15 @@ impl VP7Decoder { y2block[0] = dc; } if (pval == 0) || (dc == 0) || ((pval ^ dc) < 0) { - self.dstate.pdc_pred_val = dc; self.dstate.pdc_pred_count = 0; } else if dc == pval { self.dstate.pdc_pred_count += 1; } + self.dstate.pdc_pred_val = dc; } if has_ac[24] { idct4x4(y2block); - } else { + } else if y2block[0] != 0 { idct4x4_dc(y2block); } for i in 0..16 { @@ -562,7 +562,7 @@ impl VP7Decoder { for i in 0..24 { if has_ac[i] { idct4x4(&mut self.coeffs[i]); - } else { + } else if self.coeffs[i][0] != 0 { idct4x4_dc(&mut self.coeffs[i]); } } @@ -1141,6 +1141,10 @@ impl NADecoder for VP7Decoder { self.set_dimensions(width, height); self.dstate.reset(); + } else { + if !self.shuf.has_refs() { + return Err(DecoderError::MissingReference); + } } self.read_features(&mut bc)?; @@ -1242,8 +1246,10 @@ impl NADecoder for VP7Decoder { let mut mb_idx = 0; self.pcache.reset(); - self.dstate.pdc_pred_val = 0; - self.dstate.pdc_pred_count = 0; + if self.dstate.is_intra || (self.dstate.version > 0) { + self.dstate.pdc_pred_val = 0; + self.dstate.pdc_pred_count = 0; + } let mut use_last = true; for mb_y in 0..self.mb_h { for mb_x in 0..self.mb_w { @@ -1392,9 +1398,12 @@ impl NADecoder for VP7Decoder { frm.set_frame_type(if self.dstate.is_intra { FrameType::I } else { FrameType::P }); Ok(frm.into_ref()) } + fn flush(&mut self) { + self.shuf.clear(); + } } -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(VP7Decoder::new()) }