X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-realmedia%2Fsrc%2Fdemuxers%2Frealmedia.rs;h=b5cd9b7e85c24da5db1f98051a25ca37351dd445;hb=60b9641e93c0feb263f961dec5be151b59b5939a;hp=1fa52f967283329203518355587c770aaa5cfeb7;hpb=d254ca17b0cd03c0d91f60c849c8da6d152068ed;p=nihav.git diff --git a/nihav-realmedia/src/demuxers/realmedia.rs b/nihav-realmedia/src/demuxers/realmedia.rs index 1fa52f9..b5cd9b7 100644 --- a/nihav-realmedia/src/demuxers/realmedia.rs +++ b/nihav-realmedia/src/demuxers/realmedia.rs @@ -764,6 +764,12 @@ impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> { } } +impl<'a> NAOptionHandler for RealMediaDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + fn read_chunk(src: &mut ByteReader) -> DemuxerResult<(u32, u32, u16)> { let id = src.read_u32be()?; if id == 0 { return Ok((0, 0, 0)); } @@ -1126,19 +1132,29 @@ impl<'a> RealMediaDemuxer<'a> { Ok(()) } fn parse_index(&mut self, seek_idx: &mut SeekIndex, chunk_size: usize, ver: u16) -> DemuxerResult<()> { - if ver != 0 { return Ok(()); } + if ver != 0 && ver != 2 { return Ok(()); } let num_entries = self.src.read_u32be()? as usize; let str_id = self.src.read_u16be()? as u32; let _next_idx = self.src.read_u32be()?; - validate!(chunk_size == num_entries * 14 + 10); + if ver == 2 { + self.src.read_u32be()?; + } + if ver == 0 { + validate!(chunk_size == num_entries * 14 + 10); + } else { + validate!(chunk_size == num_entries * 18 + 14); + } if num_entries == 0 { return Ok(()); } seek_idx.add_stream(str_id); let idx = seek_idx.get_stream_index(str_id).unwrap(); for _ in 0..num_entries { - let ver = self.src.read_u16be()? as u32; - validate!(ver == 0); + let iver = self.src.read_u16be()?; + validate!(iver == ver); let ts = self.src.read_u32be()? as u64; + if ver == 2 { + self.src.read_u32be()?; + } let pos = self.src.read_u32be()? as u64; let _pkt_no = self.src.read_u32be()?; idx.add_entry(SeekEntry { time: ts, pts: 0, pos }); @@ -1252,6 +1268,12 @@ println!(" got ainfo {:?}", ainfo); } } +impl<'a> NAOptionHandler for RealAudioDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + impl<'a> RealAudioDemuxer<'a> { fn new(io: &'a mut ByteReader<'a>) -> Self { RealAudioDemuxer { @@ -1591,6 +1613,12 @@ println!("R1M kind"); } } +impl<'a> NAOptionHandler for RealIVRDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + impl<'a> RealIVRDemuxer<'a> { fn new(io: &'a mut ByteReader<'a>) -> Self { RealIVRDemuxer {