]> granicus.if.org Git - libvpx/commitdiff
Simplify txfm rate-distortion optimization
authorJingning Han <jingning@google.com>
Tue, 3 Nov 2015 20:59:24 +0000 (12:59 -0800)
committerJingning Han <jingning@google.com>
Wed, 4 Nov 2015 18:25:48 +0000 (10:25 -0800)
This commit refactors the rate-distortion optimization scheme for
transform block coding. When both ext-tx and var-tx experiments
are turned on, the encoding time for bus_cif at 1000 kbps goes down
from 706377 ms to 666503 ms (5.6% speed-up). The coding statics
remain unchanged.

Change-Id: I20835db573725580aad79c16220f799ce01f2093

vp10/encoder/rdopt.c

index f398c405762fbba6e0f80d6035a6209272986caa..2f799edc9177453010d0555760e02bc01e6c47d8 100644 (file)
@@ -1948,6 +1948,9 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x,
   int s0 = vp10_cost_bit(skip_prob, 0);
   int s1 = vp10_cost_bit(skip_prob, 1);
   TX_SIZE best_tx_size[64];
+  TX_SIZE best_tx = TX_SIZES;
+  uint8_t best_blk_skip[256];
+  const int n4 = 1 << (num_pels_log2_lookup[bsize] - 4);
   int idx, idy;
 
   *distortion = INT64_MAX;
@@ -2017,6 +2020,8 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x,
       *skippable  = this_skip;
       *sse        = this_sse;
       best_tx_type = mbmi->tx_type;
+      best_tx = mbmi->tx_size;
+      memcpy(best_blk_skip, x->blk_skip[0], sizeof(best_blk_skip[0]) * n4);
       for (idy = 0; idy < xd->n8_h; ++idy)
         for (idx = 0; idx < xd->n8_w; ++idx)
           best_tx_size[idy * 8 + idx] = mbmi->inter_tx_size[idy * 8 + idx];
@@ -2024,27 +2029,11 @@ static void select_tx_type_yrd(const VP10_COMP *cpi, MACROBLOCK *x,
   }
 
   mbmi->tx_type = best_tx_type;
-
   for (idy = 0; idy < xd->n8_h; ++idy)
     for (idx = 0; idx < xd->n8_w; ++idx)
       mbmi->inter_tx_size[idy * 8 + idx] = best_tx_size[idy * 8 + idx];
-
-  inter_block_yrd(cpi, x, rate, distortion, skippable, sse,
-                  bsize, ref_best_rd);
-
-  if (get_ext_tx_types(max_tx_size, bsize, is_inter) > 1 &&
-      !xd->lossless[xd->mi[0]->mbmi.segment_id] &&
-      *rate != INT_MAX) {
-    if (is_inter) {
-      if (ext_tx_set > 0)
-        *rate += cpi->inter_tx_type_costs[ext_tx_set]
-                                     [max_tx_size][mbmi->tx_type];
-    } else {
-      if (ext_tx_set > 0)
-        *rate += cpi->intra_tx_type_costs[ext_tx_set][max_tx_size]
-                                     [mbmi->mode][mbmi->tx_type];
-    }
-  }
+  mbmi->tx_size = best_tx;
+  memcpy(x->blk_skip[0], best_blk_skip, sizeof(best_blk_skip[0]) * n4);
 }
 #endif