add flush() to decoder interface
[nihav.git] / nihav-duck / src / codecs / truemotion2x.rs
index 6eb35594cd184cd2e5f81f0ab060a6d43c4e995d..584ee43218ebbc04729d0b08434d4ee89a789700 100644 (file)
@@ -69,25 +69,25 @@ impl Deltas {
     fn get_int(&mut self, br: &mut ByteReader) -> DecoderResult<i16> {
         let b = self.get_val(br)?;
         if b != self.vq_esc - 1 {
-            return Ok(Self::remap(b as u16));
+            return Ok(Self::remap(u16::from(b)));
         }
         let mut run = 0;
         let mut val;
-        let mut pow = self.vq_esc as u16;
+        let mut pow = u16::from(self.vq_esc);
         loop {
             let b = self.get_val(br)?;
             run += 1;
             if b != self.vq_esc - 1 {
-                val = (b as u16) * pow;
+                val = u16::from(b) * pow;
                 break;
             }
-            pow *= self.vq_esc as u16;
+            pow *= u16::from(self.vq_esc);
         }
 
         for _ in 0..run {
-            pow /= self.vq_esc as u16;
-            let b = self.get_val(br)? as u16;
-            val += pow * (b as u16);
+            pow /= u16::from(self.vq_esc);
+            let b = u16::from(self.get_val(br)?);
+            val += pow * b;
         }
         Ok(Self::remap(val))
     }
@@ -161,7 +161,7 @@ impl Frame {
 
 #[derive(Default)]
 struct TM2XDecoder {
-    info:       Rc<NACodecInfo>,
+    info:       NACodecInfoRef,
     width:      usize,
     height:     usize,
     dec_buf:    Vec<u8>,
@@ -556,7 +556,7 @@ impl TM2XDecoder {
 }
 
 impl NADecoder for TM2XDecoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
+    fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
         if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
             let fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
                                            Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)),
@@ -568,13 +568,13 @@ impl NADecoder for TM2XDecoder {
             self.height = vinfo.get_height();
             self.cur_frame.resize(self.width, self.height);
             self.ref_frame.resize(self.width, self.height);
-            self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
+            self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
             Ok(())
         } else {
             Err(DecoderError::InvalidData)
         }
     }
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
+    fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
         let src = pkt.get_buffer();
         validate!(src.len() > 8);
         let mut mr = MemoryReader::new_read(&src);
@@ -678,9 +678,7 @@ impl NADecoder for TM2XDecoder {
         self.decode_frame(&src[12..][..data_size])?;
 
         let myinfo = self.info.get_properties().get_video_info().unwrap();
-        let bufret = alloc_video_buffer(myinfo, 2);
-        if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
-        let bufinfo = bufret.unwrap();
+        let bufinfo = alloc_video_buffer(myinfo, 2)?;
         let mut buf = bufinfo.get_vbuf().unwrap();
 
         self.output_frame(&mut buf);
@@ -688,11 +686,13 @@ impl NADecoder for TM2XDecoder {
         let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
         frm.set_keyframe(self.is_intra);
         frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P });
-        Ok(Rc::new(RefCell::new(frm)))
+        Ok(frm.into_ref())
+    }
+    fn flush(&mut self) {
     }
 }
 
-pub fn get_decoder() -> Box<NADecoder> {
+pub fn get_decoder() -> Box<dyn NADecoder> {
     Box::new(TM2XDecoder::new())
 }