CONFIG_IST_REDUCTION
Search only 4 IST sets at encoder
diff --git a/aom_dsp/txfm_common.h b/aom_dsp/txfm_common.h
index 5731e92..6a51664 100644
--- a/aom_dsp/txfm_common.h
+++ b/aom_dsp/txfm_common.h
@@ -28,6 +28,9 @@
// Primary transform set used for the current tx block.
TX_TYPE tx_type;
#if CONFIG_IST_SET_FLAG
+#if CONFIG_IST_REDUCTION
+ int sec_tx_set_idx;
+#endif // CONFIG_IST_REDUCTION
// for both forward and inverse secondary transforms
// Secondary transform set used for the current tx block.
TX_TYPE sec_tx_set;
diff --git a/av1/common/common_data.h b/av1/common/common_data.h
index 27e8476..047bca4 100644
--- a/av1/common/common_data.h
+++ b/av1/common/common_data.h
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (c) 2021, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
@@ -1014,6 +1014,28 @@
block_size_high[bsize1] > block_size_high[bsize2];
}
+#if CONFIG_IST_REDUCTION
+static const uint8_t ist_intra_stx_mapping[IST_DIR_SIZE][IST_DIR_SIZE] = {
+ { 6, 1, 0, 5, 4, 3, 2 }, // DC_PRED
+ { 1, 6, 0, 4, 2, 5, 3 }, // V_PRED, H_PRED, SMOOTH_V_PRED, SMOOTH_H_PRED
+ { 2, 6, 0, 5, 1, 4, 3 }, // D45_PRED
+ { 3, 4, 6, 1, 0, 2, 5 }, // D135_PRED
+ { 4, 1, 3, 6, 0, 5, 2 }, // D113_PRED, D157_PRED
+ { 5, 0, 6, 2, 1, 4, 3 }, // D203_PRED, D67_PRED
+ { 6, 1, 0, 5, 4, 3, 2 }, // SMOOTH_PRED
+};
+
+static const uint8_t inv_ist_intra_stx_mapping[IST_DIR_SIZE][IST_DIR_SIZE] = {
+ { 2, 1, 6, 5, 4, 3, 0 }, // DC_PRED
+ { 2, 0, 4, 6, 3, 5, 1 }, // V_PRED, H_PRED, SMOOTH_V_PRED, SMOOTH_H_PRED
+ { 2, 4, 0, 6, 5, 3, 1 }, // D45_PRED
+ { 4, 3, 5, 0, 1, 6, 2 }, // D135_PRED
+ { 4, 1, 6, 2, 0, 5, 3 }, // D113_PRED, D157_PRED
+ { 1, 4, 3, 6, 5, 0, 2 }, // D203_PRED, D67_PRED
+ { 2, 1, 6, 5, 4, 3, 0 }, // SMOOTH_PRED
+};
+#endif // CONFIG_IST_REDUCTION
+
#if CONFIG_INTRA_TX_IST_PARSE
// Mapping of IST kernel set to an index based on intra mode.
// The index will be signaled in the bitstream
diff --git a/av1/common/enums.h b/av1/common/enums.h
index 701a618..60eb51c 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -28,6 +28,11 @@
/*!\cond */
#undef MAX_SB_SIZE
+
+#if CONFIG_IST_REDUCTION
+#define IST_REDUCE_SET_SIZE 4
+#endif
+
#define BAWP_BUGFIX 1
#define ADJUST_SUPER_RES_Q 1
diff --git a/av1/common/idct.c b/av1/common/idct.c
index 72ff447..c55a804 100644
--- a/av1/common/idct.c
+++ b/av1/common/idct.c
@@ -431,6 +431,9 @@
txfm_param->tx_type = get_primary_tx_type(tx_type);
#if CONFIG_IST_SET_FLAG
txfm_param->sec_tx_set = 0;
+#if CONFIG_IST_REDUCTION
+ txfm_param->sec_tx_set_idx = 0;
+#endif // CONFIG_IST_REDUCTION
#endif // CONFIG_IST_SET_FLAG
txfm_param->sec_tx_type = 0;
txfm_param->intra_mode = get_intra_mode(mbmi, plane);
@@ -447,6 +450,17 @@
txfm_param->sec_tx_type = get_secondary_tx_type(tx_type);
#if CONFIG_IST_SET_FLAG
txfm_param->sec_tx_set = get_secondary_tx_set(tx_type);
+#if CONFIG_IST_REDUCTION
+ uint8_t intra_stx_mode = stx_transpose_mapping[txfm_param->intra_mode];
+ uint8_t stx_id;
+ if (txfm_param->tx_type == ADST_ADST) {
+ stx_id = txfm_param->sec_tx_set - IST_DIR_SIZE;
+ } else {
+ stx_id = txfm_param->sec_tx_set;
+ }
+ uint8_t stx_idx = inv_ist_intra_stx_mapping[intra_stx_mode][stx_id];
+ txfm_param->sec_tx_set_idx = stx_idx;
+#endif // CONFIG_IST_REDUCTION
#endif // CONFIG_IST_SET_FLAG
}
txfm_param->tx_size = tx_size;
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index e45ed98..f683a92 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -527,7 +527,12 @@
// per set) Set 0 ~ IST_DIR_SIZE-1 for DCT_DCT, and Set IST_DIR_SIZE ~
// IST_SET_SIZE-1 for ADST_ADST
if (txfm_param->sec_tx_type == 0 &&
- (txfm_param->sec_tx_set == 0 || txfm_param->sec_tx_set == IST_DIR_SIZE))
+#if CONFIG_IST_REDUCTION
+ txfm_param->sec_tx_set_idx == 0
+#else
+ (txfm_param->sec_tx_set == 0 || txfm_param->sec_tx_set == IST_DIR_SIZE)
+#endif // CONFIG_IST_REDUCTION
+ )
#else
if (txfm_param->sec_tx_type == 0)
#endif // CONFIG_IST_ANY_SET
@@ -649,6 +654,9 @@
txfm_param->tx_type = get_primary_tx_type(tx_type);
#if CONFIG_IST_SET_FLAG
txfm_param->sec_tx_set = 0;
+#if CONFIG_IST_REDUCTION
+ txfm_param->sec_tx_set_idx = 0;
+#endif // CONFIG_IST_REDUCTION
#endif // CONFIG_IST_SET_FLAG
txfm_param->sec_tx_type = 0;
txfm_param->intra_mode = get_intra_mode(mbmi, plane);
@@ -666,6 +674,17 @@
!(mbmi->fsc_mode[xd->tree_type == CHROMA_PART])) {
#if CONFIG_IST_SET_FLAG
txfm_param->sec_tx_set = get_secondary_tx_set(tx_type);
+#if CONFIG_IST_REDUCTION
+ uint8_t intra_stx_mode = stx_transpose_mapping[txfm_param->intra_mode];
+ uint8_t stx_id;
+ if (txfm_param->tx_type == ADST_ADST) {
+ stx_id = txfm_param->sec_tx_set - IST_DIR_SIZE;
+ } else {
+ stx_id = txfm_param->sec_tx_set;
+ }
+ uint8_t stx_idx = inv_ist_intra_stx_mapping[intra_stx_mode][stx_id];
+ txfm_param->sec_tx_set_idx = stx_idx;
+#endif // CONFIG_IST_REDUCTION
#endif // CONFIG_IST_SET_FLAG
txfm_param->sec_tx_type = get_secondary_tx_type(tx_type);
}
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c
index 260d98a..b4ad627 100644
--- a/av1/encoder/tx_search.c
+++ b/av1/encoder/tx_search.c
@@ -2843,15 +2843,37 @@
int max_set_id =
(skip_stx || is_inter_block(mbmi, xd->tree_type)) ? 1 : IST_DIR_SIZE;
#endif
+#if CONFIG_IST_REDUCTION
+ if (max_set_id == IST_DIR_SIZE) {
+ max_set_id = IST_REDUCE_SET_SIZE;
+ // if (txw <= 4 || txh <= 4){
+ // max_set_id = 1;
+ // }
+ }
+ for (int set_idx = init_set_id; set_idx < max_set_id; ++set_idx) {
+ txfm_param.sec_tx_set_idx = set_idx;
+ uint8_t set_id = set_idx;
+ if (!is_inter_block(mbmi, xd->tree_type)) {
+ const PREDICTION_MODE mode = AOMMIN(intra_mode, SMOOTH_H_PRED);
+ int intra_stx_mode = stx_transpose_mapping[mode];
+ assert(set_idx < IST_REDUCE_SET_SIZE);
+ set_id = ist_intra_stx_mapping[intra_stx_mode][set_idx];
+ }
+#else
// Iterate through all possible secondary tx sets for given primary tx type
for (int set_id = init_set_id; set_id < max_set_id; ++set_id) {
+#endif // CONFIG_IST_REDUCTION
#endif // CONFIG_IST_ANY_SET
const int max_stx = xd->enable_ist && !(eob_found) ? 4 : 1;
for (int stx = 0; stx < max_stx; ++stx) {
// Skip repeated evaluation of no secondary transform.
+#if CONFIG_IST_REDUCTION
+ if (set_idx && !stx) continue;
+#else
if (set_id && !stx) continue;
+#endif // CONFIG_IST_REDUCTION
#if CONFIG_IST_ANY_SET
TX_TYPE tx_type = primary_tx_type;
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index bc3d3de..62f8c11 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -159,6 +159,9 @@
#IST multiset for inter
set_aom_config_var(CONFIG_IST_INTER_MULTISET 1
"Enable multiset IST for inter TU.")
+#IST set reduction (non-normative)
+set_aom_config_var(CONFIG_IST_REDUCTION 1
+ "Use 4 sets for IST encoder search.")
# AV2 experiment flags.
set_aom_config_var(CONFIG_IMPROVEIDTX 1