Use RD_STATS in PICK_MODE_CONTEXT

Change-Id: I0cb07826ecb6dd2f2a1167dd9245627196e8216d
diff --git a/av1/encoder/context_tree.c b/av1/encoder/context_tree.c
index 40df6c1..1ee68ad 100644
--- a/av1/encoder/context_tree.c
+++ b/av1/encoder/context_tree.c
@@ -216,7 +216,6 @@
   dst_ctx->mbmi_ext = src_ctx->mbmi_ext;
 
   dst_ctx->num_4x4_blk = src_ctx->num_4x4_blk;
-  dst_ctx->skip = src_ctx->skip;
   dst_ctx->skippable = src_ctx->skippable;
   dst_ctx->best_mode_index = src_ctx->best_mode_index;
 
@@ -227,9 +226,7 @@
   dst_ctx->comp_pred_diff = src_ctx->comp_pred_diff;
   dst_ctx->single_pred_diff = src_ctx->single_pred_diff;
 
-  dst_ctx->rate = src_ctx->rate;
-  dst_ctx->dist = src_ctx->dist;
-  dst_ctx->rdcost = src_ctx->rdcost;
+  dst_ctx->rd_stats = src_ctx->rd_stats;
   dst_ctx->rd_mode_is_ready = src_ctx->rd_mode_is_ready;
 
   memcpy(dst_ctx->pred_mv, src_ctx->pred_mv, sizeof(MV) * REF_FRAMES);
diff --git a/av1/encoder/context_tree.h b/av1/encoder/context_tree.h
index 74d4b2f..1225520 100644
--- a/av1/encoder/context_tree.h
+++ b/av1/encoder/context_tree.h
@@ -38,8 +38,6 @@
 typedef struct {
   MB_MODE_INFO mic;
   MB_MODE_INFO_EXT mbmi_ext;
-  int64_t dist;
-  int64_t rdcost;
   uint8_t *color_index_map[2];
   uint8_t *blk_skip;
 
@@ -50,7 +48,6 @@
   uint8_t *txb_entropy_ctx[MAX_MB_PLANE];
 
   int num_4x4_blk;
-  int skip;
   // For current partition, only if all Y, U, and V transform blocks'
   // coefficients are quantized to 0, skippable is set to 1.
   int skippable;
@@ -59,9 +56,7 @@
   int comp_pred_diff;
   int single_pred_diff;
 
-  // TODO(jingning) Use RD_COST struct here instead. This involves a boarder
-  // scope of refactoring.
-  int rate;
+  RD_STATS rd_stats;
 
   int rd_mode_is_ready;  // Flag to indicate whether rd pick mode decision has
                          // been made.
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index c34cb01..e2f6a3f 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -357,7 +357,7 @@
 
   memcpy(x->blk_skip, ctx->blk_skip, sizeof(x->blk_skip[0]) * ctx->num_4x4_blk);
 
-  x->skip = ctx->skip;
+  x->skip = ctx->rd_stats.skip;
 
   // If segmentation in use
   if (seg->enabled) {
@@ -373,7 +373,8 @@
     // and then update the quantizer.
     if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
       av1_cyclic_refresh_update_segment(cpi, mi_addr, mi_row, mi_col, bsize,
-                                        ctx->rate, ctx->dist, x->skip);
+                                        ctx->rd_stats.rate, ctx->rd_stats.dist,
+                                        x->skip);
     }
     if (mi_addr->uv_mode == UV_CFL_PRED && !is_cfl_allowed(xd))
       mi_addr->uv_mode = UV_DC_PRED;
@@ -527,8 +528,8 @@
 #endif
 
   if (best_rd < 0) {
-    ctx->rdcost = INT64_MAX;
-    ctx->skip = 0;
+    ctx->rd_stats.rdcost = INT64_MAX;
+    ctx->rd_stats.skip = 0;
     av1_invalid_rd_stats(rd_cost);
     return;
   }
@@ -543,9 +544,9 @@
     assert(ctx_mbmi->sb_type == bsize);
     assert(ctx_mbmi->partition == partition);
     *mbmi = *ctx_mbmi;
-    rd_cost->rate = ctx->rate;
-    rd_cost->dist = ctx->dist;
-    rd_cost->rdcost = ctx->rdcost;
+    rd_cost->rate = ctx->rd_stats.rate;
+    rd_cost->dist = ctx->rd_stats.dist;
+    rd_cost->rdcost = ctx->rd_stats.rdcost;
   } else {
     mbmi->sb_type = bsize;
     mbmi->partition = partition;
@@ -581,7 +582,7 @@
                            xd->plane[1].subsampling_y);
 
   if (ctx->rd_mode_is_ready) {
-    x->skip = ctx->skip;
+    x->skip = ctx->rd_stats.skip;
     *x->mbmi_ext = ctx->mbmi_ext;
     return;
   }
@@ -692,9 +693,9 @@
   // refactored to provide proper exit/return handle.
   if (rd_cost->rate == INT_MAX) rd_cost->rdcost = INT64_MAX;
 
