replace vec.truncate(0) with vec.clear()
[nihav.git] / nihav-codec-support / src / codecs / h263 / decoder.rs
index 591840673f392214b3e3431139713004494d1559..bba8c04ce752799a458424e8ae9c050e81115dc1 100644 (file)
@@ -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<u8>, 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<NABufferType> {
         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)
     }
 }