+#[allow(clippy::verbose_bit_mask)]
+fn parse_idx1(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mut SeekIndex, size: usize, movi_pos: u64, key_offs: &mut Vec<u64>) -> DemuxerResult<usize> {
+ validate!((size & 15) == 0);
+ let mut tag = [0u8; 4];
+ let num_entries = size >> 4;
+ let mut counter = [0u64; 100];
+ let mut add_offset = 0;
+ let mut set_offset = false;
+ for _ in 0..num_entries {
+ src.read_buf(&mut tag)?;
+ let flags = src.read_u32le()?;
+ let mut offset = src.read_u32le()? as u64;
+ let _length = src.read_u32le()?;
+
+ if !set_offset && offset < movi_pos {
+ add_offset = movi_pos - offset;
+ }
+ set_offset = true;
+
+ offset += add_offset;
+
+ if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
+ continue;
+ }
+ let stream_no = ((tag[0] - b'0') * 10 + (tag[1] - b'0')) as usize;
+
+ if (flags & 0x10) != 0 {
+ if let Some(stream) = strmgr.get_stream(stream_no) {
+ if stream.get_media_type() == StreamType::Video {
+ let (tb_num, tb_den) = stream.get_timebase();
+ let pts = counter[stream_no];
+ let time = NATimeInfo::ts_to_time(pts, 1000, tb_num, tb_den);
+ validate!(offset >= movi_pos);
+ seek_idx.add_entry(stream_no as u32, SeekEntry { time, pts, pos: offset });
+ }
+ key_offs.push(offset);
+ }
+ }
+ counter[stream_no] += 1;
+ }
+ key_offs.sort_unstable();
+ Ok(size)
+}
+
+fn parse_odml_ix(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mut SeekIndex, stream_no: usize, size: usize, start: u64) -> DemuxerResult<u64> {
+ validate!(size >= 24);
+ let entry_size = src.read_u16le()? as usize;
+ if entry_size != 2 {
+ return Err(DemuxerError::NotImplemented);
+ }
+ let sub_type = src.read_byte()?;
+ let idx_type = src.read_byte()?;
+ validate!(sub_type == 0 && idx_type == 1);
+ let entries = src.read_u32le()? as usize;
+ validate!(size >= 24 + entries * 4 * entry_size);
+ src.read_tag()?; //chunk id
+ let base_offset = src.read_u64le()?;
+ src.read_u32le()?; //reserved
+ if let Some(stream) = strmgr.get_stream(stream_no) {
+ if stream.get_media_type() == StreamType::Video {
+ let (tb_num, tb_den) = stream.get_timebase();
+
+ for i in 0..entries {
+ let offset = src.read_u32le()?;
+ validate!(offset >= 8);
+ let _size = src.read_u32le()?;
+
+ let pts = start + (i as u64);
+ let time = NATimeInfo::ts_to_time(pts, 1000, tb_num, tb_den);
+ seek_idx.add_entry(stream_no as u32, SeekEntry { time, pts, pos: base_offset + u64::from(offset - 8) });
+ }
+
+ Ok(start + (entries as u64))
+ } else {
+ Ok(0)
+ }
+ } else {
+ Ok(0)
+ }
+}
+