fps: f32,
width: usize,
height: usize,
+ duration: u64,
vname: &'static str,
aname: &'static str,
}
let hdr = self.src.peek_byte()?;
if (hdr & 0xF0) != 0 { break; }
self.src.read_skip(1)?;
- let hdr_len = read_size(&mut self.src)?;
+ let hdr_len = read_size(self.src)?;
hdr_data.resize(hdr_len, 0);
self.src.read_buf(&mut hdr_data)?;
self.parse_header_packet(&hdr_data)?;
let vhdr = NAVideoInfo::new(self.width, self.height, false, YUV420_FORMAT);
let vinfo = NACodecInfo::new(self.vname, NACodecTypeInfo::Video(vhdr), None);
- let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, self.v_num, self.v_den));
+ let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, self.v_num, self.v_den, 0));
validate!(res.is_some());
self.video_id = res.unwrap();
if self.aname != "none" {
let ahdr = NAAudioInfo::new(self.a_den, 1, SND_S16_FORMAT, self.a_num as usize);
let ainfo = NACodecInfo::new(self.aname, NACodecTypeInfo::Audio(ahdr), None);
- let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, self.a_num, self.a_den));
+ let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, self.a_num, self.a_den, 0));
validate!(res.is_some());
self.audio_id = res.unwrap();
}
}
}
}
- fn seek(&mut self, _time: u64, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
+ fn seek(&mut self, _time: NATimePoint, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
Err(DemuxerError::NotPossible)
}
+ fn get_duration(&self) -> u64 { self.duration }
}
impl<'a> NAOptionHandler for VivoDemuxer<'a> {
width: 0,
height: 0,
fps: 0.0,
+ duration: 0,
vname: "none",
aname: "none",
}
fn parse_header_packet(&mut self, pkt: &[u8]) -> DemuxerResult<()> {
for entry in pkt.split(|ch| *ch == 0xD) {
if entry.len() < 3 || !entry.contains(&b':') { continue; }
- let entry = if entry.len() > 0 && entry[0] == 0xA { &entry[1..] } else { entry };
+ let entry = if !entry.is_empty() && entry[0] == 0xA { &entry[1..] } else { entry };
let mut split = entry.split(|ch| *ch == b':');
let name = split.next().unwrap();
let value = split.next().unwrap();
return Err(DemuxerError::InvalidData);
};
},
+ b"Duration" => {
+ self.duration = if let Ok(val) = valstr.parse() {
+ val
+ } else { 0 };
+ },
/* b"TimeUnitNumerator" => {
self.v_num = if let Ok(val) = valstr.parse() {
val
#[test]
fn test_vivo_demux() {
// let mut file = File::open("assets/Misc/greetings.viv").unwrap();
+ // sample: https://samples.mplayerhq.hu/vivo/vivo2/favmovie.viv
let mut file = File::open("assets/Misc/favmovie.viv").unwrap();
let mut fr = FileReader::new_read(&mut file);
let mut br = ByteReader::new(&mut fr);