X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-indeo%2Fsrc%2Fcodecs%2Findeo4.rs;h=15cae6d2ad2eb80bfd33849979b627eb592d80f5;hb=64e8b9711a54641d4155d01f095053233c79a9bf;hp=58c246ecd5f768697eadcd4398b6c19fb2dfda5c;hpb=5641dccfbf2a70d589cf094a0d4ed5a10f919f00;p=nihav.git diff --git a/nihav-indeo/src/codecs/indeo4.rs b/nihav-indeo/src/codecs/indeo4.rs index 58c246e..15cae6d 100644 --- a/nihav-indeo/src/codecs/indeo4.rs +++ b/nihav-indeo/src/codecs/indeo4.rs @@ -1,5 +1,3 @@ -use std::rc::Rc; -use std::cell::{Ref, RefCell}; use nihav_core::io::bitreader::*; use nihav_core::formats; use nihav_core::frame::*; @@ -372,10 +370,10 @@ impl IndeoXParser for Indeo4Parser { let hh = (h / 2) as isize; let mut band0 = src.as_ptr(); let mut band1 = band0.offset(hw); - let mut band2 = band0.offset(((h / 2) * sstride) as isize); + let mut band2 = band0.add((h / 2) * sstride); let mut band3 = band2.offset(hw); let mut dst0 = dst.as_mut_ptr(); - let mut dst1 = dst0.offset(dstride as isize); + let mut dst1 = dst0.add(dstride); for _ in 0..hh { let mut b0_ptr = band0; let mut b1_ptr = band1; @@ -384,10 +382,10 @@ impl IndeoXParser for Indeo4Parser { let mut d0_ptr = dst0; let mut d1_ptr = dst1; for _ in 0..hw { - let p0 = *b0_ptr as i32; - let p1 = *b1_ptr as i32; - let p2 = *b2_ptr as i32; - let p3 = *b3_ptr as i32; + let p0 = i32::from(*b0_ptr); + let p1 = i32::from(*b1_ptr); + let p2 = i32::from(*b2_ptr); + let p3 = i32::from(*b3_ptr); let s0 = p0.wrapping_add(p2); let s1 = p1.wrapping_add(p3); let d0 = p0.wrapping_sub(p2); @@ -407,19 +405,19 @@ impl IndeoXParser for Indeo4Parser { d0_ptr = d0_ptr.offset(2); d1_ptr = d1_ptr.offset(2); } - band0 = band0.offset(sstride as isize); - band1 = band1.offset(sstride as isize); - band2 = band2.offset(sstride as isize); - band3 = band3.offset(sstride as isize); - dst0 = dst0.offset((dstride * 2) as isize); - dst1 = dst1.offset((dstride * 2) as isize); + band0 = band0.add(sstride); + band1 = band1.add(sstride); + band2 = band2.add(sstride); + band3 = band3.add(sstride); + dst0 = dst0.add(dstride * 2); + dst1 = dst1.add(dstride * 2); } } } } struct Indeo4Decoder { - info: Rc, + info: NACodecInfoRef, dec: IVIDecoder, } @@ -433,20 +431,20 @@ impl Indeo4Decoder { } impl NADecoder for Indeo4Decoder { - 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 w = vinfo.get_width(); let h = vinfo.get_height(); let f = vinfo.is_flipped(); let fmt = formats::YUV410_FORMAT; let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt)); - 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(); let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE); @@ -455,7 +453,7 @@ impl NADecoder for Indeo4Decoder { let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); frm.set_keyframe(self.dec.is_intra()); frm.set_frame_type(self.dec.get_frame_type()); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) } } @@ -508,7 +506,7 @@ const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 1 const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]; const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [ - &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG + &ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &ZIGZAG ]; const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [ &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4 @@ -760,16 +758,25 @@ const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [ &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4] ]; -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(Indeo4Decoder::new()) } #[cfg(test)] mod test { - use crate::test::dec_video::test_file_decoding; + use nihav_core::codecs::RegisteredDecoders; + use nihav_core::demuxers::RegisteredDemuxers; + use nihav_core::test::dec_video::*; + use crate::codecs::indeo_register_all_codecs; + use nihav_commonfmt::demuxers::generic_register_all_demuxers; #[test] fn test_indeo4() { - test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/); + let mut dmx_reg = RegisteredDemuxers::new(); + generic_register_all_demuxers(&mut dmx_reg); + let mut dec_reg = RegisteredDecoders::new(); + indeo_register_all_codecs(&mut dec_reg); + + test_file_decoding("avi", "assets/Indeo/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/, &dmx_reg, &dec_reg); //panic!("the end"); } }