Skip intra modes in interframe prediction Skip remaining intra modes in rd search, when current intra_rd is 1.5 times worse than current best_rd. Performance: -0.01% Speed: 5% faster. Change-Id: I0265fe4618a23d676546b929cd5f694ce9a890f3
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index a6bb904..c6b0c16 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -9227,6 +9227,7 @@ int64_t mode_threshold[MAX_MODES]; int *mode_map = tile_data->mode_map[bsize]; const int mode_search_skip_flags = sf->mode_search_skip_flags; + int skip_intra_modes = 0; HandleInterModeArgs args = { { NULL }, { MAX_SB_SIZE, MAX_SB_SIZE, MAX_SB_SIZE }, @@ -9510,6 +9511,10 @@ second_ref_frame = av1_mode_order[mode_index].ref_frame[1]; mbmi->ref_mv_idx = 0; + if (ref_frame == INTRA_FRAME) { + if (sf->skip_intra_in_interframe && skip_intra_modes) continue; + } + if (sf->drop_ref) { if (ref_frame > INTRA_FRAME && second_ref_frame > INTRA_FRAME) { if (num_available_refs > 2) { @@ -10211,6 +10216,11 @@ best_intra_rd = this_rd; best_intra_mode = mbmi->mode; } + + if (sf->skip_intra_in_interframe) { + if (best_rd != INT64_MAX && this_rd > (best_rd + (best_rd >> 1))) + skip_intra_modes = 1; + } } if (!disable_skip && ref_frame == INTRA_FRAME) {
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index 2d19300..da52789 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -493,6 +493,7 @@ sf->disable_wedge_search_var_thresh = 0; sf->fast_wedge_sign_estimate = 0; sf->drop_ref = 0; + sf->skip_intra_in_interframe = 1; for (i = 0; i < TX_SIZES; i++) { sf->intra_y_mode_mask[i] = INTRA_ALL;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index dc7d08f..6a3ce90 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -538,6 +538,9 @@ // flag to drop some ref frames in compound motion search int drop_ref; + + // flag to allow skipping intra mode for inter frame prediction + int skip_intra_in_interframe; } SPEED_FEATURES; struct AV1_COMP;