X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp3.rs;h=08bfd1a97f58de69693c930025f6d7ac0ca307e6;hb=HEAD;hp=7b3411ccffb162c3cd9c806f332b11cd91cfdbe2;hpb=fd8666bc8f48fd374571368cd4b9a0a42e3ea85b;p=nihav.git diff --git a/nihav-duck/src/codecs/vp3.rs b/nihav-duck/src/codecs/vp3.rs index 7b3411c..08bfd1a 100644 --- a/nihav-duck/src/codecs/vp3.rs +++ b/nihav-duck/src/codecs/vp3.rs @@ -1141,8 +1141,8 @@ impl VP34Decoder { if let Some(ref codes) = self.aux_codes { for _ in 0..self.y_blocks/4 { if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV { - let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.abs() as usize]]; - let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.abs() as usize]]; + let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.unsigned_abs() as usize]]; + let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.unsigned_abs() as usize]]; let x_sign = last_mv.x < 0; let y_sign = last_mv.y < 0; last2_mv = last_mv; @@ -1167,8 +1167,8 @@ impl VP34Decoder { cur_mv = ZERO_MV; }, VPMBType::InterMV => { - let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.abs() as usize]]; - let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.abs() as usize]]; + let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.unsigned_abs() as usize]]; + let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.unsigned_abs() as usize]]; let x_sign = last_mv.x < 0; let y_sign = last_mv.y < 0; let x = i16::from(br.read_cb(x_cb)?); @@ -1185,8 +1185,8 @@ impl VP34Decoder { std::mem::swap(&mut last_mv, &mut last2_mv); }, _ => { // GoldenMV - let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv_g.x.abs() as usize]]; - let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv_g.y.abs() as usize]]; + let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv_g.x.unsigned_abs() as usize]]; + let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv_g.y.unsigned_abs() as usize]]; let x_sign = last_mv_g.x < 0; let y_sign = last_mv_g.y < 0; let x = i16::from(br.read_cb(x_cb)?); @@ -1466,7 +1466,7 @@ impl VP34Decoder { let mut pred = 0i32; for i in 0..4 { if (pp & (1 << i)) != 0 { - pred += (preds[i] as i32) * i32::from(VP31_DC_WEIGHTS[pp][i]); + pred += preds[i] * i32::from(VP31_DC_WEIGHTS[pp][i]); } } pred /= i32::from(VP31_DC_WEIGHTS[pp][4]); @@ -1501,7 +1501,7 @@ impl VP34Decoder { let mut npred = 0; for i in 0..4 { if (pp & (1 << i)) != 0 { - pred += preds[i] as i32; + pred += preds[i]; npred += 1; if npred == 2 { return (pred / 2) as i16; @@ -1910,6 +1910,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/V-codecs/VP3/vp30-logo.avi test_decoding("avi", "vp3", "assets/Duck/vp30-logo.avi", Some(23), &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0x51aba7df, 0x6e42534d, 0xef6c5b13, 0x26c38d1f])); } @@ -1926,6 +1927,7 @@ mod test { // let file = "assets/Duck/01-vp31-0500.avi"; // test_file_decoding("avi", file, Some(3), true, false, None/*Some("vp31")*/, &dmx_reg, &dec_reg); //panic!("end"); + // sample: https://samples.mplayerhq.hu/V-codecs/VP3/01-vp31-0500.avi test_decoding("avi", "vp3", "assets/Duck/01-vp31-0500.avi", Some(16), &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0x65112f7e, 0x2914f29b, 0x2908ed2f, 0xce5fc8c5])); } @@ -1937,6 +1939,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/V-codecs/VP4/ot171_vp40.avi test_decoding("avi", "vp3", "assets/Duck/ot171_vp40.avi", Some(86), &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0xd41d8cd9, 0x8f00b204, 0xe9800998, 0xecf8427e])); }