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