Update txb context calculation code
Split coefficients into signs (0 or 1) and levels (0 to 255),
so that they both can be fit in 1-byte.
Change-Id: I0f486368b7b819a77aaddda4710e83189e53fc55
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c
index 13f944b..df8bc11 100644
--- a/av1/decoder/decodetxb.c
+++ b/av1/decoder/decodetxb.c
@@ -289,6 +289,9 @@
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];
+
memset(tcoeffs, 0, sizeof(*tcoeffs) * seg_eob);
#if LV_MAP_PROB
@@ -311,6 +314,8 @@
return 0;
}
+ memset(signs, 0, sizeof(signs[0]) * seg_eob);
+
(void)blk_row;
(void)blk_col;
#if CONFIG_TXK_SEL
@@ -357,19 +362,23 @@
*max_scan_line = *eob;
int i;
+ for (i = 0; i < seg_eob; i++) {
+ levels[i] = (uint8_t)tcoeffs[i];
+ }
+
for (i = 0; i < NUM_BASE_LEVELS; ++i) {
#if !LV_MAP_PROB
aom_prob *coeff_base = ec_ctx->coeff_base[txs_ctx][plane_type][i];
#endif
update_eob = 0;
for (c = *eob - 1; c >= 0; --c) {
- tran_low_t *v = &tcoeffs[scan[c]];
- int sign;
+ uint8_t *const level = &levels[scan[c]];
+ int8_t *const sign = &signs[scan[c]];
int ctx;
- if (*v <= i) continue;
+ if (*level <= i) continue;
- ctx = get_base_ctx(tcoeffs, scan[c], bwl, height, i + 1);
+ ctx = get_base_ctx(levels, scan[c], bwl, height, i + 1);
#if LV_MAP_PROB
if (av1_read_record_bin(
@@ -379,7 +388,7 @@
if (aom_read(r, coeff_base[ctx], ACCT_STR))
#endif
{
- *v = i + 1;
+ assert(*level == i + 1);
cul_level += i + 1;
if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][1];
@@ -387,21 +396,20 @@
if (c == 0) {
int dc_sign_ctx = txb_ctx->dc_sign_ctx;
#if LV_MAP_PROB
- sign = av1_read_record_bin(
+ *sign = av1_read_record_bin(
counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2,
ACCT_STR);
#else
- sign =
+ *sign =
aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
#endif
- if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
+ if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
} else {
- sign = av1_read_record_bit(counts, r, ACCT_STR);
+ *sign = av1_read_record_bit(counts, r, ACCT_STR);
}
- if (sign) *v = -(*v);
continue;
}
- *v = i + 2;
+ *level = i + 2;
if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][0];
// update the eob flag for coefficients with magnitude above 1.
@@ -410,27 +418,27 @@
}
for (c = update_eob; c >= 0; --c) {
- tran_low_t *v = &tcoeffs[scan[c]];
- int sign;
+ uint8_t *const level = &levels[scan[c]];
+ int8_t *const sign = &signs[scan[c]];
int idx;
int ctx;
- if (*v <= NUM_BASE_LEVELS) continue;
+ if (*level <= NUM_BASE_LEVELS) continue;
if (c == 0) {
int dc_sign_ctx = txb_ctx->dc_sign_ctx;
#if LV_MAP_PROB
- sign = av1_read_record_bin(
+ *sign = av1_read_record_bin(
counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2, ACCT_STR);
#else
- sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
+ *sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
#endif
- if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][sign];
+ if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
} else {
- sign = av1_read_record_bit(counts, r, ACCT_STR);
+ *sign = av1_read_record_bit(counts, r, ACCT_STR);
}
- ctx = get_br_ctx(tcoeffs, scan[c], bwl, height);
+ ctx = get_br_ctx(levels, scan[c], bwl, height);
#if BR_NODE
for (idx = 0; idx < BASE_RANGE_SETS; ++idx) {
@@ -468,9 +476,8 @@
int br_base = br_index_to_coeff[idx];
- *v = NUM_BASE_LEVELS + 1 + br_base + br_offset;
- cul_level += *v;
- if (sign) *v = -(*v);
+ *level = NUM_BASE_LEVELS + 1 + br_base + br_offset;
+ cul_level += *level;
break;
}
if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][0];
@@ -487,9 +494,8 @@
if (aom_read(r, ec_ctx->coeff_lps[txs_ctx][plane_type][ctx], ACCT_STR))
#endif
{
- *v = (idx + 1 + NUM_BASE_LEVELS);
- if (sign) *v = -(*v);
- cul_level += abs(*v);
+ *level = idx + 1 + NUM_BASE_LEVELS;
+ cul_level += *level;
if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][1];
break;
@@ -500,20 +506,19 @@
#endif
// decode 0-th order Golomb code
- *v = read_golomb(xd, r, counts) + COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
- if (sign) *v = -(*v);
- cul_level += abs(*v);
+ *level =
+ read_golomb(xd, r, counts) + COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
+ cul_level += *level;
}
for (c = 0; c < *eob; ++c) {
- int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
- tran_low_t *v = &tcoeffs[scan[c]];
+ const int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
+ const int level = levels[scan[c]];
+ const int16_t t = (level * dqv) >> shift;
#if CONFIG_SYMBOLRATE
- av1_record_coeff(counts, abs(*v));
+ av1_record_coeff(counts, level);
#endif
- int sign = (*v) < 0;
- *v = (abs(*v) * dqv) >> shift;
- if (sign) *v = -(*v);
+ tcoeffs[scan[c]] = signs[scan[c]] ? -t : t;
}
cul_level = AOMMIN(63, cul_level);