Refactor ext-tx experiment

At this point, ext-tx compapred to baseline +1.735%.

Change-Id: Ia16ac293e2cc87e06a0d898c1d52a8f3495ff814
diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c
index 2c23af1..3a6d6e4 100644
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -635,6 +635,11 @@
   TX_SIZE best_tx = max_tx_size;
   int start_tx, end_tx;
   const int tx_select = cm->tx_mode == TX_MODE_SELECT;
+#if CONFIG_EXT_TX
+  int tx_type, best_tx_type = NORM;
+  int start_tx_type, end_tx_type;
+#endif  // CONFIG_EXT_TX
+
 
   const vpx_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc->tx_probs);
   assert(skip_prob > 0);
@@ -656,70 +661,97 @@
   *skip       = 0;
   *psse       = INT64_MAX;
 
-  for (n = start_tx; n >= end_tx; --n) {
-    int r_tx_size = 0;
-    for (m = 0; m <= n - (n == (int) max_tx_size); ++m) {
-      if (m == n)
-        r_tx_size += vp10_cost_zero(tx_probs[m]);
-      else
-        r_tx_size += vp10_cost_one(tx_probs[m]);
-    }
 #if CONFIG_EXT_TX
-    if (mbmi->ext_txfrm >= GET_EXT_TX_TYPES(n)) {
-      r = INT_MAX;
-      d = INT64_MAX;
-    } else {
+  start_tx_type = NORM;
+  if (is_inter_block(mbmi) && bs >= BLOCK_8X8 && !xd->lossless)
+    end_tx_type = EXT_TX_TYPES - 1;
+  else
+    end_tx_type = NORM;
+
+  for (tx_type = start_tx_type; tx_type <= end_tx_type; ++tx_type) {
+    mbmi->ext_txfrm = tx_type;
 #endif  // CONFIG_EXT_TX
-    txfm_rd_in_plane(x, &r, &d, &s,
-                     &sse, ref_best_rd, 0, bs, n,
-                     cpi->sf.use_fast_coef_costing);
+    for (n = start_tx; n >= end_tx; --n) {
+      int r_tx_size = 0;
+
 #if CONFIG_EXT_TX
-    }
-    if (is_inter_block(mbmi) && bs >= BLOCK_8X8 &&
-        !xd->lossless && r != INT_MAX)
-      r += cpi->ext_tx_costs[n][mbmi->ext_txfrm];
+      if (mbmi->ext_txfrm >= GET_EXT_TX_TYPES(n))
+        continue;
 #endif  // CONFIG_EXT_TX
 
-    if (r == INT_MAX)
-      continue;
-
-    if (tx_select)
-      r += r_tx_size;
-
-    if (s) {
-      if (is_inter_block(mbmi)) {
-        rd = RDCOST(x->rdmult, x->rddiv, s1, sse);
-        if (tx_select)
-          r -= r_tx_size;
-      } else {
-        rd =  RDCOST(x->rdmult, x->rddiv, s1 + r_tx_size * tx_select, sse);
+      for (m = 0; m <= n - (n == (int) max_tx_size); ++m) {
+        if (m == n)
+          r_tx_size += vp10_cost_zero(tx_probs[m]);
+        else
+          r_tx_size += vp10_cost_one(tx_probs[m]);
       }
-    } else {
-      rd = RDCOST(x->rdmult, x->rddiv, r + s0, d);
+
+      txfm_rd_in_plane(x, &r, &d, &s,
+                       &sse, ref_best_rd, 0, bs, n,
+                       cpi->sf.use_fast_coef_costing);
+#if CONFIG_EXT_TX
+      if (is_inter_block(mbmi) && bs >= BLOCK_8X8 &&
+          !xd->lossless && r != INT_MAX)
+        r += cpi->ext_tx_costs[n][mbmi->ext_txfrm];
+#endif  // CONFIG_EXT_TX
+
+      if (r == INT_MAX)
+        continue;
+
+      if (tx_select)
+        r += r_tx_size;
+
+      if (s) {
+        if (is_inter_block(mbmi)) {
+          rd = RDCOST(x->rdmult, x->rddiv, s1, sse);
+          if (tx_select)
+            r -= r_tx_size;
+        } else {
+          rd =  RDCOST(x->rdmult, x->rddiv, s1 + r_tx_size * tx_select, sse);
+        }
+      } else {
+        rd = RDCOST(x->rdmult, x->rddiv, r + s0, d);
+      }
+
+      if (is_inter_block(mbmi) && !xd->lossless && !s)
+        rd = VPXMIN(rd, RDCOST(x->rdmult, x->rddiv, s1, sse));
+
+      // Early termination in transform size search.
+      if (cpi->sf.tx_size_search_breakout &&
+          (rd== INT64_MAX ||
+              (n < (int) max_tx_size && rd > last_rd) ||
+              s == 1))
+        break;
+
+      last_rd = rd;
+#if CONFIG_EXT_TX
+      if (rd < (is_inter_block(mbmi) &&
+          (best_tx_type == NORM) ? ext_tx_th : 1) * best_rd) {
+#else
+      if (rd < best_rd) {
+#endif  // CONFIG_EXT_TX
+        best_tx = n;
+        best_rd = rd;
+        *distortion = d;
+        *rate       = r;
+        *skip       = s;
+        *psse       = sse;
+#if CONFIG_EXT_TX
+        best_tx_type = mbmi->ext_txfrm;
+#endif  // CONFIG_EXT_TX
+      }
     }
-
-    if (is_inter_block(mbmi) && !xd->lossless && !s)
-      rd = VPXMIN(rd, RDCOST(x->rdmult, x->rddiv, s1, sse));
-
-    // Early termination in transform size search.
-    if (cpi->sf.tx_size_search_breakout &&
-        (rd== INT64_MAX ||
-        (n < (int) max_tx_size && rd > last_rd) ||
-        s == 1))
-      break;
-
-    last_rd = rd;
-    if (rd < best_rd) {
-      best_tx = n;
-      best_rd = rd;
-      *distortion = d;
-      *rate       = r;
-      *skip       = s;
-      *psse       = sse;
-    }
+#if CONFIG_EXT_TX
   }
+#endif  // CONFIG_EXT_TX
 
   mbmi->tx_size = best_tx;
+#if CONFIG_EXT_TX
+  mbmi->ext_txfrm = best_tx_type;
+  txfm_rd_in_plane(x, &r, &d, &s,
+                   &sse, ref_best_rd, 0, bs, best_tx,
+                   cpi->sf.use_fast_coef_costing);
+#endif  // CONFIG_EXT_TX
 }
 
 static void super_block_yrd(VP10_COMP *cpi, MACROBLOCK *x, int *rate,
@@ -2707,37 +2739,6 @@
 
     // Y cost and distortion
     vp10_subtract_plane(x, bsize, 0);
-#if CONFIG_EXT_TX
-    if (xd->lossless) {
-      mbmi->ext_txfrm = NORM;
-    } else {
-      int64_t rdcost_tx;
-      int rate_y_tx;
-      int64_t distortion_y_tx;
-      int dummy;
-      int64_t best_rdcost_tx = INT64_MAX;
-      int best_ext_tx = -1;
-
-      for (i = NORM; i < EXT_TX_TYPES; i++) {
-        mbmi->ext_txfrm = i;
-        super_block_yrd(cpi, x, &rate_y_tx, &distortion_y_tx, &dummy, psse,
-                        bsize, INT64_MAX);
-        assert(rate_y_tx != INT_MAX);
-        assert(rate_y_tx >= 0);
-        rdcost_tx = RDCOST(x->rdmult, x->rddiv, rate_y_tx, distortion_y_tx);
-        rdcost_tx = VPXMIN(rdcost_tx, RDCOST(x->rdmult, x->rddiv, 0, *psse));
-        assert(rdcost_tx >= 0);
-        if (rdcost_tx <
-            (best_ext_tx == NORM ? ext_tx_th : 1) * best_rdcost_tx) {
-          best_ext_tx = i;
-          best_rdcost_tx = rdcost_tx;
-        }
-      }
-      if (mbmi->tx_size > TX_16X16)
-        assert(best_ext_tx == NORM);
-      mbmi->ext_txfrm = best_ext_tx;
-    }
-#endif  // CONFIG_EXT_TX
 
     super_block_yrd(cpi, x, rate_y, &distortion_y, &skippable_y, psse,
                     bsize, ref_best_rd);