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.