X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fdemuxers%2Fmod.rs;h=902fbba4db578fd74bc05e3e2a32fed22fb41012;hb=e243ceb4d694cc08767ad70027bb6963f4cefea3;hp=56e670db986575f50bf2e0e52f85955e2833844b;hpb=5641dccfbf2a70d589cf094a0d4ed5a10f919f00;p=nihav.git diff --git a/nihav-core/src/demuxers/mod.rs b/nihav-core/src/demuxers/mod.rs index 56e670d..902fbba 100644 --- a/nihav-core/src/demuxers/mod.rs +++ b/nihav-core/src/demuxers/mod.rs @@ -1,6 +1,5 @@ -use std::rc::Rc; -use crate::frame::*; -use crate::io::byteio::*; +pub use crate::frame::*; +pub use crate::io::byteio::*; #[derive(Debug,Clone,Copy,PartialEq)] #[allow(dead_code)] @@ -23,31 +22,30 @@ pub trait DemuxCore<'a> { } pub trait NAPacketReader { - fn read_packet(&mut self, str: Rc, ts: NATimeInfo, keyframe: bool, size: usize) -> DemuxerResult; + fn read_packet(&mut self, str: NAStreamRef, ts: NATimeInfo, keyframe: bool, size: usize) -> DemuxerResult; fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()>; } impl<'a> NAPacketReader for ByteReader<'a> { - fn read_packet(&mut self, str: Rc, ts: NATimeInfo, kf: bool, size: usize) -> DemuxerResult { + fn read_packet(&mut self, str: NAStreamRef, ts: NATimeInfo, kf: bool, size: usize) -> DemuxerResult { let mut buf: Vec = Vec::with_capacity(size); if buf.capacity() < size { return Err(DemuxerError::MemoryError); } buf.resize(size, 0); - let res = self.read_buf(buf.as_mut_slice()); - if let Err(_) = res { return Err(DemuxerError::IOError); } + self.read_buf(buf.as_mut_slice())?; let pkt = NAPacket::new(str, ts, kf, buf); Ok(pkt) } fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()> { let mut refbuf = pkt.get_buffer(); - let buf = Rc::make_mut(&mut refbuf); - let res = self.read_buf(buf.as_mut_slice()); - if let Err(_) = res { return Err(DemuxerError::IOError); } + let buf = refbuf.as_mut().unwrap(); + self.read_buf(buf.as_mut_slice())?; Ok(()) } } +#[derive(Default)] pub struct StreamManager { - streams: Vec>, + streams: Vec, ignored: Vec, no_ign: bool, } @@ -66,18 +64,18 @@ impl StreamManager { let stream_num = self.streams.len(); let mut str = stream.clone(); str.set_num(stream_num); - self.streams.push(Rc::new(str)); + self.streams.push(str.into_ref()); self.ignored.push(false); Some(stream_num) } - pub fn get_stream(&self, idx: usize) -> Option> { + pub fn get_stream(&self, idx: usize) -> Option { if idx < self.streams.len() { Some(self.streams[idx].clone()) } else { None } } - pub fn get_stream_by_id(&self, id: u32) -> Option> { + pub fn get_stream_by_id(&self, id: u32) -> Option { for i in 0..self.streams.len() { if self.streams[i].get_id() == id { return Some(self.streams[i].clone()); @@ -117,18 +115,18 @@ impl StreamManager { } pub struct StreamIter<'a> { - streams: &'a Vec>, + streams: &'a [NAStreamRef], pos: usize, } impl<'a> StreamIter<'a> { - pub fn new(streams: &'a Vec>) -> Self { - StreamIter { streams: streams, pos: 0 } + pub fn new(streams: &'a [NAStreamRef]) -> Self { + StreamIter { streams, pos: 0 } } } impl<'a> Iterator for StreamIter<'a> { - type Item = Rc; + type Item = NAStreamRef; fn next(&mut self) -> Option { if self.pos >= self.streams.len() { return None; } @@ -139,21 +137,21 @@ impl<'a> Iterator for StreamIter<'a> { } pub struct Demuxer<'a> { - dmx: Box + 'a>, + dmx: Box + 'a>, streams: StreamManager, } impl<'a> Demuxer<'a> { - fn new(dmx: Box + 'a>, str: StreamManager) -> Self { + fn new(dmx: Box + 'a>, str: StreamManager) -> Self { Demuxer { - dmx: dmx, + dmx, streams: str, } } - pub fn get_stream(&self, idx: usize) -> Option> { + pub fn get_stream(&self, idx: usize) -> Option { self.streams.get_stream(idx) } - pub fn get_stream_by_id(&self, id: u32) -> Option> { + pub fn get_stream_by_id(&self, id: u32) -> Option { self.streams.get_stream_by_id(id) } pub fn get_num_streams(&self) -> usize { @@ -195,24 +193,11 @@ impl From for DemuxerError { ///The structure used to create demuxers. pub trait DemuxerCreator { /// Create new demuxer instance that will use `ByteReader` source as an input. - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a>; + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a>; /// Get the name of current demuxer creator. fn get_name(&self) -> &'static str; } -macro_rules! validate { - ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } }; -} - -#[cfg(feature="demuxer_avi")] -mod avi; - - -const DEMUXERS: &[&'static DemuxerCreator] = &[ -#[cfg(feature="demuxer_avi")] - &avi::AVIDemuxerCreator {}, -]; - pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> DemuxerResult> { let mut dmx = dmxcr.new_demuxer(br); let mut str = StreamManager::new(); @@ -220,6 +205,7 @@ pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> Ok(Demuxer::new(dmx, str)) } +#[derive(Default)] pub struct RegisteredDemuxers { dmxs: Vec<&'static DemuxerCreator>, } @@ -240,9 +226,3 @@ impl RegisteredDemuxers { None } } - -pub fn core_register_all_demuxers(rd: &mut RegisteredDemuxers) { - for demuxer in DEMUXERS.into_iter() { - rd.add_demuxer(*demuxer); - } -}