cinepak: fix handling of intra slices in inter frames
[nihav.git] / nihav-commonfmt / src / codecs / cinepak.rs
index 23903dd0417b7742899d2fbca298d1b023c73113..d7a80dcade4e3b82ebcd8eaa4ec8ae57b355f45c 100644 (file)
@@ -111,6 +111,7 @@ impl CinepakDecoder {
         let mut idx_pos = 0;
         let mut idx_size = 0;
         let mut v1_only = false;
+        let mut intra_mode = true;
         while br.left() > 0 {
             let id                      = br.read_byte()?;
             if (id & 0xF0) == 0x20 && is_intra_strip {
@@ -136,6 +137,7 @@ impl CinepakDecoder {
                 0x31 => { // inter indices
                     validate!(!is_intra);
                     validate!(idx_pos == 0);
+                    intra_mode = false;
                     idx_pos = br.tell() as usize;
                     idx_size = size - 4;
                                           br.read_skip(idx_size)?;
@@ -161,7 +163,7 @@ impl CinepakDecoder {
             let mut flags = if !v1_only { br.read_u32be()? } else { 0x00000000 };
             let mut mask = 1 << 31;
             while mask > 0 {
-                if !is_intra {
+                if !intra_mode {
                     let skip = (flags & mask) == 0;
                     mask >>= 1;
                     if skip {
@@ -413,6 +415,7 @@ mod test {
         generic_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
         generic_register_all_decoders(&mut dec_reg);
+        // sample: https://samples.mplayerhq.hu/V-codecs/CVID/ot171.avi
         test_decoding("avi", "cinepak", "assets/Misc/ot171.avi", Some(10), &dmx_reg,
                      &dec_reg, ExpectedTestResult::MD5Frames(vec![
                         [0xd58326b0, 0xdbfc1dcc, 0x6d66a04c, 0x08a21bbb],
@@ -433,6 +436,7 @@ mod test {
         generic_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
         generic_register_all_decoders(&mut dec_reg);
+        // sample: https://samples.mplayerhq.hu/V-codecs/CVID/grayscale/dday.mov
         test_decoding("mov", "cinepak", "assets/Misc/dday.mov", Some(10), &dmx_reg,
                      &dec_reg, ExpectedTestResult::MD5Frames(vec![
                         [0x2ab229bc, 0xb71308aa, 0x979511c6, 0xcef3ea92],
@@ -453,6 +457,7 @@ mod test {
         generic_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
         generic_register_all_decoders(&mut dec_reg);
+        // sample: https://samples.mplayerhq.hu/V-codecs/CVID/palette/catfight%20Tag%20team%20DT.mov
         test_decoding("mov", "cinepak", "assets/Misc/catfight Tag team DT.mov", Some(10), &dmx_reg,
                      &dec_reg, ExpectedTestResult::MD5Frames(vec![
                         [0x3f7ec8ea, 0x873a2bc6, 0xcc58336e, 0xe88c4ffd],