]> git.nihav.org Git - nihav.git/blobdiff - src/codecs/indeo2.rs
use frame refs everywhere
[nihav.git] / src / codecs / indeo2.rs
index 6d02a65594be2b439ad66a432c64cf26be87cef7..5036f16f13dfc441ee001a21c905ead9106f8b4b 100644 (file)
@@ -183,18 +183,18 @@ impl CodebookDescReader<u8> for IR2CodeReader {
     fn len(&mut self) -> usize { INDEO2_CODE_LENGTHS.len() }
 }
 
-pub struct Indeo2Decoder {
+struct Indeo2Decoder {
     info:    Rc<NACodecInfo>,
     cb:      Codebook<u8>,
-    lastfrm: Option<Rc<NAFrame>>,
+    frmmgr:  HAMShuffler,
 }
 
 impl Indeo2Decoder {
-    pub fn new() -> Self {
+    fn new() -> Self {
         let dummy_info = Rc::new(DUMMY_CODEC_INFO);
         let mut coderead = IR2CodeReader{};
         let cb = Codebook::new(&mut coderead, CodebookMode::LSB).unwrap();
-        Indeo2Decoder { info: dummy_info, cb: cb, lastfrm: None }
+        Indeo2Decoder { info: dummy_info, cb: cb, frmmgr: HAMShuffler::new() }
     }
 
     fn decode_plane_intra(&self, br: &mut BitReader,
@@ -205,8 +205,8 @@ impl Indeo2Decoder {
         let stride = frm.get_stride(planeno);
         let cb = &self.cb;
 
-        let mut buffer = frm.get_buffer_mut().unwrap();
-        let mut data = buffer.get_data_mut().unwrap();
+        let mut buffer = frm.get_buffer_mut();
+        let mut data = buffer.get_data_mut();
         let mut framebuf: &mut [u8] = data.as_mut_slice();
 
         let table = &INDEO2_DELTA_TABLE[tableno];
@@ -269,8 +269,8 @@ impl Indeo2Decoder {
         let stride = frm.get_stride(planeno);
         let cb = &self.cb;
 
-        let mut buffer = frm.get_buffer_mut().unwrap();
-        let mut data = buffer.get_data_mut().unwrap();
+        let mut buffer = frm.get_buffer_mut();
+        let mut data = buffer.get_data_mut();
         let mut framebuf: &mut [u8] = data.as_mut_slice();
 
         let table = &INDEO2_DELTA_TABLE[tableno];
@@ -318,12 +318,13 @@ impl NADecoder for Indeo2Decoder {
             let fmt = formats::YUV410_FORMAT;
             let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
             self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
+            self.frmmgr.clear();
             Ok(())
         } else {
             Err(DecoderError::InvalidData)
         }
     }
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<Rc<NAFrame>> {
+    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
         let src = pkt.get_buffer();
         if src.len() <= IR2_START { return Err(DecoderError::ShortData); }
         let interframe = src[18];
@@ -333,46 +334,52 @@ impl NADecoder for Indeo2Decoder {
         let chroma_tab = (tabs >> 2) & 3;
         if interframe != 0 {
             let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone());
+            frm.set_keyframe(true);
+            frm.set_frame_type(FrameType::I);
             for plane in 0..3 {
                 let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize;
                 self.decode_plane_intra(&mut br, &mut frm, plane, tabidx)?;
             }
-            let rcf = Rc::new(frm);
-            self.lastfrm = Some(rcf.clone());
-            Ok(rcf)
+            self.frmmgr.add_frame(frm);
         } else {
-            let lf = self.lastfrm.clone();
-            if let None = lf { return Err(DecoderError::MissingReference); }
-            let lastfr = lf.unwrap();
-            let mut frm = NAFrame::from_copy(lastfr.as_ref());
+            let frmref = self.frmmgr.clone_ref();
+            if let None = frmref { return Err(DecoderError::MissingReference); }
+            let ffrmref = frmref.unwrap();
+            let mut frm = ffrmref.borrow_mut();
+            frm.set_keyframe(false);
+            frm.set_frame_type(FrameType::P);
             frm.fill_timestamps(pkt);
             for plane in 0..3 {
                 let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize;
                 self.decode_plane_inter(&mut br, &mut frm, plane, tabidx)?;
             }
-            let rcf = Rc::new(frm);
-            self.lastfrm = Some(rcf.clone());
-            Ok(rcf)
         }
+        Ok(self.frmmgr.get_output_frame().unwrap())
     }
 }
 
+pub fn get_decoder() -> Box<NADecoder> {
+    Box::new(Indeo2Decoder::new())
+}
+
 #[cfg(test)]
 mod test {
-    use super::*;
-    use demuxers::avi::*;
+    use codecs;
+    use demuxers::*;
+    use frame::NAFrameRef;
     use io::byteio::*;
     use std::fs::File;
     use std::io::prelude::*;
 
     #[test]
     fn test_indeo2() {
+        let avi_dmx = find_demuxer("avi").unwrap();
         let mut file = File::open("assets/laser05.avi").unwrap();
         let mut fr = FileReader::new_read(&mut file);
         let mut br = ByteReader::new(&mut fr);
-        let mut dmx = AVIDemuxer::new(&mut br);
+        let mut dmx = avi_dmx.new_demuxer(&mut br);
         dmx.open().unwrap();
-        let mut dec = Indeo2Decoder::new();
+        let mut dec = (codecs::find_decoder("indeo2").unwrap())();//Indeo2Decoder::new();
 
         let mut str: u32 = 42;
         for i in 0..dmx.get_num_streams() {
@@ -388,18 +395,19 @@ mod test {
         loop {
             let pktres = dmx.get_frame();
             if let Err(e) = pktres {
-                if (e as i32) == (DemuxerError::EOF as i32) { break; }
+                if e == DemuxerError::EOF { break; }
                 panic!("error");
             }
             let pkt = pktres.unwrap();
             if pkt.get_stream().get_id() == str {
                 let frm = dec.decode(&pkt).unwrap();
-                write_pgmyuv(pkt.get_pts().unwrap(), &frm);
+                write_pgmyuv(pkt.get_pts().unwrap(), frm);
             }
         }
     }
 
-    fn write_pgmyuv(num: u64, frm: &NAFrame) {
+    fn write_pgmyuv(num: u64, frmref: NAFrameRef) {
+        let frm = frmref.borrow();
         let name = format!("assets/out{:04}.pgm", num);
         let mut ofile = File::create(name).unwrap();
         let (w, h) = frm.get_dimensions(0);