allow to skip index building
[nihav.git] / nihav-core / src / demuxers / mod.rs
index 64991323f9ec58548ef58950d1d2918a021d943d..ee2fe58ae871aa604a05ee13b0092acf0153ad4b 100644 (file)
@@ -203,13 +203,18 @@ pub struct SeekIndexResult {
 pub struct SeekIndex {
     pub seek_info:  Vec<StreamSeekInfo>,
     pub mode:       SeekIndexMode,
+    pub skip_index: bool,
 }
 
 impl SeekIndex {
     pub fn new() -> Self { Self::default() }
-    pub fn add_stream(&mut self, id: u32) {
-        if self.stream_id_to_index(id).is_none() {
+    pub fn add_stream(&mut self, id: u32) -> usize {
+        let ret = self.stream_id_to_index(id);
+        if ret.is_none() {
             self.seek_info.push(StreamSeekInfo::new(id));
+            self.seek_info.len() - 1
+        } else {
+            ret.unwrap()
         }
     }
     pub fn stream_id_to_index(&self, id: u32) -> Option<usize> {
@@ -228,6 +233,14 @@ impl SeekIndex {
         }
         None
     }
+    pub fn add_entry(&mut self, id: u32, entry: SeekEntry) {
+        let mut idx = self.stream_id_to_index(id);
+        if idx.is_none() {
+            idx = Some(self.add_stream(id));
+        }
+        self.seek_info[idx.unwrap()].add_entry(entry);
+        self.seek_info[idx.unwrap()].filled = true;
+    }
     pub fn find_pos(&self, time: u64) -> Option<SeekIndexResult> {
         let mut cand = None;
         for str in self.seek_info.iter() {
@@ -295,6 +308,9 @@ impl<'a> Demuxer<'a> {
         }
     }
     pub fn seek(&mut self, time: u64) -> DemuxerResult<()> {
+        if self.seek_idx.skip_index {
+            return Err(DemuxerError::NotPossible);
+        }
         self.dmx.seek(time, &self.seek_idx)
     }
     pub fn get_seek_index(&self) -> &SeekIndex {