self.src.read_buf(&mut tag)?;
let size = self.src.read_u32le()? as usize;
if mktag!(tag) == mktag!(b"JUNK") {
self.src.read_buf(&mut tag)?;
let size = self.src.read_u32le()? as usize;
if mktag!(tag) == mktag!(b"JUNK") {
if RIFFTag::Chunk(tag) == CHUNKS[i].tag {
let psize = (CHUNKS[i].parse)(self, size)?;
if psize != size { return Err(InvalidData); }
if RIFFTag::Chunk(tag) == CHUNKS[i].tag {
let psize = (CHUNKS[i].parse)(self, size)?;
if psize != size { return Err(InvalidData); }
return Ok((size + 8, false));
}
if RIFFTag::List(tag, ltag) == CHUNKS[i].tag {
return Ok((size + 8, false));
}
if RIFFTag::List(tag, ltag) == CHUNKS[i].tag {
let (psize, _) = self.parse_chunk(end_tag, rest_size, depth+1)?;
if psize > rest_size { return Err(InvalidData); }
rest_size -= psize;
let (psize, _) = self.parse_chunk(end_tag, rest_size, depth+1)?;
if psize > rest_size { return Err(InvalidData); }
rest_size -= psize;
- 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)?; }
let samplespersec = dmx.src.read_u32le()?;
let avgbytespersec = dmx.src.read_u32le()?;
let block_align = dmx.src.read_u16le()?;
let samplespersec = dmx.src.read_u32le()?;
let avgbytespersec = dmx.src.read_u32le()?;
let block_align = dmx.src.read_u16le()?;
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);
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);