introduce NADecoderSupport and buffer pools
[nihav.git] / nihav-core / src / codecs / mod.rs
index 2999cb66315cd47b33481e0c5ae73fe97caccafd..8225dd0dcbf08ff18cdf7eddd689458c14596da1 100644 (file)
@@ -2,7 +2,6 @@ use std::fmt;
 use std::ops::{Add, AddAssign, Sub, SubAssign};
 
 pub use crate::frame::*;
-pub use std::rc::Rc;
 use std::mem;
 use crate::io::byteio::ByteIOError;
 use crate::io::bitreader::BitReaderError;
@@ -46,7 +45,7 @@ impl From<AllocatorError> for DecoderError {
 
 #[allow(dead_code)]
 pub struct HAMShuffler {
-    lastframe: Option<NAVideoBuffer<u8>>,
+    lastframe: Option<NAVideoBufferRef<u8>>,
 }
 
 impl HAMShuffler {
@@ -55,21 +54,21 @@ impl HAMShuffler {
     #[allow(dead_code)]
     pub fn clear(&mut self) { self.lastframe = None; }
     #[allow(dead_code)]
-    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    pub fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn clone_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref mut frm) = self.lastframe {
             let newfrm = frm.copy_buffer();
-            *frm = newfrm.clone();
-            Some(newfrm)
+            *frm = newfrm.clone().into_ref();
+            Some(newfrm.into_ref())
         } else {
             None
         }
     }
     #[allow(dead_code)]
-    pub fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_output_frame(&mut self) -> Option<NAVideoBufferRef<u8>> {
         match self.lastframe {
             Some(ref frm) => Some(frm.clone()),
             None => None,
@@ -83,7 +82,7 @@ impl Default for HAMShuffler {
 
 #[allow(dead_code)]
 pub struct IPShuffler {
-    lastframe: Option<NAVideoBuffer<u8>>,
+    lastframe: Option<NAVideoBufferRef<u8>>,
 }
 
 impl IPShuffler {
@@ -92,11 +91,11 @@ impl IPShuffler {
     #[allow(dead_code)]
     pub fn clear(&mut self) { self.lastframe = None; }
     #[allow(dead_code)]
-    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    pub fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -111,8 +110,8 @@ impl Default for IPShuffler {
 
 #[allow(dead_code)]
 pub struct IPBShuffler {
-    lastframe: Option<NAVideoBuffer<u8>>,
-    nextframe: Option<NAVideoBuffer<u8>>,
+    lastframe: Option<NAVideoBufferRef<u8>>,
+    nextframe: Option<NAVideoBufferRef<u8>>,
 }
 
 impl IPBShuffler {
@@ -121,12 +120,12 @@ impl IPBShuffler {
     #[allow(dead_code)]
     pub fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
     #[allow(dead_code)]
-    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
         mem::swap(&mut self.lastframe, &mut self.nextframe);
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    pub fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_lastref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -134,7 +133,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    pub fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_nextref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref frm) = self.nextframe {
             Some(frm.clone())
         } else {
@@ -142,7 +141,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    pub fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_b_fwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref frm) = self.nextframe {
             Some(frm.clone())
         } else {
@@ -150,7 +149,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    pub fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_b_bwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -230,10 +229,26 @@ impl fmt::Display for MV {
     }
 }
 
+pub struct NADecoderSupport {
+    pub pool_u8:        NAVideoBufferPool<u8>,
+    pub pool_u16:       NAVideoBufferPool<u16>,
+    pub pool_u32:       NAVideoBufferPool<u32>,
+}
+
+impl NADecoderSupport {
+    pub fn new() -> Self {
+        Self {
+            pool_u8:        NAVideoBufferPool::new(0),
+            pool_u16:       NAVideoBufferPool::new(0),
+            pool_u32:       NAVideoBufferPool::new(0),
+        }
+    }
+}
+
 
 pub trait NADecoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()>;
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
+    fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()>;
+    fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
 }
 
 #[derive(Clone,Copy)]
@@ -267,4 +282,7 @@ impl RegisteredDecoders {
         }
         None
     }
+    pub fn iter(&self) -> std::slice::Iter<DecoderInfo> {
+        self.decs.iter()
+    }
 }