Bypass repeated motion search stages in the compound mode search
Skip the initial motion search for compound modes. It improves the
encoding speed in sp1 by ~10%. The coding performance loss ranges
between 0.01 - 0.05% across test sets.
STATS_CHANGED
Change-Id: Icdf5d5f8dfcd961593451de97f0b14cc86ae0b1d
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 28df2f2..d3c0a77 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1074,8 +1074,6 @@
if (is_comp_pred) {
const int valid_mv0 = args->single_newmv_valid[ref_mv_idx][refs[0]];
const int valid_mv1 = args->single_newmv_valid[ref_mv_idx][refs[1]];
- InterPredParams inter_pred_params;
-
if (this_mode == NEW_NEWMV) {
if (valid_mv0) {
cur_mv[0].as_int = args->single_newmv[ref_mv_idx][refs[0]].as_int;
@@ -1085,140 +1083,32 @@
cur_mv[1].as_int = args->single_newmv[ref_mv_idx][refs[1]].as_int;
clamp_mv_in_range(x, &cur_mv[1], 1);
}
-
- // aomenc1
- if (cpi->sf.inter_sf.comp_inter_joint_search_thresh <= bsize ||
- !valid_mv0 || !valid_mv1) {
- int_mv tmp_mv[2] = { cur_mv[0], cur_mv[1] };
- int tmp_rate_mv;
- mbmi->compound_idx = 1;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- uint8_t mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
- int cmp_avg_sme =
- av1_joint_motion_search(cpi, x, bsize, cur_mv, xd->seg_mask,
- block_size_wide[bsize], rate_mv);
-
- mbmi->compound_idx = 0;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
- int cmp_jnt_sme =
- av1_joint_motion_search(cpi, x, bsize, tmp_mv, xd->seg_mask,
- block_size_wide[bsize], &tmp_rate_mv);
- if (cmp_jnt_sme < cmp_avg_sme) {
- cur_mv[0] = tmp_mv[0];
- cur_mv[1] = tmp_mv[1];
- *rate_mv = tmp_rate_mv;
- } else {
- mbmi->compound_idx = 1;
- }
- } else {
- *rate_mv = 0;
- for (int i = 0; i < 2; ++i) {
- const int_mv ref_mv = av1_get_ref_mv(x, i);
- *rate_mv += av1_mv_bit_cost(
- &cur_mv[i].as_mv, &ref_mv.as_mv, x->mv_costs.nmv_joint_cost,
- x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
- }
+ *rate_mv = 0;
+ for (int i = 0; i < 2; ++i) {
+ const int_mv ref_mv = av1_get_ref_mv(x, i);
+ *rate_mv += av1_mv_bit_cost(&cur_mv[i].as_mv, &ref_mv.as_mv,
+ x->mv_costs.nmv_joint_cost,
+ x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
}
} else if (this_mode == NEAREST_NEWMV || this_mode == NEAR_NEWMV) {
if (valid_mv1) {
cur_mv[1].as_int = args->single_newmv[ref_mv_idx][refs[1]].as_int;
clamp_mv_in_range(x, &cur_mv[1], 1);
}
-
- // aomenc2
- if (cpi->sf.inter_sf.comp_inter_joint_search_thresh <= bsize ||
- !valid_mv1) {
- int_mv tmp_mv[2] = { cur_mv[0], cur_mv[1] };
- int tmp_rate_mv;
- mbmi->compound_idx = 1;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- uint8_t mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
-
- int cmp_avg_sme = av1_compound_single_motion_search_interinter(
- cpi, x, bsize, cur_mv, xd->seg_mask, block_size_wide[bsize],
- rate_mv, 1);
- mbmi->compound_idx = 0;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
- int cmp_jnt_sme = av1_compound_single_motion_search_interinter(
- cpi, x, bsize, tmp_mv, xd->seg_mask, block_size_wide[bsize],
- &tmp_rate_mv, 1);
- if (cmp_jnt_sme < cmp_avg_sme) {
- cur_mv[0] = tmp_mv[0];
- cur_mv[1] = tmp_mv[1];
- *rate_mv = tmp_rate_mv;
- } else {
- mbmi->compound_idx = 1;
- }
- } else {
- const int_mv ref_mv = av1_get_ref_mv(x, 1);
- *rate_mv = av1_mv_bit_cost(&cur_mv[1].as_mv, &ref_mv.as_mv,
- x->mv_costs.nmv_joint_cost,
- x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
- }
+ const int_mv ref_mv = av1_get_ref_mv(x, 1);
+ *rate_mv = av1_mv_bit_cost(&cur_mv[1].as_mv, &ref_mv.as_mv,
+ x->mv_costs.nmv_joint_cost,
+ x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
} else {
assert(this_mode == NEW_NEARESTMV || this_mode == NEW_NEARMV);
if (valid_mv0) {
cur_mv[0].as_int = args->single_newmv[ref_mv_idx][refs[0]].as_int;
clamp_mv_in_range(x, &cur_mv[0], 0);
}
-
- // aomenc3
- if (cpi->sf.inter_sf.comp_inter_joint_search_thresh <= bsize ||
- !valid_mv0) {
- int_mv tmp_mv[2] = { cur_mv[0], cur_mv[1] };
- int tmp_rate_mv;
- mbmi->compound_idx = 1;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- uint8_t mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
-
- int cmp_avg_sme = av1_compound_single_motion_search_interinter(
- cpi, x, bsize, cur_mv, xd->seg_mask, block_size_wide[bsize],
- rate_mv, 0);
- mbmi->compound_idx = 0;
- av1_dist_wtd_comp_weight_assign(
- &cpi->common, mbmi, 0, &inter_pred_params.conv_params.fwd_offset,
- &inter_pred_params.conv_params.bck_offset,
- &inter_pred_params.conv_params.use_dist_wtd_comp_avg, 1);
- mask_value = inter_pred_params.conv_params.fwd_offset * 4;
- memset(xd->seg_mask, mask_value, sizeof(xd->seg_mask));
- int cmp_jnt_sme = av1_compound_single_motion_search_interinter(
- cpi, x, bsize, tmp_mv, xd->seg_mask, block_size_wide[bsize],
- &tmp_rate_mv, 0);
- if (cmp_jnt_sme < cmp_avg_sme) {
- cur_mv[0] = tmp_mv[0];
- cur_mv[1] = tmp_mv[1];
- *rate_mv = tmp_rate_mv;
- } else {
- mbmi->compound_idx = 1;
- }
- } else {
- const int_mv ref_mv = av1_get_ref_mv(x, 0);
- *rate_mv = av1_mv_bit_cost(&cur_mv[0].as_mv, &ref_mv.as_mv,
- x->mv_costs.nmv_joint_cost,
- x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
- }
+ const int_mv ref_mv = av1_get_ref_mv(x, 0);
+ *rate_mv = av1_mv_bit_cost(&cur_mv[0].as_mv, &ref_mv.as_mv,
+ x->mv_costs.nmv_joint_cost,
+ x->mv_costs.mv_cost_stack, MV_COST_WEIGHT);
}
} else {
// Single ref case.