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)) {