Speed up filter-intra keyframe encoding with model RD
On keyframe, 22% speedup, 0.04% compression loss.
Change-Id: I70d387cc9de86c0c0c8b0037d35cff141409d59b
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 4fcecb2..d7e35e8 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2252,6 +2252,18 @@
max_angle_delta + mbmi->angle_delta[0]);
}
#endif // CONFIG_EXT_INTRA
+#if CONFIG_FILTER_INTRA
+ if (mbmi->mode == DC_PRED) {
+ const aom_prob prob = cpi->common.fc->filter_intra_probs[0];
+ if (mbmi->filter_intra_mode_info.use_filter_intra_mode[0]) {
+ const int mode = mbmi->filter_intra_mode_info.filter_intra_mode[0];
+ mode_cost += (av1_cost_bit(prob, 1) +
+ write_uniform_cost(FILTER_INTRA_MODES, mode));
+ } else {
+ mode_cost += av1_cost_bit(prob, 0);
+ }
+ }
+#endif // CONFIG_FILTER_INTRA
this_rd = RDCOST(x->rdmult, x->rddiv, this_rd_stats.rate + mode_cost,
this_rd_stats.dist);
return this_rd;
@@ -3055,14 +3067,12 @@
int *rate, int *rate_tokenonly,
int64_t *distortion, int *skippable,
BLOCK_SIZE bsize, int mode_cost,
- int64_t *best_rd, uint16_t skip_mask) {
+ int64_t *best_rd, int64_t *best_model_rd,
+ uint16_t skip_mask) {
MACROBLOCKD *const xd = &x->e_mbd;
MODE_INFO *const mic = xd->mi[0];
MB_MODE_INFO *mbmi = &mic->mbmi;
- int this_rate;
- RD_STATS tokenonly_rd_stats;
int filter_intra_selected_flag = 0;
- int64_t this_rd;
FILTER_INTRA_MODE mode;
TX_SIZE best_tx_size = TX_4X4;
FILTER_INTRA_MODE_INFO filter_intra_mode_info;
@@ -3076,11 +3086,18 @@
#endif // CONFIG_PALETTE
for (mode = 0; mode < FILTER_INTRA_MODES; ++mode) {
+ int this_rate;
+ int64_t this_rd, this_model_rd;
+ RD_STATS tokenonly_rd_stats;
if (skip_mask & (1 << mode)) continue;
mbmi->filter_intra_mode_info.filter_intra_mode[0] = mode;
+ 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))
+ continue;
+ if (this_model_rd < *best_model_rd) *best_model_rd = this_model_rd;
super_block_yrd(cpi, x, &tokenonly_rd_stats, bsize, *best_rd);
if (tokenonly_rd_stats.rate == INT_MAX) continue;
-
this_rate = tokenonly_rd_stats.rate +
av1_cost_bit(cpi->common.fc->filter_intra_probs[0], 1) +
write_uniform_cost(FILTER_INTRA_MODES, mode) + mode_cost;
@@ -3602,7 +3619,8 @@
if (beat_best_rd) {
if (rd_pick_filter_intra_sby(cpi, x, rate, rate_tokenonly, distortion,
skippable, bsize, bmode_costs[DC_PRED],
- &best_rd, filter_intra_mode_skip_mask)) {
+ &best_rd, &best_model_rd,
+ filter_intra_mode_skip_mask)) {
best_mbmi = *mbmi;
}
}
@@ -9083,7 +9101,8 @@
int rate2 = 0, rate_y = INT_MAX, skippable = 0, rate_uv, rate_dummy, i;
int dc_mode_index;
const int *const intra_mode_cost = cpi->mbmode_cost[size_group_lookup[bsize]];
- int64_t distortion2 = 0, distortion_y = 0, this_rd = *best_rd, distortion_uv;
+ int64_t distortion2 = 0, distortion_y = 0, this_rd = *best_rd;
+ int64_t distortion_uv, model_rd = INT64_MAX;
TX_SIZE uv_tx;
for (i = 0; i < MAX_MODES; ++i)
@@ -9101,7 +9120,7 @@
mbmi->ref_frame[1] = NONE_FRAME;
if (!rd_pick_filter_intra_sby(cpi, x, &rate_dummy, &rate_y, &distortion_y,
&skippable, bsize, intra_mode_cost[mbmi->mode],
- &this_rd, 0)) {
+ &this_rd, &model_rd, 0)) {
return;
}
if (rate_y == INT_MAX) return;