Merge "Improve the second-level sub-pixel motion search"
This commit is contained in:
commit
4bc6ae4342
@ -256,6 +256,27 @@ static INLINE const uint8_t *pre(const uint8_t *buf, int stride, int r, int c) {
|
||||
} \
|
||||
}
|
||||
|
||||
// TODO(yunqingwang): SECOND_LEVEL_CHECKS_BEST was a rewrote of
|
||||
// SECOND_LEVEL_CHECKS, and SECOND_LEVEL_CHECKS should be rewritten
|
||||
// later in the same way.
|
||||
#define SECOND_LEVEL_CHECKS_BEST \
|
||||
{ \
|
||||
unsigned int second; \
|
||||
int br0 = br; \
|
||||
int bc0 = bc; \
|
||||
assert(tr == br || tc == bc); \
|
||||
if (tr == br && tc != bc) { \
|
||||
kc = bc - tc; \
|
||||
} else if (tr != br && tc == bc) { \
|
||||
kr = br - tr; \
|
||||
} \
|
||||
CHECK_BETTER(second, br0 + kr, bc0); \
|
||||
CHECK_BETTER(second, br0, bc0 + kc); \
|
||||
if (br0 != br || bc0 != bc) { \
|
||||
CHECK_BETTER(second, br0 + kr, bc0 + kc); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SETUP_SUBPEL_SEARCH \
|
||||
const uint8_t *const z = x->plane[0].src.buf; \
|
||||
const int src_stride = x->plane[0].src.stride; \
|
||||
@ -636,7 +657,6 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
|
||||
const MACROBLOCKD *xd = &x->e_mbd;
|
||||
unsigned int besterr = INT_MAX;
|
||||
unsigned int sse;
|
||||
unsigned int whichdir = 0;
|
||||
int thismse;
|
||||
const int y_stride = xd->plane[0].pre[0].stride;
|
||||
const int offset = bestmv->row * y_stride + bestmv->col;
|
||||
@ -657,6 +677,7 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
|
||||
const MV *search_step = search_step_table;
|
||||
int idx, best_idx = -1;
|
||||
unsigned int cost_array[5];
|
||||
int kr, kc;
|
||||
|
||||
if (!(allow_hp && vp9_use_mv_hp(ref_mv)))
|
||||
if (round == 3)
|
||||
@ -703,8 +724,11 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
|
||||
}
|
||||
|
||||
// Check diagonal sub-pixel position
|
||||
tc = bc + (cost_array[0] <= cost_array[1] ? -hstep : hstep);
|
||||
tr = br + (cost_array[2] <= cost_array[3] ? -hstep : hstep);
|
||||
kc = (cost_array[0] <= cost_array[1] ? -hstep : hstep);
|
||||
kr = (cost_array[2] <= cost_array[3] ? -hstep : hstep);
|
||||
|
||||
tc = bc + kc;
|
||||
tr = br + kr;
|
||||
if (tc >= minc && tc <= maxc && tr >= minr && tr <= maxr) {
|
||||
const uint8_t *const pre_address = y + (tr >> 3) * y_stride + (tc >> 3);
|
||||
MV this_mv = {tr, tc};
|
||||
@ -736,7 +760,7 @@ int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
|
||||
}
|
||||
|
||||
if (iters_per_step > 1 && best_idx != -1)
|
||||
SECOND_LEVEL_CHECKS;
|
||||
SECOND_LEVEL_CHECKS_BEST;
|
||||
|
||||
tr = br;
|
||||
tc = bc;
|
||||
|
Loading…
Reference in New Issue
Block a user