check for missing reference frames in various decoders
[nihav.git] / nihav-realmedia / src / codecs / rv60.rs
index a4cf919cb8337841acb5f58ace5a06ccb131e060..753b8050178d1d2ae8fbe844fda8f90967783363 100644 (file)
@@ -1431,6 +1431,22 @@ println!("???");
         let hdr = FrameHeader::read(&mut br)?;
         let mut slices: Vec<usize> = Vec::new();
         hdr.parse_slice_sizes(&mut br, &mut slices)?;
+        match hdr.ftype {
+            FrameType::P => {
+                if self.ipbs.get_lastref().is_none() {
+                    return Err(DecoderError::MissingReference);
+                }
+            },
+            FrameType::B => {
+                if self.ipbs.get_lastref().is_none() {
+                    return Err(DecoderError::MissingReference);
+                }
+                if self.ipbs.get_nextref().is_none() {
+                    return Err(DecoderError::MissingReference);
+                }
+            },
+            _ => {},
+        };
 
         let tmp_vinfo = NAVideoInfo::new(hdr.width, hdr.height, false, YUV420_FORMAT);
         let ret = supp.pool_u8.get_free();
@@ -1475,6 +1491,9 @@ println!("???");
         frm.set_frame_type(hdr.ftype);
         Ok(frm.into_ref())
     }
+    fn flush(&mut self) {
+        self.ipbs.clear();
+    }
 }
 
 pub fn get_decoder() -> Box<dyn NADecoder> {