Add encoder options for cost update frequency Two new paramters are added that allow selecting costing update frequencies at the encoder side for coefficeint and mode/mv costs to SB level (0), SB row level in tile (1) and Tile level (2): --mode-cost-upd-freq=<n> --coeff-cost-upd-freq=<n> where n = 0, 1, 2. Change-Id: I98d648064b535648bde5cc2effbbcf28e8a2156c
diff --git a/aom/aomcx.h b/aom/aomcx.h index ec5455a..37c9ea4 100644 --- a/aom/aomcx.h +++ b/aom/aomcx.h
@@ -990,6 +990,22 @@ /*!\brief Control to select maximum reference frames allowed per frame * (valid values: 3 - 7) */ AV1E_SET_MAX_REFERENCE_FRAMES, + + /*!\brief Control to set frequency of the cost updates for coefficients + * Possible values are: + * 0: Update at SB level (default) + * 1: Update at SB row level in tile + * 2: Update at tile level + */ + AV1E_SET_COEFF_COST_UPD_FREQ, + + /*!\brief Control to set frequency of the cost updates for mode + * Possible values are: + * 0: Update at SB level (default) + * 1: Update at SB row level in tile + * 2: Update at tile level + */ + AV1E_SET_MODE_COST_UPD_FREQ, }; /*!\brief aom 1-D scaling mode @@ -1379,6 +1395,12 @@ AOM_CTRL_USE_TYPE(AV1E_SET_MAX_REFERENCE_FRAMES, unsigned int) #define AOM_CTRL_AV1E_SET_MAX_REFERENCE_FRAMES +AOM_CTRL_USE_TYPE(AV1E_SET_COEFF_COST_UPD_FREQ, unsigned int) +#define AOM_CTRL_AV1E_SET_COEFF_COST_UPD_FREQ + +AOM_CTRL_USE_TYPE(AV1E_SET_MODE_COST_UPD_FREQ, unsigned int) +#define AOM_CTRL_AV1E_SET_MODE_COST_UPD_FREQ + /*!\endcond */ /*! @} - end defgroup aom_encoder */ #ifdef __cplusplus
diff --git a/apps/aomenc.c b/apps/aomenc.c index 2574477..6efe123 100644 --- a/apps/aomenc.c +++ b/apps/aomenc.c
@@ -541,6 +541,14 @@ 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"); +static const arg_def_t coeff_cost_upd_freq = + ARG_DEF(NULL, "coeff-cost-upd-freq", 1, + "Update freq for coeff costs" + "0: SB, 1: SB Row per Tile, 2: Tile"); +static const arg_def_t mode_cost_upd_freq = + ARG_DEF(NULL, "mode-cost-upd-freq", 1, + "Update freq for mode costs" + "0: SB, 1: SB Row per Tile, 2: Tile"); #if CONFIG_DIST_8X8 static const arg_def_t enable_dist_8x8 = ARG_DEF(NULL, "enable-dist-8x8", 1, @@ -767,6 +775,8 @@ &use_intra_dct_only, &use_inter_dct_only, &quant_b_adapt, + &coeff_cost_upd_freq, + &mode_cost_upd_freq, #if CONFIG_DIST_8X8 &enable_dist_8x8, #endif @@ -853,6 +863,8 @@ AV1E_SET_INTRA_DCT_ONLY, AV1E_SET_INTER_DCT_ONLY, AV1E_SET_QUANT_B_ADAPT, + AV1E_SET_COEFF_COST_UPD_FREQ, + AV1E_SET_MODE_COST_UPD_FREQ, #if CONFIG_DIST_8X8 AV1E_SET_ENABLE_DIST_8X8, #endif
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c index 987a478..0b6b61c 100644 --- a/av1/av1_cx_iface.c +++ b/av1/av1_cx_iface.c
@@ -127,6 +127,8 @@ int use_intra_dct_only; int use_inter_dct_only; int quant_b_adapt; + COST_UPDATE_TYPE coeff_cost_upd_freq; + COST_UPDATE_TYPE mode_cost_upd_freq; }; static struct av1_extracfg default_extra_cfg = { @@ -218,12 +220,14 @@ 0, // noise_level 32, // noise_block_size #endif - 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 + 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 + COST_UPD_SB, // coeff_cost_upd_freq + COST_UPD_SB, // mode_cost_upd_freq }; struct aom_codec_alg_priv { @@ -433,6 +437,8 @@ RANGE_CHECK_HI(extra_cfg, chroma_subsampling_y, 1); RANGE_CHECK_HI(extra_cfg, disable_trellis_quant, 2); + RANGE_CHECK(extra_cfg, coeff_cost_upd_freq, 0, 2); + RANGE_CHECK(extra_cfg, mode_cost_upd_freq, 0, 2); return AOM_CODEC_OK; } @@ -586,6 +592,8 @@ 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; + oxcf->coeff_cost_upd_freq = (COST_UPDATE_TYPE)extra_cfg->coeff_cost_upd_freq; + oxcf->mode_cost_upd_freq = (COST_UPDATE_TYPE)extra_cfg->mode_cost_upd_freq; #if CONFIG_DIST_8X8 oxcf->using_dist_8x8 = extra_cfg->enable_dist_8x8; if (extra_cfg->tuning == AOM_TUNE_CDEF_DIST || @@ -1333,6 +1341,20 @@ return update_extra_cfg(ctx, &extra_cfg); } +static aom_codec_err_t ctrl_set_coeff_cost_upd_freq(aom_codec_alg_priv_t *ctx, + va_list args) { + struct av1_extracfg extra_cfg = ctx->extra_cfg; + extra_cfg.coeff_cost_upd_freq = CAST(AV1E_SET_COEFF_COST_UPD_FREQ, args); + return update_extra_cfg(ctx, &extra_cfg); +} + +static aom_codec_err_t ctrl_set_mode_cost_upd_freq(aom_codec_alg_priv_t *ctx, + va_list args) { + struct av1_extracfg extra_cfg = ctx->extra_cfg; + extra_cfg.mode_cost_upd_freq = CAST(AV1E_SET_MODE_COST_UPD_FREQ, args); + return update_extra_cfg(ctx, &extra_cfg); +} + static aom_codec_err_t ctrl_set_film_grain_test_vector( aom_codec_alg_priv_t *ctx, va_list args) { struct av1_extracfg extra_cfg = ctx->extra_cfg; @@ -2057,6 +2079,8 @@ { 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_COEFF_COST_UPD_FREQ, ctrl_set_coeff_cost_upd_freq }, + { AV1E_SET_MODE_COST_UPD_FREQ, ctrl_set_mode_cost_upd_freq }, { AV1E_SET_DELTAQ_MODE, ctrl_set_deltaq_mode }, { AV1E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost }, { AV1E_SET_TUNE_CONTENT, ctrl_set_tune_content },
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 0ec8bf3..6f1a296 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -5735,8 +5735,32 @@ wt_left, wt_tr); } } - av1_fill_coeff_costs(&td->mb, xd->tile_ctx, num_planes); - av1_fill_mode_rates(cm, x, xd->tile_ctx); + + switch (cpi->oxcf.coeff_cost_upd_freq) { + case COST_UPD_TILE: // Tile level + if (mi_row != tile_info->mi_row_start) break; + AOM_FALLTHROUGH_INTENDED; + case COST_UPD_SBROW: // SB row level in tile + if (mi_col != tile_info->mi_col_start) break; + AOM_FALLTHROUGH_INTENDED; + case COST_UPD_SB: // SB level + av1_fill_coeff_costs(&td->mb, xd->tile_ctx, num_planes); + break; + default: assert(0); + } + + switch (cpi->oxcf.mode_cost_upd_freq) { + case COST_UPD_TILE: // Tile level + if (mi_row != tile_info->mi_row_start) break; + AOM_FALLTHROUGH_INTENDED; + case COST_UPD_SBROW: // SB row level in tile + if (mi_col != tile_info->mi_col_start) break; + AOM_FALLTHROUGH_INTENDED; + case COST_UPD_SB: // SB level + av1_fill_mode_rates(cm, x, xd->tile_ctx); + break; + default: assert(0); + } if (sf->adaptive_pred_interp_filter) { for (int i = 0; i < leaf_nodes; ++i) {
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index 9050a89..bccaa82 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -170,6 +170,12 @@ int base_qindex; } TplDepFrame; +typedef enum { + COST_UPD_SB, + COST_UPD_SBROW, + COST_UPD_TILE, +} COST_UPDATE_TYPE; + #define TPL_DEP_COST_SCALE_LOG2 4 typedef struct AV1EncoderConfig { @@ -378,6 +384,8 @@ int use_intra_dct_only; int use_inter_dct_only; int quant_b_adapt; + COST_UPDATE_TYPE coeff_cost_upd_freq; + COST_UPDATE_TYPE mode_cost_upd_freq; int border_in_pixels; } AV1EncoderConfig;