X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-codec-support%2Fsrc%2Fcodecs%2Fh263%2Fdecoder.rs;h=bba8c04ce752799a458424e8ae9c050e81115dc1;hp=591840673f392214b3e3431139713004494d1559;hb=379524159c95f1c3639976ccf35f9d47cd9732ac;hpb=7ce1f80b526f0168f35ed8fa24505e563245d49c diff --git a/nihav-codec-support/src/codecs/h263/decoder.rs b/nihav-codec-support/src/codecs/h263/decoder.rs index 5918406..bba8c04 100644 --- a/nihav-codec-support/src/codecs/h263/decoder.rs +++ b/nihav-codec-support/src/codecs/h263/decoder.rs @@ -287,6 +287,7 @@ impl H263BaseDecoder { } Ok(()) } + #[allow(clippy::comparison_chain)] fn decode_intra_mb_pred_quant(&mut self, bd: &mut dyn BlockDecoder, bdsp: &dyn BlockDSP, mb_pos: usize, binfo: &BlockInfo, sstate: &SliceState, apply_acpred: bool) -> DecoderResult<()> { for i in 0..6 { bd.decode_block_intra(&binfo, &sstate, binfo.get_q(), i, (binfo.cbp & (1 << (5 - i))) != 0, &mut self.blk[i])?; @@ -295,6 +296,7 @@ impl H263BaseDecoder { } else { i16::from(binfo.get_q() * 2) }; + let qadd = (q + 1) >> 1; let quant_gray = 1024 / q; if apply_acpred && (binfo.acpred != ACPredMode::None) { let has_b = (i == 1) || (i == 3) || !sstate.first_mb; @@ -372,7 +374,19 @@ impl H263BaseDecoder { for t in 0..8 { self.pred_coeffs[mb_pos].ver[i][t] = self.blk[i][t]; } } if apply_acpred { - self.blk[i][0] *= q; + let start = if binfo.get_q() < 8 { + self.blk[i][0] <<= 3; + 1 + } else { + 0 + }; + for el in self.blk[i].iter_mut().skip(start) { + if *el > 0 { + *el = *el * q + qadd; + } else if *el < 0 { + *el = *el * q - qadd; + } + } } bdsp.idct(&mut self.blk[i]); } @@ -397,7 +411,7 @@ impl H263BaseDecoder { bi.mv_f[blk_no] } } - #[allow(clippy::cyclomatic_complexity)] + #[allow(clippy::cognitive_complexity)] fn reconstruct_obmc(&mut self, buf: &mut NAVideoBuffer, slice_start: usize, start: usize, end: usize, slice_end: bool) -> usize { let mut mb_x = start % self.mb_w; let mut mb_y = start / self.mb_w; @@ -501,7 +515,7 @@ impl H263BaseDecoder { } mb_pos } - #[allow(clippy::cyclomatic_complexity)] + #[allow(clippy::cognitive_complexity)] pub fn parse_frame(&mut self, bd: &mut dyn BlockDecoder, bdsp: &dyn BlockDSP) -> DecoderResult { let pinfo = bd.decode_pichdr()?; let mut mvi = MVInfo::new(); @@ -524,16 +538,16 @@ impl H263BaseDecoder { if capacity < self.num_mb { self.obmc_blk.reserve(self.num_mb - capacity); } - self.obmc_blk.truncate(0); + self.obmc_blk.clear(); } if self.has_b { - self.mv_data.truncate(0); + self.mv_data.clear(); } let save_b_data = pinfo.mode.is_ref() && self.may_have_b_frames; if save_b_data { - self.mv_data.truncate(0); + self.mv_data.clear(); } let is_b = pinfo.mode == Type::B; @@ -566,7 +580,7 @@ impl H263BaseDecoder { let mut mb_pos = 0; let apply_acpred = /*(pinfo.mode == Type::I) && */pinfo.plusinfo.is_some() && pinfo.plusinfo.unwrap().aic; if apply_acpred { - self.pred_coeffs.truncate(0); + self.pred_coeffs.clear(); if !self.pred_quant { self.pred_coeffs.resize(self.mb_w * self.mb_h, ZERO_PRED_COEFFS); } else { @@ -782,7 +796,7 @@ impl H263BaseDecoder { recon_b_frame(b_buf, bck_buf.clone(), fwd_buf.clone(), self.mb_w, self.mb_h, self.b_data.as_slice(), bdsp); } - self.b_data.truncate(0); + self.b_data.clear(); Ok(bufinfo) } }