X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-rad%2Fsrc%2Fcodecs%2Fsmacker.rs;h=7ecd4436b074063c67acd37cc0a98bc7ed6aff90;hb=962b9cb37ad2ff46692eee62087c53805a3c675b;hp=0d681dc19809b1c792b69e26386f435bd37cf692;hpb=78fb6560c73965d834b215fb0b49505ae5443288;p=nihav.git diff --git a/nihav-rad/src/codecs/smacker.rs b/nihav-rad/src/codecs/smacker.rs index 0d681dc..7ecd443 100644 --- a/nihav-rad/src/codecs/smacker.rs +++ b/nihav-rad/src/codecs/smacker.rs @@ -94,6 +94,7 @@ const SMK_LAST_UNINIT: usize = 0xFFFFFFFF; impl SmackerTree16Builder { fn get_tree16(&mut self, br: &mut BitReader, tree: &mut SmackerTree16, depth: usize) -> DecoderResult { validate!(tree.tree.len() < self.nsyms); + validate!(depth <= 32); if !br.read_bool()? { let lo = br.read_tree8(&self.tree_lo)?; let hi = br.read_tree8(&self.tree_hi)?; @@ -138,7 +139,7 @@ impl SmackerTree16 { let mut esc: [u32; 3] = [0; 3]; for i in 0..esc.len() { - esc[i] = br.read(16)? as u32; + esc[i] = br.read(16)?; } let nsyms = (((size + 3) >> 2) + 4) as usize; @@ -573,7 +574,7 @@ impl NADecoder for SmackerAudioDecoder { let mut pred: [u8; 2] = [ pred1, pred0 ]; for ch in 0..2 { dst[ch] = pred[ch]; } for i in 2..unp_size { - let diff = br.read_tree8(&trees[i & 1])? as u8; + let diff = br.read_tree8(&trees[i & 1])?; pred[i & 1] = pred[i & 1].wrapping_add(diff); dst[i] = pred[i & 1]; } @@ -583,7 +584,7 @@ impl NADecoder for SmackerAudioDecoder { let mut pred = br.read(8)? as u8; dst[0] = pred; for i in 1..unp_size { - let diff = br.read_tree8(&tree)? as u8; + let diff = br.read_tree8(&tree)?; pred = pred.wrapping_add(diff); dst[i] = pred; } @@ -625,6 +626,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); rad_register_all_decoders(&mut dec_reg); + // sample from Heroes of Might and Magic 2 test_decoding("smacker", "smacker-video", "assets/RAD/credits.smk", None, &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0x0983944a, 0xa23503f8, 0x2602b589, 0x13b53480], @@ -645,6 +647,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); rad_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/game-formats/smacker/wetlands/wetlogo.smk test_decoding("smacker", "smacker-audio", "assets/RAD/wetlogo.smk", None, &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0xc686b833, 0x0a203038, 0x012f6d9b, 0xa4186d44])); } @@ -655,6 +658,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); rad_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/game-formats/smacker/20130507_audio-distortion.smk test_decoding("smacker", "smacker-audio", "assets/RAD/20130507_audio-distortion.smk", None, &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0x942a0922, 0x182bb5fd, 0x94ab7a59, 0x2028d810])); }