make an interface for working with demuxers
authorKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 May 2017 12:50:54 +0000 (14:50 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 May 2017 12:50:54 +0000 (14:50 +0200)
src/codecs/indeo2.rs
src/demuxers/avi.rs
src/demuxers/gdv.rs
src/demuxers/mod.rs

index 6d02a65594be2b439ad66a432c64cf26be87cef7..1df483fc4fe3c19c1219ea2be266b4dd7e85b090 100644 (file)
@@ -360,17 +360,18 @@ impl NADecoder for Indeo2Decoder {
 #[cfg(test)]
 mod test {
     use super::*;
-    use demuxers::avi::*;
+    use demuxers::*;
     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();
 
index 034ef70e31e3f574f9bc3e882296399b51f561f7..8737fbf7354049537e9e2c3d45d0b9a673fa65cb 100644 (file)
@@ -38,7 +38,7 @@ impl StreamState {
 }
 
 #[allow(dead_code)]
-pub struct AVIDemuxer<'a> {
+struct AVIDemuxer<'a> {
     opened:         bool,
     src:            &'a mut ByteReader<'a>,
     cur_frame:      Vec<u64>,
@@ -106,7 +106,7 @@ impl<'a> Demux<'a> for AVIDemuxer<'a> {
 }
 
 impl<'a> AVIDemuxer<'a> {
-    pub fn new(io: &'a mut ByteReader<'a>) -> Self {
+    fn new(io: &'a mut ByteReader<'a>) -> Self {
         AVIDemuxer {
             cur_frame: Vec::new(),
             num_streams: 0,
@@ -358,6 +358,15 @@ fn parse_junk(dmx: &mut AVIDemuxer, size: usize) -> DemuxerResult<usize> {
     Ok(size)
 }
 
+pub struct AVIDemuxerCreator { }
+
+impl DemuxerCreator for AVIDemuxerCreator {
+    fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<Demux<'a> + 'a> {
+        Box::new(AVIDemuxer::new(br))
+    }
+    fn get_name(&self) -> &'static str { "avi" }
+}
+
 #[cfg(test)]
 mod test {
     use super::*;
index 09c26202cca75333db51aa5618043b3d1b9a622e..897550f19f13983279f2a12dccdf7c55fecc4048 100644 (file)
@@ -10,7 +10,7 @@ enum GDVState {
 }
 
 #[allow(dead_code)]
-pub struct GremlinVideoDemuxer<'a> {
+struct GremlinVideoDemuxer<'a> {
     opened:     bool,
     src:        &'a mut ByteReader<'a>,
     frames:     u16,
@@ -90,7 +90,7 @@ impl<'a> Demux<'a> for GremlinVideoDemuxer<'a> {
     }
 }*/
 impl<'a> GremlinVideoDemuxer<'a> {
-    pub fn new(io: &'a mut ByteReader<'a>) -> Self {
+    fn new(io: &'a mut ByteReader<'a>) -> Self {
         GremlinVideoDemuxer {
             cur_frame: 0,
             frames: 0,
@@ -126,6 +126,15 @@ pktdta: Vec::new(),
     }
 }
 
+pub struct GDVDemuxerCreator { }
+
+impl DemuxerCreator for GDVDemuxerCreator {
+    fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<Demux<'a> + 'a> {
+        Box::new(GremlinVideoDemuxer::new(br))
+    }
+    fn get_name(&self) -> &'static str { "gdv" }
+}
+
 #[cfg(test)]
 mod test {
     use super::*;
index 6499517de33b15124bc4b1c1aa60ad02f2396e32..707984bcfca085f8e8d0d3418bff39e09f9eaccb 100644 (file)
@@ -193,3 +193,24 @@ impl FrameFromPacket for NAFrame {
         self.set_duration(pkt.duration);
     }
 }
+
+pub trait DemuxerCreator {
+    fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<Demux<'a> + 'a>;
+    fn get_name(&self) -> &'static str;
+}
+
+const DEMUXERS: &[&'static DemuxerCreator] = &[
+#[cfg(feature="demuxer_avi")]
+    &avi::AVIDemuxerCreator {},
+#[cfg(feature="demuxer_gdv")]
+    &gdv::GDVDemuxerCreator {},
+];
+
+pub fn find_demuxer(name: &str) -> Option<&DemuxerCreator> {
+    for i in 0..DEMUXERS.len() {
+        if DEMUXERS[i].get_name() == name {
+            return Some(DEMUXERS[i]);
+        }
+    }
+    None
+}