From 069943a5f1e059aaaac7800466dad92b8b5a7cae Mon Sep 17 00:00:00 2001 From: Angie Chiang Date: Wed, 17 Oct 2018 15:54:25 -0700 Subject: [PATCH] Recompute mv inconsistency after mv search is done Change-Id: I6061f38cb42eea2b4c8996ad372c829dc1051c8d --- vp9/encoder/vp9_encoder.c | 16 +++++++++++++++- vp9/encoder/vp9_mcomp.c | 16 +++++++++------- vp9/encoder/vp9_mcomp.h | 2 ++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index e269955c1..a2f9a8c45 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -52,6 +52,9 @@ #include "vp9/encoder/vp9_extend.h" #include "vp9/encoder/vp9_firstpass.h" #include "vp9/encoder/vp9_mbgraph.h" +#if CONFIG_NON_GREEDY_MV +#include "vp9/encoder/vp9_mcomp.h" +#endif #include "vp9/encoder/vp9_multi_thread.h" #include "vp9/encoder/vp9_noise_estimate.h" #include "vp9/encoder/vp9_picklpf.h" @@ -6089,6 +6092,7 @@ static void do_motion_search(VP9_COMP *cpi, ThreadData *td, int frame_idx, #define CHANGE_MV_SEARCH_ORDER 1 #define USE_PQSORT 1 +#define RE_COMPUTE_MV_INCONSISTENCY 1 #if CHANGE_MV_SEARCH_ORDER #if USE_PQSORT @@ -6327,11 +6331,21 @@ void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture, int frame_idx, TplDepStats *this_tpl_stats = &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col]; for (rf_idx = 0; rf_idx < 3; ++rf_idx) { +#if RE_COMPUTE_MV_INCONSISTENCY + MV full_mv; + int_mv nb_full_mvs[NB_MVS_NUM]; + prepare_nb_full_mvs(tpl_frame, mi_row, mi_col, rf_idx, bsize, + nb_full_mvs); + full_mv.row = this_tpl_stats->mv_arr[rf_idx].as_mv.row >> 3; + full_mv.col = this_tpl_stats->mv_arr[rf_idx].as_mv.col >> 3; + this_tpl_stats->mv_cost[rf_idx] = + av1_nb_mvs_inconsistency(&full_mv, nb_full_mvs); +#endif // RE_COMPUTE_MV_INCONSISTENCY tpl_frame->mv_dist_sum[rf_idx] += this_tpl_stats->mv_dist[rf_idx]; tpl_frame->mv_cost_sum[rf_idx] += this_tpl_stats->mv_cost[rf_idx]; } } -#endif +#endif // CONFIG_NON_GREEDY_MV } } } diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c index 496251622..1192ed64d 100644 --- a/vp9/encoder/vp9_mcomp.c +++ b/vp9/encoder/vp9_mcomp.c @@ -1733,7 +1733,7 @@ static int exhuastive_mesh_search(const MACROBLOCK *x, MV *ref_mv, MV *best_mv, } #if CONFIG_NON_GREEDY_MV -static double nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs) { +double av1_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs) { int i; double best_cost = -1; vpx_clear_system_state(); @@ -1801,7 +1801,7 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x, // Check the starting position *best_mv_dist = fn_ptr->sdf(what, what_stride, in_what, in_what_stride); - *best_mv_cost = nb_mvs_inconsistency(best_full_mv, nb_full_mvs); + *best_mv_cost = av1_nb_mvs_inconsistency(best_full_mv, nb_full_mvs); bestsad = (*best_mv_dist) + lambda * (*best_mv_cost); i = 0; @@ -1834,7 +1834,8 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x, const MV this_mv = { best_full_mv->row + ss_mv[i].row, best_full_mv->col + ss_mv[i].col }; const double mv_dist = sad_array[t]; - const double mv_cost = nb_mvs_inconsistency(&this_mv, nb_full_mvs); + const double mv_cost = + av1_nb_mvs_inconsistency(&this_mv, nb_full_mvs); double thissad = mv_dist + lambda * mv_cost; if (thissad < bestsad) { bestsad = thissad; @@ -1854,7 +1855,8 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x, const uint8_t *const check_here = ss_os[i] + best_address; const double mv_dist = fn_ptr->sdf(what, what_stride, check_here, in_what_stride); - const double mv_cost = nb_mvs_inconsistency(&this_mv, nb_full_mvs); + const double mv_cost = + av1_nb_mvs_inconsistency(&this_mv, nb_full_mvs); double thissad = mv_dist + lambda * mv_cost; if (thissad < bestsad) { bestsad = thissad; @@ -2440,7 +2442,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv, vpx_clear_system_state(); *best_mv_dist = fn_ptr->sdf(what->buf, what->stride, best_address, in_what->stride); - *best_mv_cost = nb_mvs_inconsistency(best_full_mv, nb_full_mvs); + *best_mv_cost = av1_nb_mvs_inconsistency(best_full_mv, nb_full_mvs); best_sad = (*best_mv_dist) + lambda * (*best_mv_cost); for (i = 0; i < search_range; i++) { @@ -2462,7 +2464,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv, const MV mv = { best_full_mv->row + neighbors[j].row, best_full_mv->col + neighbors[j].col }; const double mv_dist = sads[j]; - const double mv_cost = nb_mvs_inconsistency(&mv, nb_full_mvs); + const double mv_cost = av1_nb_mvs_inconsistency(&mv, nb_full_mvs); const double thissad = mv_dist + lambda * mv_cost; if (thissad < best_sad) { best_sad = thissad; @@ -2480,7 +2482,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv, const double mv_dist = fn_ptr->sdf(what->buf, what->stride, get_buf_from_mv(in_what, &mv), in_what->stride); - const double mv_cost = nb_mvs_inconsistency(&mv, nb_full_mvs); + const double mv_cost = av1_nb_mvs_inconsistency(&mv, nb_full_mvs); const double thissad = mv_dist + lambda * mv_cost; if (thissad < best_sad) { best_sad = thissad; diff --git a/vp9/encoder/vp9_mcomp.h b/vp9/encoder/vp9_mcomp.h index 558ecbcd8..a159cb288 100644 --- a/vp9/encoder/vp9_mcomp.h +++ b/vp9/encoder/vp9_mcomp.h @@ -134,6 +134,8 @@ double vp9_full_pixel_diamond_new(const struct VP9_COMP *cpi, MACROBLOCK *x, const vp9_variance_fn_ptr_t *fn_ptr, const int_mv *nb_full_mvs, struct TplDepStats *tpl_stats, int rf_idx); + +double av1_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs); #endif // CONFIG_NON_GREEDY_MV #ifdef __cplusplus } // extern "C" -- 2.40.0