Add speed feature to selectively change trellis rd mult

STATS_CHANGED

Change-Id: I5cd1d63bb8406a2ca37efd778496497f5e60f4ca
diff --git a/av1/encoder/encodetxb.h b/av1/encoder/encodetxb.h
index 5e711e5..45a7b63 100644
--- a/av1/encoder/encodetxb.h
+++ b/av1/encoder/encodetxb.h
@@ -263,10 +263,14 @@
 
 /*!\cond */
 // These numbers are empirically obtained.
-static const int plane_rd_mult[REF_TYPES][PLANE_TYPES] = {
+static const int plane_rd_mult_chroma[REF_TYPES][PLANE_TYPES] = {
   { 17, 13 },
   { 16, 10 },
 };
+static const int plane_rd_mult[REF_TYPES][PLANE_TYPES] = {
+  { 17, 20 },
+  { 16, 20 },
+};
 /*!\endcond */
 
 #ifdef __cplusplus
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 4f7d308..abfa1a5 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -367,6 +367,7 @@
   sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
   sf->tx_sf.model_based_prune_tx_search_level = 1;
   sf->tx_sf.tx_type_search.use_reduced_intra_txset = 1;
+  sf->tx_sf.use_chroma_trellis_rd_mult = 1;
 
   sf->rt_sf.use_nonrd_pick_mode = 0;
   sf->rt_sf.discount_color_cost = 0;
@@ -2016,6 +2017,7 @@
   sf->tx_sf.tx_type_search.fast_intra_tx_type_search = 2;
   sf->tx_sf.tx_type_search.use_skip_flag_prediction = 2;
   sf->tx_sf.tx_type_search.winner_mode_tx_type_pruning = 4;
+  sf->tx_sf.use_chroma_trellis_rd_mult = 1;
 
   sf->rd_sf.optimize_coefficients = NO_TRELLIS_OPT;
   sf->rd_sf.simple_model_rd_from_var = 1;
@@ -2452,6 +2454,7 @@
   tx_sf->prune_intra_tx_depths_using_nn = false;
   tx_sf->use_rd_based_breakout_for_intra_tx_search = false;
   tx_sf->prune_inter_tx_split_rd_eval_lvl = 0;
+  tx_sf->use_chroma_trellis_rd_mult = 0;
 }
 
 static inline void init_rd_sf(RD_CALC_SPEED_FEATURES *rd_sf,
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 342049e..5b1a2e8 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1482,6 +1482,9 @@
   // Values are 0 (not used),  1 - 2 with progressively increasing
   // aggressiveness, i.e., decreasing number of top candidates
   int prune_inter_tx_split_rd_eval_lvl;
+
+  // If 1, use a trellis rd multiplier that favors chroma plane more.
+  int use_chroma_trellis_rd_mult;
 } TX_SPEED_FEATURES;
 
 typedef struct RD_CALC_SPEED_FEATURES {
diff --git a/av1/encoder/txb_rdopt.c b/av1/encoder/txb_rdopt.c
index a199941..bd16ddc 100644
--- a/av1/encoder/txb_rdopt.c
+++ b/av1/encoder/txb_rdopt.c
@@ -384,9 +384,12 @@
                          ? 7
                          : 5;
 
+  const int(*trellis_rd_mult)[2] = cpi->sf.tx_sf.use_chroma_trellis_rd_mult
+                                       ? plane_rd_mult_chroma
+                                       : plane_rd_mult;
   const int64_t rdmult = ROUND_POWER_OF_TWO(
       (int64_t)x->rdmult * (8 - sharpness) *
-          (plane_rd_mult[is_inter][plane_type] << (2 * (xd->bd - 8))),
+          (trellis_rd_mult[is_inter][plane_type] << (2 * (xd->bd - 8))),
       rshift);
 
   uint8_t levels_buf[TX_PAD_2D];
diff --git a/test/horz_superres_test.cc b/test/horz_superres_test.cc
index 6d4ca8a..28c3348 100644
--- a/test/horz_superres_test.cc
+++ b/test/horz_superres_test.cc
@@ -56,7 +56,7 @@
     44.7 },
 #if CONFIG_AV1_HIGHBITDEPTH
   { "park_joy_90p_10_444.y4m", AOM_IMG_FMT_I44416, AOM_BITS_10, 1, 5, 0, 27.0,
-    46.8 },
+    46.7 },
 #endif
   { "screendata.y4m", AOM_IMG_FMT_I420, AOM_BITS_8, 0, 4, 1, 23.0, 52.5 },
   // Image coding (single frame).