if (self.src.tell() & 1) == 1 {
self.src.read_skip(1)?;
self.movi_size -= 1;
+ if self.movi_size == 0 { return Err(EOF); }
}
self.src.read_buf(&mut tag)?;
let size = self.src.read_u32le()? as usize;
self.src.read_skip(size)?;
continue;
}
+ if mktag!(tag) == mktag!(b"LIST") {
+ self.movi_size -= 12;
+ self.src.read_skip(4)?;
+ if self.movi_size == 0 { return Err(EOF); }
+ continue;
+ }
if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
return Err(InvalidData);
}
if RIFFTag::Chunk(tag) == end_tag {
return Ok((size, true));
}
- let ltag = if is_list_tag(tag) { self.src.read_u32be()? } else { 0 };
+ let is_list = is_list_tag(tag);
+ let ltag = if is_list { self.src.read_u32be()? } else { 0 };
if RIFFTag::List(tag, ltag) == end_tag {
return Ok((size, true));
}
return Ok((size + 8, false));
}
}
- self.src.read_skip(size)?;
+ if !is_list {
+ self.src.read_skip(size)?;
+ } else {
+ if size < 4 { return Err(InvalidData); }
+ self.src.read_skip(size - 4)?;
+ }
if (size & 1) == 1 { self.src.read_skip(1)?; }
return Ok((size + 8, false));
}
let samplespersec = dmx.src.read_u32le()?;
let avgbytespersec = dmx.src.read_u32le()?;
let block_align = dmx.src.read_u16le()?;
- let bits_per_sample = dmx.src.read_u16le()?;
+ let bits_per_sample = dmx.src.read_u16le()? * 8;
let soniton = NASoniton::new(bits_per_sample as u8, SONITON_FLAG_SIGNED);
let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize);