X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fcodecs%2Fcinepak.rs;h=ff1130b16346d363f6ad3348b9109136ddd5158e;hp=5f03e14f55f9a74af61772b6f8de5ac9a99392e7;hb=78fb6560c73965d834b215fb0b49505ae5443288;hpb=7d57ae2f680d7a1eba7af2ee831f305b2f0f9324 diff --git a/nihav-commonfmt/src/codecs/cinepak.rs b/nihav-commonfmt/src/codecs/cinepak.rs index 5f03e14..ff1130b 100644 --- a/nihav-commonfmt/src/codecs/cinepak.rs +++ b/nihav-commonfmt/src/codecs/cinepak.rs @@ -14,7 +14,7 @@ enum DecodeMode { struct CinepakDecoder { info: NACodecInfoRef, - frmmgr: HAMShuffler, + frmmgr: HAMShuffler, cb_v1: [[u8; 6]; 256], cb_v4: [[u8; 6]; 256], mode: DecodeMode, @@ -113,8 +113,8 @@ impl CinepakDecoder { let mut v1_only = false; while br.left() > 0 { let id = br.read_byte()?; - if (id & 0xF0) == 0x20 { - validate!(((id & 1) != 0) ^ is_intra_strip); + if (id & 0xF0) == 0x20 && is_intra_strip { + validate!((id & 1) == 0); } let size = br.read_u24be()? as usize; validate!(size >= 4 && (size - 4 <= (br.left() as usize))); @@ -158,7 +158,7 @@ impl CinepakDecoder { let mut y = yoff; let mut block = [0u8; 24]; while br.left() > 0 { - let flags = if !v1_only { br.read_u32be()? } else { 0xFFFFFFFF }; + let mut flags = if !v1_only { br.read_u32be()? } else { 0x00000000 }; let mut mask = 1 << 31; while mask > 0 { if !is_intra { @@ -173,8 +173,12 @@ impl CinepakDecoder { return Ok(()); } } + continue; + } + if mask == 0 { + flags = br.read_u32be()?; + mask = 1 << 31; } - continue; } if (flags & mask) == 0 { let idx = br.read_byte()? as usize; @@ -395,14 +399,14 @@ mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; use nihav_codec_support::test::dec_video::*; - use crate::generic_register_all_codecs; + use crate::generic_register_all_decoders; use crate::generic_register_all_demuxers; #[test] fn test_cinepak() { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - generic_register_all_codecs(&mut dec_reg); + generic_register_all_decoders(&mut dec_reg); test_decoding("avi", "cinepak", "assets/Misc/ot171.avi", Some(10), &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0xd58326b0, 0xdbfc1dcc, 0x6d66a04c, 0x08a21bbb], @@ -422,19 +426,19 @@ mod test { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - generic_register_all_codecs(&mut dec_reg); + generic_register_all_decoders(&mut dec_reg); test_decoding("mov", "cinepak", "assets/Misc/dday.mov", Some(10), &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], - [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92], + [0x94f227d5, 0xbaa646ef, 0xab78f751, 0x8e1f50da], + [0x555de93a, 0x625e77f0, 0x95611bae, 0xbd715e9d], + [0xb31b9ba7, 0xba6327f8, 0x5698954f, 0xc16fad2a], + [0xda86ffb6, 0x58deb79d, 0x59f62c5b, 0x1bd2a2c5], + [0x2f46c7eb, 0x8950ac76, 0xbc68c470, 0x12e3247a], + [0x77d73950, 0xf76b28b0, 0x3552bb52, 0x38900a51], + [0xf4f45bef, 0x91146af2, 0xdcf4d44e, 0x713bf36e], + [0x8e06d350, 0x787f245e, 0x32426903, 0xf35f7dd3], + [0x0e35ebc1, 0xfdb6c520, 0x2bf484dc, 0xcec78b63], [0xb8411fa4, 0x3a35f646, 0x85e8e04a, 0xfff58785]])); } #[test] @@ -442,7 +446,7 @@ mod test { let mut dmx_reg = RegisteredDemuxers::new(); generic_register_all_demuxers(&mut dmx_reg); let mut dec_reg = RegisteredDecoders::new(); - generic_register_all_codecs(&mut dec_reg); + generic_register_all_decoders(&mut dec_reg); test_decoding("mov", "cinepak", "assets/Misc/catfight Tag team DT.mov", Some(10), &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0x3f7ec8ea, 0x873a2bc6, 0xcc58336e, 0xe88c4ffd],