split NihAV into subcrates
[nihav.git] / nihav-core / src / demuxers / mod.rs
similarity index 90%
rename from src/demuxers/mod.rs
rename to nihav-core/src/demuxers/mod.rs
index adf954af270d215ed0bf5aa88f769308095b61af..56e670db986575f50bf2e0e52f85955e2833844b 100644 (file)
@@ -14,7 +14,7 @@ pub enum DemuxerError {
     TryAgain,
 }
 
-type DemuxerResult<T> = Result<T, DemuxerError>;
+pub type DemuxerResult<T> = Result<T, DemuxerError>;
 
 pub trait DemuxCore<'a> {
     fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()>;
@@ -204,39 +204,45 @@ macro_rules! validate {
     ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } };
 }
 
-#[cfg(feature="demuxer_gdv")]
-mod gdv;
 #[cfg(feature="demuxer_avi")]
 mod avi;
-#[cfg(feature="demuxer_real")]
-mod realmedia;
 
 
 const DEMUXERS: &[&'static DemuxerCreator] = &[
 #[cfg(feature="demuxer_avi")]
     &avi::AVIDemuxerCreator {},
-#[cfg(feature="demuxer_gdv")]
-    &gdv::GDVDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
-    &realmedia::RealMediaDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
-    &realmedia::RealAudioDemuxerCreator {},
-#[cfg(feature="demuxer_real")]
-    &realmedia::RealIVRDemuxerCreator {},
 ];
 
-pub fn find_demuxer(name: &str) -> Option<&DemuxerCreator> {
-    for &dmx in DEMUXERS {
-        if dmx.get_name() == name {
-            return Some(dmx);
-        }
-    }
-    None
-}
-
 pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> DemuxerResult<Demuxer<'a>> {
     let mut dmx = dmxcr.new_demuxer(br);
     let mut str = StreamManager::new();
     dmx.open(&mut str)?;
     Ok(Demuxer::new(dmx, str))
 }
+
+pub struct RegisteredDemuxers {
+    dmxs:   Vec<&'static DemuxerCreator>,
+}
+
+impl RegisteredDemuxers {
+    pub fn new() -> Self {
+        Self { dmxs: Vec::new() }
+    }
+    pub fn add_demuxer(&mut self, dmx: &'static DemuxerCreator) {
+        self.dmxs.push(dmx);
+    }
+    pub fn find_demuxer(&self, name: &str) -> Option<&DemuxerCreator> {
+        for &dmx in self.dmxs.iter() {
+            if dmx.get_name() == name {
+                return Some(dmx);
+            }
+        }
+        None
+    }
+}
+
+pub fn core_register_all_demuxers(rd: &mut RegisteredDemuxers) {
+    for demuxer in DEMUXERS.into_iter() {
+        rd.add_demuxer(*demuxer);
+    }
+}