diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-10-04 11:53:21 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2020-10-04 11:53:21 +0200 |
commit | a480a0de101483d802a11e72d758dae00fa4860a (patch) | |
tree | b433ba04fc397f6e7297aeb56103105254dcb3f7 /nihav-core | |
parent | b4bf2c3f1a94b2b4ebbfc704e17fbaf366f8fa8b (diff) | |
download | nihav-a480a0de101483d802a11e72d758dae00fa4860a.tar.gz |
introduce stream and container duration
Diffstat (limited to 'nihav-core')
-rw-r--r-- | nihav-core/src/demuxers/mod.rs | 21 | ||||
-rw-r--r-- | nihav-core/src/frame.rs | 8 |
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) } } |