AV1 RT: Use adaptive threshold in fast pick inter mode
Change-Id: I2d06c074717e9db56d71f32ab8558a6cf231dcab
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index c54b468..ffd8c5c 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4132,8 +4132,8 @@
}
// TODO(angiebird): Let inter_mode_rd_model_estimation support multi-tile.
- if (cpi->sf.inter_mode_rd_model_estimation == 1 && cm->tile_cols == 1 &&
- cm->tile_rows == 1) {
+ if (!use_nonrd_mode && cpi->sf.inter_mode_rd_model_estimation == 1 &&
+ cm->tile_cols == 1 && cm->tile_rows == 1) {
av1_inter_mode_data_fit(tile_data, x->rdmult);
}
if (tile_data->allow_update_cdf && (cpi->row_mt == 1) &&
@@ -4281,7 +4281,7 @@
const TileInfo *const tile_info = &this_tile->tile_info;
int mi_row;
- av1_inter_mode_data_init(this_tile);
+ if (!cpi->sf.use_fast_nonrd_pick_mode) av1_inter_mode_data_init(this_tile);
av1_zero_above_context(cm, &td->mb.e_mbd, tile_info->mi_col_start,
tile_info->mi_col_end, tile_row);
@@ -4293,7 +4293,8 @@
td->mb.m_search_count_ptr = &this_tile->m_search_count;
td->mb.ex_search_count_ptr = &this_tile->ex_search_count;
- cfl_init(&td->mb.e_mbd.cfl, &cm->seq_params);
+ if (!cpi->sf.use_fast_nonrd_pick_mode)
+ cfl_init(&td->mb.e_mbd.cfl, &cm->seq_params);
av1_crc32c_calculator_init(&td->mb.mb_rd_record.crc_calculator);
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 6e07491..a54b12c 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -69,8 +69,9 @@
static const THR_MODES mode_idx[REF_FRAMES][4] = {
{ THR_DC, THR_V_PRED, THR_H_PRED, THR_SMOOTH },
{ THR_NEARESTMV, THR_NEARMV, THR_GLOBALMV, THR_NEWMV },
+ { THR_NEARESTL2, THR_NEARL2, THR_GLOBALL2, THR_NEWL2 },
+ { THR_NEARESTL3, THR_NEARL3, THR_GLOBALL3, THR_NEWL3 },
{ THR_NEARESTG, THR_NEARG, THR_GLOBALMV, THR_NEWG },
- { THR_NEARESTA, THR_NEARA, THR_GLOBALMV, THR_NEWA },
};
static const PREDICTION_MODE intra_mode_list[] = { DC_PRED, V_PRED, H_PRED,
@@ -1015,6 +1016,21 @@
args->rdc->dist += this_rdc.dist;
}
+static INLINE void update_thresh_freq_fact(AV1_COMP *cpi, MACROBLOCK *x,
+ BLOCK_SIZE bsize,
+ MV_REFERENCE_FRAME ref_frame,
+ THR_MODES best_mode_idx,
+ PREDICTION_MODE mode) {
+ THR_MODES thr_mode_idx = mode_idx[ref_frame][mode_offset(mode)];
+ int *freq_fact = &x->thresh_freq_fact[bsize][thr_mode_idx];
+ if (thr_mode_idx == best_mode_idx) {
+ *freq_fact -= (*freq_fact >> 4);
+ } else {
+ *freq_fact = AOMMIN(*freq_fact + RD_THRESH_INC,
+ cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
+ }
+}
+
void av1_fast_nonrd_pick_inter_mode_sb(AV1_COMP *cpi, TileDataEnc *tile_data,
MACROBLOCK *x, int mi_row, int mi_col,
RD_STATS *rd_cost, BLOCK_SIZE bsize,
@@ -1553,6 +1569,28 @@
pd->dst.stride, 0, 0, 0, 0, bw, bh);
}
}
+ if (cpi->sf.adaptive_rd_thresh) {
+ THR_MODES best_mode_idx =
+ mode_idx[best_pickmode.best_ref_frame][mode_offset(mi->mode)];
+ if (best_pickmode.best_ref_frame == INTRA_FRAME) {
+ // Only consider the modes that are included in the intra_mode_list.
+ int intra_modes = sizeof(intra_mode_list) / sizeof(PREDICTION_MODE);
+ int i;
+ for (i = 0; i < intra_modes; i++) {
+ update_thresh_freq_fact(cpi, x, bsize, INTRA_FRAME, best_mode_idx,
+ intra_mode_list[i]);
+ }
+ } else {
+ for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) {
+ PREDICTION_MODE this_mode;
+ if (best_pickmode.best_ref_frame != ref_frame) continue;
+ for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) {
+ update_thresh_freq_fact(cpi, x, bsize, ref_frame, best_mode_idx,
+ this_mode);
+ }
+ }
+ }
+ }
store_coding_context(x, ctx, mi->mode);
*rd_cost = best_rdc;