structure decoders a bit too
authorKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 May 2017 16:54:27 +0000 (18:54 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 May 2017 16:54:27 +0000 (18:54 +0200)
src/codecs/indeo2.rs
src/codecs/mod.rs

index 1df483fc4fe3c19c1219ea2be266b4dd7e85b090..fec0f1299ec0fd00362df1bd1a856c621852ff13 100644 (file)
@@ -183,14 +183,14 @@ 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>>,
 }
 
 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();
@@ -357,10 +357,15 @@ impl NADecoder for Indeo2Decoder {
     }
 }
 
+pub fn get_decoder() -> Box<NADecoder> {
+    Box::new(Indeo2Decoder::new())
+}
+
 #[cfg(test)]
 mod test {
-    use super::*;
+    use codecs;
     use demuxers::*;
+    use frame::NAFrame;
     use io::byteio::*;
     use std::fs::File;
     use std::io::prelude::*;
@@ -373,7 +378,7 @@ mod test {
         let mut br = ByteReader::new(&mut fr);
         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() {
index 782d4513a0d2dfe42b7cebeb0407373ca153e44c..ff75af9fbd4a0c9532bc3d7f49e6b1b4b9d6573e 100644 (file)
@@ -42,3 +42,22 @@ pub trait NADecoder {
     fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<Rc<NAFrame>>;
 }
 
+#[derive(Clone,Copy)]
+pub struct DemuxerInfo {
+    name: &'static str,
+    get_decoder: fn () -> Box<NADecoder>,
+}
+
+const DECODERS: &[DemuxerInfo] = &[
+#[cfg(feature="decoder_indeo2")]
+    DemuxerInfo { name: "indeo2", get_decoder: indeo2::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);
+        }
+    }
+    None
+}