projects
/
nihav.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
introduce stream and container duration
[nihav.git]
/
nihav-commonfmt
/
src
/
demuxers
/
mov.rs
diff --git
a/nihav-commonfmt/src/demuxers/mov.rs
b/nihav-commonfmt/src/demuxers/mov.rs
index c10bb2dd7a2500ff136081dd51510e51320cc53c..9236baa1b0667d0132745e31e3465d959dafe193 100644
(file)
--- a/
nihav-commonfmt/src/demuxers/mov.rs
+++ b/
nihav-commonfmt/src/demuxers/mov.rs
@@
-239,7
+239,7
@@
fn read_cmov(dmx: &mut MOVDemuxer, strmgr: &mut StreamManager, size: u64) -> Dem
dmx.duration = ddmx.duration;
dmx.tb_den = ddmx.tb_den;
std::mem::swap(&mut dmx.pal, &mut ddmx.pal);
dmx.duration = ddmx.duration;
dmx.tb_den = ddmx.tb_den;
std::mem::swap(&mut dmx.pal, &mut ddmx.pal);
-
+
Ok(size)
}
Ok(size)
}
@@
-292,7
+292,7
@@
fn read_tkhd(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult
let _mtime = br.read_u32be()?;
let track_id = br.read_u32be()?;
br.read_skip(4)?;
let _mtime = br.read_u32be()?;
let track_id = br.read_u32be()?;
br.read_skip(4)?;
- let
_duration
= br.read_u32be()?;
+ let
duration
= br.read_u32be()?;
br.read_skip(8)?;
let _layer = br.read_u16be()?;
let _alt_group = br.read_u16be()?;
br.read_skip(8)?;
let _layer = br.read_u16be()?;
let _alt_group = br.read_u16be()?;
@@
-304,6
+304,7
@@
fn read_tkhd(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult
track.width = width >> 16;
track.height = height >> 16;
track.track_id = track_id;
track.width = width >> 16;
track.height = height >> 16;
track.track_id = track_id;
+ track.duration = duration;
track.tkhd_found = true;
Ok(KNOWN_TKHD_SIZE)
track.tkhd_found = true;
Ok(KNOWN_TKHD_SIZE)
@@
-621,7
+622,7
@@
fn read_stsd(track: &mut Track, br: &mut ByteReader, size: u64) -> DemuxerResult
};
let read_size = br.tell() - start_pos;
validate!(read_size <= size);
};
let read_size = br.tell() - start_pos;
validate!(read_size <= size);
- track.stream = Some(NAStream::new(track.stream_type, track.track_no, codec_info, 1, track.tb_den));
+ track.stream = Some(NAStream::new(track.stream_type, track.track_no, codec_info, 1, track.tb_den
, u64::from(track.duration)
));
track.stsd_found = true;
Ok(read_size)
}
track.stsd_found = true;
Ok(read_size)
}
@@
-718,6
+719,7
@@
struct Track {
track_str_id: usize,
track_no: u32,
tb_den: u32,
track_str_id: usize,
track_no: u32,
tb_den: u32,
+ duration: u32,
depth: u8,
tkhd_found: bool,
stsd_found: bool,
depth: u8,
tkhd_found: bool,
stsd_found: bool,
@@
-751,6
+753,7
@@
impl Track {
track_str_id: 0,
track_no,
tb_den,
track_str_id: 0,
track_no,
tb_den,
+ duration: 0,
stream_type: StreamType::None,
width: 0,
height: 0,
stream_type: StreamType::None,
width: 0,
height: 0,
@@
-962,7
+965,7
@@
impl<'a> DemuxCore<'a> for MOVDemuxer<'a> {
Err(DemuxerError::EOF)
}
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);
let ret = seek_index.find_pos(time);
if ret.is_none() {
return Err(DemuxerError::SeekError);
@@
-973,6
+976,13
@@
impl<'a> DemuxCore<'a> for MOVDemuxer<'a> {
}
Ok(())
}
}
Ok(())
}
+ fn get_duration(&self) -> u64 {
+ if self.tb_den != 0 {
+ u64::from(self.duration) * 1000 / u64::from(self.tb_den)
+ } else {
+ 0
+ }
+ }
}
impl<'a> NAOptionHandler for MOVDemuxer<'a> {
}
impl<'a> NAOptionHandler for MOVDemuxer<'a> {