X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Ftruemotion2x.rs;h=7f4ac524062903d4129f13ea9405faeaeb66437c;hp=ae2efec3360ca4f24bd0f881d1c704376c17a023;hb=78fb6560c73965d834b215fb0b49505ae5443288;hpb=01613464323864a655c994820d3c43df1954e3b2 diff --git a/nihav-duck/src/codecs/truemotion2x.rs b/nihav-duck/src/codecs/truemotion2x.rs index ae2efec..7f4ac52 100644 --- a/nihav-duck/src/codecs/truemotion2x.rs +++ b/nihav-duck/src/codecs/truemotion2x.rs @@ -69,25 +69,25 @@ impl Deltas { fn get_int(&mut self, br: &mut ByteReader) -> DecoderResult { let b = self.get_val(br)?; if b != self.vq_esc - 1 { - return Ok(Self::remap(b as u16)); + return Ok(Self::remap(u16::from(b))); } let mut run = 0; let mut val; - let mut pow = self.vq_esc as u16; + let mut pow = u16::from(self.vq_esc); loop { let b = self.get_val(br)?; run += 1; if b != self.vq_esc - 1 { - val = (b as u16) * pow; + val = u16::from(b) * pow; break; } - pow *= self.vq_esc as u16; + pow *= u16::from(self.vq_esc); } for _ in 0..run { - pow /= self.vq_esc as u16; - let b = self.get_val(br)? as u16; - val += pow * (b as u16); + pow /= u16::from(self.vq_esc); + let b = u16::from(self.get_val(br)?); + val += pow * b; } Ok(Self::remap(val)) } @@ -227,7 +227,7 @@ impl TM2XDecoder { br.read_skip(len)?; let _smth = br.read_u32be()?; } - + Ok(()) } fn parse_tabs(&mut self) -> DecoderResult<()> { @@ -275,6 +275,9 @@ impl TM2XDecoder { Ok(()) } + #[allow(clippy::int_plus_one)] + #[allow(clippy::manual_memcpy)] + #[allow(clippy::cyclomatic_complexity)] fn decode_frame(&mut self, src: &[u8]) -> DecoderResult<()> { let mut mr = MemoryReader::new_read(src); let mut br = ByteReader::new(&mut mr); @@ -678,9 +681,7 @@ impl NADecoder for TM2XDecoder { self.decode_frame(&src[12..][..data_size])?; let myinfo = self.info.get_properties().get_video_info().unwrap(); - let bufret = alloc_video_buffer(myinfo, 2); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let bufinfo = bufret.unwrap(); + let bufinfo = alloc_video_buffer(myinfo, 2)?; let mut buf = bufinfo.get_vbuf().unwrap(); self.output_frame(&mut buf); @@ -690,9 +691,17 @@ impl NADecoder for TM2XDecoder { frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P }); Ok(frm.into_ref()) } + fn flush(&mut self) { + } +} + +impl NAOptionHandler for TM2XDecoder { + 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() -> Box { +pub fn get_decoder() -> Box { Box::new(TM2XDecoder::new()) } @@ -700,17 +709,25 @@ pub fn get_decoder() -> 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_decoders; + use nihav_commonfmt::generic_register_all_demuxers; #[test] fn test_tm2x() { 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); + duck_register_all_decoders(&mut dec_reg); - test_file_decoding("avi", "assets/Duck/TM2x.avi", Some(16), true, false, None/*Some("tm2x")*/, &dmx_reg, &dec_reg); + test_decoding("avi", "truemotion2x", "assets/Duck/TM2x.avi", None, + &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![ + [0x2854e7f3, 0x41e54fd3, 0xd9a16302, 0x580321b2], + [0x8e736f59, 0x57c58dc0, 0xe15bad3a, 0xf96e2c5b], + [0x12700e7c, 0xfa2d06e0, 0x05b758ba, 0xe79aabb6], + [0x29f935f2, 0x2ad0d6d1, 0x2fde19a2, 0x5aa3823b], + [0x7f1a787d, 0x77f3ab61, 0x0e584c66, 0x9d1842ea], + [0xb5607334, 0xdb149056, 0xe0e3ddb5, 0x19f8e254], + [0xb054e4d0, 0x1d241d4f, 0x75fdfe95, 0x9dde8024]])); } }