Skip redundant call to intra_model_yrd
Removed redundant intra_model_yrd calculation in
calc_rd_for_given_intra_angle()
Encode Time
Cpu-used Reduction(%)
1 0.32
2 0.29
3 0.71
4 0.44
Change-Id: I7732d7990ec6969c2f8c7653b22f2bd4490269a6
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 0f492c2..35ba214 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -4408,18 +4408,20 @@
int mi_col, int mode_cost, int64_t best_rd_in, int8_t angle_delta,
int max_angle_delta, int *rate, RD_STATS *rd_stats, int *best_angle_delta,
TX_SIZE *best_tx_size, int64_t *best_rd, int64_t *best_model_rd,
- TX_TYPE *best_txk_type, uint8_t *best_blk_skip) {
+ TX_TYPE *best_txk_type, uint8_t *best_blk_skip, int skip_model_rd) {
RD_STATS tokenonly_rd_stats;
int64_t this_rd, this_model_rd;
MB_MODE_INFO *mbmi = x->e_mbd.mi[0];
const int n4 = bsize_to_num_blk(bsize);
assert(!is_inter_block(mbmi));
mbmi->angle_delta[PLANE_TYPE_Y] = angle_delta;
- this_model_rd = intra_model_yrd(cpi, x, bsize, mode_cost, mi_row, mi_col);
- if (*best_model_rd != INT64_MAX &&
- this_model_rd > *best_model_rd + (*best_model_rd >> 1))
- return INT64_MAX;
- if (this_model_rd < *best_model_rd) *best_model_rd = this_model_rd;
+ if (!skip_model_rd) {
+ this_model_rd = intra_model_yrd(cpi, x, bsize, mode_cost, mi_row, mi_col);
+ if (*best_model_rd != INT64_MAX &&
+ this_model_rd > *best_model_rd + (*best_model_rd >> 1))
+ return INT64_MAX;
+ if (this_model_rd < *best_model_rd) *best_model_rd = this_model_rd;
+ }
super_block_yrd(cpi, x, &tokenonly_rd_stats, bsize, best_rd_in);
if (tokenonly_rd_stats.rate == INT_MAX) return INT64_MAX;
@@ -4449,7 +4451,8 @@
int mi_row, int mi_col, int *rate,
RD_STATS *rd_stats, BLOCK_SIZE bsize,
int mode_cost, int64_t best_rd,
- int64_t *best_model_rd) {
+ int64_t *best_model_rd,
+ int skip_model_rd_for_zero_deg) {
MB_MODE_INFO *mbmi = x->e_mbd.mi[0];
assert(!is_inter_block(mbmi));
@@ -4471,7 +4474,8 @@
cpi, x, bsize, mi_row, mi_col, mode_cost, best_rd_in,
(1 - 2 * i) * angle_delta, MAX_ANGLE_DELTA, rate, rd_stats,
&best_angle_delta, &best_tx_size, &best_rd, best_model_rd,
- best_txk_type, best_blk_skip);
+ best_txk_type, best_blk_skip,
+ (skip_model_rd_for_zero_deg & !angle_delta));
rd_cost[2 * angle_delta + i] = this_rd;
if (first_try && this_rd == INT64_MAX) return best_rd;
first_try = 0;
@@ -4491,11 +4495,11 @@
rd_cost[2 * (angle_delta - 1) + i] > rd_thresh)
skip_search = 1;
if (!skip_search) {
- calc_rd_given_intra_angle(cpi, x, bsize, mi_row, mi_col, mode_cost,
- best_rd, (1 - 2 * i) * angle_delta,
- MAX_ANGLE_DELTA, rate, rd_stats,
- &best_angle_delta, &best_tx_size, &best_rd,
- best_model_rd, best_txk_type, best_blk_skip);
+ calc_rd_given_intra_angle(
+ cpi, x, bsize, mi_row, mi_col, mode_cost, best_rd,
+ (1 - 2 * i) * angle_delta, MAX_ANGLE_DELTA, rate, rd_stats,
+ &best_angle_delta, &best_tx_size, &best_rd, best_model_rd,
+ best_txk_type, best_blk_skip, 0);
}
}
}
@@ -4732,7 +4736,7 @@
this_rd_stats.rate = INT_MAX;
rd_pick_intra_angle_sby(cpi, x, mi_row, mi_col, &this_rate,
&this_rd_stats, bsize, bmode_costs[mbmi->mode],
- best_rd, &best_model_rd);
+ best_rd, &best_model_rd, 1);
} else {
super_block_yrd(cpi, x, &this_rd_stats, bsize, best_rd);
}
@@ -11963,7 +11967,7 @@
rd_stats_y->rate = INT_MAX;
rd_pick_intra_angle_sby(cpi, x, mi_row, mi_col, &rate_dummy, rd_stats_y,
bsize, intra_mode_cost[mbmi->mode],
- search_state->best_rd, &model_rd);
+ search_state->best_rd, &model_rd, 0);
} else {
av1_init_rd_stats(rd_stats_y);
mbmi->angle_delta[PLANE_TYPE_Y] = 0;