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 {
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]);
}
}
self.set_dimensions(width, height);
self.dstate.reset();
+ } else {
+ if !self.shuf.has_refs() {
+ return Err(DecoderError::MissingReference);
+ }
}
self.read_features(&mut bc)?;
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 {
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<NADecoder> {
+pub fn get_decoder() -> Box<NADecoder + Send> {
Box::new(VP7Decoder::new())
}