Disable filter_intra mode in <8x8 tx blocks
0.159% gain on lowres 60 frames, compared to 0.236% gain if we don't
restrict it in small tx blocks.
(--disable-ext-partition --disable-ext-partition-types
--disable-convolve-round --disable-ext-comp-refs)
Change-Id: I1d1c5474ca27de9dec992ea30a9883afd7a56474
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 4cd2388..17b3f6f 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2466,6 +2466,12 @@
mbmi->tx_type = tx_type;
mbmi->tx_size = tx_size;
+#if CONFIG_FILTER_INTRA
+ if (!is_inter_block(mbmi) &&
+ mbmi->filter_intra_mode_info.use_filter_intra_mode[0] &&
+ !av1_filter_intra_allowed_txsize(tx_size))
+ return INT64_MAX;
+#endif
txfm_rd_in_plane(x, cpi, rd_stats, ref_best_rd, 0, bs, tx_size,
cpi->sf.use_fast_coef_costing);
if (rd_stats->rate == INT_MAX) return INT64_MAX;
@@ -3285,7 +3291,7 @@
int this_rate;
int64_t this_rd, this_model_rd;
RD_STATS tokenonly_rd_stats;
- if (skip_mask & (1 << mode)) continue;
+ if (skip_mask & (1 << fimode_to_intradir[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 &&
@@ -3735,7 +3741,7 @@
x->palette_y_mode_cost[bsize - BLOCK_8X8][palette_y_mode_ctx][0];
}
#if CONFIG_FILTER_INTRA
- if (mbmi->mode == DC_PRED)
+ if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_txsize(mbmi->tx_size))
this_rate += av1_cost_bit(cpi->common.fc->filter_intra_probs[0], 0);
#endif // CONFIG_FILTER_INTRA
#if CONFIG_EXT_INTRA
@@ -3784,7 +3790,7 @@
}
#if CONFIG_FILTER_INTRA
- if (beat_best_rd) {
+ if (beat_best_rd && av1_filter_intra_allowed_bsize(bsize)) {
if (rd_pick_filter_intra_sby(cpi, x, rate, rate_tokenonly, distortion,
skippable, bsize, bmode_costs[DC_PRED],
&best_rd, &best_model_rd,
@@ -10020,20 +10026,21 @@
skippable = rd_stats_y.skip;
#if CONFIG_FILTER_INTRA
- int64_t best_rd_tmp = INT64_MAX;
- if (rate_y != INT_MAX) {
- best_rd_tmp = RDCOST(
- x->rdmult,
- rate_y + av1_cost_bit(cpi->common.fc->filter_intra_probs[0], 0) +
- intra_mode_cost[mbmi->mode],
- distortion_y);
- }
if (mbmi->mode == DC_PRED) {
RD_STATS rd_stats_y_fi;
int filter_intra_selected_flag = 0;
TX_SIZE best_tx_size = mbmi->tx_size;
TX_TYPE best_tx_type = mbmi->tx_type;
FILTER_INTRA_MODE best_fi_mode = FILTER_DC_PRED;
+ int64_t best_rd_tmp = INT64_MAX;
+ if (rate_y != INT_MAX &&
+ av1_filter_intra_allowed_txsize(best_tx_size)) {
+ best_rd_tmp = RDCOST(
+ x->rdmult,
+ rate_y + av1_cost_bit(cpi->common.fc->filter_intra_probs[0], 0) +
+ intra_mode_cost[mbmi->mode],
+ distortion_y);
+ }
mbmi->filter_intra_mode_info.use_filter_intra_mode[0] = 1;
for (FILTER_INTRA_MODE fi_mode = FILTER_DC_PRED;