Simplify tx_mode frame level bit

Adds a new experiment to simplify the tx_mode symbol.

The existing frame level tx_mode information is converted to a single bit
to select between largest tx_size for a prediction unit or specified
at the block level. The less useful modes: ALLOW_8X8, ALLOW_16X16,
etc. are removed.

Change-Id: Ib9358e17b0158a167eb4edef79f36ff113aa56e1
diff --git a/av1/common/common_data.h b/av1/common/common_data.h
index 54738f9..ab8f25e 100644
--- a/av1/common/common_data.h
+++ b/av1/common/common_data.h
@@ -1064,6 +1064,18 @@
 };
 
 /* clang-format off */
+#if CONFIG_SIMPLIFY_TX_MODE
+static const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES] = {
+  TX_4X4,    // ONLY_4X4
+#if CONFIG_TX64X64
+  TX_64X64,  // TX_MODE_LARGEST
+  TX_64X64,  // TX_MODE_SELECT
+#else
+  TX_32X32,  // TX_MODE_LARGEST
+  TX_32X32,  // TX_MODE_SELECT
+#endif  // CONFIG_TX64X64
+};
+#else
 static const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES] = {
   TX_4X4,    // ONLY_4X4
   TX_8X8,    // ALLOW_8X8
@@ -1071,11 +1083,12 @@
   TX_32X32,  // ALLOW_32X32
 #if CONFIG_TX64X64
   TX_64X64,  // ALLOW_64X64
-  TX_64X64,  // TX_MODE_SELECT
+  TX_64X64,  // TX_MODE_LARGEST
 #else
   TX_32X32,  // TX_MODE_SELECT
 #endif  // CONFIG_TX64X64
 };
+#endif  // CONFIG_SIMPLIFY_TX_MODE
 /* clang-format on */
 
 static const BLOCK_SIZE ss_size_lookup[BLOCK_SIZES_ALL][2][2] = {
diff --git a/av1/common/enums.h b/av1/common/enums.h
index 468f786..2dcb23f 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -281,17 +281,28 @@
 #endif  // CONFIG_NCOBMC_ADAPT_WEIGHT
 
 // frame transform mode
+#if CONFIG_SIMPLIFY_TX_MODE
 typedef enum ATTRIBUTE_PACKED {
-  ONLY_4X4,     // only 4x4 transform used
-  ALLOW_8X8,    // allow block transform size up to 8x8
-  ALLOW_16X16,  // allow block transform size up to 16x16
-  ALLOW_32X32,  // allow block transform size up to 32x32
+  ONLY_4X4,         // use only 4x4 transform
+  TX_MODE_LARGEST,  // transform size is the largest possible for pu size
+  TX_MODE_SELECT,   // transform specified for each block
+  TX_MODES,
+} TX_MODE;
+
+#else
+
+typedef enum ATTRIBUTE_PACKED {
+  ONLY_4X4,        // only 4x4 transform used
+  ALLOW_8X8,       // allow block transform size up to 8x8
+  ALLOW_16X16,     // allow block transform size up to 16x16
+  ALLOW_32X32,     // allow block transform size up to 32x32
 #if CONFIG_TX64X64
-  ALLOW_64X64,  // allow block transform size up to 64x64
+  ALLOW_64X64,     // allow block transform size up to 64x64
 #endif
   TX_MODE_SELECT,  // transform specified for each block
   TX_MODES,
 } TX_MODE;
+#endif  // CONFIG_SIMPLIFY_TX_MODE
 
 // 1D tx types
 typedef enum ATTRIBUTE_PACKED {
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 4c4254b..73a38b7 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -127,6 +127,17 @@
   return data > max ? max : data;
 }
 
+#if CONFIG_SIMPLIFY_TX_MODE
+static TX_MODE read_tx_mode(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) {
+  if (cm->all_lossless) return ONLY_4X4;
+#if CONFIG_VAR_TX_NO_TX_MODE
+  (void)rb;
+  return TX_MODE_SELECT;
+#else
+  return aom_rb_read_bit(rb) ? TX_MODE_SELECT : TX_MODE_LARGEST;
+#endif  // CONFIG_VAR_TX_NO_TX_MODE
+}
+#else
 static TX_MODE read_tx_mode(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) {
 #if CONFIG_TX64X64
   TX_MODE tx_mode;
@@ -145,6 +156,7 @@
 #endif  // CONFIG_TX64X64
 #endif  // CONFIG_VAR_TX_NO_TX_MODE
 }
+#endif  // CONFIG_SIMPLIFY_TX_MODE
 
 #if !CONFIG_NEW_MULTISYMBOL
 static void read_inter_mode_probs(FRAME_CONTEXT *fc, aom_reader *r) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index c227960..9a2b852 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2822,6 +2822,9 @@
   *mode = TX_MODE_SELECT;
   return;
 #else
+#if CONFIG_SIMPLIFY_TX_MODE
+  aom_wb_write_bit(wb, *mode == TX_MODE_SELECT);
+#else
 #if CONFIG_TX64X64
   aom_wb_write_bit(wb, *mode == TX_MODE_SELECT);
   if (*mode != TX_MODE_SELECT) {
@@ -2832,6 +2835,7 @@
   aom_wb_write_bit(wb, *mode == TX_MODE_SELECT);
   if (*mode != TX_MODE_SELECT) aom_wb_write_literal(wb, *mode, 2);
 #endif  // CONFIG_TX64X64
+#endif  // CONFIG_SIMPLIFY_TX_MODE
 #endif  // CONFIG_VAR_TX_NO_TX_MODE
 }
 
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 2b0ab77..b7da15a 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -3422,6 +3422,22 @@
     return LAST_FRAME;
 }
 
