X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Favi.rs;h=4ea40673aa40c2be22249d453ea7bc8552857278;hb=f8d697207ac1373091df74002bdc72fd5b2d8944;hp=739cd012c3c3d971c258f33238af35c0f3b81ca1;hpb=956ef3a088a7cf14292b874ab6f49d2c3e31090a;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs index 739cd01..4ea4067 100644 --- a/nihav-commonfmt/src/demuxers/avi.rs +++ b/nihav-commonfmt/src/demuxers/avi.rs @@ -97,7 +97,7 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> { if self.movi_size == 0 { return Err(EOF); } continue; } - if tag[0] == b'i' && tag[1] == b'x' { + if (tag[0] == b'i' && tag[1] == b'x') || (&tag == b"idx1") { return Err(EOF); } if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' { @@ -292,7 +292,8 @@ impl<'a> AVIDemuxer<'a> { 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] = self.src.read_byte()?; + newpal[i * 4 + 3] = 0; + self.src.read_byte()?; // flags } pe.pal = Arc::new(newpal); pe.changed = true; @@ -392,7 +393,7 @@ fn parse_strf(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> fn parse_strf_vids(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult { if size < 40 { return Err(InvalidData); } let bi_size = dmx.src.read_u32le()?; - if (bi_size as usize) > size { return Err(InvalidData); } + if (bi_size as usize) < 40 { return Err(InvalidData); } let width = dmx.src.read_u32le()?; let height = dmx.src.read_u32le()? as i32; let planes = dmx.src.read_u16le()?; @@ -408,17 +409,17 @@ fn parse_strf_vids(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize let flip = height < 0; let format = if bitcount > 8 { RGB24_FORMAT } else { PAL8_FORMAT }; - let vhdr = NAVideoInfo::new(width as usize, if flip { -height as usize } else { height as usize}, flip, PAL8_FORMAT); + let vhdr = NAVideoInfo::new(width as usize, if flip { -height as usize } else { height as usize}, flip, format); let vci = NACodecTypeInfo::Video(vhdr); let edata = dmx.read_extradata(size - 40)?; if colors > 0 { if let Some(ref buf) = edata { let mut pal = [0u8; 1024]; for (dpal, spal) in pal.chunks_mut(4).take(colors as usize).zip(buf.chunks(4)) { - dpal[0] = spal[0]; + dpal[0] = spal[2]; dpal[1] = spal[1]; - dpal[2] = spal[2]; - dpal[3] = spal[3]; + dpal[2] = spal[0]; + dpal[3] = 0; } let pal = PalInfo { pal: Arc::new(pal), changed: true, stream_no: strmgr.get_num_streams() }; dmx.pal.push(pal); @@ -447,7 +448,14 @@ fn parse_strf_auds(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: 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); - let edata = dmx.read_extradata(size - 16)?; + let edata; + if size > 16 { + let edata_size = dmx.src.read_u16le()? as usize; + validate!(edata_size + 18 == size); + edata = dmx.read_extradata(size - 18)?; + } else { + edata = None; + } let cname = match register::find_codec_from_wav_twocc(w_format_tag) { None => "unknown", Some(name) => name,