X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Favi.rs;h=cf66f36885438d1052c8c83bb2f967956d86e2ce;hb=1fdbd53e295c3876df7602cc5c5397730711ed24;hp=c8e707153a77a4b391659a0354654dbd2b5e7ba7;hpb=c83013a1f409bc5f83e343cf1b2293aa736e6c93;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs index c8e7071..cf66f36 100644 --- a/nihav-commonfmt/src/demuxers/avi.rs +++ b/nihav-commonfmt/src/demuxers/avi.rs @@ -87,6 +87,9 @@ 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' { + return Err(EOF); + } if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' { return Err(InvalidData); } @@ -183,7 +186,14 @@ impl<'a> AVIDemuxer<'a> { let riff_tag = self.src.read_u32be()?; let size = self.src.read_u32le()? as usize; let avi_tag = self.src.read_u32be()?; - if riff_tag != mktag!(b"RIFF") || avi_tag != mktag!(b"AVI ") { + let mut matches = false; + for rt in RIFF_TAGS.iter() { + if rt[0] == riff_tag && rt[1] == avi_tag { + matches = true; + break; + } + } + if !matches { return Err(InvalidData); } self.size = size; @@ -207,10 +217,17 @@ impl<'a> AVIDemuxer<'a> { } } -const CHUNKS: [RIFFParser; 6] = [ +const RIFF_TAGS: &[[u32; 2]] = &[ + [ mktag!(b"RIFF"), mktag!(b"AVI ") ], + [ mktag!(b"RIFF"), mktag!(b"AVIX") ], + [ mktag!(b"ON2 "), mktag!(b"ON2f") ], +]; + +const CHUNKS: [RIFFParser; 7] = [ RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"hdrl")), parse: parse_hdrl }, RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"strl")), parse: parse_strl }, RIFFParser { tag: RIFFTag::Chunk(mktag!(b"avih")), parse: parse_avih }, + RIFFParser { tag: RIFFTag::Chunk(mktag!(b"ON2h")), parse: parse_avih }, RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strf")), parse: parse_strf }, RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strh")), parse: parse_strh }, RIFFParser { tag: RIFFTag::Chunk(mktag!(b"JUNK")), parse: parse_junk },