Unify motion estimation process Unify the motion estimation process used in first and second pass encoding paths. Change-Id: I486c3be695fb8ce7c7a204767868a22cd735f65e
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c index 42c28fa3..590523e 100644 --- a/av1/encoder/firstpass.c +++ b/av1/encoder/firstpass.c
@@ -218,62 +218,28 @@ const MV *ref_mv, MV *best_mv, int *best_motion_err) { MACROBLOCKD *const xd = &x->e_mbd; - MV tmp_mv = kZeroMv; MV ref_mv_full = { ref_mv->row >> 3, ref_mv->col >> 3 }; - int num00, tmp_err, n; + int tmp_err; const BLOCK_SIZE bsize = xd->mi[0]->sb_type; aom_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize]; const int new_mv_mode_penalty = NEW_MV_MODE_PENALTY; - - int step_param = 3; - int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; const int sr = get_search_range(cpi); - step_param += sr; - further_steps -= sr; + int step_param = 3 + sr; + int cost_list[5]; - // Override the default variance function to use MSE. - v_fn_ptr.vf = get_block_variance_fn(bsize); -#if CONFIG_AV1_HIGHBITDEPTH - if (is_cur_buf_hbd(xd)) { - v_fn_ptr.vf = highbd_get_block_variance_fn(bsize, xd->bd); - } -#endif - // Center the initial step/diamond search on best mv. - tmp_err = av1_diamond_search_sad_c( - x, &cpi->ss_cfg[SS_CFG_SRC], &ref_mv_full, &tmp_mv, step_param, - x->sadperbit16, &num00, &v_fn_ptr, ref_mv, NULL, NULL, 0, 0); + tmp_err = av1_full_pixel_search( + cpi, x, bsize, &ref_mv_full, step_param, 0, NSTEP, 0, x->sadperbit16, + cond_cost_list(cpi, cost_list), ref_mv, INT_MAX, 0, + (MI_SIZE * xd->mi_col), (MI_SIZE * xd->mi_row), 0, + &cpi->ss_cfg[SS_CFG_SRC], 0); + if (tmp_err < INT_MAX) - tmp_err = av1_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); - if (tmp_err < INT_MAX - new_mv_mode_penalty) tmp_err += new_mv_mode_penalty; + tmp_err = av1_get_mvpred_var(x, &x->best_mv.as_mv, ref_mv, &v_fn_ptr, 0) + + new_mv_mode_penalty; if (tmp_err < *best_motion_err) { *best_motion_err = tmp_err; - *best_mv = tmp_mv; - } - - // Carry out further step/diamond searches as necessary. - n = num00; - num00 = 0; - - while (n < further_steps) { - ++n; - - if (num00) { - --num00; - } else { - tmp_err = av1_diamond_search_sad_c( - x, &cpi->ss_cfg[SS_CFG_SRC], &ref_mv_full, &tmp_mv, step_param + n, - x->sadperbit16, &num00, &v_fn_ptr, ref_mv, NULL, NULL, 0, 0); - if (tmp_err < INT_MAX) - tmp_err = av1_get_mvpred_var(x, &tmp_mv, ref_mv, &v_fn_ptr, 1); - if (tmp_err < INT_MAX - new_mv_mode_penalty) - tmp_err += new_mv_mode_penalty; - - if (tmp_err < *best_motion_err) { - *best_motion_err = tmp_err; - *best_mv = tmp_mv; - } - } + *best_mv = x->best_mv.as_mv; } }
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c index 8776747..5ac02a8 100644 --- a/av1/encoder/mcomp.c +++ b/av1/encoder/mcomp.c
@@ -1416,18 +1416,20 @@ int av1_get_mvpred_var(const MACROBLOCK *x, const MV *best_mv, const MV *center_mv, const aom_variance_fn_ptr_t *vfp, - int use_mvcost) { + int use_var) { const MACROBLOCKD *const xd = &x->e_mbd; const struct buf_2d *const what = &x->plane[0].src; const struct buf_2d *const in_what = &xd->plane[0].pre[0]; const MV mv = { best_mv->row * 8, best_mv->col * 8 }; - unsigned int unused; + unsigned int sse, var; - return vfp->vf(what->buf, what->stride, get_buf_from_mv(in_what, best_mv), - in_what->stride, &unused) + - (use_mvcost ? mv_err_cost(&mv, center_mv, x->nmv_vec_cost, - x->mv_cost_stack, x->errorperbit) - : 0); + var = vfp->vf(what->buf, what->stride, get_buf_from_mv(in_what, best_mv), + in_what->stride, &sse); + + if (!use_var) var = sse; + + return var + mv_err_cost(&mv, center_mv, x->nmv_vec_cost, x->mv_cost_stack, + x->errorperbit); } int av1_get_mvpred_av_var(const MACROBLOCK *x, const MV *best_mv, @@ -1798,7 +1800,8 @@ point as the best match, we will do a final 1-away diamond refining search */ static int full_pixel_diamond(MACROBLOCK *x, MV *mvp_full, int step_param, - int sadpb, int further_steps, int *cost_list, + int use_var, int sadpb, int further_steps, + int *cost_list, const aom_variance_fn_ptr_t *fn_ptr, const MV *ref_mv, const search_site_config *cfg, uint8_t *second_pred, uint8_t *mask, @@ -1809,7 +1812,7 @@ sadpb, &n, fn_ptr, ref_mv, second_pred, mask, mask_stride, inv_mask); if (bestsme < INT_MAX) - bestsme = av1_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, 1); + bestsme = av1_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, use_var); x->best_mv.as_mv = temp_mv; // If there won't be more n-step search, check to see if refining search is @@ -1824,7 +1827,7 @@ x, cfg, mvp_full, &temp_mv, step_param + n, sadpb, &num00, fn_ptr, ref_mv, second_pred, mask, mask_stride, inv_mask); if (thissme < INT_MAX) - thissme = av1_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, 1); + thissme = av1_get_mvpred_var(x, &temp_mv, ref_mv, fn_ptr, use_var); if (thissme < bestsme) { bestsme = thissme; @@ -2218,7 +2221,7 @@ } int av1_full_pixel_search(const AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, - MV *mvp_full, int step_param, int method, + MV *mvp_full, int step_param, int use_var, int method, int run_mesh_search, int error_per_bit, int *cost_list, const MV *ref_mv, int var_max, int rd, int x_pos, int y_pos, int intra, @@ -2261,7 +2264,7 @@ fn_ptr, 1, ref_mv); break; case NSTEP: - var = full_pixel_diamond(x, mvp_full, step_param, error_per_bit, + var = full_pixel_diamond(x, mvp_full, step_param, use_var, error_per_bit, cfg->ss_count - 1 - step_param, cost_list, fn_ptr, ref_mv, cfg, NULL, NULL, 0, 0); break; @@ -2274,7 +2277,7 @@ const int max_exhaustive_pct = use_intrabc_mesh_pattern ? sf->intrabc_max_exhaustive_pct : sf->max_exhaustive_pct; - if (!run_mesh_search && method == NSTEP && + if (!run_mesh_search && method == NSTEP && use_var && is_exhaustive_allowed(cpi, x, max_exhaustive_pct)) { int exhuastive_thr = sf->exhaustive_searches_thresh; exhuastive_thr >>= @@ -2993,9 +2996,9 @@ // This overwrites the mv_limits so we will need to restore it later. av1_set_mv_search_range(&x->mv_limits, &ref_mv); var = av1_full_pixel_search( - cpi, x, bsize, &ref_mv_full, step_param, search_methods, do_mesh_search, - sadpb, cond_cost_list(cpi, cost_list), &ref_mv, INT_MAX, 1, - mi_col * MI_SIZE, mi_row * MI_SIZE, 0, &cpi->ss_cfg[SS_CFG_SRC], 0); + cpi, x, bsize, &ref_mv_full, step_param, 1, search_methods, + do_mesh_search, sadpb, cond_cost_list(cpi, cost_list), &ref_mv, INT_MAX, + 1, mi_col * MI_SIZE, mi_row * MI_SIZE, 0, &cpi->ss_cfg[SS_CFG_SRC], 0); // Restore x->mv_limits = tmp_mv_limits;
diff --git a/av1/encoder/mcomp.h b/av1/encoder/mcomp.h index c19ecfa..0104b8d 100644 --- a/av1/encoder/mcomp.h +++ b/av1/encoder/mcomp.h
@@ -66,7 +66,7 @@ // Utility to compute variance + MV rate cost for a given MV int av1_get_mvpred_var(const MACROBLOCK *x, const MV *best_mv, const MV *center_mv, const aom_variance_fn_ptr_t *vfp, - int use_mvcost); + int use_var); int av1_get_mvpred_av_var(const MACROBLOCK *x, const MV *best_mv, const MV *center_mv, const uint8_t *second_pred, const aom_variance_fn_ptr_t *vfp, @@ -135,9 +135,9 @@ int av1_full_pixel_search(const struct AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, MV *mvp_full, int step_param, - int method, int run_mesh_search, int error_per_bit, - int *cost_list, const MV *ref_mv, int var_max, int rd, - int x_pos, int y_pos, int intra, + int use_var, int method, int run_mesh_search, + int error_per_bit, int *cost_list, const MV *ref_mv, + int var_max, int rd, int x_pos, int y_pos, int intra, const search_site_config *cfg, int use_intrabc_mesh_pattern);
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c index a796a84..39598da 100644 --- a/av1/encoder/nonrd_pickmode.c +++ b/av1/encoder/nonrd_pickmode.c
@@ -160,8 +160,8 @@ center_mv = tmp_mv->as_mv; av1_full_pixel_search( - cpi, x, bsize, &mvp_full, step_param, cpi->sf.mv.search_method, 0, sadpb, - cond_cost_list(cpi, cost_list), ¢er_mv, INT_MAX, 0, + cpi, x, bsize, &mvp_full, step_param, 1, cpi->sf.mv.search_method, 0, + sadpb, cond_cost_list(cpi, cost_list), ¢er_mv, INT_MAX, 0, (MI_SIZE * mi_col), (MI_SIZE * mi_row), 0, &cpi->ss_cfg[SS_CFG_SRC], 0); x->mv_limits = tmp_mv_limits;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 8cb7520..9b24f40 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -7793,7 +7793,7 @@ switch (mbmi->motion_mode) { case SIMPLE_TRANSLATION: bestsme = av1_full_pixel_search( - cpi, x, bsize, &mvp_full, step_param, cpi->sf.mv.search_method, 0, + cpi, x, bsize, &mvp_full, step_param, 1, cpi->sf.mv.search_method, 0, sadpb, cond_cost_list(cpi, cost_list), &ref_mv, INT_MAX, 1, (MI_SIZE * mi_col), (MI_SIZE * mi_row), 0, &cpi->ss_cfg[SS_CFG_SRC], 0); @@ -11628,7 +11628,7 @@ const int sadpb = x->sadperbit16; int cost_list[5]; const int bestsme = av1_full_pixel_search( - cpi, x, bsize, &mvp_full, step_param, cpi->sf.mv.search_method, 0, + cpi, x, bsize, &mvp_full, step_param, 1, cpi->sf.mv.search_method, 0, sadpb, cond_cost_list(cpi, cost_list), &dv_ref.as_mv, INT_MAX, 1, (MI_SIZE * mi_col), (MI_SIZE * mi_row), 1, &cpi->ss_cfg[SS_CFG_LOOKAHEAD], 1);
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c index 493c621..7b8f8b3 100644 --- a/av1/encoder/temporal_filter.c +++ b/av1/encoder/temporal_filter.c
@@ -915,9 +915,10 @@ // av1_full_pixel_search() parameters: best_ref_mv1_full is the start mv, and // ref_mv is for mv rate calculation. The search result is stored in // x->best_mv. - av1_full_pixel_search(cpi, x, TF_BLOCK, &best_ref_mv1_full, step_param, NSTEP, - 1, sadpb, cond_cost_list(cpi, cost_list), &ref_mv, 0, 0, - x_pos, y_pos, 0, &cpi->ss_cfg[SS_CFG_LOOKAHEAD], 0); + av1_full_pixel_search(cpi, x, TF_BLOCK, &best_ref_mv1_full, step_param, 1, + NSTEP, 1, sadpb, cond_cost_list(cpi, cost_list), + &ref_mv, 0, 0, x_pos, y_pos, 0, + &cpi->ss_cfg[SS_CFG_LOOKAHEAD], 0); x->mv_limits = tmp_mv_limits; // Ignore mv costing by sending NULL pointer instead of cost array @@ -972,7 +973,7 @@ av1_set_mv_search_range(&x->mv_limits, &ref_mv); av1_full_pixel_search(cpi, x, TF_SUB_BLOCK, &best_ref_mv1_full, - step_param, NSTEP, 1, sadpb, + step_param, 1, NSTEP, 1, sadpb, cond_cost_list(cpi, cost_list), &ref_mv, 0, 0, x_pos, y_pos, 0, &cpi->ss_cfg[SS_CFG_LOOKAHEAD], 0); x->mv_limits = tmp_mv_limits;
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c index 3dde8cc..da66fcc 100644 --- a/av1/encoder/tpl_model.c +++ b/av1/encoder/tpl_model.c
@@ -139,7 +139,7 @@ av1_set_mv_search_range(&x->mv_limits, &best_ref_mv1); av1_init3smotion_compensation(&ss_cfg, stride_ref); - av1_full_pixel_search(cpi, x, bsize, &best_ref_mv1_full, step_param, + av1_full_pixel_search(cpi, x, bsize, &best_ref_mv1_full, step_param, 1, search_method, 0, sadpb, cond_cost_list(cpi, cost_list), &best_ref_mv1, INT_MAX, 0, (MI_SIZE * mi_col), (MI_SIZE * mi_row), 0, &ss_cfg, 0);