-  ctx->rate = rd_cost->rate;
-  ctx->dist = rd_cost->dist;
-  ctx->rdcost = rd_cost->rdcost;
+  ctx->rd_stats.rate = rd_cost->rate;
+  ctx->rd_stats.dist = rd_cost->dist;
+  ctx->rd_stats.rdcost = rd_cost->rdcost;
 
 #if CONFIG_COLLECT_COMPONENT_TIMING
   end_timing(cpi, rd_pick_sb_modes_time);
@@ -2193,7 +2194,7 @@
 static void reset_partition(PC_TREE *pc_tree, BLOCK_SIZE bsize) {
   pc_tree->partitioning = PARTITION_NONE;
   pc_tree->cb_search_range = SEARCH_FULL_PLANE;
-  pc_tree->none.skip = 0;
+  pc_tree->none.rd_stats.skip = 0;
 
   pc_tree->pc_tree_stats.valid = 0;
   pc_tree->pc_tree_stats.split = 0;
@@ -2252,8 +2253,8 @@
   (void)split_rd;
 
   if (best_rd < 0) {
-    pc_tree->none.rdcost = INT64_MAX;
-    pc_tree->none.skip = 0;
+    pc_tree->none.rd_stats.rdcost = INT64_MAX;
+    pc_tree->none.rd_stats.skip = 0;
     av1_invalid_rd_stats(rd_cost);
     return;
   }
@@ -2334,8 +2335,8 @@
     pick_sb_modes(cpi, tile_data, x, mi_row, mi_col, &this_rdc, PARTITION_NONE,
                   bsize, ctx_none, best_remain_rdcost, 0);
 
-    pc_tree->pc_tree_stats.rdcost = ctx_none->rdcost;
-    pc_tree->pc_tree_stats.skip = ctx_none->skip;
+    pc_tree->pc_tree_stats.rdcost = ctx_none->rd_stats.rdcost;
+    pc_tree->pc_tree_stats.skip = ctx_none->rd_stats.skip;
 
     if (none_rd) *none_rd = this_rdc.rdcost;
     if (this_rdc.rate != INT_MAX) {
@@ -2436,7 +2437,7 @@
 
       pc_tree->pc_tree_stats.sub_block_rdcost[idx] = this_rdc.rdcost;
       pc_tree->pc_tree_stats.sub_block_skip[idx] =
-          pc_tree->split[idx]->none.skip;
+          pc_tree->split[idx]->none.rd_stats.skip;
 
       if (this_rdc.rate == INT_MAX) {
         sum_rdc.rdcost = INT64_MAX;
@@ -3056,8 +3057,8 @@
   BLOCK_SIZE bsize2 = get_partition_subsize(bsize, PARTITION_SPLIT);
 
   if (best_rd < 0) {
-    pc_tree->none.rdcost = INT64_MAX;
-    pc_tree->none.skip = 0;
+    pc_tree->none.rd_stats.rdcost = INT64_MAX;
+    pc_tree->none.rd_stats.skip = 0;
     av1_invalid_rd_stats(rd_cost);
     return;
   }
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 3fc5bd4..2576815 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -833,7 +833,7 @@
 
   // Take a snapshot of the coding context so it can be
   // restored if we decide to encode this way
-  ctx->skip = x->skip;
+  ctx->rd_stats.skip = x->skip;
   memcpy(ctx->blk_skip, x->blk_skip, sizeof(x->blk_skip[0]) * ctx->num_4x4_blk);
   ctx->skippable = x->skip;
   ctx->best_mode_index = mode_index;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 6a66f32..3bf5ad8 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -6996,7 +6996,7 @@
 
   // Take a snapshot of the coding context so it can be
   // restored if we decide to encode this way
-  ctx->skip = x->skip;
+  ctx->rd_stats.skip = x->skip;
   ctx->skippable = skippable;
   ctx->best_mode_index = mode_index;
   ctx->mic = *xd->mi[0];
@@ -10807,7 +10807,7 @@
   int64_t dist_y = 0, dist_uv = 0;
   TX_SIZE max_uv_tx_size;
 
-  ctx->skip = 0;
+  ctx->rd_stats.skip = 0;
   mbmi->ref_frame[0] = INTRA_FRAME;
   mbmi->ref_frame[1] = NONE_FRAME;
   mbmi->use_intrabc = 0;
@@ -10858,7 +10858,7 @@
   if (rd_cost->rate != INT_MAX && rd_cost->rdcost < best_rd)
     best_rd = rd_cost->rdcost;
   if (rd_pick_intrabc_mode_sb(cpi, x, rd_cost, bsize, best_rd) < best_rd) {
-    ctx->skip = x->skip;
+    ctx->rd_stats.skip = x->skip;
     memcpy(ctx->blk_skip, x->blk_skip,
            sizeof(x->blk_skip[0]) * ctx->num_4x4_blk);
     assert(rd_cost->rate != INT_MAX);