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<()>;
($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);
+ }
+}