X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-codec-support%2Fsrc%2Fcodecs%2Fh263%2Fdecoder.rs;fp=nihav-codec-support%2Fsrc%2Fcodecs%2Fh263%2Fdecoder.rs;h=6be437bd084e17906fcf238ee0f5018285251540;hp=591840673f392214b3e3431139713004494d1559;hb=72a12906b921436dad6ff68326ad8b3e526fbe11;hpb=06480aad139b943f8fcef979b16af72036dd604a diff --git a/nihav-codec-support/src/codecs/h263/decoder.rs b/nihav-codec-support/src/codecs/h263/decoder.rs index 5918406..6be437b 100644 --- a/nihav-codec-support/src/codecs/h263/decoder.rs +++ b/nihav-codec-support/src/codecs/h263/decoder.rs @@ -295,6 +295,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 +373,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]); }