+ fn try_next_odml_chunk(&mut self) -> DemuxerResult<()> {
+ let last_seg = self.odml_riff.last().unwrap();
+ if self.src.tell() < last_seg.get_end() {
+ for riff_seg in self.odml_riff.iter() {
+ if riff_seg.pos >= self.src.tell() {
+ self.src.seek(SeekFrom::Start(riff_seg.movi_pos))?;
+ self.movi_pos = riff_seg.movi_pos;
+ self.movi_size = riff_seg.movi_size;
+ return Ok(());
+ }
+ }
+ }
+ self.src.seek(SeekFrom::Start(last_seg.get_end()))?;
+
+ let riff_pos = self.src.tell();
+ let ret = self.src.read_tag();
+ if let Ok([b'R', b'I', b'F', b'F']) = ret {
+ } else {
+ return Err(DemuxerError::EOF);
+ }
+ let riff_size = self.src.read_u32le()? as usize;
+ let tag = self.src.read_tag()?;
+ validate!(&tag == b"AVIX");
+ let tag = self.src.read_tag()?;
+ validate!(&tag == b"LIST");
+ let list_size = self.src.read_u32le()? as usize;
+ validate!(list_size >= 4);
+ let tag = self.src.read_tag()?;
+ validate!(&tag == b"movi");
+ self.odml_riff.push(RIFFSegment{ pos: riff_pos, size: riff_size + 8, movi_pos: riff_pos + 24, movi_size: list_size - 4});
+ self.movi_pos = riff_pos + 24;
+ self.movi_size = list_size - 4;
+ self.movi_orig = self.movi_size;
+
+ Ok(())
+ }