Abstract txfm_rd_gate_level code into own function
The code related to pruning based on txfm_rd_gate_level in
av1_compound_type_rd() is abstracted into a separate function.
Change-Id: Iac2770b7352cb3590896b35b4204771bb556a624
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index f4375bd..aacb7fc 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -1010,6 +1010,21 @@
return 0;
}
+static INLINE int prune_mode_by_skip_rd(const AV1_COMP *const cpi,
+ MACROBLOCK *x, MACROBLOCKD *xd,
+ const BLOCK_SIZE bsize,
+ int64_t ref_skip_rd, int mode_rate) {
+ int eval_txfm = 1;
+ // Check if the mode is good enough based on skip rd
+ if (cpi->sf.inter_sf.txfm_rd_gate_level) {
+ int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
+ int64_t skip_rd = RDCOST(x->rdmult, mode_rate, (sse_y << 4));
+ eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
+ cpi->sf.inter_sf.txfm_rd_gate_level, 1);
+ }
+ return eval_txfm;
+}
+
static int64_t masked_compound_type_rd(
const AV1_COMP *const cpi, MACROBLOCK *x, const int_mv *const cur_mv,
const BLOCK_SIZE bsize, const PREDICTION_MODE this_mode, int *rs2,
@@ -1288,14 +1303,8 @@
RD_STATS est_rd_stats;
const int64_t tmp_rd_thresh = AOMMIN(*rd, rd_thresh) - mode_rd;
int64_t est_rd = INT64_MAX;
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd = RDCOST(x->rdmult, rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ rs2 + *rate_mv);
// Evaluate further if skip rd is low enough
if (eval_txfm) {
est_rd = estimate_yrd_for_sb(cpi, bsize, x, tmp_rd_thresh,
@@ -1341,15 +1350,8 @@
AOM_PLANE_Y, AOM_PLANE_Y);
if (cur_type == COMPOUND_AVERAGE) *is_luma_interp_done = 1;
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd = RDCOST(x->rdmult, rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
-
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ rs2 + *rate_mv);
if (eval_txfm) {
RD_STATS est_rd_stats;
estimate_yrd_for_sb(cpi, bsize, x, INT64_MAX, &est_rd_stats);
@@ -1402,14 +1404,8 @@
RD_STATS est_rd_stats;
int64_t this_rd_cur = INT64_MAX;
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd = RDCOST(x->rdmult, rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ rs2 + *rate_mv);
if (eval_txfm) {
this_rd_cur = estimate_yrd_for_sb(
cpi, bsize, x, AOMMIN(best_rd_cur, ref_best_rd), &est_rd_stats);
@@ -1457,15 +1453,8 @@
best_rs2 += get_interinter_compound_mask_rate(&x->mode_costs, mbmi);
av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
AOM_PLANE_Y, AOM_PLANE_Y);
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd =
- RDCOST(x->rdmult, best_rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ best_rs2 + *rate_mv);
if (eval_txfm) {
RD_STATS est_rd_stats;
estimate_yrd_for_sb(cpi, bsize, x, INT64_MAX, &est_rd_stats);
@@ -1504,14 +1493,8 @@
AOM_PLANE_Y, AOM_PLANE_Y);
RD_STATS est_rd_stats;
int64_t this_rd_cur = INT64_MAX;
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd = RDCOST(x->rdmult, rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ rs2 + *rate_mv);
if (eval_txfm) {
this_rd_cur =
estimate_yrd_for_sb(cpi, bsize, x, ref_best_rd, &est_rd_stats);
@@ -1552,14 +1535,8 @@
AOM_PLANE_Y, AOM_PLANE_Y);
RD_STATS est_rd_stats;
int64_t this_rd_cur = INT64_MAX;
- int eval_txfm = 1;
- // Check if the mode is good enough based on skip rd
- if (cpi->sf.inter_sf.txfm_rd_gate_level) {
- int64_t sse_y = compute_sse_plane(x, xd, PLANE_TYPE_Y, bsize);
- int64_t skip_rd = RDCOST(x->rdmult, rs2 + *rate_mv, (sse_y << 4));
- eval_txfm = check_txfm_eval(x, bsize, ref_skip_rd, skip_rd,
- cpi->sf.inter_sf.txfm_rd_gate_level, 1);
- }
+ int eval_txfm = prune_mode_by_skip_rd(cpi, x, xd, bsize, ref_skip_rd,
+ rs2 + *rate_mv);
if (eval_txfm) {
this_rd_cur =
estimate_yrd_for_sb(cpi, bsize, x, ref_best_rd, &est_rd_stats);