Add encoder flags to use dct only for inter/inrta
Change-Id: I98fa7db33ed0971b9d3b8f3f907e2fd303bcd479
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 223e7c3..fc0f233 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -973,6 +973,12 @@
/*!\brief Control to use a reduced tx type set */
AV1E_SET_REDUCED_TX_TYPE_SET,
+ /*!\brief Control to use dct only for intra modes */
+ AV1E_SET_INTRA_DCT_ONLY,
+
+ /*!\brief Control to use dct only for inter modes */
+ AV1E_SET_INTER_DCT_ONLY,
+
/*!\brief Control to use adaptive quantize_b */
AV1E_SET_QUANT_B_ADAPT,
@@ -1357,6 +1363,12 @@
AOM_CTRL_USE_TYPE(AV1E_SET_REDUCED_TX_TYPE_SET, unsigned int)
#define AOM_CTRL_AV1E_SET_REDUCED_TX_TYPE_SET
+AOM_CTRL_USE_TYPE(AV1E_SET_INTRA_DCT_ONLY, unsigned int)
+#define AOM_CTRL_AV1E_SET_INTRA_DCT_ONLY
+
+AOM_CTRL_USE_TYPE(AV1E_SET_INTER_DCT_ONLY, unsigned int)
+#define AOM_CTRL_AV1E_SET_INTER_DCT_ONLY
+
AOM_CTRL_USE_TYPE(AV1E_SET_QUANT_B_ADAPT, unsigned int)
#define AOM_CTRL_AV1E_SET_QUANT_B_ADAPT
diff --git a/apps/aomenc.c b/apps/aomenc.c
index 39a2ffc..974788e 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -532,6 +532,10 @@
NULL, "qm-max", 1, "Max quant matrix flatness (0..15), default is 15");
static const arg_def_t reduced_tx_type_set = ARG_DEF(
NULL, "reduced-tx-type-set", 1, "Use reduced set of transform types");
+static const arg_def_t use_intra_dct_only =
+ ARG_DEF(NULL, "use-intra-dct-only", 1, "Use DCT only for INTRA modes");
+static const arg_def_t use_inter_dct_only =
+ ARG_DEF(NULL, "use-inter-dct-only", 1, "Use DCT only for INTER modes");
static const arg_def_t quant_b_adapt =
ARG_DEF(NULL, "quant-b-adapt", 1, "Use adaptive quantize_b");
#if CONFIG_DIST_8X8
@@ -757,6 +761,8 @@
&qm_min,
&qm_max,
&reduced_tx_type_set,
+ &use_intra_dct_only,
+ &use_inter_dct_only,
&quant_b_adapt,
#if CONFIG_DIST_8X8
&enable_dist_8x8,
@@ -841,6 +847,8 @@
AV1E_SET_QM_MIN,
AV1E_SET_QM_MAX,
AV1E_SET_REDUCED_TX_TYPE_SET,
+ AV1E_SET_INTRA_DCT_ONLY,
+ AV1E_SET_INTER_DCT_ONLY,
AV1E_SET_QUANT_B_ADAPT,
#if CONFIG_DIST_8X8
AV1E_SET_ENABLE_DIST_8X8,
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index e15209e..199ef0a 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -125,6 +125,8 @@
unsigned int chroma_subsampling_x;
unsigned int chroma_subsampling_y;
int reduced_tx_type_set;
+ int use_intra_dct_only;
+ int use_inter_dct_only;
int quant_b_adapt;
};
@@ -220,6 +222,8 @@
0, // chroma_subsampling_x
0, // chroma_subsampling_y
0, // reduced_tx_type_set
+ 0, // use_intra_dct_only
+ 0, // use_inter_dct_only
0, // quant_b_adapt
};
@@ -577,6 +581,8 @@
oxcf->qm_minlevel = extra_cfg->qm_min;
oxcf->qm_maxlevel = extra_cfg->qm_max;
oxcf->reduced_tx_type_set = extra_cfg->reduced_tx_type_set;
+ oxcf->use_intra_dct_only = extra_cfg->use_intra_dct_only;
+ oxcf->use_inter_dct_only = extra_cfg->use_inter_dct_only;
oxcf->quant_b_adapt = extra_cfg->quant_b_adapt;
#if CONFIG_DIST_8X8
oxcf->using_dist_8x8 = extra_cfg->enable_dist_8x8;
@@ -1311,6 +1317,20 @@
return update_extra_cfg(ctx, &extra_cfg);
}
+static aom_codec_err_t ctrl_set_intra_dct_only(aom_codec_alg_priv_t *ctx,
+ va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.use_intra_dct_only = CAST(AV1E_SET_INTRA_DCT_ONLY, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
+static aom_codec_err_t ctrl_set_inter_dct_only(aom_codec_alg_priv_t *ctx,
+ va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.use_inter_dct_only = CAST(AV1E_SET_INTER_DCT_ONLY, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
static aom_codec_err_t ctrl_set_quant_b_adapt(aom_codec_alg_priv_t *ctx,
va_list args) {
struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -2038,6 +2058,8 @@
{ AV1E_SET_ENABLE_ANGLE_DELTA, ctrl_set_enable_angle_delta },
{ AV1E_SET_AQ_MODE, ctrl_set_aq_mode },
{ AV1E_SET_REDUCED_TX_TYPE_SET, ctrl_set_reduced_tx_type_set },
+ { AV1E_SET_INTRA_DCT_ONLY, ctrl_set_intra_dct_only },
+ { AV1E_SET_INTER_DCT_ONLY, ctrl_set_inter_dct_only },
{ AV1E_SET_QUANT_B_ADAPT, ctrl_set_quant_b_adapt },
{ AV1E_SET_DELTAQ_MODE, ctrl_set_deltaq_mode },
{ AV1E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost },
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f7abda7..2b4ef11 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -358,6 +358,8 @@
unsigned int chroma_subsampling_x;
unsigned int chroma_subsampling_y;
int reduced_tx_type_set;
+ int use_intra_dct_only;
+ int use_inter_dct_only;
int quant_b_adapt;
int border_in_pixels;
} AV1EncoderConfig;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index d457048..8f56bd2 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1907,7 +1907,13 @@
x->tx_search_prune[tx_set_type] = 0;
x->tx_split_prune_flag = 0;
const MB_MODE_INFO *mbmi = xd->mi[0];
- if (!is_inter_block(mbmi) || cpi->sf.tx_type_search.prune_mode == NO_PRUNE ||
+ const int is_inter = is_inter_block(mbmi);
+ if ((is_inter && cpi->oxcf.use_inter_dct_only) ||
+ (!is_inter && cpi->oxcf.use_intra_dct_only)) {
+ x->tx_search_prune[tx_set_type] = ~(1 << DCT_DCT);
+ return;
+ }
+ if (!is_inter || cpi->sf.tx_type_search.prune_mode == NO_PRUNE ||
x->use_default_inter_tx_type || xd->lossless[mbmi->segment_id] ||
x->cb_partition_scan)
return;
@@ -3113,7 +3119,9 @@
}
const uint16_t ext_tx_used_flag = av1_ext_tx_used_flag[tx_set_type];
if (xd->lossless[mbmi->segment_id] || txsize_sqr_up_map[tx_size] > TX_32X32 ||
- ext_tx_used_flag == 0x0001) {
+ ext_tx_used_flag == 0x0001 ||
+ (is_inter && cpi->oxcf.use_inter_dct_only) ||
+ (!is_inter && cpi->oxcf.use_intra_dct_only)) {
txk_start = txk_end = DCT_DCT;
}
uint16_t allowed_tx_mask = 0; // 1: allow; 0: skip.