Extend the eob context model
Account for 1-D/2-D transform kernels for the eob modeling. To
maintain a smaller context cardinality, set the two 1-D transform
kernels in the same category. The difference in directions should
be largely covered by the scan order.
This and the previous CLs on nz_map context modeling together
improve the compression performance of level-map coefficient coding
system by 0.4% for lowres.
Change-Id: I8c4f03ca01ce3d248950d04bd1266f445b4227a0
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index 71eb693..9d14964 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -130,18 +130,19 @@
return error;
}
-void av1_update_eob_context(int eob, int seg_eob, TX_SIZE txsize,
- PLANE_TYPE plane, FRAME_CONTEXT *ec_ctx,
- FRAME_COUNTS *counts) {
+void av1_update_eob_context(int eob, int seg_eob, TX_SIZE tx_size,
+ TX_TYPE tx_type, PLANE_TYPE plane,
+ FRAME_CONTEXT *ec_ctx, FRAME_COUNTS *counts) {
int16_t eob_extra;
int16_t eob_pt = get_eob_pos_token(eob, &eob_extra);
int16_t dummy;
int16_t max_eob_pt = get_eob_pos_token(seg_eob, &dummy);
+ TX_SIZE txs_ctx = get_txsize_context(tx_size);
for (int i = 1; i < max_eob_pt; i++) {
- int eob_pos_ctx = get_eob_pos_ctx(i);
- counts->eob_flag[txsize][plane][eob_pos_ctx][eob_pt == i]++;
- update_cdf(ec_ctx->eob_flag_cdf[txsize][plane][eob_pos_ctx], eob_pt == i,
+ int eob_pos_ctx = av1_get_eob_pos_ctx(tx_type, i);
+ counts->eob_flag[txs_ctx][plane][eob_pos_ctx][eob_pt == i]++;
+ update_cdf(ec_ctx->eob_flag_cdf[txs_ctx][plane][eob_pos_ctx], eob_pt == i,
2);
if (eob_pt == i) {
break;
@@ -151,13 +152,13 @@
if (k_eob_offset_bits[eob_pt] > 0) {
int eob_shift = k_eob_offset_bits[eob_pt] - 1;
int bit = (eob_extra & (1 << eob_shift)) ? 1 : 0;
- counts->eob_extra[txsize][plane][eob_pt][bit]++;
- update_cdf(ec_ctx->eob_extra_cdf[txsize][plane][eob_pt], bit, 2);
+ counts->eob_extra[txs_ctx][plane][eob_pt][bit]++;
+ update_cdf(ec_ctx->eob_extra_cdf[txs_ctx][plane][eob_pt], bit, 2);
}
}
static int get_eob_cost(int eob, int seg_eob,
- const LV_MAP_COEFF_COST *txb_costs) {
+ const LV_MAP_COEFF_COST *txb_costs, TX_TYPE tx_type) {
int16_t eob_extra;
int16_t eob_pt = get_eob_pos_token(eob, &eob_extra);
int16_t dummy;
@@ -166,7 +167,7 @@
// printf("Enc: [%d, %d], (%d, %d) ", seg_eob, eob, eob_pt, eob_extra);
for (int i = 1; i < max_eob_pt; i++) {
- int eob_pos_ctx = get_eob_pos_ctx(i);
+ int eob_pos_ctx = av1_get_eob_pos_ctx(tx_type, i);
eob_cost += txb_costs->eob_cost[eob_pos_ctx][eob_pt == i];
if (eob_pt == i) {
break;
@@ -408,7 +409,7 @@
// printf("Enc: [%d, %d], (%d, %d) ", seg_eob, eob, eob_pt, eob_extra);
for (int i = 1; i < max_eob_pt; i++) {
- int eob_pos_ctx = get_eob_pos_ctx(i);
+ int eob_pos_ctx = av1_get_eob_pos_ctx(tx_type, i);
aom_write_bin(w, eob_pt == i,
ec_ctx->eob_flag_cdf[txs_ctx][plane_type][eob_pos_ctx], 2);
@@ -774,7 +775,7 @@
#endif
const int seg_eob = tx_size_2d[tx_size];
- int eob_cost = get_eob_cost(eob, seg_eob, coeff_costs);
+ int eob_cost = get_eob_cost(eob, seg_eob, coeff_costs, tx_type);
cost += eob_cost;
for (c = eob - 1; c >= 0; --c) {
@@ -1794,7 +1795,7 @@
// forward optimize the nz_map`
const int init_eob = txb_info->eob;
const int seg_eob = txb_info->seg_eob;
- int eob_cost = get_eob_cost(init_eob, seg_eob, txb_costs);
+ int eob_cost = get_eob_cost(init_eob, seg_eob, txb_costs, txb_info->tx_type);
// backward optimize the level-k map
int64_t accu_rate = eob_cost;
@@ -1813,7 +1814,8 @@
accu_rate += stats.rate;
} else {
// check if it is better to make this the last significant coefficient
- int cur_eob_rate = get_eob_cost(si + 1, seg_eob, txb_costs);
+ int cur_eob_rate =
+ get_eob_cost(si + 1, seg_eob, txb_costs, txb_info->tx_type);
cur_eob_rd_cost = RDCOST(txb_info->rdmult, cur_eob_rate, 0);
prev_eob_rd_cost =
RDCOST(txb_info->rdmult, accu_rate + stats.nz_rate, accu_dist);
@@ -2295,7 +2297,7 @@
unsigned int(*nz_map_count)[SIG_COEF_CONTEXTS][2] =
&(td->counts->nz_map[txsize_ctx][plane_type]);
- av1_update_eob_context(eob, seg_eob, txsize_ctx, plane_type, ec_ctx,
+ av1_update_eob_context(eob, seg_eob, tx_size, tx_type, plane_type, ec_ctx,
td->counts);
for (c = eob - 1; c >= 0; --c) {
tran_low_t v = qcoeff[scan[c]];