+ pub fn is_ignored(&self, idx: usize) -> bool {
+ if self.no_ign {
+ true
+ } else if idx < self.ignored.len() {
+ self.ignored[idx]
+ } else {
+ false
+ }
+ }
+ pub fn is_ignored_id(&self, id: u32) -> bool {
+ for i in 0..self.streams.len() {
+ if self.streams[i].get_id() == id {
+ return self.ignored[i];
+ }
+ }
+ false
+ }
+ pub fn set_ignored(&mut self, idx: usize) {
+ if idx < self.ignored.len() {
+ self.ignored[idx] = true;
+ self.no_ign = false;
+ }
+ }
+ pub fn set_unignored(&mut self, idx: usize) {
+ if idx < self.ignored.len() {
+ self.ignored[idx] = false;
+ }
+ }
+}
+
+pub struct StreamIter<'a> {
+ streams: &'a Vec<Rc<NAStream>>,
+ pos: usize,
+}
+
+impl<'a> StreamIter<'a> {
+ pub fn new(streams: &'a Vec<Rc<NAStream>>) -> Self {
+ StreamIter { streams: streams, pos: 0 }
+ }
+}
+
+impl<'a> Iterator for StreamIter<'a> {
+ type Item = Rc<NAStream>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.pos >= self.streams.len() { return None; }
+ let ret = self.streams[self.pos].clone();
+ self.pos += 1;
+ Some(ret)
+ }
+}
+
+pub struct Demuxer<'a> {
+ dmx: Box<DemuxCore<'a> + 'a>,
+ streams: StreamManager,
+}
+
+impl<'a> Demuxer<'a> {
+ fn new(dmx: Box<DemuxCore<'a> + 'a>, str: StreamManager) -> Self {
+ Demuxer {
+ dmx: dmx,
+ streams: str,
+ }
+ }
+ pub fn get_stream(&self, idx: usize) -> Option<Rc<NAStream>> {
+ self.streams.get_stream(idx)
+ }
+ pub fn get_stream_by_id(&self, id: u32) -> Option<Rc<NAStream>> {
+ self.streams.get_stream_by_id(id)
+ }
+ pub fn get_num_streams(&self) -> usize {
+ self.streams.get_num_streams()
+ }
+ pub fn get_streams(&self) -> StreamIter {
+ self.streams.iter()
+ }
+ pub fn is_ignored_stream(&self, idx: usize) -> bool {
+ self.streams.is_ignored(idx)
+ }
+ pub fn set_ignored_stream(&mut self, idx: usize) {
+ self.streams.set_ignored(idx)
+ }
+ pub fn set_unignored_stream(&mut self, idx: usize) {
+ self.streams.set_unignored(idx)
+ }
+
+ pub fn get_frame(&mut self) -> DemuxerResult<NAPacket> {
+ loop {
+ let res = self.dmx.get_frame(&mut self.streams);
+ if self.streams.no_ign || res.is_err() { return res; }
+ let res = res.unwrap();
+ let idx = res.get_stream().get_num();
+ if !self.is_ignored_stream(idx) {
+ return Ok(res);
+ }
+ }
+ }
+ pub fn seek(&mut self, time: u64) -> DemuxerResult<()> {
+ self.dmx.seek(time)
+ }