+#if CONFIG_SIMPLIFY_TX_MODE
+static TX_MODE select_tx_mode(const AV1_COMP *cpi) {
+  if (cpi->common.all_lossless) return ONLY_4X4;
+#if CONFIG_VAR_TX_NO_TX_MODE
+  return TX_MODE_SELECT;
+#else
+  if (cpi->sf.tx_size_search_method == USE_LARGESTALL)
+    return TX_MODE_LARGEST;
+  else if (cpi->sf.tx_size_search_method == USE_FULL_RD ||
+           cpi->sf.tx_size_search_method == USE_FAST_RD)
+    return TX_MODE_SELECT;
+  else
+    return cpi->common.tx_mode;
+#endif  // CONFIG_VAR_TX_NO_TX_MODE
+}
+#else
 static TX_MODE select_tx_mode(const AV1_COMP *cpi) {
   if (cpi->common.all_lossless) return ONLY_4X4;
 #if CONFIG_VAR_TX_NO_TX_MODE
@@ -3436,6 +3452,7 @@
     return cpi->common.tx_mode;
 #endif  // CONFIG_VAR_TX_NO_TX_MODE
 }
+#endif  // CONFIG_SIMPLIFY_TX_MODE
 
 void av1_init_tile_data(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
@@ -4156,7 +4173,11 @@
 #else
     if (cm->tx_mode == TX_MODE_SELECT && cpi->td.mb.txb_split_count == 0)
 #endif
+#if CONFIG_SIMPLIFY_TX_MODE
+      cm->tx_mode = TX_MODE_LARGEST;
+#else
       cm->tx_mode = ALLOW_32X32 + CONFIG_TX64X64;
+#endif  // CONFIG_SIMPLIFY_TX_MODE
   } else {
     make_consistent_compound_tools(cm);
     encode_frame_internal(cpi);
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index 332ca90..f6bb38b 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -189,6 +189,7 @@
 set(CONFIG_SEGMENT_GLOBALMV 0 CACHE NUMBER "AV1 experiment flag.")
 set(CONFIG_SHORT_FILTER 0 CACHE NUMBER "AV1 experiment flag.")
 set(CONFIG_SIMPLE_BWD_ADAPT 1 CACHE NUMBER "AV1 experiment flag.")
+set(CONFIG_SIMPLIFY_TX_MODE 0 CACHE NUMBER "AV1 experiment flag.")
 set(CONFIG_SMOOTH_HV 1 CACHE NUMBER "AV1 experiment flag.")
 set(CONFIG_STRIPED_LOOP_RESTORATION 1 CACHE NUMBER "AV1 experiment flag.")
 set(CONFIG_TEMPMV_SIGNALING 1 CACHE NUMBER "AV1 experiment flag.")
diff --git a/configure b/configure
index ce541ab..f056c6f 100755
--- a/configure
+++ b/configure
@@ -317,6 +317,7 @@
     ncobmc_adapt_weight
     bgsprite
     var_tx_no_tx_mode
+    simplify_tx_mode
     mrc_tx
     lpf_direct
     loopfilter_level