X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-rad%2Fsrc%2Fcodecs%2Fbink2.rs;h=e56bff7fc192bc6137e82eab93074c98221b37ea;hb=f9be4e750dccff762b9a3d894faec50ffdb59233;hp=e331d4f17481ddce3772bb34cebadf6f929b041f;hpb=9e9e49d110c5fb5ec71be9b25a4a00d88af70c84;p=nihav.git diff --git a/nihav-rad/src/codecs/bink2.rs b/nihav-rad/src/codecs/bink2.rs index e331d4f..e56bff7 100644 --- a/nihav-rad/src/codecs/bink2.rs +++ b/nihav-rad/src/codecs/bink2.rs @@ -53,7 +53,7 @@ macro_rules! idct { }; (float; $src: expr, $sstep: expr, $off: expr, $dst: expr, $dstep: expr, $doff: expr, $bias: expr, $shift: expr) => { let t00 = $src[$off + $sstep * 2] + $src[$off + $sstep * 6]; - let t01 = ($src[$off + $sstep * 2] - $src[$off + $sstep * 6]) * 1.4142135 - t00; + let t01 = ($src[$off + $sstep * 2] - $src[$off + $sstep * 6]) * std::f32::consts::SQRT_2 - t00; let t02 = $src[$off + $sstep * 0] + $src[$off + $sstep * 4]; let t03 = $src[$off + $sstep * 0] - $src[$off + $sstep * 4]; let t04 = $src[$off + $sstep * 3] + $src[$off + $sstep * 5]; @@ -65,7 +65,7 @@ macro_rules! idct { let t10 = t03 + t01; let t11 = t03 - t01; let t12 = t06 + t04; - let t13 = (t06 - t04) * 1.4142135; + let t13 = (t06 - t04) * std::f32::consts::SQRT_2; let t14 = (t07 - t05) * 1.847759; let t15 = t05 * 2.613126 + t14 - t12; let t16 = t13 - t15; @@ -82,6 +82,7 @@ macro_rules! idct { }; } +#[allow(clippy::erasing_op)] fn bink2_idct(coeffs: &mut [i32; 64]) { let mut tmp: [i32; 64] = [0; 64]; for i in 0..8 { @@ -92,6 +93,7 @@ fn bink2_idct(coeffs: &mut [i32; 64]) { } } +#[allow(clippy::erasing_op)] fn bink2_idct_old(coeffs: &mut [f32; 64]) { let mut tmp: [f32; 64] = [0.0; 64]; coeffs[0] += 512.5; @@ -148,6 +150,7 @@ macro_rules! avg_tree { ($a: expr, $b: expr, $c: expr, $d: expr) => (avg_tree!(avg_tree!($a, $b), avg_tree!($c, $d))); } +#[allow(clippy::erasing_op)] impl Bink2DSP { fn calc_dc(src: &[u8], stride: usize) -> i32 { let mut sums = [0u16; 8]; @@ -996,7 +999,7 @@ impl Default for Bink2Codes { #[derive(Default)] struct Bink2Decoder { - info: Rc, + info: NACodecInfoRef, ips: IPShuffler, version: u32, @@ -1017,6 +1020,7 @@ struct Bink2Decoder { codes: Bink2Codes, } +#[allow(clippy::erasing_op)] impl Bink2Decoder { fn new() -> Self { Self::default() @@ -1027,7 +1031,7 @@ impl Bink2Decoder { let (mut off_y, mut off_u, mut off_v, mut off_a) = (buf.get_offset(0), buf.get_offset(1), buf.get_offset(2), buf.get_offset(3)); let (ooff_y, ooff_u, ooff_v, ooff_a) = (off_y, off_u, off_v, off_a); let (width, height) = buf.get_dimensions(0); - let mut data = buf.get_data_mut(); + let data = buf.get_data_mut().unwrap(); let dst = data.as_mut_slice(); let bw = (width + 31) >> 5; let bheight = (height + 31) >> 5; @@ -1492,7 +1496,7 @@ fn decode_luma_inter(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: u let dcs = &dcinfo.dcs; for i in 0..4 { decode_acs_4blocks(br, codes, &mut dst[i], BINK2_QUANT_INTER, q, cbp >> (i * 4))?; - for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j]; } + for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j] * 8; } } Ok(cbp) } @@ -1504,7 +1508,7 @@ fn decode_chroma_inter(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: dcinfo.predict_inter(min_dc, max_dc); let dcs = &dcinfo.dcs; decode_acs_4blocks(br, codes, dst, BINK2_QUANT_INTER, q, cbp)?; - for i in 0..4 { dst[i][0] = dcs[i]; } + for i in 0..4 { dst[i][0] = dcs[i] * 8; } Ok(cbp) } @@ -1709,11 +1713,11 @@ fn decode_cbp_luma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult if !br.read_bool()? { nib1 = br.read(4)?; } - new_cbp = new_cbp | (nib1 << 4); + new_cbp |= nib1 << 4; if !br.read_bool()? { nib1 = br.read(4)?; } - new_cbp = new_cbp | (nib1 << 8); + new_cbp |= nib1 << 8; if !br.read_bool()? { nib1 = br.read(4)?; } @@ -1858,7 +1862,7 @@ fn decode_acs_4blocks_old(br: &mut BitReader, codes: &Bink2Codes, dst: &mut [[f3 const KB2H_NUM_SLICES: [usize; 4] = [ 2, 3, 4, 8 ]; impl NADecoder for Bink2Decoder { - 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(); @@ -1907,14 +1911,14 @@ impl NADecoder for Bink2Decoder { if self.has_alpha { FORMATON_FLAG_ALPHA } else { 0 }, if self.has_alpha { 4 } else { 3 }); let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, 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, src.len(), BitReaderMode::LE); @@ -1922,9 +1926,7 @@ impl NADecoder for Bink2Decoder { let mut buf; self.key_frame = pkt.is_keyframe(); - let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 5); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let bufinfo = bufret.unwrap(); + let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 5)?; buf = bufinfo.get_vbuf().unwrap(); self.decode_frame_new(&mut br, &mut buf, pkt.is_keyframe())?; @@ -1933,11 +1935,14 @@ impl NADecoder for Bink2Decoder { let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); frm.set_frame_type(if self.key_frame { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) + } + fn flush(&mut self) { + self.ips.clear(); } } -pub fn get_decoder() -> Box { +pub fn get_decoder() -> Box { Box::new(Bink2Decoder::new()) }