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