X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-duck%2Fsrc%2Fcodecs%2Ftruemotion2x.rs;h=165642a080f3a0fb91d9ce8bd4874e66c63f50a4;hb=e64739f87a35f29be0bbbce366876180ba3eb57e;hp=6eb35594cd184cd2e5f81f0ab060a6d43c4e995d;hpb=1a967e6bad5f17943b4de0607078eb940ad5adfe;p=nihav.git diff --git a/nihav-duck/src/codecs/truemotion2x.rs b/nihav-duck/src/codecs/truemotion2x.rs index 6eb3559..165642a 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)) } @@ -161,7 +161,7 @@ impl Frame { #[derive(Default)] struct TM2XDecoder { - info: Rc, + info: NACodecInfoRef, width: usize, height: usize, dec_buf: Vec, @@ -227,7 +227,7 @@ impl TM2XDecoder { br.read_skip(len)?; let _smth = br.read_u32be()?; } - + Ok(()) } fn parse_tabs(&mut self) -> DecoderResult<()> { @@ -556,7 +556,7 @@ impl TM2XDecoder { } impl NADecoder for TM2XDecoder { - fn init(&mut self, info: Rc) -> DecoderResult<()> { + fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { let fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ), Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)), @@ -568,13 +568,13 @@ impl NADecoder for TM2XDecoder { self.height = vinfo.get_height(); self.cur_frame.resize(self.width, self.height); self.ref_frame.resize(self.width, self.height); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); + self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref(); Ok(()) } else { Err(DecoderError::InvalidData) } } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult { + fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let src = pkt.get_buffer(); validate!(src.len() > 8); let mut mr = MemoryReader::new_read(&src); @@ -678,9 +678,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); @@ -688,11 +686,13 @@ impl NADecoder for TM2XDecoder { let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); frm.set_keyframe(self.is_intra); frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) + } + fn flush(&mut self) { } } -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(TM2XDecoder::new()) } @@ -701,8 +701,8 @@ 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 crate::duck_register_all_codecs; + use nihav_commonfmt::generic_register_all_demuxers; #[test] fn test_tm2x() { let mut dmx_reg = RegisteredDemuxers::new(); @@ -710,7 +710,15 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); duck_register_all_codecs(&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]])); } }