[FFmpeg-devel] [PATCH] Bink: clip AC coefficients during dequantization.
Reimar Döffinger
Reimar.Doeffinger at gmx.de
Sun Jul 17 13:06:59 CEST 2011
Fixes artefacts with Neverwinter Nights WOTCLogo.bik
(http://drmccoy.de/zeugs/WOTCLogo.bik).
Fixes trac ticket #352.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
---
libavcodec/bink.c | 15 +++++++++++++--
1 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/libavcodec/bink.c b/libavcodec/bink.c
index ef07747..297c034 100644
--- a/libavcodec/bink.c
+++ b/libavcodec/bink.c
@@ -571,6 +571,17 @@ static inline int binkb_get_value(BinkContext *c, int bundle_num)
return ret;
}
+static inline DCTELEM dequant(DCTELEM in, uint32_t quant, int dc)
+{
+ // Note: multiplication is unsigned but we want signed shift
+ // otherwise clipping breaks
+ int32_t res = in * quant;
+ res >>= 11;
+ if (!dc)
+ res = av_clip_int16(res);
+ return res;
+}
+
/**
* Read 8x8 block of DCT coefficients.
*
@@ -669,10 +680,10 @@ static int read_dct_coeffs(GetBitContext *gb, DCTELEM block[64], const uint8_t *
quant = quant_matrices[quant_idx];
- block[0] = (block[0] * quant[0]) >> 11;
+ block[0] = dequant(block[0], quant[0], 1);
for (i = 0; i < coef_count; i++) {
int idx = coef_idx[i];
- block[scan[idx]] = (block[scan[idx]] * quant[idx]) >> 11;
+ block[scan[idx]] = dequant(block[scan[idx]], quant[idx], 0);
}
return 0;
--
1.7.5.4
More information about the ffmpeg-devel
mailing list