X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp6.rs;h=4f014faf13cbad7f53498cb527ddb9a9ac6edff3;hb=7d57ae2f680d7a1eba7af2ee831f305b2f0f9324;hp=97986340a06ab5bc2e464da1280f6f73c7b71b84;hpb=93bbc2b0582d4199cef6642924dca7c95bfe135a;p=nihav.git diff --git a/nihav-duck/src/codecs/vp6.rs b/nihav-duck/src/codecs/vp6.rs index 9798634..4f014fa 100644 --- a/nihav-duck/src/codecs/vp6.rs +++ b/nihav-duck/src/codecs/vp6.rs @@ -1,6 +1,7 @@ use nihav_core::codecs::*; use nihav_core::io::bitreader::*; -use nihav_core::codecs::blockdsp::edge_emu; +use nihav_codec_support::codecs::{MV, ZIGZAG}; +use nihav_codec_support::codecs::blockdsp::edge_emu; use super::vpcommon::*; use super::vp56::*; @@ -36,7 +37,7 @@ impl VP56Parser for VP6BR { let mut hdr = VP56Header::default(); // horrible hack to match VP6 header parsing let src = bc.src; - let mut br = BitReader::new(src, src.len(), BitReaderMode::BE); + let mut br = BitReader::new(src, BitReaderMode::BE); hdr.is_intra = !br.read_bool()?; hdr.is_golden = hdr.is_intra; @@ -556,7 +557,7 @@ fn get_block(dst: &mut [u8], dstride: usize, src: NAVideoBufferRef, comp: us if (sx - 2 < 0) || (sx + 8 + 2 > (w as isize)) || (sy - 2 < 0) || (sy + 8 + 2 > (h as isize)) { edge_emu(&src, sx - 2, sy - 2, 8 + 2 + 2, 8 + 2 + 2, - dst, dstride, comp); + dst, dstride, comp, 0); } else { let sstride = src.get_stride(comp); let soff = src.get_offset(comp); @@ -714,6 +715,12 @@ impl NADecoder for VP6Decoder { } } +impl NAOptionHandler for VP6Decoder { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + pub fn get_decoder_vp6() -> Box { Box::new(VP6Decoder::new(false)) } @@ -726,9 +733,9 @@ pub fn get_decoder_vp6_alpha() -> Box { mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; - use nihav_core::test::dec_video::*; - use crate::codecs::duck_register_all_codecs; - use nihav_commonfmt::demuxers::generic_register_all_demuxers; + use nihav_codec_support::test::dec_video::*; + use crate::duck_register_all_codecs; + use nihav_commonfmt::generic_register_all_demuxers; #[test] fn test_vp6() { @@ -737,16 +744,26 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_codecs(&mut dec_reg); - //let file = "assets/Duck/predator2_vp60.avi"; - //let file = "assets/Duck/predator2_vp61.avi"; - //let file = "assets/Duck/vp6_crash.avi"; - let file = "assets/Duck/vp6_interlaced.avi"; - //let file = "assets/Duck/vp6_vid.avi"; - //let file = "assets/Duck/selection_720x576_300kBit_vp60i.avi"; - //let file = "assets/Duck/selection_720x576_300kBit_flipped_vp60i.avi"; - test_file_decoding("avi", file, Some(17), true, false, None/*Some("vp6")*/, &dmx_reg, &dec_reg); -//panic!("end"); + test_decoding("avi", "vp6", "assets/Duck/selection_720x576_300kBit_vp60i.avi", Some(16), + &dmx_reg, &dec_reg, + ExpectedTestResult::MD5([0x042c3e96, 0x8a9b26a2, 0x4dcbaf66, 0x1b788d03])); + } + #[test] + fn test_vp6_huff() { + let mut dmx_reg = RegisteredDemuxers::new(); + generic_register_all_demuxers(&mut dmx_reg); + let mut dec_reg = RegisteredDecoders::new(); + duck_register_all_codecs(&mut dec_reg); + + test_decoding("avi", "vp6", "assets/Duck/vp6_crash.avi", Some(4), + &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ + [0xdcd70fa0, 0x0d075ce2, 0xc9e65077, 0xb003a92e], + [0x334abf96, 0x3a004c7a, 0x5781cd5c, 0x25c3ae5c], + [0x6164b851, 0x528cd8de, 0xecab7328, 0x4b49708a], + [0x11b048ac, 0xedb3e471, 0xd04e9399, 0x64e623e3], + [0x182871b1, 0x2146893a, 0x2912210e, 0x6dd592e8]])); } + // todo find good sample for vp6a test } const VP6_AC_PROBS: [[[[u8; 11]; 6]; 2]; 3] = [