split NihAV into subcrates
[nihav.git] / nihav-core / src / codecs / mod.rs
similarity index 61%
rename from src/codecs/mod.rs
rename to nihav-core/src/codecs/mod.rs
index 92aba8edf098e77923747d3cdd7ee09adb593b34..f3fabf3a642dad3c249c7c08a9f9fe16ed652aff 100644 (file)
@@ -50,21 +50,21 @@ macro_rules! validate {
 }
 
 #[allow(dead_code)]
-struct HAMShuffler {
+pub struct HAMShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
 }
 
 impl HAMShuffler {
     #[allow(dead_code)]
-    fn new() -> Self { HAMShuffler { lastframe: None } }
+    pub fn new() -> Self { HAMShuffler { lastframe: None } }
     #[allow(dead_code)]
-    fn clear(&mut self) { self.lastframe = None; }
+    pub fn clear(&mut self) { self.lastframe = None; }
     #[allow(dead_code)]
-    fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref mut frm) = self.lastframe {
             let newfrm = frm.copy_buffer();
             *frm = newfrm.clone();
@@ -74,7 +74,7 @@ impl HAMShuffler {
         }
     }
     #[allow(dead_code)]
-    fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
         match self.lastframe {
             Some(ref frm) => Some(frm.clone()),
             None => None,
@@ -83,21 +83,21 @@ impl HAMShuffler {
 }
 
 #[allow(dead_code)]
-struct IPShuffler {
+pub struct IPShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
 }
 
 impl IPShuffler {
     #[allow(dead_code)]
-    fn new() -> Self { IPShuffler { lastframe: None } }
+    pub fn new() -> Self { IPShuffler { lastframe: None } }
     #[allow(dead_code)]
-    fn clear(&mut self) { self.lastframe = None; }
+    pub fn clear(&mut self) { self.lastframe = None; }
     #[allow(dead_code)]
-    fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -107,23 +107,23 @@ impl IPShuffler {
 }
 
 #[allow(dead_code)]
-struct IPBShuffler {
+pub struct IPBShuffler {
     lastframe: Option<NAVideoBuffer<u8>>,
     nextframe: Option<NAVideoBuffer<u8>>,
 }
 
 impl IPBShuffler {
     #[allow(dead_code)]
-    fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } }
+    pub fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } }
     #[allow(dead_code)]
-    fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
+    pub fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
     #[allow(dead_code)]
-    fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
+    pub fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
         mem::swap(&mut self.lastframe, &mut self.nextframe);
         self.lastframe = Some(buf);
     }
     #[allow(dead_code)]
-    fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -131,7 +131,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref frm) = self.nextframe {
             Some(frm.clone())
         } else {
@@ -139,7 +139,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref frm) = self.nextframe {
             Some(frm.clone())
         } else {
@@ -147,7 +147,7 @@ impl IPBShuffler {
         }
     }
     #[allow(dead_code)]
-    fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
+    pub fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> {
         if let Some(ref frm) = self.lastframe {
             Some(frm.clone())
         } else {
@@ -231,23 +231,19 @@ pub trait NADecoder {
 
 #[derive(Clone,Copy)]
 pub struct DecoderInfo {
-    name: &'static str,
-    get_decoder: fn () -> Box<NADecoder>,
+    pub name: &'static str,
+    pub get_decoder: fn () -> Box<NADecoder>,
 }
 
-#[cfg(any(feature="h263", feature="decoder_realvideo3", feature="decoder_realvideo4"))]
-mod blockdsp;
+#[cfg(any(feature="h263"))]
+pub mod blockdsp;
 
 #[cfg(feature="decoder_clearvideo")]
 mod clearvideo;
 #[cfg(feature="decoder_gdvvid")]
 mod gremlinvideo;
-#[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_indeo4", feature="decoder_indeo5", feature="decoder_imc"))]
-mod indeo;
 #[cfg(feature="h263")]
-mod h263;
-#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4", feature="decoder_realvideo6", feature="decoder_realaudio144", feature="decoder_realaudio288", feature="decoder_cook", feature="decoder_ralf"))]
-mod real;
+pub mod h263;
 
 #[cfg(feature="decoder_aac")]
 mod aac;
@@ -265,60 +261,42 @@ const DECODERS: &[DecoderInfo] = &[
     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_gdvvid")]
-    DecoderInfo { name: "gdv-audio", get_decoder: gremlinvideo::get_decoder_audio },
-#[cfg(feature="decoder_gdvvid")]
-    DecoderInfo { name: "gdv-video", get_decoder: gremlinvideo::get_decoder_video },
-#[cfg(feature="decoder_indeo2")]
-    DecoderInfo { name: "indeo2", get_decoder: indeo::indeo2::get_decoder },
-#[cfg(feature="decoder_indeo3")]
-    DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder },
-#[cfg(feature="decoder_indeo4")]
-    DecoderInfo { name: "indeo4", get_decoder: indeo::indeo4::get_decoder },
-#[cfg(feature="decoder_indeo5")]
-    DecoderInfo { name: "indeo5", get_decoder: indeo::indeo5::get_decoder },
-#[cfg(feature="decoder_intel263")]
-    DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder },
-#[cfg(feature="decoder_realvideo1")]
-    DecoderInfo { name: "realvideo1", get_decoder: h263::rv10::get_decoder },
-#[cfg(feature="decoder_realvideo2")]
-    DecoderInfo { name: "realvideo2", get_decoder: h263::rv20::get_decoder },
-#[cfg(feature="decoder_realvideo3")]
-    DecoderInfo { name: "realvideo3", get_decoder: real::rv30::get_decoder },
-#[cfg(feature="decoder_realvideo4")]
-    DecoderInfo { name: "realvideo4", get_decoder: real::rv40::get_decoder },
-#[cfg(feature="decoder_realvideo6")]
-    DecoderInfo { name: "realvideo6", get_decoder: real::rv60::get_decoder },
 
 #[cfg(feature="decoder_pcm")]
     DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder },
-#[cfg(feature="decoder_imc")]
-    DecoderInfo { name: "imc", get_decoder: indeo::imc::get_decoder_imc },
-#[cfg(feature="decoder_imc")]
-    DecoderInfo { name: "iac", get_decoder: indeo::imc::get_decoder_iac },
-#[cfg(feature="decoder_realaudio144")]
-    DecoderInfo { name: "ra14.4", get_decoder: real::ra144::get_decoder },
-#[cfg(feature="decoder_realaudio288")]
-    DecoderInfo { name: "ra28.8", get_decoder: real::ra288::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_cook")]
-    DecoderInfo { name: "cook", get_decoder: real::cook::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 },
-#[cfg(feature="decoder_ralf")]
-    DecoderInfo { name: "ralf", get_decoder: real::ralf::get_decoder },
 ];
 
-pub fn find_decoder(name: &str) -> Option<fn () -> Box<NADecoder>> {
-    for &dec in DECODERS {
-        if dec.name == name {
-            return Some(dec.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>,
+}
+
+impl RegisteredDecoders {
+    pub fn new() -> Self {
+        Self { decs: Vec::new() }
+    }
+    pub fn add_decoder(&mut self, dec: DecoderInfo) {
+        self.decs.push(dec);
+    }
+    pub fn find_decoder(&self, name: &str) -> Option<fn () -> Box<NADecoder>> {
+        for &dec in self.decs.iter() {
+            if dec.name == name {
+                return Some(dec.get_decoder);
+            }
         }
+        None
     }
-    None
 }