X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Fvp6.rs;h=916711cddbc00b5392b75c4f1c7f6b28ba257f7e;hb=HEAD;hp=15bd832452a40974383391912bc9514fef74c7d0;hpb=3952bfd9d2d5c2a64d50c2a89b02e93d9b97d541;p=nihav.git diff --git a/nihav-duck/src/codecs/vp6.rs b/nihav-duck/src/codecs/vp6.rs index 15bd832..916711c 100644 --- a/nihav-duck/src/codecs/vp6.rs +++ b/nihav-duck/src/codecs/vp6.rs @@ -54,7 +54,6 @@ impl VP56Parser for VP6BR { hdr.multistream = true; } let bytes = br.tell() >> 3; - std::mem::drop(br); bc.skip_bytes(bytes); self.loop_mode = 0; if hdr.is_intra { @@ -478,15 +477,17 @@ struct VP6Decoder { info: NACodecInfoRef, br: VP6BR, has_alpha: bool, + flipped: bool, } impl VP6Decoder { - fn new(has_alpha: bool) -> Self { + fn new(flipped: bool, has_alpha: bool) -> Self { Self { - dec: VP56Decoder::new(6, has_alpha, true), + dec: VP56Decoder::new(6, has_alpha, flipped), info: NACodecInfoRef::default(), br: VP6BR::new(), has_alpha, + flipped, } } } @@ -499,7 +500,15 @@ impl NADecoder for VP6Decoder { } else { VP_YUVA420_FORMAT }; - let myvinfo = NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, fmt); + let mut width = vinfo.get_width(); + let mut height = vinfo.get_height(); + if let (false, Some(edta)) = (self.flipped, info.get_extradata()) { + if (width & 0xF) == 0 && (height & 0xF) == 0 { + width -= usize::from(edta[0] >> 4); + height -= usize::from(edta[0] & 0xF); + } + } + let myvinfo = NAVideoInfo::new(width, height, self.flipped, fmt); let myinfo = NACodecTypeInfo::Video(myvinfo); self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref(); self.dec.init(supp, myvinfo)?; @@ -530,11 +539,15 @@ impl NAOptionHandler for VP6Decoder { } pub fn get_decoder_vp6() -> Box { - Box::new(VP6Decoder::new(false)) + Box::new(VP6Decoder::new(true, false)) +} + +pub fn get_decoder_vp6f() -> Box { + Box::new(VP6Decoder::new(false, false)) } pub fn get_decoder_vp6_alpha() -> Box { - Box::new(VP6Decoder::new(true)) + Box::new(VP6Decoder::new(false, true)) } #[cfg(test)] @@ -552,6 +565,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_decoders(&mut dec_reg); + // sample from a private collection test_decoding("avi", "vp6", "assets/Duck/selection_720x576_300kBit_vp60i.avi", Some(16), &dmx_reg, &dec_reg, ExpectedTestResult::MD5([0x042c3e96, 0x8a9b26a2, 0x4dcbaf66, 0x1b788d03])); @@ -563,6 +577,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_decoders(&mut dec_reg); + // sample: https://samples.mplayerhq.hu/V-codecs/VP6/vp6_crash.avi test_decoding("avi", "vp6", "assets/Duck/vp6_crash.avi", Some(4), &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0xdcd70fa0, 0x0d075ce2, 0xc9e65077, 0xb003a92e], @@ -578,6 +593,7 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_decoders(&mut dec_reg); + // sample created by remuxing some VP6A in FLV test_decoding("avi", "vp6a", "assets/Duck/vp6a.avi", Some(25), &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ [0xaf903d79, 0x17ddb3c7, 0xf0a381e8, 0x26b36a7d], @@ -605,6 +621,6 @@ mod test { [0xd3801a96, 0x1b5384ff, 0x422b228c, 0x9c4582c4], [0x8ddb0dfe, 0x302eb1ed, 0x10e64e22, 0x5a5a62b9], [0x79338328, 0x06113781, 0x8b116d18, 0xde56707e], - [0x671fa1b3, 0x0b3e41e9, 0xeb3a494c, 0xcdd24b1b]])); + [0xdb58433b, 0x1de4ce67, 0x15fcbcee, 0x1df9de61]])); } }