Speed up ext-intra keyframe encoding with model RD
On keyframe, 18% speedup, 0.07% compression loss.
Change-Id: I98323db23251c70958a314f16fd6d789579017ec
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 15feb9e..4fcecb2 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2219,7 +2219,7 @@
// Model based RD estimation for luma intra blocks.
static int64_t intra_model_yrd(const AV1_COMP *const cpi, MACROBLOCK *const x,
- BLOCK_SIZE bsize, const int *bmode_costs) {
+ BLOCK_SIZE bsize, int mode_cost) {
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
RD_STATS this_rd_stats;
@@ -2245,9 +2245,15 @@
// RD estimation.
model_rd_for_sb(cpi, bsize, x, xd, 0, 0, &this_rd_stats.rate,
&this_rd_stats.dist, &this_rd_stats.skip, &temp_sse);
- this_rd =
- RDCOST(x->rdmult, x->rddiv, this_rd_stats.rate + bmode_costs[mbmi->mode],
- this_rd_stats.dist);
+#if CONFIG_EXT_INTRA
+ if (av1_is_directional_mode(mbmi->mode, bsize)) {
+ const int max_angle_delta = av1_get_max_angle_delta(bsize, 0);
+ mode_cost += write_uniform_cost(2 * max_angle_delta + 1,
+ max_angle_delta + mbmi->angle_delta[0]);
+ }
+#endif // CONFIG_EXT_INTRA
+ this_rd = RDCOST(x->rdmult, x->rddiv, this_rd_stats.rate + mode_cost,
+ this_rd_stats.dist);
return this_rd;
}
@@ -3119,13 +3125,18 @@
#if CONFIG_INTRA_INTERP
INTRA_FILTER *best_filter,
#endif // CONFIG_INTRA_INTERP
- int64_t *best_rd) {
+ int64_t *best_rd, int64_t *best_model_rd) {
int this_rate;
RD_STATS tokenonly_rd_stats;
- int64_t this_rd;
+ int64_t this_rd, this_model_rd;
MB_MODE_INFO *mbmi = &x->e_mbd.mi[0]->mbmi;
mbmi->angle_delta[0] = angle_delta;
+ this_model_rd = intra_model_yrd(cpi, x, bsize, mode_cost);
+ 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;
@@ -3155,7 +3166,8 @@
static int64_t rd_pick_intra_angle_sby(const AV1_COMP *const cpi, MACROBLOCK *x,
int *rate, RD_STATS *rd_stats,
BLOCK_SIZE bsize, int mode_cost,
- int64_t best_rd) {
+ int64_t best_rd,
+ int64_t *best_model_rd) {
MACROBLOCKD *const xd = &x->e_mbd;
MODE_INFO *const mic = xd->mi[0];
MB_MODE_INFO *mbmi = &mic->mbmi;
@@ -3195,7 +3207,7 @@
#if CONFIG_INTRA_INTERP
&best_filter,
#endif // CONFIG_INTRA_INTERP
- &best_rd);
+ &best_rd, best_model_rd);
rd_cost[2 * angle_delta + i] = this_rd;
if (first_try && this_rd == INT64_MAX) return best_rd;
first_try = 0;
@@ -3236,7 +3248,7 @@
#if CONFIG_INTRA_INTERP
&best_filter,
#endif // CONFIG_INTRA_INTERP
- &best_rd);
+ &best_rd, best_model_rd);
}
}
#if CONFIG_INTRA_INTERP
@@ -3256,7 +3268,7 @@
mode_cost + cpi->intra_filter_cost[intra_filter_ctx][filter],
best_rd, best_angle_delta, max_angle_delta, rate, rd_stats,
&best_angle_delta, &best_tx_size, &best_tx_type, &best_filter,
- &best_rd);
+ &best_rd, best_model_rd);
}
}
}
@@ -3494,7 +3506,7 @@
#if CONFIG_EXT_INTRA
mbmi->angle_delta[0] = 0;
#endif // CONFIG_EXT_INTRA
- this_model_rd = intra_model_yrd(cpi, x, bsize, bmode_costs);
+ this_model_rd = intra_model_yrd(cpi, x, bsize, bmode_costs[mbmi->mode]);
if (best_model_rd != INT64_MAX &&
this_model_rd > best_model_rd + (best_model_rd >> 1))
continue;
@@ -3504,9 +3516,9 @@
if (is_directional_mode && directional_mode_skip_mask[mbmi->mode]) continue;
if (is_directional_mode) {
this_rd_stats.rate = INT_MAX;
- this_rd =
- rd_pick_intra_angle_sby(cpi, x, &this_rate, &this_rd_stats, bsize,
- bmode_costs[mbmi->mode], best_rd);
+ this_rd = rd_pick_intra_angle_sby(cpi, x, &this_rate, &this_rd_stats,
+ bsize, bmode_costs[mbmi->mode], best_rd,
+ &best_model_rd);
} else {
super_block_yrd(cpi, x, &this_rd_stats, bsize, best_rd);
}
@@ -9841,6 +9853,7 @@
is_directional_mode = av1_is_directional_mode(mbmi->mode, bsize);
if (is_directional_mode) {
int rate_dummy;
+ int64_t model_rd = INT64_MAX;
if (!angle_stats_ready) {
const int src_stride = x->plane[0].src.stride;
const uint8_t *src = x->plane[0].src.buf;
@@ -9856,9 +9869,9 @@
}
if (directional_mode_skip_mask[mbmi->mode]) continue;
rd_stats_y.rate = INT_MAX;
- this_rd =
- rd_pick_intra_angle_sby(cpi, x, &rate_dummy, &rd_stats_y, bsize,
- intra_mode_cost[mbmi->mode], best_rd);
+ this_rd = rd_pick_intra_angle_sby(cpi, x, &rate_dummy, &rd_stats_y,
+ bsize, intra_mode_cost[mbmi->mode],
+ best_rd, &model_rd);
} else {
mbmi->angle_delta[0] = 0;
super_block_yrd(cpi, x, &rd_stats_y, bsize, best_rd);