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);