aac: clear M/S flags
[nihav.git] / nihav-game / src / codecs / vx.rs
index 08c26700dea501606941b7035748776ca175208f..057f61769afe7b72e832ca697d67fde337375205 100644 (file)
@@ -304,7 +304,7 @@ fn pred_hor_down(blk: &mut [u8], pos: usize) {
     let pix = avg(l0, l1);
     blk[pos + 0 + 1 * 256] = pix;
     blk[pos + 2 + 2 * 256] = pix;
-    let pix = interp2(tl, t0, l1);
+    let pix = interp2(tl, l0, l1);
     blk[pos + 1 + 1 * 256] = pix;
     blk[pos + 3 + 2 * 256] = pix;
     let pix = avg(tl, l0);
@@ -402,8 +402,12 @@ fn pred_plane(blk: &mut [u8], pos: usize, w: usize, h: usize) {
     let dm = avg_nr(dl, dr);
     blk[pos + w2off + hoff]  = dm;
     blk[pos + woff  + h2off] = avg_nr(tr, dr);
-    let val2 = if is_even_block { blk[pos + w2off - 256] } else { blk[pos - 1 + h2off] };
-    blk[pos + w2off + h2off] = avg_nr(dm, val2);
+    let (val1, val2) = if is_even_block {
+            (dm, blk[pos + w2off - 256])
+        } else {
+            (blk[pos + woff + h2off], blk[pos - 1 + h2off])
+        };
+    blk[pos + w2off + h2off] = avg_nr(val1, val2);
 
     let hw = w / 2;
     let hh = h / 2;
@@ -415,9 +419,7 @@ fn pred_plane(blk: &mut [u8], pos: usize, w: usize, h: usize) {
 fn pred_plane_delta(blk: &mut [u8], pos: usize, w: usize, h: usize, delta: i32) {
     let tr = blk[pos + w - 1 - 256];
     let dl = blk[pos + 256 * (h - 1) - 1];
-    //XXX: this is a hack since it should not wrap around normally but this conceals some artefacts so let it be until the reconstruction is properly fixed
-    let pred = (((i32::from(tr) + i32::from(dl) + 1) >> 1) + delta).max(0).min(255) as u8;
-    //let pred = avg(tr, dl).wrapping_add(delta as u8);
+    let pred = avg(tr, dl).wrapping_add(delta as u8);
     blk[pos + 256 * (h - 1) + w - 1] = pred;
     pred_plane(blk, pos, w, h);
 }
@@ -650,7 +652,7 @@ impl VXVideoDecoder {
         let mx = self.cur_mv.x as isize;
         let my = self.cur_mv.y as isize;
         mc!(self.buf, src, dst, mx, my, xpos, ypos, w, h, 0, 0, 0, self.width, self.height);
-        
+
         Ok(())
     }
     fn do_mc_bias(&mut self, br: &mut BitReader, xpos: usize, ypos: usize, w: usize, h: usize) -> DecoderResult<()> {
@@ -662,7 +664,7 @@ impl VXVideoDecoder {
         let udelta                      = br.read_gammap_s()? * 2;
         let vdelta                      = br.read_gammap_s()? * 2;
         mc!(self.buf, src, dst, mx, my, xpos, ypos, w, h, ydelta, udelta, vdelta, self.width, self.height);
-        
+
         Ok(())
     }
     fn pred_plane(&mut self, br: &mut BitReader, xpos: usize, ypos: usize, w: usize, h: usize) -> DecoderResult<()> {
@@ -1117,8 +1119,7 @@ impl AudioState {
 }
 
 fn apply_lpc(dst: &mut [i32], src: &[i32], hist: &mut [i32], filt: &[i32; 8]) {
-    let mut hidx = 0;
-    for (out, src) in dst.iter_mut().zip(src.iter()) {
+    for (hidx, (out, src)) in dst.iter_mut().zip(src.iter()).enumerate() {
         let mut sum = *src << 14;
         for i in 0..8 {
             sum += hist[(hidx + i) & 7] * filt[i];
@@ -1126,7 +1127,6 @@ fn apply_lpc(dst: &mut [i32], src: &[i32], hist: &mut [i32], filt: &[i32; 8]) {
         let samp = sum >> 14;
         *out = samp;
         hist[hidx & 7] = samp;
-        hidx += 1;
     }
 }
 
@@ -1197,10 +1197,10 @@ impl VXAudioDecoder {
             f0[i] = (pfilt[i] + f1   [i]) >> 1;
             f2[i] = (f1   [i] + cfilt[i]) >> 1;
         }
-        apply_lpc(&mut cur_buf[ 0..][..32], &prev_buf[128..],      &mut self.lpc_hist,   &f0);
+        apply_lpc(&mut cur_buf[ 0..][..32], &prev_buf[128..],      &mut self.lpc_hist, &f0);
         apply_lpc(&mut cur_buf[32..][..32], &prev_buf[128 + 32..], &mut self.lpc_hist, &f1);
         apply_lpc(&mut cur_buf[64..][..32], &prev_buf[128 + 64..], &mut self.lpc_hist, &f2);
-        apply_lpc(&mut cur_buf[96..][..32], &prev_buf[128 + 96..], &mut self.lpc_hist, &cfilt);
+        apply_lpc(&mut cur_buf[96..][..32], &prev_buf[128 + 96..], &mut self.lpc_hist, cfilt);
         Ok(())
     }
     fn decode_intra(&mut self, br: &mut ByteReader, val: u16) -> DecoderResult<()> {
@@ -1331,41 +1331,41 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        //XXX: the current version does not reconstruct videos perfectly yet
+        // sample from some game
         test_decoding("vx", "vxvideo", "assets/Game/bioware.vx", Some(31), &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5Frames(vec![
                                 [0x33de14fa, 0x00948eb7, 0x028141d7, 0x1d07abd6],
-                                [0x07442eef, 0x36ec00c1, 0x3d9556c6, 0x6ddbcd46],
-                                [0xb5b48d03, 0x0063faaf, 0xfa64de6f, 0xbe5d916b],
-                                [0xb760b777, 0xe7159f5e, 0x352b7326, 0xd21e3d14],
-                                [0xee1ccadc, 0xd2b54891, 0xb5f6f31a, 0x73d7e869],
-                                [0xcd234bd9, 0xad3d8f3e, 0xdb405b8c, 0x4faa738b],
-                                [0x615957be, 0x8a20b367, 0xadc031af, 0x886311cc],
-                                [0xade60b19, 0x2560fffa, 0x8bafff67, 0x698485ad],
-                                [0x131b874c, 0x4bb41da5, 0xc0f52bf2, 0x626d6e66],
-                                [0x1dc1bb4b, 0xc3552467, 0xa5598162, 0xe6220dde],
-                                [0xa1e27935, 0xd01c18c4, 0x6e6e1be7, 0xc42b021c],
-                                [0x28876ccb, 0xfaca435f, 0xe8cf81d7, 0x8f103d89],
-                                [0xab610d4d, 0x0bf5b213, 0x28749eda, 0xcbf5c34c],
-                                [0x48a452f8, 0x544b8a4d, 0x0a031be4, 0xe60b6f59],
-                                [0xe6f88898, 0x46171e3b, 0xf39e2605, 0x3d16e75a],
-                                [0xe1461669, 0x3dd4daa6, 0x1e82b9e7, 0x49214174],
-                                [0x39d89d57, 0x5c0bf9ba, 0xf254cdc4, 0x8c1b9bb9],
-                                [0x81f1a684, 0xd2a0bc8a, 0xe1355afa, 0xbe33e476],
-                                [0x571b0722, 0x25643452, 0x509ed72d, 0x1d55214e],
-                                [0xc799fa72, 0xed2bc13d, 0xa9be1b55, 0xece4d7f0],
-                                [0x0eae7358, 0x87d80481, 0xcac84bf9, 0x76bee392],
-                                [0xf0e6fb26, 0x95a9a362, 0x474edaa2, 0xd8d0b5fc],
-                                [0xee57bff2, 0x490b9ffc, 0x6189e2d4, 0xb1b97277],
-                                [0xa5f83723, 0xaa807527, 0x5c722b29, 0x3ea10cfc],
-                                [0x83562752, 0x27021714, 0x5b81f808, 0x192fa17c],
-                                [0x50f5ab82, 0x01a482b2, 0xa44b7525, 0xac4d1916],
-                                [0x8cf1fffd, 0xf09364c5, 0x57847078, 0x1a811a61],
-                                [0x3d8e4221, 0xe69532b1, 0x7bd4fa20, 0x78dc0676],
-                                [0x7b6432a5, 0x01ee9819, 0xfd0fd634, 0x96fd612b],
-                                [0xb0e0d469, 0xc651dd3a, 0xf2fa8e9b, 0xc58d55be],
-                                [0xa9d7fa17, 0xaf2d05f8, 0xd307d0c1, 0xd83dc57a],
-                                [0x14e644a7, 0xd8d9e459, 0x0d81e68c, 0xe57b9b81]]));
+                                [0x77a96135, 0x0cc2d0b5, 0x45862c7c, 0xe27f5b10],
+                                [0x3c3ed089, 0x3c643216, 0xe6aed381, 0x4d43c50f],
+                                [0x09e86330, 0x37d3a766, 0xa8198ac5, 0x21fa089c],
+                                [0xbcab34d7, 0xdffe234a, 0x6534709f, 0xc3050e32],
+                                [0x2bab595d, 0x7a19937e, 0xccc97277, 0x91b32191],
+                                [0xe082f77e, 0x6498fd0d, 0xa3828c0f, 0xb4f7a02a],
+                                [0x8515f6e2, 0xc0cb8ab3, 0xf91a3483, 0xd54470fc],
+                                [0x17b1b54a, 0x1b574323, 0xcdeec1ec, 0x7a00ae4e],
+                                [0x773f1d47, 0x86188681, 0xb111bcb8, 0x80fe34e9],
+                                [0xbc4a8e20, 0xca91d4b6, 0x7275a162, 0x9a73be7c],
+                                [0x0d4992b5, 0xd12a985a, 0x929ebec2, 0x0653fbc7],
+                                [0xc24691b7, 0xabd27a7a, 0xd62cbd73, 0xd72a49ea],
+                                [0x9024f7f4, 0xbe707e73, 0x27b4b4a0, 0x33bb515e],
+                                [0x31aee8fc, 0xd0a3fa6d, 0xea11ef6a, 0x53a5f031],
+                                [0x4a83f326, 0xceff4329, 0x54fbe91e, 0xf98ee74b],
+                                [0xe54b5450, 0x979f4b26, 0x910ee666, 0x05fd1996],
+                                [0xe48d66d0, 0x0a69b963, 0x9917084e, 0xf4b0486d],
+                                [0x624a8b32, 0x0d1ce036, 0x9de8ebf0, 0x472a77b9],
+                                [0x5d307d48, 0x1168f3a9, 0xaa792fb2, 0x34430b20],
+                                [0xf2d80474, 0xac6b0972, 0x500e569e, 0x3c8e7dde],
+                                [0x481310b3, 0x70cdeb91, 0xed007972, 0x70cefff3],
+                                [0x8b5b17ca, 0xca6f9a72, 0x0256908a, 0x4505cf85],
+                                [0xb6222c1d, 0x7a9760cb, 0xb3276304, 0x2ff1595e],
+                                [0xf98e3d89, 0xae957c83, 0xff849c05, 0x8ca54276],
+                                [0xbcebda1c, 0x6f6e4ac6, 0x023e7f0f, 0x9578142f],
+                                [0x399f5155, 0xd95b33e3, 0xf0b55af8, 0xe32db6b2],
+                                [0x0c4d4347, 0x5f5061e4, 0xe2fa4690, 0xa340d294],
+                                [0x6fcdddb5, 0xf101da80, 0x6f55ddd9, 0x0dfeead1],
+                                [0xb9623043, 0x1dab8a93, 0x22fd5f7a, 0x2c2a6633],
+                                [0xb3ac2652, 0xf474e49d, 0x7db51405, 0xcd1c13cc],
+                                [0x6a901339, 0xda88b2be, 0x6d943e18, 0xda9b5926]]));
     }
 }