vp7: fix inter mode DC predictor
[nihav.git] / nihav-duck / src / codecs / vp7.rs
index b96da83bfe40832c16cfe5b074403c42085208e7..ea423ad26145b2070bd88df7c038eea9620b9a23 100644 (file)
@@ -544,11 +544,11 @@ 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);
@@ -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 {
@@ -1397,7 +1403,7 @@ impl NADecoder for VP7Decoder {
     }
 }
 
-pub fn get_decoder() -> Box<NADecoder> {
+pub fn get_decoder() -> Box<NADecoder + Send> {
     Box::new(VP7Decoder::new())
 }