switch NACodecInfo to Arc
[nihav.git] / nihav-core / src / codecs / mod.rs
index f3fabf3a642dad3c249c7c08a9f9fe16ed652aff..692269ea7572dd1c03a535ff3a441982a486ab60 100644 (file)
@@ -1,9 +1,7 @@
 use std::fmt;
 use std::ops::{Add, AddAssign, Sub, SubAssign};
 
-use crate::frame::*;
-use std::rc::Rc;
-use std::cell::RefCell;
+pub use crate::frame::*;
 use std::mem;
 use crate::io::byteio::ByteIOError;
 use crate::io::bitreader::BitReaderError;
@@ -45,10 +43,6 @@ impl From<AllocatorError> for DecoderError {
     fn from(_: AllocatorError) -> Self { DecoderError::AllocError }
 }
 
-macro_rules! validate {
-    ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } };
-}
-
 #[allow(dead_code)]
 pub struct HAMShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
@@ -82,6 +76,10 @@ impl HAMShuffler {
     }
 }
 
+impl Default for HAMShuffler {
+    fn default() -> Self { Self { lastframe: None } }
+}
+
 #[allow(dead_code)]
 pub struct IPShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
@@ -106,6 +104,10 @@ impl IPShuffler {
     }
 }
 
+impl Default for IPShuffler {
+    fn default() -> Self { Self { lastframe: None } }
+}
+
 #[allow(dead_code)]
 pub struct IPBShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
@@ -156,6 +158,10 @@ impl IPBShuffler {
     }
 }
 
+impl Default for IPBShuffler {
+    fn default() -> Self { Self { lastframe: None, nextframe: None } }
+}
+
 #[derive(Debug,Clone,Copy,PartialEq)]
 pub struct MV {
     pub x: i16,
@@ -225,7 +231,7 @@ impl fmt::Display for MV {
 
 
 pub trait NADecoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()>;
+    fn init(&mut self, info: NACodecInfoRef) -> DecoderResult<()>;
     fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
 }
 
@@ -238,48 +244,9 @@ pub struct DecoderInfo {
 #[cfg(any(feature="h263"))]
 pub mod blockdsp;
 
-#[cfg(feature="decoder_clearvideo")]
-mod clearvideo;
-#[cfg(feature="decoder_gdvvid")]
-mod gremlinvideo;
 #[cfg(feature="h263")]
 pub mod h263;
 
-#[cfg(feature="decoder_aac")]
-mod aac;
-#[cfg(feature="decoder_atrac3")]
-mod atrac3;
-#[cfg(feature="decoder_pcm")]
-mod pcm;
-#[cfg(feature="decoder_sipro")]
-mod sipro;
-#[cfg(feature="decoder_ts102366")]
-mod ts102366;
-
-const DECODERS: &[DecoderInfo] = &[
-#[cfg(feature="decoder_clearvideo")]
-    DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder },
-#[cfg(feature="decoder_clearvideo")]
-    DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm },
-
-#[cfg(feature="decoder_pcm")]
-    DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder },
-#[cfg(feature="decoder_sipro")]
-    DecoderInfo { name: "sipro", get_decoder: sipro::get_decoder },
-#[cfg(feature="decoder_ts102366")]
-    DecoderInfo { name: "ac3", get_decoder: ts102366::get_decoder },
-#[cfg(feature="decoder_atrac3")]
-    DecoderInfo { name: "atrac3", get_decoder: atrac3::get_decoder },
-#[cfg(feature="decoder_aac")]
-    DecoderInfo { name: "aac", get_decoder: aac::get_decoder },
-];
-
-pub fn core_register_all_codecs(rd: &mut RegisteredDecoders) {
-    for decoder in DECODERS.into_iter() {
-        rd.add_decoder(decoder.clone());
-    }
-}
-
 pub struct RegisteredDecoders {
     decs:   Vec<DecoderInfo>,
 }
@@ -299,4 +266,7 @@ impl RegisteredDecoders {
         }
         None
     }
+    pub fn iter(&self) -> std::slice::Iter<DecoderInfo> {
+        self.decs.iter()
+    }
 }