Group intra mode config params in AV1EncoderConfig This CL groups together the configuration parameters for intra mode in AV1EncoderConfig to new struct IntraModeCfg, changes datatypes of flags to bool, and adds relevant documentation. BUG=aomedia:2701 Change-Id: I84b116ee6cb91dbffe89d59aa56c0cc5649e8ea8
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c index 31fe3bb..d2ba973 100644 --- a/av1/av1_cx_iface.c +++ b/av1/av1_cx_iface.c
@@ -708,6 +708,8 @@ update_default_encoder_config(&cfg->encoder_cfg, extra_cfg); } + IntraModeCfg *const intra_mode_cfg = &oxcf->intra_mode_cfg; + const int is_vbr = cfg->rc_end_usage == AOM_VBR; oxcf->profile = cfg->g_profile; oxcf->fwd_kf_enabled = cfg->fwd_kf_enabled; @@ -787,7 +789,6 @@ oxcf->enable_overlay = extra_cfg->enable_overlay; oxcf->enable_palette = extra_cfg->enable_palette; oxcf->enable_intrabc = extra_cfg->enable_intrabc; - oxcf->enable_angle_delta = extra_cfg->enable_angle_delta; oxcf->disable_trellis_quant = extra_cfg->disable_trellis_quant; oxcf->allow_ref_frame_mvs = extra_cfg->enable_ref_frame_mvs; oxcf->using_qm = extra_cfg->enable_qm; @@ -929,7 +930,6 @@ oxcf->enable_1to4_partitions = extra_cfg->enable_1to4_partitions; oxcf->min_partition_size = extra_cfg->min_partition_size; oxcf->max_partition_size = extra_cfg->max_partition_size; - oxcf->enable_intra_edge_filter = extra_cfg->enable_intra_edge_filter; oxcf->enable_tx64 = extra_cfg->enable_tx64; oxcf->enable_flip_idtx = extra_cfg->enable_flip_idtx; oxcf->enable_order_hint = extra_cfg->enable_order_hint; @@ -957,10 +957,15 @@ (cfg->g_usage == AOM_USAGE_REALTIME) ? 0 : (extra_cfg->allow_warped_motion & extra_cfg->enable_warped_motion); - oxcf->enable_filter_intra = extra_cfg->enable_filter_intra; - oxcf->enable_smooth_intra = extra_cfg->enable_smooth_intra; - oxcf->enable_paeth_intra = extra_cfg->enable_paeth_intra; - oxcf->enable_cfl_intra = extra_cfg->enable_cfl_intra; + + // Set intra mode configuration. + intra_mode_cfg->enable_angle_delta = extra_cfg->enable_angle_delta; + intra_mode_cfg->enable_intra_edge_filter = + extra_cfg->enable_intra_edge_filter; + intra_mode_cfg->enable_filter_intra = extra_cfg->enable_filter_intra; + intra_mode_cfg->enable_smooth_intra = extra_cfg->enable_smooth_intra; + intra_mode_cfg->enable_paeth_intra = extra_cfg->enable_paeth_intra; + intra_mode_cfg->enable_cfl_intra = extra_cfg->enable_cfl_intra; oxcf->enable_superres = (oxcf->superres_mode != AOM_SUPERRES_NONE) && extra_cfg->enable_superres;
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c index ce11b08..6025797 100644 --- a/av1/encoder/compound_type.c +++ b/av1/encoder/compound_type.c
@@ -595,7 +595,7 @@ int64_t best_interintra_rd = INT64_MAX; for (INTERINTRA_MODE cur_mode = 0; cur_mode < INTERINTRA_MODES; ++cur_mode) { - if ((!cpi->oxcf.enable_smooth_intra || + if ((!cpi->oxcf.intra_mode_cfg.enable_smooth_intra || cpi->sf.intra_sf.disable_smooth_intra) && cur_mode == II_SMOOTH_PRED) continue;
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index e223942..6d29675 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -5502,7 +5502,8 @@ av1_init_above_context(&cm->above_contexts, av1_num_planes(cm), tile_row, &td->mb.e_mbd); - if (cpi->oxcf.enable_cfl_intra) cfl_init(&td->mb.e_mbd.cfl, &cm->seq_params); + if (cpi->oxcf.intra_mode_cfg.enable_cfl_intra) + cfl_init(&td->mb.e_mbd.cfl, &cm->seq_params); av1_crc32c_calculator_init( &td->mb.txfm_search_info.mb_rd_record.crc_calculator);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index 0bda0ce..cebff7a5 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c
@@ -1346,8 +1346,8 @@ seq->enable_warped_motion = oxcf->enable_warped_motion; seq->enable_interintra_compound = oxcf->enable_interintra_comp; seq->enable_masked_compound = oxcf->enable_masked_comp; - seq->enable_intra_edge_filter = oxcf->enable_intra_edge_filter; - seq->enable_filter_intra = oxcf->enable_filter_intra; + seq->enable_intra_edge_filter = oxcf->intra_mode_cfg.enable_intra_edge_filter; + seq->enable_filter_intra = oxcf->intra_mode_cfg.enable_filter_intra; set_bitstream_level_tier(seq, cm, oxcf);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index 7c548fb..16c9885 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -254,6 +254,23 @@ #define TPL_DEP_COST_SCALE_LOG2 4 +typedef struct { + // Flag to indicate if intra edge filtering process should be enabled. + bool enable_intra_edge_filter; + // Flag to indicate if recursive filtering based intra prediction should be + // enabled. + bool enable_filter_intra; + // Flag to indicate if smooth intra prediction modes should be enabled. + bool enable_smooth_intra; + // Flag to indicate if PAETH intra prediction mode should be enabled. + bool enable_paeth_intra; + // Flag to indicate if CFL uv intra mode should be enabled. + bool enable_cfl_intra; + // Flag to indicate if delta angles for directional intra prediction should be + // enabled. + bool enable_angle_delta; +} IntraModeCfg; + typedef struct AV1EncoderConfig { BITSTREAM_PROFILE profile; aom_bit_depth_t bit_depth; // Codec bit-depth. @@ -429,7 +446,6 @@ int enable_1to4_partitions; int min_partition_size; int max_partition_size; - int enable_intra_edge_filter; int enable_tx64; int enable_flip_idtx; int enable_order_hint; @@ -448,17 +464,15 @@ int enable_global_motion; int enable_warped_motion; int allow_warped_motion; - int enable_filter_intra; - int enable_smooth_intra; - int enable_paeth_intra; - int enable_cfl_intra; int enable_superres; int enable_overlay; int enable_palette; int enable_intrabc; - int enable_angle_delta; unsigned int save_as_annexb; + // Flags related to intra mode search. + IntraModeCfg intra_mode_cfg; + #if CONFIG_DENOISE float noise_level; int noise_block_size;
diff --git a/av1/encoder/intra_mode_search.c b/av1/encoder/intra_mode_search.c index c99841c..52d3c34 100644 --- a/av1/encoder/intra_mode_search.c +++ b/av1/encoder/intra_mode_search.c
@@ -1339,7 +1339,7 @@ const BLOCK_SIZE plane_bsize = get_plane_block_size(mbmi->sb_type, pd->subsampling_x, pd->subsampling_y); - assert(is_cfl_allowed(xd) && cpi->oxcf.enable_cfl_intra); + assert(is_cfl_allowed(xd) && cpi->oxcf.intra_mode_cfg.enable_cfl_intra); assert(plane_bsize < BLOCK_SIZES_ALL); if (!xd->lossless[mbmi->segment_id]) { assert(block_size_wide[plane_bsize] == tx_size_wide[tx_size]); @@ -1463,6 +1463,7 @@ MB_MODE_INFO best_mbmi = *mbmi; int64_t best_rd = INT64_MAX, this_rd; const ModeCosts *mode_costs = &x->mode_costs; + const IntraModeCfg *const intra_mode_cfg = &cpi->oxcf.intra_mode_cfg; for (int mode_idx = 0; mode_idx < UV_INTRA_MODES; ++mode_idx) { int this_rate; @@ -1472,16 +1473,16 @@ if (!(cpi->sf.intra_sf.intra_uv_mode_mask[txsize_sqr_up_map[max_tx_size]] & (1 << mode))) continue; - if (!cpi->oxcf.enable_smooth_intra && mode >= UV_SMOOTH_PRED && + if (!intra_mode_cfg->enable_smooth_intra && mode >= UV_SMOOTH_PRED && mode <= UV_SMOOTH_H_PRED) continue; - if (!cpi->oxcf.enable_paeth_intra && mode == UV_PAETH_PRED) continue; + if (!intra_mode_cfg->enable_paeth_intra && mode == UV_PAETH_PRED) continue; mbmi->uv_mode = mode; int cfl_alpha_rate = 0; if (mode == UV_CFL_PRED) { - if (!is_cfl_allowed(xd) || !cpi->oxcf.enable_cfl_intra) continue; + if (!is_cfl_allowed(xd) || !intra_mode_cfg->enable_cfl_intra) continue; assert(!is_directional_mode); const TX_SIZE uv_tx_size = av1_get_tx_size(AOM_PLANE_U, xd); cfl_alpha_rate = cfl_rd_pick_alpha(x, cpi, uv_tx_size, best_rd); @@ -1489,7 +1490,7 @@ } mbmi->angle_delta[PLANE_TYPE_UV] = 0; if (is_directional_mode && av1_use_angle_delta(mbmi->sb_type) && - cpi->oxcf.enable_angle_delta) { + intra_mode_cfg->enable_angle_delta) { const int rate_overhead = mode_costs->intra_uv_mode_cost[is_cfl_allowed(xd)][mbmi->mode][mode]; if (!rd_pick_intra_angle_sbuv(cpi, x, bsize, rate_overhead, best_rd, @@ -1506,7 +1507,7 @@ this_rate = tokenonly_rd_stats.rate + intra_mode_info_cost_uv(cpi, x, mbmi, bsize, mode_cost); if (mode == UV_CFL_PRED) { - assert(is_cfl_allowed(xd) && cpi->oxcf.enable_cfl_intra); + assert(is_cfl_allowed(xd) && intra_mode_cfg->enable_cfl_intra); #if CONFIG_DEBUG if (!xd->lossless[mbmi->segment_id]) assert(xd->cfl.rate == tokenonly_rd_stats.rate + mode_cost); @@ -1776,7 +1777,7 @@ const int is_directional_mode = av1_is_directional_mode(mode); if (is_directional_mode && av1_use_angle_delta(bsize) && - cpi->oxcf.enable_angle_delta) { + cpi->oxcf.intra_mode_cfg.enable_angle_delta) { if (sf->intra_sf.intra_pruning_with_hog && !intra_search_state->angle_stats_ready) { prune_intra_mode_with_hog(x, bsize, @@ -2016,12 +2017,14 @@ int this_rate, this_rate_tokenonly, s; int64_t this_distortion, this_rd; mbmi->mode = intra_rd_search_mode_order[mode_idx]; - if ((!cpi->oxcf.enable_smooth_intra || + if ((!cpi->oxcf.intra_mode_cfg.enable_smooth_intra || cpi->sf.intra_sf.disable_smooth_intra) && (mbmi->mode == SMOOTH_PRED || mbmi->mode == SMOOTH_H_PRED || mbmi->mode == SMOOTH_V_PRED)) continue; - if (!cpi->oxcf.enable_paeth_intra && mbmi->mode == PAETH_PRED) continue; + if (!cpi->oxcf.intra_mode_cfg.enable_paeth_intra && + mbmi->mode == PAETH_PRED) + continue; mbmi->angle_delta[PLANE_TYPE_Y] = 0; if (model_intra_yrd_and_prune(cpi, x, bsize, bmode_costs[mbmi->mode], @@ -2032,7 +2035,7 @@ is_directional_mode = av1_is_directional_mode(mbmi->mode); if (is_directional_mode && directional_mode_skip_mask[mbmi->mode]) continue; if (is_directional_mode && av1_use_angle_delta(bsize) && - cpi->oxcf.enable_angle_delta) { + cpi->oxcf.intra_mode_cfg.enable_angle_delta) { this_rd_stats.rate = INT_MAX; rd_pick_intra_angle_sby(cpi, x, &this_rate, &this_rd_stats, bsize, bmode_costs[mbmi->mode], best_rd, &best_model_rd,
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index ef1e222..ca098df 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -4524,11 +4524,14 @@ // Speed features to prune out INTRA frames if (ref_frame == INTRA_FRAME) { - if ((!cpi->oxcf.enable_smooth_intra || sf->intra_sf.disable_smooth_intra) && + if ((!cpi->oxcf.intra_mode_cfg.enable_smooth_intra || + sf->intra_sf.disable_smooth_intra) && (mbmi->mode == SMOOTH_PRED || mbmi->mode == SMOOTH_H_PRED || mbmi->mode == SMOOTH_V_PRED)) return 1; - if (!cpi->oxcf.enable_paeth_intra && mbmi->mode == PAETH_PRED) return 1; + if (!cpi->oxcf.intra_mode_cfg.enable_paeth_intra && + mbmi->mode == PAETH_PRED) + return 1; if (sf->inter_sf.adaptive_mode_search > 1) if ((x->source_variance << num_pels_log2_lookup[bsize]) > args->search_state->best_pred_sse)