Use original coeff arr to deal with r/w golomb
This will avoid overflow issue when coeff uses more than 8 bits
BUG=aomedia:954
Change-Id: Ib5f323b0d9db3141cc019a6aad019f09b8c4f9fa
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c
index f4f7328..4f3747b 100644
--- a/av1/decoder/decodetxb.c
+++ b/av1/decoder/decodetxb.c
@@ -592,15 +592,16 @@
#endif
// decode 0-th order Golomb code
- *level =
- read_golomb(xd, r, counts) + COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
- cul_level += *level;
+ *level = COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
+ // Save golomb in tcoeffs because adding it to level may incur overflow
+ tcoeffs[scan[c]] = read_golomb(xd, r, counts);
+ cul_level += *level + tcoeffs[scan[c]];
}
for (c = 0; c < *eob; ++c) {
const int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
const int level = levels[scan[c]];
- const int16_t t = (level * dqv) >> shift;
+ const int16_t t = ((level + tcoeffs[scan[c]]) * dqv) >> shift;
#if CONFIG_SYMBOLRATE
av1_record_coeff(counts, level);
#endif
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index 24b1a3e..fcab41b 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -452,7 +452,7 @@
if (eob == 0) return;
for (int i = 0; i < seg_eob; i++) {
- levels[i] = (uint8_t)abs(tcoeff[i]);
+ levels[i] = (uint8_t)clamp(abs(tcoeff[i]), 0, UINT8_MAX);
signs[i] = (int8_t)(tcoeff[i] < 0);
}
@@ -670,7 +670,8 @@
#endif // BR_NODE
// use 0-th order Golomb code to handle the residual level.
- write_golomb(w, level - COEFF_BASE_RANGE - 1 - NUM_BASE_LEVELS);
+ write_golomb(w,
+ abs(tcoeff[scan[c]]) - COEFF_BASE_RANGE - 1 - NUM_BASE_LEVELS);
}
}
@@ -2623,7 +2624,6 @@
pd->left_context + blk_row, &txb_ctx);
const int bwl = b_width_log2_lookup[txsize_to_bsize[tx_size]] + 2;
const int height = tx_size_high[tx_size];
- int cul_level = 0;
uint8_t levels[64 * 64];
int8_t signs[64 * 64];
@@ -2647,7 +2647,7 @@
}
for (i = 0; i < seg_eob; i++) {
- levels[i] = (uint8_t)abs(tcoeff[i]);
+ levels[i] = (uint8_t)clamp(abs(tcoeff[i]), 0, UINT8_MAX);
signs[i] = (int8_t)(tcoeff[i] < 0);
}
@@ -2737,7 +2737,6 @@
#endif
x->mbmi_ext->dc_sign_ctx[plane][block] = dc_sign_ctx;
}
- cul_level += level;
continue;
}
++td->counts->coeff_base[txsize_ctx][plane_type][i][ctx][0];
@@ -2756,7 +2755,6 @@
if (level <= NUM_BASE_LEVELS) continue;
- cul_level += level;
if (c == 0) {
int dc_sign_ctx = txb_ctx.dc_sign_ctx;
@@ -2826,10 +2824,7 @@
// use 0-th order Golomb code to handle the residual level.
}
- cul_level = AOMMIN(COEFF_CONTEXT_MASK, cul_level);
-
- // DC value
- set_dc_sign(&cul_level, tcoeff[0]);
+ int cul_level = av1_get_txb_entropy_context(tcoeff, scan_order, eob);
av1_set_contexts(xd, pd, plane, tx_size, cul_level, blk_col, blk_row);
#if CONFIG_ADAPT_SCAN