Remove repetitive code in mcomp.c
Deleted vp9_find_best_sub_pixel_comp_tree(), and combined it in vp9_find_best_sub_pixel_tree(). Change-Id: Ifb25763c8b19822df5537cc1daa76ce88dc3b056
This commit is contained in:
Родитель
a51e389b42
Коммит
a581da218e
|
@ -338,7 +338,6 @@ typedef struct VP9_COMP {
|
|||
CYCLIC_REFRESH *cyclic_refresh;
|
||||
|
||||
fractional_mv_step_fp *find_fractional_mv_step;
|
||||
fractional_mv_step_comp_fp *find_fractional_mv_step_comp;
|
||||
vp9_full_search_fn_t full_search_sad;
|
||||
vp9_refining_search_fn_t refining_search_sad;
|
||||
vp9_diamond_search_fn_t diamond_search_sad;
|
||||
|
|
|
@ -56,7 +56,7 @@ static unsigned int do_16x16_motion_iteration(VP9_COMP *cpi,
|
|||
cpi->find_fractional_mv_step(
|
||||
x, dst_mv, ref_mv, cpi->common.allow_high_precision_mv, x->errorperbit,
|
||||
&v_fn_ptr, 0, mv_sf->subpel_iters_per_step, NULL, NULL, &distortion,
|
||||
&sse);
|
||||
&sse, NULL, 0, 0);
|
||||
}
|
||||
|
||||
xd->mi[0]->mbmi.mode = NEWMV;
|
||||
|
|
|
@ -172,15 +172,15 @@ static INLINE const uint8_t *pre(const uint8_t *buf, int stride, int r, int c) {
|
|||
return &buf[(r >> 3) * stride + (c >> 3)];
|
||||
}
|
||||
|
||||
/* returns subpixel variance error function */
|
||||
#define DIST(r, c) \
|
||||
vfp->svf(pre(y, y_stride, r, c), y_stride, sp(c), sp(r), z, \
|
||||
src_stride, &sse)
|
||||
|
||||
/* checks if (r, c) has better score than previous best */
|
||||
#define CHECK_BETTER(v, r, c) \
|
||||
if (c >= minc && c <= maxc && r >= minr && r <= maxr) { \
|
||||
thismse = (DIST(r, c)); \
|
||||
if (second_pred == NULL) \
|
||||
thismse = vfp->svf(pre(y, y_stride, r, c), y_stride, sp(c), sp(r), z, \
|
||||
src_stride, &sse); \
|
||||
else \
|
||||
thismse = vfp->svaf(pre(y, y_stride, r, c), y_stride, sp(c), sp(r), \
|
||||
z, src_stride, &sse, second_pred); \
|
||||
if ((v = MVC(r, c) + thismse) < besterr) { \
|
||||
besterr = v; \
|
||||
br = r; \
|
||||
|
@ -266,105 +266,9 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
|
|||
int iters_per_step,
|
||||
int *mvjcost, int *mvcost[2],
|
||||
int *distortion,
|
||||
unsigned int *sse1) {
|
||||
const uint8_t *const z = x->plane[0].src.buf;
|
||||
const int src_stride = x->plane[0].src.stride;
|
||||
const MACROBLOCKD *xd = &x->e_mbd;
|
||||
unsigned int besterr = INT_MAX;
|
||||
unsigned int sse;
|
||||
unsigned int whichdir;
|
||||
int thismse;
|
||||
unsigned int halfiters = iters_per_step;
|
||||
unsigned int quarteriters = iters_per_step;
|
||||
unsigned int eighthiters = iters_per_step;
|
||||
|
||||
const int y_stride = xd->plane[0].pre[0].stride;
|
||||
const int offset = bestmv->row * y_stride + bestmv->col;
|
||||
const uint8_t *const y = xd->plane[0].pre[0].buf;
|
||||
|
||||
int rr = ref_mv->row;
|
||||
int rc = ref_mv->col;
|
||||
int br = bestmv->row * 8;
|
||||
int bc = bestmv->col * 8;
|
||||
int hstep = 4;
|
||||
const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX);
|
||||
const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX);
|
||||
const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX);
|
||||
const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX);
|
||||
|
||||
int tr = br;
|
||||
int tc = bc;
|
||||
|
||||
// central mv
|
||||
bestmv->row *= 8;
|
||||
bestmv->col *= 8;
|
||||
|
||||
// calculate central point error
|
||||
besterr = vfp->vf(y + offset, y_stride, z, src_stride, sse1);
|
||||
*distortion = besterr;
|
||||
besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
|
||||
|
||||
// 1/2 pel
|
||||
FIRST_LEVEL_CHECKS;
|
||||
if (halfiters > 1) {
|
||||
SECOND_LEVEL_CHECKS;
|
||||
}
|
||||
tr = br;
|
||||
tc = bc;
|
||||
|
||||
// Note forced_stop: 0 - full, 1 - qtr only, 2 - half only
|
||||
if (forced_stop != 2) {
|
||||
hstep >>= 1;
|
||||
FIRST_LEVEL_CHECKS;
|
||||
if (quarteriters > 1) {
|
||||
SECOND_LEVEL_CHECKS;
|
||||
}
|
||||
tr = br;
|
||||
tc = bc;
|
||||
}
|
||||
|
||||
if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
|
||||
hstep >>= 1;
|
||||
FIRST_LEVEL_CHECKS;
|
||||
if (eighthiters > 1) {
|
||||
SECOND_LEVEL_CHECKS;
|
||||
}
|
||||
tr = br;
|
||||
tc = bc;
|
||||
}
|
||||
// These lines insure static analysis doesn't warn that
|
||||
// tr and tc aren't used after the above point.
|
||||
(void) tr;
|
||||
(void) tc;
|
||||
|
||||
bestmv->row = br;
|
||||
bestmv->col = bc;
|
||||
|
||||
if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) ||
|
||||
(abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3)))
|
||||
return INT_MAX;
|
||||
|
||||
return besterr;
|
||||
}
|
||||
|
||||
#undef DIST
|
||||
/* returns subpixel variance error function */
|
||||
#define DIST(r, c) \
|
||||
vfp->svaf(pre(y, y_stride, r, c), y_stride, sp(c), sp(r), \
|
||||
z, src_stride, &sse, second_pred)
|
||||
|
||||
int vp9_find_best_sub_pixel_comp_tree(const MACROBLOCK *x,
|
||||
MV *bestmv, const MV *ref_mv,
|
||||
int allow_hp,
|
||||
int error_per_bit,
|
||||
const vp9_variance_fn_ptr_t *vfp,
|
||||
int forced_stop,
|
||||
int iters_per_step,
|
||||
int *mvjcost, int *mvcost[2],
|
||||
int *distortion,
|
||||
unsigned int *sse1,
|
||||
const uint8_t *second_pred,
|
||||
int w, int h) {
|
||||
unsigned int *sse1,
|
||||
const uint8_t *second_pred,
|
||||
int w, int h) {
|
||||
const uint8_t *const z = x->plane[0].src.buf;
|
||||
const int src_stride = x->plane[0].src.stride;
|
||||
const MACROBLOCKD *xd = &x->e_mbd;
|
||||
|
@ -376,7 +280,6 @@ int vp9_find_best_sub_pixel_comp_tree(const MACROBLOCK *x,
|
|||
const unsigned int quarteriters = iters_per_step;
|
||||
const unsigned int eighthiters = iters_per_step;
|
||||
|
||||
DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
|
||||
const int y_stride = xd->plane[0].pre[0].stride;
|
||||
const int offset = bestmv->row * y_stride + bestmv->col;
|
||||
const uint8_t *const y = xd->plane[0].pre[0].buf;
|
||||
|
@ -401,8 +304,13 @@ int vp9_find_best_sub_pixel_comp_tree(const MACROBLOCK *x,
|
|||
// calculate central point error
|
||||
// TODO(yunqingwang): central pointer error was already calculated in full-
|
||||
// pixel search, and can be passed in this function.
|
||||
vp9_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride);
|
||||
besterr = vfp->vf(comp_pred, w, z, src_stride, sse1);
|
||||
if (second_pred != NULL) {
|
||||
DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
|
||||
vp9_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride);
|
||||
besterr = vfp->vf(comp_pred, w, z, src_stride, sse1);
|
||||
} else {
|
||||
besterr = vfp->vf(y + offset, y_stride, z, src_stride, sse1);
|
||||
}
|
||||
*distortion = besterr;
|
||||
besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
|
||||
|
||||
|
@ -456,7 +364,6 @@ int vp9_find_best_sub_pixel_comp_tree(const MACROBLOCK *x,
|
|||
|
||||
#undef MVC
|
||||
#undef PRE
|
||||
#undef DIST
|
||||
#undef CHECK_BETTER
|
||||
|
||||
static INLINE int check_bounds(const MACROBLOCK *x, int row, int col,
|
||||
|
|
|
@ -91,21 +91,6 @@ integer_mv_pattern_search_fn vp9_fast_hex_search;
|
|||
integer_mv_pattern_search_fn vp9_fast_dia_search;
|
||||
|
||||
typedef int (fractional_mv_step_fp) (
|
||||
const MACROBLOCK *x,
|
||||
MV *bestmv, const MV *ref_mv,
|
||||
int allow_hp,
|
||||
int error_per_bit,
|
||||
const vp9_variance_fn_ptr_t *vfp,
|
||||
int forced_stop, // 0 - full, 1 - qtr only, 2 - half only
|
||||
int iters_per_step,
|
||||
int *mvjcost,
|
||||
int *mvcost[2],
|
||||
int *distortion,
|
||||
unsigned int *sse);
|
||||
|
||||
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree;
|
||||
|
||||
typedef int (fractional_mv_step_comp_fp) (
|
||||
const MACROBLOCK *x,
|
||||
MV *bestmv, const MV *ref_mv,
|
||||
int allow_hp,
|
||||
|
@ -118,7 +103,7 @@ typedef int (fractional_mv_step_comp_fp) (
|
|||
const uint8_t *second_pred,
|
||||
int w, int h);
|
||||
|
||||
extern fractional_mv_step_comp_fp vp9_find_best_sub_pixel_comp_tree;
|
||||
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree;
|
||||
|
||||
typedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x,
|
||||
const MV *ref_mv, int sad_per_bit,
|
||||
|
|
|
@ -185,7 +185,7 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||
cpi->sf.mv.subpel_force_stop,
|
||||
cpi->sf.mv.subpel_iters_per_step,
|
||||
x->nmvjointcost, x->mvcost,
|
||||
&dis, &x->pred_sse[ref]);
|
||||
&dis, &x->pred_sse[ref], NULL, 0, 0);
|
||||
x->pred_mv[ref] = tmp_mv->as_mv;
|
||||
}
|
||||
|
||||
|
|
|
@ -1422,7 +1422,8 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
|||
cpi->sf.mv.subpel_iters_per_step,
|
||||
x->nmvjointcost, x->mvcost,
|
||||
&distortion,
|
||||
&x->pred_sse[mbmi->ref_frame[0]]);
|
||||
&x->pred_sse[mbmi->ref_frame[0]],
|
||||
NULL, 0, 0);
|
||||
|
||||
// save motion search result for use in compound prediction
|
||||
seg_mvs[i][mbmi->ref_frame[0]].as_mv = *new_mv;
|
||||
|
@ -1838,7 +1839,7 @@ static void single_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||
cpi->sf.mv.subpel_force_stop,
|
||||
cpi->sf.mv.subpel_iters_per_step,
|
||||
x->nmvjointcost, x->mvcost,
|
||||
&dis, &x->pred_sse[ref]);
|
||||
&dis, &x->pred_sse[ref], NULL, 0, 0);
|
||||
}
|
||||
*rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv,
|
||||
x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
|
||||
|
@ -1954,7 +1955,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||
if (bestsme < INT_MAX) {
|
||||
int dis; /* TODO: use dis in distortion calculation later. */
|
||||
unsigned int sse;
|
||||
bestsme = cpi->find_fractional_mv_step_comp(
|
||||
bestsme = cpi->find_fractional_mv_step(
|
||||
x, &tmp_mv,
|
||||
&ref_mv[id].as_mv,
|
||||
cpi->common.allow_high_precision_mv,
|
||||
|
|
|
@ -396,7 +396,6 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
|
|||
|
||||
if (sf->mv.subpel_search_method == SUBPEL_TREE) {
|
||||
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
|
||||
cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree;
|
||||
}
|
||||
|
||||
cpi->mb.optimize = sf->optimize_coefficients == 1 && cpi->pass != 1;
|
||||
|
|
|
@ -178,7 +178,7 @@ static int temporal_filter_find_matching_mb_c(VP9_COMP *cpi,
|
|||
&cpi->fn_ptr[BLOCK_16X16],
|
||||
0, mv_sf->subpel_iters_per_step,
|
||||
NULL, NULL,
|
||||
&distortion, &sse);
|
||||
&distortion, &sse, NULL, 0, 0);
|
||||
|
||||
// Restore input state
|
||||
x->plane[0].src = src;
|
||||
|
|
Загрузка…
Ссылка в новой задаче