diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2018-10-20 11:04:53 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2018-10-20 11:04:53 +0200 |
commit | 480d951eac7bd3c1e52a019b5bb66b4dce4929f8 (patch) | |
tree | 33dd5f0655005c35a3d88ddbaeee8fd0b9d494f7 /src | |
parent | 1a151e53b591a45fb7f009e480d7abb5e03f0cfe (diff) | |
download | nihav-480d951eac7bd3c1e52a019b5bb66b4dce4929f8.tar.gz |
rm: VBR audio deinterleaver support
Diffstat (limited to 'src')
-rw-r--r-- | src/demuxers/realmedia.rs | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/src/demuxers/realmedia.rs b/src/demuxers/realmedia.rs index 270eddc..020e8c0 100644 --- a/src/demuxers/realmedia.rs +++ b/src/demuxers/realmedia.rs @@ -130,7 +130,9 @@ impl RMAudioStream { buf = Vec::with_capacity(bsize); buf.resize(bsize, 0u8); }, - Deinterleaver::VBR => { unimplemented!("deint"); }, + Deinterleaver::VBR => { + buf = Vec::new(); + }, }; } else { deint = Deinterleaver::None; @@ -188,7 +190,31 @@ impl RMAudioStream { let mut dst = &mut self.buf[fsize * ppos..][..fsize]; src.read_buf(&mut dst)?; }, - _ => { return src.read_packet(stream, ts, keyframe, payload_size); }, + Deinterleaver::VBR => { + validate!(payload_size >= 5); + let hdrsizesize = src.read_u16be()?; + let num_entries = (hdrsizesize / 16) as usize; + validate!(payload_size >= num_entries * 3 + 2); + let mut sizes: Vec<usize> = Vec::with_capacity(num_entries); + let mut tot_size = 0; + for _ in 0..num_entries { + let sz = src.read_u16be()? as usize; + tot_size += sz; + sizes.push(sz); + } + validate!(tot_size + num_entries * 2 + 2 == payload_size); + let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den); + let mut first = true; + for size in sizes.iter() { + let cur_ts = if first { ts } else { pkt_ts }; + first = false; + let pkt = src.read_packet(stream.clone(), cur_ts, true, *size)?; + queued_packets.push(pkt); + } + queued_packets.reverse(); + let pkt0 = queued_packets.pop().unwrap(); + return Ok(pkt0); + }, }; let iinfo = self.iinfo.unwrap(); @@ -946,27 +972,6 @@ fn parse_rm_stream(io: &mut ByteReader) -> DemuxerResult<NAStream> { unimplemented!(); } -#[allow(dead_code)] -#[allow(unused_variables)] -fn read_ra_vbr_stream(io: &mut ByteReader) -> DemuxerResult<NAPacket> { - let hdrsizesize = io.read_u16le()?; - let num_entries = (hdrsizesize / 16) as usize; - let mut sizes: Vec<usize> = Vec::with_capacity(num_entries); - for _ in 0..num_entries { - let sz = io.read_u16le()? as usize; - sizes.push(sz); - } - for i in 0..num_entries { -//read packet of sizes[i] - } - unimplemented!(); -} - -//todo interleavers - -//todo opaque data - - static RM_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[ (b"RV10", "realvideo1"), (b"RV20", "realvideo2"), |