Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions av2/encoder/rdopt.c
Original file line number Diff line number Diff line change
Expand Up @@ -8999,10 +8999,19 @@ static void av2_evaluate_intra_modes_in_inter_frame(
av2_nn_softmax(scores, probs, 2);

if (probs[1] > 0.8) search_state->intra_search_state.skip_intra_modes = 1;
} else if ((search_state->best_mbmode
.skip_txfm[xd->tree_type == CHROMA_PART]) &&
(sf->intra_sf.skip_intra_in_interframe >= 2)) {
search_state->intra_search_state.skip_intra_modes = 1;
} else if (search_state->best_mbmode
.skip_txfm[xd->tree_type == CHROMA_PART]) {
if (sf->intra_sf.skip_intra_in_interframe == 1 &&
cpi->oxcf.mode == REALTIME) {
const int num_pixels = block_size_wide[bsize] * block_size_high[bsize];
const int shift = (xd->bd - 8) * 2;
const int64_t dist_thresh = ((int64_t)num_pixels * 5000) << shift;
if (rd_cost->dist <= dist_thresh) {
search_state->intra_search_state.skip_intra_modes = 1;
}
} else if (sf->intra_sf.skip_intra_in_interframe >= 2) {
search_state->intra_search_state.skip_intra_modes = 1;
}
}
}

Expand Down Expand Up @@ -9035,6 +9044,7 @@ static void av2_evaluate_intra_modes_in_inter_frame(
search_state->intra_search_state.dir_mode_skip_mask_ready = 1;
}
}

for (int dpcm_idx = 0; dpcm_idx < dpcm_loop_num; dpcm_idx++) {
// Dry pass: cap DPCM index.
if (apply_dry_pass_shortcuts && dpcm_idx > dry_pass_cfg->intra_dpcm_cap)
Expand Down Expand Up @@ -9079,7 +9089,10 @@ static void av2_evaluate_intra_modes_in_inter_frame(
mode_idx >= AVMMIN((int)mbmi->num_y_intra_mpm,
dry_pass_cfg->intra_mpm_cap))
break;
if (sf->rt_sf.use_only_dc_intra_interframe && mode_idx != DC_PRED)
if ((sf->rt_sf.prune_intra_mode_in_interframe == 2 ||
(sf->rt_sf.prune_intra_mode_in_interframe == 1 &&
bsize > BLOCK_16X16)) &&
mode_idx != DC_PRED)
continue;
if (sf->intra_sf.skip_intra_in_interframe &&
search_state->intra_search_state.skip_intra_modes)
Expand All @@ -9088,6 +9101,12 @@ static void av2_evaluate_intra_modes_in_inter_frame(
mbmi->joint_y_mode_delta_angle = mbmi->y_intra_mode_list[mode_idx];
av2_set_y_mode_and_delta_angle(mbmi->joint_y_mode_delta_angle,
mbmi);
if (sf->rt_sf.prune_intra_mode_in_interframe == 1) {
if (mbmi->mode != DC_PRED && mbmi->mode != V_PRED &&
mbmi->mode != H_PRED)
continue;
if (mbmi->angle_delta[PLANE_TYPE_Y] != 0) continue;
}
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 ||
Expand Down
9 changes: 7 additions & 2 deletions av2/encoder/speed_features.c
Original file line number Diff line number Diff line change
Expand Up @@ -779,11 +779,16 @@ static void set_rt_speed_features_framesize_independent(
sf->part_sf.partition_search_type = VAR_BASED_PARTITION;
sf->rd_sf.tx_domain_dist_thres_level = 2;
sf->rt_sf.use_nonrd_partition = 1;
sf->rt_sf.use_only_dc_intra_interframe = true;
sf->rt_sf.source_metrics_sb = 1;
sf->winner_mode_sf.tx_size_search_level = USE_FAST_RD;
sf->tx_sf.restrict_tx_partition_type_search = 3;
sf->tx_sf.enable_tx_partition = true;
sf->intra_sf.skip_intra_in_interframe = 2;
sf->rt_sf.prune_intra_mode_in_interframe = 2;
if (cpi->oxcf.tune_cfg.content == AVM_CONTENT_SCREEN) {
sf->intra_sf.skip_intra_in_interframe = 1;
sf->rt_sf.prune_intra_mode_in_interframe = 1;
}
}
}

Expand Down Expand Up @@ -1113,7 +1118,7 @@ static AVM_INLINE void init_lc_sf(LC_DEC_SPEED_FEATURES *lc_sf) {

static AVM_INLINE void init_rt_sf(REALTIME_SPEED_FEATURES *rt_sf) {
rt_sf->use_nonrd_partition = 0;
rt_sf->use_only_dc_intra_interframe = false;
rt_sf->prune_intra_mode_in_interframe = 0;
rt_sf->source_metrics_sb = 0;
}

Expand Down
7 changes: 5 additions & 2 deletions av2/encoder/speed_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -1100,8 +1100,11 @@ typedef struct REALTIME_SPEED_FEATURES {
// Use non-rd partition instead of rd partition.
int use_nonrd_partition;

// Flag to disable all but DC intra mode for inter frame prediction.
bool use_only_dc_intra_interframe;
// Prune intra mode search in inter frames:
// 0: Search all intra modes
// 1: Test only DC, V, and H modes
// 2: Test only DC mode
int prune_intra_mode_in_interframe;

// Compute source sad metrics for superblock.
int source_metrics_sb;
Expand Down
Loading