interintra rdo: do not re-calculate mode rate cost
Keep track of the rate cost of the selected mode instead of
re-calculating it afterwards.
Change-Id: Ie6b21e4c51760651c9bc54ebec6a771106aeadfa
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index ac377d8..5b0980b 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -500,17 +500,14 @@
return rd;
}
-// Computes the rd_threshold and total_mode_rate
-static AOM_INLINE int64_t compute_total_rate_and_rd_thresh(
- MACROBLOCK *const x, int *rate_mv, int *total_mode_rate, BLOCK_SIZE bsize,
- int64_t ref_best_rd, int rmode) {
- const int is_wedge_used = av1_is_wedge_used(bsize);
+// Computes the rd_threshold for smooth interintra rd search.
+static AOM_INLINE int64_t compute_rd_thresh(MACROBLOCK *const x,
+ int total_mode_rate,
+ int64_t ref_best_rd) {
const int64_t rd_thresh = get_rd_thresh_from_best_rd(
ref_best_rd, (1 << INTER_INTRA_RD_THRESH_SHIFT),
INTER_INTRA_RD_THRESH_SCALE);
- const int rwedge = is_wedge_used ? x->wedge_interintra_cost[bsize][0] : 0;
- *total_mode_rate = *rate_mv + rmode + rwedge;
- const int64_t mode_rd = RDCOST(x->rdmult, *total_mode_rate, 0);
+ const int64_t mode_rd = RDCOST(x->rdmult, total_mode_rate, 0);
return (rd_thresh - mode_rd);
}
@@ -551,8 +548,9 @@
const BUFFER_SET *orig_dst) {
const int try_smooth_interintra = cpi->oxcf.enable_smooth_interintra &&
!cpi->sf.inter_sf.disable_smooth_interintra;
+ const int is_wedge_used = av1_is_wedge_used(bsize);
const int try_wedge_interintra =
- av1_is_wedge_used(bsize) && enable_wedge_interintra_search(x, cpi);
+ is_wedge_used && enable_wedge_interintra_search(x, cpi);
if (!try_smooth_interintra && !try_wedge_interintra) return -1;
const AV1_COMMON *const cm = &cpi->common;
@@ -584,6 +582,7 @@
// Compute smooth_interintra
int64_t best_interintra_rd_nowedge = INT64_MAX;
+ int best_mode_rate = INT_MAX;
if (try_smooth_interintra) {
mbmi->use_wedge_interintra = 0;
int interintra_mode_reuse = 1;
@@ -607,7 +606,6 @@
assert(IMPLIES(!cpi->oxcf.enable_smooth_interintra ||
cpi->sf.inter_sf.disable_smooth_interintra,
best_interintra_mode != II_SMOOTH_PRED));
- int rmode = interintra_mode_cost[best_interintra_mode];
// Recompute prediction if required
if (interintra_mode_reuse || best_interintra_mode != INTERINTRA_MODES - 1) {
mbmi->interintra_mode = best_interintra_mode;
@@ -618,9 +616,11 @@
// Compute rd cost for best smooth_interintra
RD_STATS rd_stats;
- int total_mode_rate;
- const int64_t rd_thresh = compute_total_rate_and_rd_thresh(
- x, rate_mv, &total_mode_rate, bsize, ref_best_rd, rmode);
+ const int rmode = interintra_mode_cost[best_interintra_mode] +
+ (is_wedge_used ? x->wedge_interintra_cost[bsize][0] : 0);
+ const int total_mode_rate = rmode + *rate_mv;
+ const int64_t rd_thresh =
+ compute_rd_thresh(x, total_mode_rate, ref_best_rd);
rd = estimate_yrd_for_sb(cpi, bsize, x, rd_thresh, &rd_stats);
if (rd != INT64_MAX) {
rd = RDCOST(x->rdmult, total_mode_rate + rd_stats.rate, rd_stats.dist);
@@ -628,6 +628,7 @@
return -1;
}
best_interintra_rd_nowedge = rd;
+ best_mode_rate = rmode;
// Return early if best_interintra_rd_nowedge not good enough
if (ref_best_rd < INT64_MAX &&
(best_interintra_rd_nowedge >> INTER_INTRA_RD_THRESH_SHIFT) *
@@ -751,6 +752,7 @@
mbmi->mv[0].as_int = tmp_mv.as_int;
*tmp_rate2 += tmp_rate_mv - *rate_mv;
*rate_mv = tmp_rate_mv;
+ best_mode_rate = rate_overhead;
} else {
mbmi->use_wedge_interintra = 0;
mbmi->interintra_mode = best_interintra_mode;
@@ -765,6 +767,8 @@
return -1;
}
+ *tmp_rate2 += best_mode_rate;
+
if (num_planes > 1) {
av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
AOM_PLANE_U, num_planes - 1);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 1ff3751..036b5ee 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1451,18 +1451,6 @@
if (interintra_allowed) {
rd_stats->rate += x->interintra_cost[size_group_lookup[bsize]]
[mbmi->ref_frame[1] == INTRA_FRAME];
- if (mbmi->ref_frame[1] == INTRA_FRAME) {
- rd_stats->rate += x->interintra_mode_cost[size_group_lookup[bsize]]
- [mbmi->interintra_mode];
- if (av1_is_wedge_used(bsize)) {
- rd_stats->rate +=
- x->wedge_interintra_cost[bsize][mbmi->use_wedge_interintra];
- if (mbmi->use_wedge_interintra) {
- rd_stats->rate +=
- x->wedge_idx_cost[bsize][mbmi->interintra_wedge_index];
- }
- }
- }
}
if ((last_motion_mode_allowed > SIMPLE_TRANSLATION) &&
(mbmi->ref_frame[1] != INTRA_FRAME)) {