+
+ fn parse_palette_change(&mut self, stream_no: usize, size: usize) -> DemuxerResult<()> {
+ for pe in self.pal.iter_mut() {
+ if pe.stream_no == stream_no {
+ let mut newpal = *pe.pal;
+ let mut data_left = size;
+ while data_left > 0 {
+ validate!(data_left >= 8);
+ let start_clr = self.src.read_byte()? as usize;
+ let len = self.src.read_byte()? as usize;
+ let len = if len == 0 { 256 } else { len };
+ let _flags = self.src.read_u16le()?;
+ validate!(start_clr + len <= 256);
+ let change_size = len * 4 + 4;
+ validate!(change_size <= data_left);
+ for i in start_clr..(start_clr + len) {
+ newpal[i * 4] = self.src.read_byte()?;
+ newpal[i * 4 + 1] = self.src.read_byte()?;
+ newpal[i * 4 + 2] = self.src.read_byte()?;
+ newpal[i * 4 + 3] = 0;
+ self.src.read_byte()?; // flags
+ }
+ data_left -= change_size;
+ }
+ pe.pal = Arc::new(newpal);
+ pe.changed = true;
+ return Ok(());
+ }
+ }
+ self.src.read_skip(size)?;
+ Ok(())
+ }
+ 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(())
+ }