aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-07-09 10:42:42 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-07-09 10:42:42 +0200
commit24d998947d55228ec37a08cd391983c6239e3c0c (patch)
treec7c392e66ea95f35f558de9edd5a3ff8bfaede01
parentdcabdfd2eea01174f46548a8e2166ab88d0de96b (diff)
downloadnihav-24d998947d55228ec37a08cd391983c6239e3c0c.tar.gz
use NATimePoint for seeking
-rw-r--r--nihav-commonfmt/src/demuxers/avi.rs2
-rw-r--r--nihav-commonfmt/src/demuxers/mov.rs2
-rw-r--r--nihav-commonfmt/src/demuxers/wav.rs12
-rw-r--r--nihav-core/src/demuxers/mod.rs35
-rw-r--r--nihav-game/src/demuxers/bmv.rs4
-rw-r--r--nihav-game/src/demuxers/gdv.rs2
-rw-r--r--nihav-game/src/demuxers/vmd.rs2
-rw-r--r--nihav-rad/src/demuxers/bink.rs2
-rw-r--r--nihav-rad/src/demuxers/smacker.rs9
-rw-r--r--nihav-realmedia/src/demuxers/realmedia.rs6
-rw-r--r--nihav-vivo/src/demuxers/vivo.rs2
11 files changed, 52 insertions, 26 deletions
diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs
index 43d154a..05a0d64 100644
--- a/nihav-commonfmt/src/demuxers/avi.rs
+++ b/nihav-commonfmt/src/demuxers/avi.rs
@@ -135,7 +135,7 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
}
}
- fn seek(&mut self, time: u64, seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_index: &SeekIndex) -> DemuxerResult<()> {
let ret = seek_index.find_pos(time);
if ret.is_none() {
return Err(DemuxerError::SeekError);
diff --git a/nihav-commonfmt/src/demuxers/mov.rs b/nihav-commonfmt/src/demuxers/mov.rs
index c10bb2d..47cfbe3 100644
--- a/nihav-commonfmt/src/demuxers/mov.rs
+++ b/nihav-commonfmt/src/demuxers/mov.rs
@@ -962,7 +962,7 @@ impl<'a> DemuxCore<'a> for MOVDemuxer<'a> {
Err(DemuxerError::EOF)
}
- fn seek(&mut self, time: u64, seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_index: &SeekIndex) -> DemuxerResult<()> {
let ret = seek_index.find_pos(time);
if ret.is_none() {
return Err(DemuxerError::SeekError);
diff --git a/nihav-commonfmt/src/demuxers/wav.rs b/nihav-commonfmt/src/demuxers/wav.rs
index f9c9551..a579279 100644
--- a/nihav-commonfmt/src/demuxers/wav.rs
+++ b/nihav-commonfmt/src/demuxers/wav.rs
@@ -83,10 +83,16 @@ impl<'a> DemuxCore<'a> for WAVDemuxer<'a> {
}
}
- fn seek(&mut self, time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> {
if self.block_size != 0 && self.avg_bytes != 0 {
- let seek_dst = u64::from(self.avg_bytes) * time / 1000;
- let seek_off = seek_dst / (self.block_size as u64) * (self.block_size as u64);
+ let seek_off = match time {
+ NATimePoint::Milliseconds(ms) => {
+ let seek_dst = u64::from(self.avg_bytes) * ms / 1000;
+ seek_dst / (self.block_size as u64) * (self.block_size as u64)
+ },
+ NATimePoint::PTS(pts) => (self.block_size as u64) * pts,
+ NATimePoint::None => return Ok(()),
+ };
self.src.seek(SeekFrom::Start(self.data_pos + seek_off))?;
Ok(())
} else {
diff --git a/nihav-core/src/demuxers/mod.rs b/nihav-core/src/demuxers/mod.rs
index 9a69abb..352c160 100644
--- a/nihav-core/src/demuxers/mod.rs
+++ b/nihav-core/src/demuxers/mod.rs
@@ -37,7 +37,7 @@ pub trait DemuxCore<'a>: NAOptionHandler {
/// Demuxes a packet.
fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket>;
/// Seeks to the requested time.
- fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()>;
+ fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()>;
}
/// An auxiliary trait to make bytestream reader read packet data.
@@ -229,16 +229,31 @@ impl StreamSeekInfo {
self.entries.push(entry);
}
/// Searches for an appropriate seek position before requested time.
- pub fn find_pos(&self, time: u64) -> Option<SeekEntry> {
+ pub fn find_pos(&self, time: NATimePoint) -> Option<SeekEntry> {
+ if time == NATimePoint::None {
+ return None;
+ }
if !self.entries.is_empty() {
// todo something faster like binary search
let mut cand = None;
for entry in self.entries.iter() {
- if entry.time <= time {
- cand = Some(*entry);
- } else {
- break;
- }
+ match time {
+ NATimePoint::Milliseconds(ms) => {
+ if entry.time <= ms {
+ cand = Some(*entry);
+ } else {
+ break;
+ }
+ },
+ NATimePoint::PTS(pts) => {
+ if entry.pts <= pts {
+ cand = Some(*entry);
+ } else {
+ break;
+ }
+ },
+ NATimePoint::None => unreachable!(),
+ };
}
cand
} else {
@@ -309,7 +324,7 @@ impl SeekIndex {
self.seek_info[idx.unwrap()].filled = true;
}
/// Searches for a seek position before requested time.
- pub fn find_pos(&self, time: u64) -> Option<SeekIndexResult> {
+ pub fn find_pos(&self, time: NATimePoint) -> Option<SeekIndexResult> {
let mut cand = None;
for str in self.seek_info.iter() {
if !str.filled { continue; }
@@ -389,8 +404,8 @@ impl<'a> Demuxer<'a> {
}
}
}
- /// Seeks to the requested time (in milliseconds) if possible.
- pub fn seek(&mut self, time: u64) -> DemuxerResult<()> {
+ /// Seeks to the requested time if possible.
+ pub fn seek(&mut self, time: NATimePoint) -> DemuxerResult<()> {
if self.seek_idx.skip_index {
return Err(DemuxerError::NotPossible);
}
diff --git a/nihav-game/src/demuxers/bmv.rs b/nihav-game/src/demuxers/bmv.rs
index fafd6f0..83f75b1 100644
--- a/nihav-game/src/demuxers/bmv.rs
+++ b/nihav-game/src/demuxers/bmv.rs
@@ -70,7 +70,7 @@ impl<'a> DemuxCore<'a> for BMVDemuxer<'a> {
}
}
- fn seek(&mut self, _time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
}
@@ -218,7 +218,7 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> {
}
}
- fn seek(&mut self, _time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
}
diff --git a/nihav-game/src/demuxers/gdv.rs b/nihav-game/src/demuxers/gdv.rs
index 11d7406..af0f857 100644
--- a/nihav-game/src/demuxers/gdv.rs
+++ b/nihav-game/src/demuxers/gdv.rs
@@ -110,7 +110,7 @@ impl<'a> DemuxCore<'a> for GremlinVideoDemuxer<'a> {
}
}
- fn seek(&mut self, _time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
}
diff --git a/nihav-game/src/demuxers/vmd.rs b/nihav-game/src/demuxers/vmd.rs
index 3c6e152..f693e73 100644
--- a/nihav-game/src/demuxers/vmd.rs
+++ b/nihav-game/src/demuxers/vmd.rs
@@ -180,7 +180,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
Ok(pkt)
}
- fn seek(&mut self, _time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
}
diff --git a/nihav-rad/src/demuxers/bink.rs b/nihav-rad/src/demuxers/bink.rs
index a5d8169..454290f 100644
--- a/nihav-rad/src/demuxers/bink.rs
+++ b/nihav-rad/src/demuxers/bink.rs
@@ -152,7 +152,7 @@ impl<'a> DemuxCore<'a> for BinkDemuxer<'a> {
Ok(pkt)
}
- fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()> {
let ret = seek_idx.find_pos(time);
if ret.is_none() {
return Err(DemuxerError::SeekError);
diff --git a/nihav-rad/src/demuxers/smacker.rs b/nihav-rad/src/demuxers/smacker.rs
index accbfa5..6d1173c 100644
--- a/nihav-rad/src/demuxers/smacker.rs
+++ b/nihav-rad/src/demuxers/smacker.rs
@@ -251,8 +251,13 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
Ok(pkt)
}
- fn seek(&mut self, time: u64, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
- if time == 0 {
+ fn seek(&mut self, time: NATimePoint, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ let seek_to_start = match time {
+ NATimePoint::Milliseconds(0) => true,
+ NATimePoint::PTS(0) => true,
+ _ => false,
+ };
+ if seek_to_start {
let start = self.start;
self.src.seek(SeekFrom::Start(start))?;
self.cur_frame = 0;
diff --git a/nihav-realmedia/src/demuxers/realmedia.rs b/nihav-realmedia/src/demuxers/realmedia.rs
index 16c4746..b37c34f 100644
--- a/nihav-realmedia/src/demuxers/realmedia.rs
+++ b/nihav-realmedia/src/demuxers/realmedia.rs
@@ -740,7 +740,7 @@ impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> {
}
#[allow(unused_variables)]
- fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()> {
self.queued_pkts.clear();
let ret = seek_idx.find_pos(time);
if ret.is_none() {
@@ -1263,7 +1263,7 @@ println!(" got ainfo {:?}", ainfo);
}
#[allow(unused_variables)]
- fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()> {
Err(NotImplemented)
}
}
@@ -1608,7 +1608,7 @@ println!("R1M kind");
}
#[allow(unused_variables)]
- fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()> {
Err(NotImplemented)
}
}
diff --git a/nihav-vivo/src/demuxers/vivo.rs b/nihav-vivo/src/demuxers/vivo.rs
index a060d48..3c0ac7d 100644
--- a/nihav-vivo/src/demuxers/vivo.rs
+++ b/nihav-vivo/src/demuxers/vivo.rs
@@ -129,7 +129,7 @@ impl<'a> DemuxCore<'a> for VivoDemuxer<'a> {
}
}
}
- fn seek(&mut self, _time: u64, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
}