aboutsummaryrefslogtreecommitdiffstats
path: root/nihav-commonfmt/src/demuxers/avi.rs
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-11-13 19:41:45 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-11-13 19:41:45 +0100
commit33b5a8f0020ee3e6e0cc39ba9f6219965502df84 (patch)
tree549da6d6386f7ed41c07fca5e7e00cf068406704 /nihav-commonfmt/src/demuxers/avi.rs
parent266da7b9db18727dc065a4e8971ecb0ac0b1e45f (diff)
downloadnihav-33b5a8f0020ee3e6e0cc39ba9f6219965502df84.tar.gz
initial seeking support
Diffstat (limited to 'nihav-commonfmt/src/demuxers/avi.rs')
-rw-r--r--nihav-commonfmt/src/demuxers/avi.rs32
1 files changed, 27 insertions, 5 deletions
diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs
index cf66f36..6603b57 100644
--- a/nihav-commonfmt/src/demuxers/avi.rs
+++ b/nihav-commonfmt/src/demuxers/avi.rs
@@ -41,6 +41,8 @@ struct AVIDemuxer<'a> {
num_streams: u8,
size: usize,
movi_size: usize,
+ movi_pos: u64,
+ movi_orig: usize,
sstate: StreamState,
tb_num: u32,
tb_den: u32,
@@ -59,7 +61,7 @@ struct RIFFParser {
impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
#[allow(unused_variables)]
- fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> {
+ fn open(&mut self, strmgr: &mut StreamManager, seek_index: &mut SeekIndex) -> DemuxerResult<()> {
self.read_header(strmgr)?;
Ok(())
}
@@ -112,9 +114,21 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
}
}
- #[allow(unused_variables)]
- fn seek(&mut self, time: u64) -> DemuxerResult<()> {
- Err(NotImplemented)
+ fn seek(&mut self, time: u64, seek_index: &SeekIndex) -> DemuxerResult<()> {
+ let ret = seek_index.find_pos(time);
+ if ret.is_none() {
+ return Err(DemuxerError::SeekError);
+ }
+ let pos = ret.unwrap().pos;
+ self.src.seek(SeekFrom::Start(pos))?;
+
+ let cur_pos = self.src.tell();
+ if cur_pos < self.movi_pos { return Err(DemuxerError::SeekError); }
+ let skip_size = (cur_pos - self.movi_pos) as usize;
+ if skip_size > self.movi_size { return Err(DemuxerError::SeekError); }
+ self.movi_size = self.movi_orig - skip_size;
+
+ Ok(())
}
}
@@ -126,6 +140,8 @@ impl<'a> AVIDemuxer<'a> {
src: io,
size: 0,
movi_size: 0,
+ movi_pos: 0,
+ movi_orig: 0,
sstate: StreamState::new(),
tb_num: 0,
tb_den: 0,
@@ -200,9 +216,15 @@ impl<'a> AVIDemuxer<'a> {
let mut rest_size = size;
loop {
let (csz, end) = self.parse_chunk(strmgr, RIFFTag::List(mktag!(b"LIST"), mktag!(b"movi")), rest_size,0)?;
- if end { self.movi_size = csz - 4; break; }
+ if end {
+ self.movi_size = csz - 4;
+ self.movi_orig = self.movi_size;
+ self.movi_pos = self.src.tell();
+ break;
+ }
rest_size -= csz;
}
+//todo read index
if !self.sstate.valid_state() || self.sstate.strm_no != self.num_streams {
return Err(InvalidData);
}