summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2015-08-07 16:05:59 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-08-07 16:05:59 +0000
commit4bc6ae434207c854150c0d9dd014fb527da591c2 (patch)
treec622aad50874066d63ad0baed38f69be83222db2 /vp9
parentd74ceb03dea1fe7a8e16ede07421ee17043d5abf (diff)
parent7418b176ce1c985637c639280d70b12bdc850e57 (diff)
downloadlibvpx-4bc6ae434207c854150c0d9dd014fb527da591c2.tar
libvpx-4bc6ae434207c854150c0d9dd014fb527da591c2.tar.gz
libvpx-4bc6ae434207c854150c0d9dd014fb527da591c2.tar.bz2
libvpx-4bc6ae434207c854150c0d9dd014fb527da591c2.zip
Merge "Improve the second-level sub-pixel motion search"
Diffstat (limited to 'vp9')
-rw-r--r--vp9/encoder/vp9_mcomp.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c
index 5d3bc5d51..aa3e51ceb 100644
--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -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;