]> granicus.if.org Git - libvpx/commitdiff
vp9: 4x4 tx_size for nonrd-pickmode for screen content
authorMarco Paniconi <marpan@google.com>
Thu, 26 Jul 2018 21:06:42 +0000 (14:06 -0700)
committerMarco Paniconi <marpan@google.com>
Fri, 27 Jul 2018 05:35:25 +0000 (22:35 -0700)
Force 4x4 transform size under some conditions for real-time
screen-content mode. Improvemet on text in some screen clips.

Change-Id: I77cafa23ea1060ef4334dc07eac53189bf80e0ec

vp9/encoder/vp9_pickmode.c

index 4ff385a2359acec5c1ab7dba3adb15739be55c91..50a2c9057dc662ef851873eb823e9001ed4d28d7 100644 (file)
@@ -406,6 +406,11 @@ static void model_rd_for_sb_y_large(VP9_COMP *cpi, BLOCK_SIZE bsize,
       tx_size = TX_8X8;
     else if (tx_size > TX_16X16)
       tx_size = TX_16X16;
+
+    // For screen-content force 4X4 tx_size over 8X8, for large variance.
+    if (cpi->oxcf.content == VP9E_CONTENT_SCREEN && tx_size == TX_8X8 &&
+        bsize <= BLOCK_16X16 && var > (ac_thr << 6))
+      tx_size = TX_4X4;
   } else {
     tx_size = VPXMIN(max_txsize_lookup[bsize],
                      tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
@@ -588,6 +593,12 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, MACROBLOCK *x,
       xd->mi[0]->tx_size = TX_8X8;
     else if (xd->mi[0]->tx_size > TX_16X16)
       xd->mi[0]->tx_size = TX_16X16;
+
+    // For screen-content force 4X4 tx_size over 8X8, for large variance.
+    if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
+        xd->mi[0]->tx_size == TX_8X8 && bsize <= BLOCK_16X16 &&
+        var > (ac_thr << 6))
+      xd->mi[0]->tx_size = TX_4X4;
   } else {
     xd->mi[0]->tx_size =
         VPXMIN(max_txsize_lookup[bsize],