aboutsummaryrefslogtreecommitdiffstats
path: root/nihav-core
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-10-04 11:53:21 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-10-04 11:53:21 +0200
commita480a0de101483d802a11e72d758dae00fa4860a (patch)
treeb433ba04fc397f6e7297aeb56103105254dcb3f7 /nihav-core
parentb4bf2c3f1a94b2b4ebbfc704e17fbaf366f8fa8b (diff)
downloadnihav-a480a0de101483d802a11e72d758dae00fa4860a.tar.gz
introduce stream and container duration
Diffstat (limited to 'nihav-core')
-rw-r--r--nihav-core/src/demuxers/mod.rs21
-rw-r--r--nihav-core/src/frame.rs8
2 files changed, 27 insertions, 2 deletions
diff --git a/nihav-core/src/demuxers/mod.rs b/nihav-core/src/demuxers/mod.rs
index b54e563..dfcd118 100644
--- a/nihav-core/src/demuxers/mod.rs
+++ b/nihav-core/src/demuxers/mod.rs
@@ -38,6 +38,8 @@ pub trait DemuxCore<'a>: NAOptionHandler {
fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket>;
/// Seeks to the requested time.
fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()>;
+ /// Returns container duration in milliseconds (zero if not available).
+ fn get_duration(&self) -> u64;
}
/// An auxiliary trait to make bytestream reader read packet data.
@@ -415,6 +417,25 @@ impl<'a> Demuxer<'a> {
pub fn get_seek_index(&self) -> &SeekIndex {
&self.seek_idx
}
+ /// Returns media duration reported by container or its streams.
+ ///
+ /// Duration is in milliseconds and set to zero when it is not available.
+ pub fn get_duration(&self) -> u64 {
+ let duration = self.dmx.get_duration();
+ if duration != 0 {
+ return duration;
+ }
+ let mut duration = 0;
+ for stream in self.streams.iter() {
+ if stream.duration > 0 {
+ let dur = NATimeInfo::ts_to_time(stream.duration, 1000, stream.tb_num, stream.tb_den);
+ if duration < dur {
+ duration = dur;
+ }
+ }
+ }
+ duration
+ }
}
impl<'a> NAOptionHandler for Demuxer<'a> {
diff --git a/nihav-core/src/frame.rs b/nihav-core/src/frame.rs
index fbccfbe..8c58e19 100644
--- a/nihav-core/src/frame.rs
+++ b/nihav-core/src/frame.rs
@@ -1289,6 +1289,8 @@ pub struct NAStream {
pub tb_num: u32,
/// Timebase denominator.
pub tb_den: u32,
+ /// Duration in timebase units (zero if not available).
+ pub duration: u64,
}
/// A specialised reference-counted `NAStream` type.
@@ -1312,9 +1314,9 @@ pub fn reduce_timebase(tb_num: u32, tb_den: u32) -> (u32, u32) {
impl NAStream {
/// Constructs a new `NAStream` instance.
- pub fn new(mt: StreamType, id: u32, info: NACodecInfo, tb_num: u32, tb_den: u32) -> Self {
+ pub fn new(mt: StreamType, id: u32, info: NACodecInfo, tb_num: u32, tb_den: u32, duration: u64) -> Self {
let (n, d) = reduce_timebase(tb_num, tb_den);
- NAStream { media_type: mt, id, num: 0, info: info.into_ref(), tb_num: n, tb_den: d }
+ NAStream { media_type: mt, id, num: 0, info: info.into_ref(), tb_num: n, tb_den: d, duration }
}
/// Returns stream id.
pub fn get_id(&self) -> u32 { self.id }
@@ -1334,6 +1336,8 @@ impl NAStream {
self.tb_num = n;
self.tb_den = d;
}
+ /// Returns stream duration.
+ pub fn get_duration(&self) -> usize { self.num }
/// Converts current instance into a reference-counted one.
pub fn into_ref(self) -> NAStreamRef { Arc::new(self) }
}