update_coeff_eob : minor optimization
tmp_levels unnecessary as all of the functions for calculating
context take a parameter as to whether this is end of block and
if so don't access levels at all. If the cost is actually less
then we'll set the values.
Change-Id: Ie2d460e874e2ee31d6f12980af16da06d84a0da8
diff --git a/av1/common/txb_common.h b/av1/common/txb_common.h
index 5e5ead0..8a3932d 100644
--- a/av1/common/txb_common.h
+++ b/av1/common/txb_common.h
@@ -159,6 +159,19 @@
return mag + 14;
}
+static AOM_FORCE_INLINE int get_br_ctx_eob(const int c, // raster order
+ const int bwl,
+ const TX_CLASS tx_class) {
+ const int row = c >> bwl;
+ const int col = c - (row << bwl);
+ if (c == 0) return 0;
+ if ((tx_class == TX_CLASS_2D && row < 2 && col < 2) ||
+ (tx_class == TX_CLASS_HORIZ && col == 0) ||
+ (tx_class == TX_CLASS_VERT && row == 0))
+ return 7;
+ return 14;
+}
+
static AOM_FORCE_INLINE int get_br_ctx(const uint8_t *const levels,
const int c, // raster order
const int bwl, const TX_CLASS tx_class) {
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index edd5f39..fc2bc90 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -1322,7 +1322,11 @@
cost += av1_cost_literal(1);
}
if (abs_qc > NUM_BASE_LEVELS) {
- const int br_ctx = get_br_ctx(levels, ci, bwl, tx_class);
+ int br_ctx;
+ if (is_last)
+ br_ctx = get_br_ctx_eob(ci, bwl, tx_class);
+ else
+ br_ctx = get_br_ctx(levels, ci, bwl, tx_class);
cost += get_br_cost(abs_qc, br_ctx, txb_costs->lps_cost[br_ctx]);
cost += get_golomb_cost(abs_qc);
}
@@ -1478,13 +1482,6 @@
int lower_level_new_eob = 0;
const int new_eob = si + 1;
- uint8_t tmp_levels[3];
- for (int ni = 0; ni < *nz_num; ++ni) {
- const int last_ci = nz_ci[ni];
- tmp_levels[ni] = levels[get_padded_idx(last_ci, bwl)];
- levels[get_padded_idx(last_ci, bwl)] = 0;
- }
-
const int coeff_ctx_new_eob = get_lower_levels_ctx_eob(bwl, height, si);
const int new_eob_cost =
get_eob_cost(new_eob, txb_eob_costs, txb_costs, tx_class);
@@ -1521,7 +1518,7 @@
if (sharpness == 0 && rd_new_eob < rd) {
for (int ni = 0; ni < *nz_num; ++ni) {
int last_ci = nz_ci[ni];
- // levels[get_padded_idx(last_ci, bwl)] = 0;
+ levels[get_padded_idx(last_ci, bwl)] = 0;
qcoeff[last_ci] = 0;
dqcoeff[last_ci] = 0;
}
@@ -1531,10 +1528,6 @@
*accu_dist = dist_new_eob;
lower_level = lower_level_new_eob;
} else {
- for (int ni = 0; ni < *nz_num; ++ni) {
- const int last_ci = nz_ci[ni];
- levels[get_padded_idx(last_ci, bwl)] = tmp_levels[ni];
- }
*accu_rate += rate;
*accu_dist += dist;
}