| Index: source/libvpx/vp9/encoder/vp9_mcomp.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_mcomp.c (revision 232232)
|
| +++ source/libvpx/vp9/encoder/vp9_mcomp.c (working copy)
|
| @@ -59,38 +59,39 @@
|
| return sr;
|
| }
|
|
|
| -int vp9_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvjcost, int *mvcost[2],
|
| - int weight) {
|
| - MV v;
|
| - v.row = mv->as_mv.row - ref->as_mv.row;
|
| - v.col = mv->as_mv.col - ref->as_mv.col;
|
| - return ROUND_POWER_OF_TWO((mvjcost[vp9_get_mv_joint(&v)] +
|
| - mvcost[0][v.row] +
|
| - mvcost[1][v.col]) * weight, 7);
|
| +static INLINE int mv_cost(const MV *mv,
|
| + const int *joint_cost, int *comp_cost[2]) {
|
| + return joint_cost[vp9_get_mv_joint(mv)] +
|
| + comp_cost[0][mv->row] + comp_cost[1][mv->col];
|
| }
|
|
|
| -static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvjcost, int *mvcost[2],
|
| +int vp9_mv_bit_cost(const MV *mv, const MV *ref,
|
| + const int *mvjcost, int *mvcost[2], int weight) {
|
| + const MV diff = { mv->row - ref->row,
|
| + mv->col - ref->col };
|
| + return ROUND_POWER_OF_TWO(mv_cost(&diff, mvjcost, mvcost) * weight, 7);
|
| +}
|
| +
|
| +static int mv_err_cost(const MV *mv, const MV *ref,
|
| + const int *mvjcost, int *mvcost[2],
|
| int error_per_bit) {
|
| if (mvcost) {
|
| - MV v;
|
| - v.row = mv->as_mv.row - ref->as_mv.row;
|
| - v.col = mv->as_mv.col - ref->as_mv.col;
|
| - return ROUND_POWER_OF_TWO((mvjcost[vp9_get_mv_joint(&v)] +
|
| - mvcost[0][v.row] +
|
| - mvcost[1][v.col]) * error_per_bit, 13);
|
| + const MV diff = { mv->row - ref->row,
|
| + mv->col - ref->col };
|
| + return ROUND_POWER_OF_TWO(mv_cost(&diff, mvjcost, mvcost) *
|
| + error_per_bit, 13);
|
| }
|
| return 0;
|
| }
|
|
|
| -static int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvjsadcost,
|
| - int *mvsadcost[2], int error_per_bit) {
|
| +static int mvsad_err_cost(const MV *mv, const MV *ref,
|
| + const int *mvjsadcost, int *mvsadcost[2],
|
| + int error_per_bit) {
|
| if (mvsadcost) {
|
| - MV v;
|
| - v.row = mv->as_mv.row - ref->as_mv.row;
|
| - v.col = mv->as_mv.col - ref->as_mv.col;
|
| - return ROUND_POWER_OF_TWO((mvjsadcost[vp9_get_mv_joint(&v)] +
|
| - mvsadcost[0][v.row] +
|
| - mvsadcost[1][v.col]) * error_per_bit, 8);
|
| + const MV diff = { mv->row - ref->row,
|
| + mv->col - ref->col };
|
| + return ROUND_POWER_OF_TWO(mv_cost(&diff, mvjsadcost, mvsadcost) *
|
| + error_per_bit, 8);
|
| }
|
| return 0;
|
| }
|
| @@ -136,66 +137,26 @@
|
| }
|
|
|
| void vp9_init3smotion_compensation(MACROBLOCK *x, int stride) {
|
| - int len;
|
| - int search_site_count = 0;
|
| + int len, ss_count = 1;
|
|
|
| - // Generate offsets for 8 search sites per step.
|
| - x->ss[search_site_count].mv.col = 0;
|
| - x->ss[search_site_count].mv.row = 0;
|
| - x->ss[search_site_count].offset = 0;
|
| - search_site_count++;
|
| + x->ss[0].mv.col = x->ss[0].mv.row = 0;
|
| + x->ss[0].offset = 0;
|
|
|
| for (len = MAX_FIRST_STEP; len > 0; len /= 2) {
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = 0;
|
| - x->ss[search_site_count].mv.row = -len;
|
| - x->ss[search_site_count].offset = -len * stride;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = 0;
|
| - x->ss[search_site_count].mv.row = len;
|
| - x->ss[search_site_count].offset = len * stride;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = -len;
|
| - x->ss[search_site_count].mv.row = 0;
|
| - x->ss[search_site_count].offset = -len;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = len;
|
| - x->ss[search_site_count].mv.row = 0;
|
| - x->ss[search_site_count].offset = len;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = -len;
|
| - x->ss[search_site_count].mv.row = -len;
|
| - x->ss[search_site_count].offset = -len * stride - len;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = len;
|
| - x->ss[search_site_count].mv.row = -len;
|
| - x->ss[search_site_count].offset = -len * stride + len;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = -len;
|
| - x->ss[search_site_count].mv.row = len;
|
| - x->ss[search_site_count].offset = len * stride - len;
|
| - search_site_count++;
|
| -
|
| - // Compute offsets for search sites.
|
| - x->ss[search_site_count].mv.col = len;
|
| - x->ss[search_site_count].mv.row = len;
|
| - x->ss[search_site_count].offset = len * stride + len;
|
| - search_site_count++;
|
| + // Generate offsets for 8 search sites per step.
|
| + const MV ss_mvs[8] = {
|
| + {-len, 0 }, {len, 0 }, { 0, -len}, {0, len},
|
| + {-len, -len}, {-len, len}, {len, -len}, {len, len}
|
| + };
|
| + int i;
|
| + for (i = 0; i < 8; ++i) {
|
| + search_site *const ss = &x->ss[ss_count++];
|
| + ss->mv = ss_mvs[i];
|
| + ss->offset = ss->mv.row * stride + ss->mv.col;
|
| + }
|
| }
|
|
|
| - x->ss_count = search_site_count;
|
| + x->ss_count = ss_count;
|
| x->searches_per_step = 8;
|
| }
|
|
|
| @@ -313,7 +274,8 @@
|
| }
|
|
|
| int vp9_find_best_sub_pixel_iterative(MACROBLOCK *x,
|
| - int_mv *bestmv, int_mv *ref_mv,
|
| + MV *bestmv, const MV *ref_mv,
|
| + int allow_hp,
|
| int error_per_bit,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int forced_stop,
|
| @@ -333,38 +295,34 @@
|
| unsigned int eighthiters = iters_per_step;
|
| int thismse;
|
|
|
| - uint8_t *y = xd->plane[0].pre[0].buf +
|
| - (bestmv->as_mv.row) * xd->plane[0].pre[0].stride +
|
| - bestmv->as_mv.col;
|
| -
|
| const int y_stride = xd->plane[0].pre[0].stride;
|
| + const int offset = bestmv->row * y_stride + bestmv->col;
|
| + uint8_t *y = xd->plane[0].pre[0].buf + offset;
|
|
|
| - int rr = ref_mv->as_mv.row;
|
| - int rc = ref_mv->as_mv.col;
|
| - int br = bestmv->as_mv.row << 3;
|
| - int bc = bestmv->as_mv.col << 3;
|
| + 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 << 3, ref_mv->as_mv.col - MV_MAX);
|
| - const int maxc = MIN(x->mv_col_max << 3, ref_mv->as_mv.col + MV_MAX);
|
| - const int minr = MAX(x->mv_row_min << 3, ref_mv->as_mv.row - MV_MAX);
|
| - const int maxr = MIN(x->mv_row_max << 3, ref_mv->as_mv.row + MV_MAX);
|
| + 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;
|
|
|
| - const int offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
|
| -
|
| // central mv
|
| - bestmv->as_mv.row <<= 3;
|
| - bestmv->as_mv.col <<= 3;
|
| + bestmv->row <<= 3;
|
| + bestmv->col <<= 3;
|
|
|
| // calculate central point error
|
| besterr = vfp->vf(y, y_stride, z, src_stride, sse1);
|
| *distortion = besterr;
|
| besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
|
|
|
| - // TODO: Each subsequent iteration checks at least one point in
|
| - // common with the last iteration could be 2 ( if diag selected)
|
| + // TODO(jbb): Each subsequent iteration checks at least one point in
|
| + // common with the last iteration could be 2 if diagonal is selected.
|
| while (halfiters--) {
|
| // 1/2 pel
|
| FIRST_LEVEL_CHECKS;
|
| @@ -375,8 +333,8 @@
|
| tc = bc;
|
| }
|
|
|
| - // TODO: Each subsequent iteration checks at least one point in common with
|
| - // the last iteration could be 2 ( if diag selected) 1/4 pel
|
| + // TODO(yaowu): Each subsequent iteration checks at least one point in common
|
| + // with the last iteration could be 2 if diagonal is selected.
|
|
|
| // Note forced_stop: 0 - full, 1 - qtr only, 2 - half only
|
| if (forced_stop != 2) {
|
| @@ -391,8 +349,7 @@
|
| }
|
| }
|
|
|
| - if (xd->allow_high_precision_mv && vp9_use_mv_hp(&ref_mv->as_mv) &&
|
| - forced_stop == 0) {
|
| + if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
|
| hstep >>= 1;
|
| while (eighthiters--) {
|
| FIRST_LEVEL_CHECKS;
|
| @@ -404,18 +361,19 @@
|
| }
|
| }
|
|
|
| - bestmv->as_mv.row = br;
|
| - bestmv->as_mv.col = bc;
|
| + bestmv->row = br;
|
| + bestmv->col = bc;
|
|
|
| - if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL << 3)) ||
|
| - (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL << 3)))
|
| + 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;
|
| }
|
|
|
| int vp9_find_best_sub_pixel_tree(MACROBLOCK *x,
|
| - int_mv *bestmv, int_mv *ref_mv,
|
| + MV *bestmv, const MV *ref_mv,
|
| + int allow_hp,
|
| int error_per_bit,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int forced_stop,
|
| @@ -424,49 +382,36 @@
|
| int *distortion,
|
| unsigned int *sse1) {
|
| uint8_t *z = x->plane[0].src.buf;
|
| - int src_stride = x->plane[0].src.stride;
|
| + const int src_stride = x->plane[0].src.stride;
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - int rr, rc, br, bc, hstep;
|
| - int tr, tc;
|
| unsigned int besterr = INT_MAX;
|
| unsigned int sse;
|
| unsigned int whichdir;
|
| int thismse;
|
| - int maxc, minc, maxr, minr;
|
| - int y_stride;
|
| - int offset;
|
| unsigned int halfiters = iters_per_step;
|
| unsigned int quarteriters = iters_per_step;
|
| unsigned int eighthiters = iters_per_step;
|
|
|
| - uint8_t *y = xd->plane[0].pre[0].buf +
|
| - (bestmv->as_mv.row) * xd->plane[0].pre[0].stride +
|
| - bestmv->as_mv.col;
|
| + const int y_stride = xd->plane[0].pre[0].stride;
|
| + const int offset = bestmv->row * y_stride + bestmv->col;
|
| + uint8_t *y = xd->plane[0].pre[0].buf + offset;
|
|
|
| - y_stride = xd->plane[0].pre[0].stride;
|
| + 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);
|
|
|
| - rr = ref_mv->as_mv.row;
|
| - rc = ref_mv->as_mv.col;
|
| - br = bestmv->as_mv.row << 3;
|
| - bc = bestmv->as_mv.col << 3;
|
| - hstep = 4;
|
| - minc = MAX(x->mv_col_min << 3,
|
| - (ref_mv->as_mv.col) - ((1 << MV_MAX_BITS) - 1));
|
| - maxc = MIN(x->mv_col_max << 3,
|
| - (ref_mv->as_mv.col) + ((1 << MV_MAX_BITS) - 1));
|
| - minr = MAX(x->mv_row_min << 3,
|
| - (ref_mv->as_mv.row) - ((1 << MV_MAX_BITS) - 1));
|
| - maxr = MIN(x->mv_row_max << 3,
|
| - (ref_mv->as_mv.row) + ((1 << MV_MAX_BITS) - 1));
|
| + int tr = br;
|
| + int tc = bc;
|
|
|
| - tr = br;
|
| - tc = bc;
|
| -
|
| - offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
|
| -
|
| // central mv
|
| - bestmv->as_mv.row <<= 3;
|
| - bestmv->as_mv.col <<= 3;
|
| + bestmv->row *= 8;
|
| + bestmv->col *= 8;
|
|
|
| // calculate central point error
|
| besterr = vfp->vf(y, y_stride, z, src_stride, sse1);
|
| @@ -492,8 +437,7 @@
|
| tc = bc;
|
| }
|
|
|
| - if (xd->allow_high_precision_mv && vp9_use_mv_hp(&ref_mv->as_mv) &&
|
| - forced_stop == 0) {
|
| + if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
|
| hstep >>= 1;
|
| FIRST_LEVEL_CHECKS;
|
| if (eighthiters > 1) {
|
| @@ -503,11 +447,11 @@
|
| tc = bc;
|
| }
|
|
|
| - bestmv->as_mv.row = br;
|
| - bestmv->as_mv.col = bc;
|
| + bestmv->row = br;
|
| + bestmv->col = bc;
|
|
|
| - if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL << 3)) ||
|
| - (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL << 3)))
|
| + 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;
|
| @@ -520,7 +464,8 @@
|
| z, src_stride, &sse, second_pred)
|
|
|
| int vp9_find_best_sub_pixel_comp_iterative(MACROBLOCK *x,
|
| - int_mv *bestmv, int_mv *ref_mv,
|
| + MV *bestmv, const MV *ref_mv,
|
| + int allow_hp,
|
| int error_per_bit,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int forced_stop,
|
| @@ -543,30 +488,26 @@
|
| int thismse;
|
|
|
| DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
|
| - uint8_t *const y = xd->plane[0].pre[0].buf +
|
| - (bestmv->as_mv.row) * xd->plane[0].pre[0].stride +
|
| - bestmv->as_mv.col;
|
| -
|
| const int y_stride = xd->plane[0].pre[0].stride;
|
| + const int offset = bestmv->row * y_stride + bestmv->col;
|
| + uint8_t *const y = xd->plane[0].pre[0].buf + offset;
|
|
|
| - int rr = ref_mv->as_mv.row;
|
| - int rc = ref_mv->as_mv.col;
|
| - int br = bestmv->as_mv.row << 3;
|
| - int bc = bestmv->as_mv.col << 3;
|
| + 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 << 3, ref_mv->as_mv.col - MV_MAX);
|
| - const int maxc = MIN(x->mv_col_max << 3, ref_mv->as_mv.col + MV_MAX);
|
| - const int minr = MAX(x->mv_row_min << 3, ref_mv->as_mv.row - MV_MAX);
|
| - const int maxr = MIN(x->mv_row_max << 3, ref_mv->as_mv.row + MV_MAX);
|
| + 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;
|
|
|
| - const int offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
|
| -
|
| // central mv
|
| - bestmv->as_mv.row <<= 3;
|
| - bestmv->as_mv.col <<= 3;
|
| + bestmv->row *= 8;
|
| + bestmv->col *= 8;
|
|
|
| // calculate central point error
|
| // TODO(yunqingwang): central pointer error was already calculated in full-
|
| @@ -604,8 +545,7 @@
|
| }
|
| }
|
|
|
| - if (xd->allow_high_precision_mv && vp9_use_mv_hp(&ref_mv->as_mv) &&
|
| - forced_stop == 0) {
|
| + if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
|
| hstep >>= 1;
|
| while (eighthiters--) {
|
| FIRST_LEVEL_CHECKS;
|
| @@ -616,18 +556,19 @@
|
| tc = bc;
|
| }
|
| }
|
| - bestmv->as_mv.row = br;
|
| - bestmv->as_mv.col = bc;
|
| + bestmv->row = br;
|
| + bestmv->col = bc;
|
|
|
| - if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL << 3)) ||
|
| - (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL << 3)))
|
| + 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;
|
| }
|
|
|
| int vp9_find_best_sub_pixel_comp_tree(MACROBLOCK *x,
|
| - int_mv *bestmv, int_mv *ref_mv,
|
| + MV *bestmv, const MV *ref_mv,
|
| + int allow_hp,
|
| int error_per_bit,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int forced_stop,
|
| @@ -638,51 +579,37 @@
|
| const uint8_t *second_pred,
|
| int w, int h) {
|
| uint8_t *z = x->plane[0].src.buf;
|
| - int src_stride = x->plane[0].src.stride;
|
| + const int src_stride = x->plane[0].src.stride;
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - int rr, rc, br, bc, hstep;
|
| - int tr, tc;
|
| unsigned int besterr = INT_MAX;
|
| unsigned int sse;
|
| unsigned int whichdir;
|
| int thismse;
|
| - int maxc, minc, maxr, minr;
|
| - int y_stride;
|
| - int offset;
|
| unsigned int halfiters = iters_per_step;
|
| unsigned int quarteriters = iters_per_step;
|
| unsigned int eighthiters = iters_per_step;
|
|
|
| DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
|
| - uint8_t *y = xd->plane[0].pre[0].buf +
|
| - (bestmv->as_mv.row) * xd->plane[0].pre[0].stride +
|
| - bestmv->as_mv.col;
|
| + const int y_stride = xd->plane[0].pre[0].stride;
|
| + const int offset = bestmv->row * y_stride + bestmv->col;
|
| + uint8_t *y = xd->plane[0].pre[0].buf + offset;
|
|
|
| - y_stride = xd->plane[0].pre[0].stride;
|
| + 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);
|
|
|
| - rr = ref_mv->as_mv.row;
|
| - rc = ref_mv->as_mv.col;
|
| - br = bestmv->as_mv.row << 3;
|
| - bc = bestmv->as_mv.col << 3;
|
| - hstep = 4;
|
| - minc = MAX(x->mv_col_min << 3, (ref_mv->as_mv.col) -
|
| - ((1 << MV_MAX_BITS) - 1));
|
| - maxc = MIN(x->mv_col_max << 3, (ref_mv->as_mv.col) +
|
| - ((1 << MV_MAX_BITS) - 1));
|
| - minr = MAX(x->mv_row_min << 3, (ref_mv->as_mv.row) -
|
| - ((1 << MV_MAX_BITS) - 1));
|
| - maxr = MIN(x->mv_row_max << 3, (ref_mv->as_mv.row) +
|
| - ((1 << MV_MAX_BITS) - 1));
|
| + int tr = br;
|
| + int tc = bc;
|
|
|
| - tr = br;
|
| - tc = bc;
|
| -
|
| -
|
| - offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
|
| -
|
| // central mv
|
| - bestmv->as_mv.row <<= 3;
|
| - bestmv->as_mv.col <<= 3;
|
| + bestmv->row *= 8;
|
| + bestmv->col *= 8;
|
|
|
| // calculate central point error
|
| // TODO(yunqingwang): central pointer error was already calculated in full-
|
| @@ -716,8 +643,7 @@
|
| tc = bc;
|
| }
|
|
|
| - if (xd->allow_high_precision_mv && vp9_use_mv_hp(&ref_mv->as_mv) &&
|
| - forced_stop == 0) {
|
| + if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
|
| hstep >>= 1;
|
| FIRST_LEVEL_CHECKS;
|
| if (eighthiters > 1) {
|
| @@ -726,11 +652,11 @@
|
| tr = br;
|
| tc = bc;
|
| }
|
| - bestmv->as_mv.row = br;
|
| - bestmv->as_mv.col = bc;
|
| + bestmv->row = br;
|
| + bestmv->col = bc;
|
|
|
| - if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL << 3)) ||
|
| - (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL << 3)))
|
| + 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;
|
| @@ -754,10 +680,10 @@
|
|
|
| #define CHECK_POINT \
|
| {\
|
| - if (this_mv.as_mv.col < x->mv_col_min) continue;\
|
| - if (this_mv.as_mv.col > x->mv_col_max) continue;\
|
| - if (this_mv.as_mv.row < x->mv_row_min) continue;\
|
| - if (this_mv.as_mv.row > x->mv_row_max) continue;\
|
| + if (this_mv.col < x->mv_col_min) continue;\
|
| + if (this_mv.col > x->mv_col_max) continue;\
|
| + if (this_mv.row < x->mv_row_min) continue;\
|
| + if (this_mv.row > x->mv_row_max) continue;\
|
| }
|
|
|
| #define CHECK_BETTER \
|
| @@ -765,7 +691,7 @@
|
| if (thissad < bestsad)\
|
| {\
|
| if (use_mvcost) \
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, \
|
| + thissad += mvsad_err_cost(&this_mv, &fcenter_mv.as_mv, \
|
| mvjsadcost, mvsadcost, \
|
| sad_per_bit);\
|
| if (thissad < bestsad)\
|
| @@ -790,14 +716,14 @@
|
| // candidates as indicated in the num_candidates and candidates arrays
|
| // passed into this function
|
| static int vp9_pattern_search(MACROBLOCK *x,
|
| - int_mv *ref_mv,
|
| + MV *ref_mv,
|
| int search_param,
|
| int sad_per_bit,
|
| int do_init_search,
|
| int do_refine,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int use_mvcost,
|
| - int_mv *center_mv, int_mv *best_mv,
|
| + const MV *center_mv, MV *best_mv,
|
| const int num_candidates[MAX_PATTERN_SCALES],
|
| const MV candidates[MAX_PATTERN_SCALES]
|
| [MAX_PATTERN_CANDIDATES]) {
|
| @@ -810,7 +736,7 @@
|
| int what_stride = x->plane[0].src.stride;
|
| int in_what_stride = xd->plane[0].pre[0].stride;
|
| int br, bc;
|
| - int_mv this_mv;
|
| + MV this_mv;
|
| int bestsad = INT_MAX;
|
| int thissad;
|
| uint8_t *base_offset;
|
| @@ -823,24 +749,22 @@
|
| int *mvjsadcost = x->nmvjointsadcost;
|
| int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
|
|
|
| - fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
|
| - fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
|
| + fcenter_mv.as_mv.row = center_mv->row >> 3;
|
| + fcenter_mv.as_mv.col = center_mv->col >> 3;
|
|
|
| // adjust ref_mv to make sure it is within MV range
|
| - clamp_mv(&ref_mv->as_mv,
|
| - x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
|
| - br = ref_mv->as_mv.row;
|
| - bc = ref_mv->as_mv.col;
|
| + clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
|
| + br = ref_mv->row;
|
| + bc = ref_mv->col;
|
|
|
| // Work out the start point for the search
|
| base_offset = (uint8_t *)(xd->plane[0].pre[0].buf);
|
| this_offset = base_offset + (br * in_what_stride) + bc;
|
| - this_mv.as_mv.row = br;
|
| - this_mv.as_mv.col = bc;
|
| - bestsad = vfp->sdf(what, what_stride, this_offset,
|
| - in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + this_mv.row = br;
|
| + this_mv.col = bc;
|
| + bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride, 0x7fffffff)
|
| + + mvsad_err_cost(&this_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| // Search all possible scales upto the search param around the center point
|
| // pick the scale of the point that is best as the starting scale of
|
| @@ -853,21 +777,21 @@
|
| CHECK_BOUNDS((1 << t))
|
| if (all_in) {
|
| for (i = 0; i < num_candidates[t]; i++) {
|
| - this_mv.as_mv.row = br + candidates[t][i].row;
|
| - this_mv.as_mv.col = bc + candidates[t][i].col;
|
| - this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) +
|
| - this_mv.as_mv.col;
|
| + this_mv.row = br + candidates[t][i].row;
|
| + this_mv.col = bc + candidates[t][i].col;
|
| + this_offset = base_offset + (this_mv.row * in_what_stride) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| }
|
| } else {
|
| for (i = 0; i < num_candidates[t]; i++) {
|
| - this_mv.as_mv.row = br + candidates[t][i].row;
|
| - this_mv.as_mv.col = bc + candidates[t][i].col;
|
| + this_mv.row = br + candidates[t][i].row;
|
| + this_mv.col = bc + candidates[t][i].col;
|
| CHECK_POINT
|
| - this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) +
|
| - this_mv.as_mv.col;
|
| + this_offset = base_offset + (this_mv.row * in_what_stride) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| @@ -897,21 +821,21 @@
|
| CHECK_BOUNDS((1 << s))
|
| if (all_in) {
|
| for (i = 0; i < num_candidates[s]; i++) {
|
| - this_mv.as_mv.row = br + candidates[s][i].row;
|
| - this_mv.as_mv.col = bc + candidates[s][i].col;
|
| - this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) +
|
| - this_mv.as_mv.col;
|
| + this_mv.row = br + candidates[s][i].row;
|
| + this_mv.col = bc + candidates[s][i].col;
|
| + this_offset = base_offset + (this_mv.row * in_what_stride) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| }
|
| } else {
|
| for (i = 0; i < num_candidates[s]; i++) {
|
| - this_mv.as_mv.row = br + candidates[s][i].row;
|
| - this_mv.as_mv.col = bc + candidates[s][i].col;
|
| + this_mv.row = br + candidates[s][i].row;
|
| + this_mv.col = bc + candidates[s][i].col;
|
| CHECK_POINT
|
| - this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) +
|
| - this_mv.as_mv.col;
|
| + this_offset = base_offset + (this_mv.row * in_what_stride) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| @@ -935,25 +859,21 @@
|
| get_next_chkpts(next_chkpts_indices, k, num_candidates[s]);
|
| if (all_in) {
|
| for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
|
| - this_mv.as_mv.row = br +
|
| - candidates[s][next_chkpts_indices[i]].row;
|
| - this_mv.as_mv.col = bc +
|
| - candidates[s][next_chkpts_indices[i]].col;
|
| - this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) +
|
| - this_mv.as_mv.col;
|
| + this_mv.row = br + candidates[s][next_chkpts_indices[i]].row;
|
| + this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col;
|
| + this_offset = base_offset + (this_mv.row * (in_what_stride)) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| }
|
| } else {
|
| for (i = 0; i < PATTERN_CANDIDATES_REF; i++) {
|
| - this_mv.as_mv.row = br +
|
| - candidates[s][next_chkpts_indices[i]].row;
|
| - this_mv.as_mv.col = bc +
|
| - candidates[s][next_chkpts_indices[i]].col;
|
| + this_mv.row = br + candidates[s][next_chkpts_indices[i]].row;
|
| + this_mv.col = bc + candidates[s][next_chkpts_indices[i]].col;
|
| CHECK_POINT
|
| - this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) +
|
| - this_mv.as_mv.col;
|
| + this_offset = base_offset + (this_mv.row * (in_what_stride)) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| @@ -980,21 +900,21 @@
|
| CHECK_BOUNDS(1)
|
| if (all_in) {
|
| for (i = 0; i < 4; i++) {
|
| - this_mv.as_mv.row = br + neighbors[i].row;
|
| - this_mv.as_mv.col = bc + neighbors[i].col;
|
| - this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) +
|
| - this_mv.as_mv.col;
|
| + this_mv.row = br + neighbors[i].row;
|
| + this_mv.col = bc + neighbors[i].col;
|
| + this_offset = base_offset + (this_mv.row * (in_what_stride)) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| }
|
| } else {
|
| for (i = 0; i < 4; i++) {
|
| - this_mv.as_mv.row = br + neighbors[i].row;
|
| - this_mv.as_mv.col = bc + neighbors[i].col;
|
| + this_mv.row = br + neighbors[i].row;
|
| + this_mv.col = bc + neighbors[i].col;
|
| CHECK_POINT
|
| - this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) +
|
| - this_mv.as_mv.col;
|
| + this_offset = base_offset + (this_mv.row * (in_what_stride)) +
|
| + this_mv.col;
|
| thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride,
|
| bestsad);
|
| CHECK_BETTER
|
| @@ -1010,31 +930,32 @@
|
| }
|
| }
|
|
|
| - best_mv->as_mv.row = br;
|
| - best_mv->as_mv.col = bc;
|
| + best_mv->row = br;
|
| + best_mv->col = bc;
|
|
|
| - this_offset = base_offset + (best_mv->as_mv.row * (in_what_stride)) +
|
| - best_mv->as_mv.col;
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_offset = base_offset + (best_mv->row * in_what_stride) +
|
| + best_mv->col;
|
| + this_mv.row = best_mv->row * 8;
|
| + this_mv.col = best_mv->col * 8;
|
| if (bestsad == INT_MAX)
|
| return INT_MAX;
|
| - return
|
| - vfp->vf(what, what_stride, this_offset, in_what_stride,
|
| - (unsigned int *)(&bestsad)) +
|
| - use_mvcost ? mv_err_cost(&this_mv, center_mv, x->nmvjointcost, x->mvcost,
|
| - x->errorperbit) : 0;
|
| +
|
| + return vfp->vf(what, what_stride, this_offset, in_what_stride,
|
| + (unsigned int *)&bestsad) +
|
| + use_mvcost ? mv_err_cost(&this_mv, center_mv,
|
| + x->nmvjointcost, x->mvcost, x->errorperbit)
|
| + : 0;
|
| }
|
|
|
|
|
| int vp9_hex_search(MACROBLOCK *x,
|
| - int_mv *ref_mv,
|
| + MV *ref_mv,
|
| int search_param,
|
| int sad_per_bit,
|
| int do_init_search,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int use_mvcost,
|
| - int_mv *center_mv, int_mv *best_mv) {
|
| + const MV *center_mv, MV *best_mv) {
|
| // First scale has 8-closest points, the rest have 6 points in hex shape
|
| // at increasing scales
|
| static const int hex_num_candidates[MAX_PATTERN_SCALES] = {
|
| @@ -1063,14 +984,14 @@
|
| }
|
|
|
| int vp9_bigdia_search(MACROBLOCK *x,
|
| - int_mv *ref_mv,
|
| + MV *ref_mv,
|
| int search_param,
|
| int sad_per_bit,
|
| int do_init_search,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int use_mvcost,
|
| - int_mv *center_mv,
|
| - int_mv *best_mv) {
|
| + const MV *center_mv,
|
| + MV *best_mv) {
|
| // First scale has 4-closest points, the rest have 8 points in diamond
|
| // shape at increasing scales
|
| static const int bigdia_num_candidates[MAX_PATTERN_SCALES] = {
|
| @@ -1097,22 +1018,21 @@
|
| {{-512, -512}, {0, -1024}, {512, -512}, {1024, 0}, {512, 512}, {0, 1024},
|
| {-512, 512}, {-1024, 0}},
|
| };
|
| - return
|
| - vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
|
| - do_init_search, 0, vfp, use_mvcost,
|
| - center_mv, best_mv,
|
| - bigdia_num_candidates, bigdia_candidates);
|
| + return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
|
| + do_init_search, 0, vfp, use_mvcost,
|
| + center_mv, best_mv,
|
| + bigdia_num_candidates, bigdia_candidates);
|
| }
|
|
|
| int vp9_square_search(MACROBLOCK *x,
|
| - int_mv *ref_mv,
|
| + MV *ref_mv,
|
| int search_param,
|
| int sad_per_bit,
|
| int do_init_search,
|
| const vp9_variance_fn_ptr_t *vfp,
|
| int use_mvcost,
|
| - int_mv *center_mv,
|
| - int_mv *best_mv) {
|
| + const MV *center_mv,
|
| + MV *best_mv) {
|
| // All scales have 8 closest points in square shape
|
| static const int square_num_candidates[MAX_PATTERN_SCALES] = {
|
| 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
| @@ -1139,11 +1059,10 @@
|
| {{-1024, -1024}, {0, -1024}, {1024, -1024}, {1024, 0}, {1024, 1024},
|
| {0, 1024}, {-1024, 1024}, {-1024, 0}},
|
| };
|
| - return
|
| - vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
|
| - do_init_search, 0, vfp, use_mvcost,
|
| - center_mv, best_mv,
|
| - square_num_candidates, square_candidates);
|
| + return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
|
| + do_init_search, 0, vfp, use_mvcost,
|
| + center_mv, best_mv,
|
| + square_num_candidates, square_candidates);
|
| };
|
|
|
| #undef CHECK_BOUNDS
|
| @@ -1199,13 +1118,14 @@
|
| best_address = in_what;
|
|
|
| // Check the starting position
|
| - bestsad = fn_ptr->sdf(what, what_stride, in_what,
|
| - in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(best_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
|
| + + mvsad_err_cost(&best_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| - // search_param determines the length of the initial step and hence the number of iterations
|
| - // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
|
| + // search_param determines the length of the initial step and hence the number
|
| + // of iterations
|
| + // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 =
|
| + // (MAX_FIRST_STEP/4) pel... etc.
|
| ss = &x->ss[search_param * x->searches_per_step];
|
| tot_steps = (x->ss_count / x->searches_per_step) - search_param;
|
|
|
| @@ -1228,7 +1148,7 @@
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| @@ -1260,7 +1180,7 @@
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1274,19 +1194,21 @@
|
| break;
|
| };
|
| #endif
|
| - } else if (best_address == in_what)
|
| + } else if (best_address == in_what) {
|
| (*num00)++;
|
| + }
|
| }
|
|
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = best_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = best_mv->as_mv.col * 8;
|
|
|
| if (bestsad == INT_MAX)
|
| return INT_MAX;
|
|
|
| return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| - (unsigned int *)(&thissad)) + mv_err_cost(&this_mv, center_mv, mvjcost,
|
| - mvcost, x->errorperbit);
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| }
|
|
|
| int vp9_diamond_search_sadx4(MACROBLOCK *x,
|
| @@ -1340,13 +1262,15 @@
|
| best_address = in_what;
|
|
|
| // Check the starting position
|
| - bestsad = fn_ptr->sdf(what, what_stride,
|
| - in_what, in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(best_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
|
| + + mvsad_err_cost(&best_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| - // search_param determines the length of the initial step and hence the number of iterations
|
| - // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
|
| + // search_param determines the length of the initial step and hence the number
|
| + // of iterations.
|
| + // 0 = initial step (MAX_FIRST_STEP) pel
|
| + // 1 = (MAX_FIRST_STEP/2) pel,
|
| + // 2 = (MAX_FIRST_STEP/4) pel...
|
| ss = &x->ss[search_param * x->searches_per_step];
|
| tot_steps = (x->ss_count / x->searches_per_step) - search_param;
|
|
|
| @@ -1355,13 +1279,16 @@
|
| for (step = 0; step < tot_steps; step++) {
|
| int all_in = 1, t;
|
|
|
| - // To know if all neighbor points are within the bounds, 4 bounds checking are enough instead of
|
| - // checking 4 bounds for each points.
|
| + // All_in is true if every one of the points we are checking are within
|
| + // the bounds of the image.
|
| all_in &= ((best_mv->as_mv.row + ss[i].mv.row) > x->mv_row_min);
|
| all_in &= ((best_mv->as_mv.row + ss[i + 1].mv.row) < x->mv_row_max);
|
| all_in &= ((best_mv->as_mv.col + ss[i + 2].mv.col) > x->mv_col_min);
|
| all_in &= ((best_mv->as_mv.col + ss[i + 3].mv.col) < x->mv_col_max);
|
|
|
| + // If all the pixels are within the bounds we don't check whether the
|
| + // search point is valid in this loop, otherwise we check each point
|
| + // for validity..
|
| if (all_in) {
|
| unsigned int sad_array[4];
|
|
|
| @@ -1378,7 +1305,7 @@
|
| if (sad_array[t] < bestsad) {
|
| this_mv.as_mv.row = best_mv->as_mv.row + ss[i].mv.row;
|
| this_mv.as_mv.col = best_mv->as_mv.col + ss[i].mv.col;
|
| - sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + sad_array[t] += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (sad_array[t] < bestsad) {
|
| @@ -1394,15 +1321,18 @@
|
| this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
|
| this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
|
|
|
| - if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
|
| - (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max)) {
|
| + if ((this_col_offset > x->mv_col_min) &&
|
| + (this_col_offset < x->mv_col_max) &&
|
| + (this_row_offset > x->mv_row_min) &&
|
| + (this_row_offset < x->mv_row_max)) {
|
| check_here = ss[i].offset + best_address;
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| @@ -1433,7 +1363,7 @@
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1447,19 +1377,21 @@
|
| break;
|
| };
|
| #endif
|
| - } else if (best_address == in_what)
|
| + } else if (best_address == in_what) {
|
| (*num00)++;
|
| + }
|
| }
|
|
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = best_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = best_mv->as_mv.col * 8;
|
|
|
| if (bestsad == INT_MAX)
|
| return INT_MAX;
|
|
|
| return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| - (unsigned int *)(&thissad)) + mv_err_cost(&this_mv,
|
| - center_mv, mvjcost, mvcost, x->errorperbit);
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| }
|
|
|
| /* do_refine: If last step (1-away) of n-step search doesn't pick the center
|
| @@ -1482,16 +1414,17 @@
|
| n = num00;
|
| num00 = 0;
|
|
|
| - /* If there won't be more n-step search, check to see if refining search is needed. */
|
| + /* If there won't be more n-step search, check to see if refining search is
|
| + * needed. */
|
| if (n > further_steps)
|
| do_refine = 0;
|
|
|
| while (n < further_steps) {
|
| n++;
|
|
|
| - if (num00)
|
| + if (num00) {
|
| num00--;
|
| - else {
|
| + } else {
|
| thissme = cpi->diamond_search_sad(x, mvp_full, &temp_mv,
|
| step_param + n, sadpb, &num00,
|
| fn_ptr, x->nmvjointcost, x->mvcost,
|
| @@ -1570,8 +1503,8 @@
|
| // Baseline value at the centre
|
| bestsad = fn_ptr->sdf(what, what_stride, bestaddress,
|
| in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(best_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + + mvsad_err_cost(&best_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| // Apply further limits to prevent us looking using vectors that stretch
|
| // beyond the UMV border
|
| @@ -1585,11 +1518,12 @@
|
| check_here = r * mv_stride + in_what + col_min;
|
|
|
| for (c = col_min; c < col_max; c++) {
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| - mvjsadcost, mvsadcost, sad_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1602,14 +1536,14 @@
|
| }
|
| }
|
|
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = best_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = best_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX)
|
| - return
|
| - fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| - (unsigned int *)(&thissad)) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| else
|
| return INT_MAX;
|
| }
|
| @@ -1660,8 +1594,8 @@
|
| // Baseline value at the centre
|
| bestsad = fn_ptr->sdf(what, what_stride,
|
| bestaddress, in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(best_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + + mvsad_err_cost(&best_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| // Apply further limits to prevent us looking using vectors that stretch
|
| // beyond the UMV border
|
| @@ -1685,8 +1619,8 @@
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| - mvjsadcost, mvsadcost, sad_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1702,11 +1636,12 @@
|
| }
|
|
|
| while (c < col_max) {
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| @@ -1720,17 +1655,16 @@
|
| check_here++;
|
| c++;
|
| }
|
| -
|
| }
|
|
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = best_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = best_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX)
|
| - return
|
| - fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| - (unsigned int *)(&thissad)) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| else
|
| return INT_MAX;
|
| }
|
| @@ -1783,8 +1717,8 @@
|
| // Baseline value at the centre
|
| bestsad = fn_ptr->sdf(what, what_stride,
|
| bestaddress, in_what_stride, 0x7fffffff)
|
| - + mvsad_err_cost(best_mv, &fcenter_mv, mvjsadcost, mvsadcost,
|
| - sad_per_bit);
|
| + + mvsad_err_cost(&best_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| // Apply further limits to prevent us looking using vectors that stretch
|
| // beyond the UMV border
|
| @@ -1808,8 +1742,8 @@
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| - mvjsadcost, mvsadcost, sad_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1834,7 +1768,7 @@
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| @@ -1851,12 +1785,13 @@
|
| }
|
|
|
| while (c < col_max) {
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.col = c;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
|
| - mvjsadcost, mvsadcost, sad_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, sad_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1871,14 +1806,14 @@
|
| }
|
| }
|
|
|
| - this_mv.as_mv.row = best_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = best_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = best_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = best_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX)
|
| - return
|
| - fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| - (unsigned int *)(&thissad)) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride,
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| else
|
| return INT_MAX;
|
| }
|
| @@ -1909,8 +1844,10 @@
|
| fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
|
| fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
|
|
|
| - bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride, 0x7fffffff) +
|
| - mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
|
| + bestsad = fn_ptr->sdf(what, what_stride, best_address,
|
| + in_what_stride, 0x7fffffff) +
|
| + mvsad_err_cost(&ref_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| for (i = 0; i < search_range; i++) {
|
| int best_site = -1;
|
| @@ -1919,16 +1856,20 @@
|
| this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
|
| this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
|
|
|
| - if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
|
| - (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max)) {
|
| - check_here = (neighbors[j].row) * in_what_stride + neighbors[j].col + best_address;
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + if ((this_col_offset > x->mv_col_min) &&
|
| + (this_col_offset < x->mv_col_max) &&
|
| + (this_row_offset > x->mv_row_min) &&
|
| + (this_row_offset < x->mv_row_max)) {
|
| + check_here = (neighbors[j].row) * in_what_stride + neighbors[j].col +
|
| + best_address;
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost,
|
| - mvsadcost, error_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -1938,23 +1879,24 @@
|
| }
|
| }
|
|
|
| - if (best_site == -1)
|
| + if (best_site == -1) {
|
| break;
|
| - else {
|
| + } else {
|
| ref_mv->as_mv.row += neighbors[best_site].row;
|
| ref_mv->as_mv.col += neighbors[best_site].col;
|
| - best_address += (neighbors[best_site].row) * in_what_stride + neighbors[best_site].col;
|
| + best_address += (neighbors[best_site].row) * in_what_stride +
|
| + neighbors[best_site].col;
|
| }
|
| }
|
|
|
| - this_mv.as_mv.row = ref_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = ref_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = ref_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = ref_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX)
|
| - return
|
| - fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| - (unsigned int *)(&thissad)) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| else
|
| return INT_MAX;
|
| }
|
| @@ -1986,8 +1928,10 @@
|
| fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
|
| fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
|
|
|
| - bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride, 0x7fffffff) +
|
| - mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
|
| + bestsad = fn_ptr->sdf(what, what_stride, best_address,
|
| + in_what_stride, 0x7fffffff) +
|
| + mvsad_err_cost(&ref_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| for (i = 0; i < search_range; i++) {
|
| int best_site = -1;
|
| @@ -2004,14 +1948,15 @@
|
| block_offset[2] = best_address + 1;
|
| block_offset[3] = best_address + in_what_stride;
|
|
|
| - fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
|
| + fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride,
|
| + sad_array);
|
|
|
| for (j = 0; j < 4; j++) {
|
| if (sad_array[j] < bestsad) {
|
| this_mv.as_mv.row = ref_mv->as_mv.row + neighbors[j].row;
|
| this_mv.as_mv.col = ref_mv->as_mv.col + neighbors[j].col;
|
| - sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost,
|
| - mvsadcost, error_per_bit);
|
| + sad_array[j] += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| if (sad_array[j] < bestsad) {
|
| bestsad = sad_array[j];
|
| @@ -2024,16 +1969,20 @@
|
| this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
|
| this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
|
|
|
| - if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
|
| - (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max)) {
|
| - check_here = (neighbors[j].row) * in_what_stride + neighbors[j].col + best_address;
|
| - thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride, bestsad);
|
| + if ((this_col_offset > x->mv_col_min) &&
|
| + (this_col_offset < x->mv_col_max) &&
|
| + (this_row_offset > x->mv_row_min) &&
|
| + (this_row_offset < x->mv_row_max)) {
|
| + check_here = (neighbors[j].row) * in_what_stride + neighbors[j].col +
|
| + best_address;
|
| + thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
| + bestsad);
|
|
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost,
|
| - mvsadcost, error_per_bit);
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| @@ -2044,23 +1993,24 @@
|
| }
|
| }
|
|
|
| - if (best_site == -1)
|
| + if (best_site == -1) {
|
| break;
|
| - else {
|
| + } else {
|
| ref_mv->as_mv.row += neighbors[best_site].row;
|
| ref_mv->as_mv.col += neighbors[best_site].col;
|
| - best_address += (neighbors[best_site].row) * in_what_stride + neighbors[best_site].col;
|
| + best_address += (neighbors[best_site].row) * in_what_stride +
|
| + neighbors[best_site].col;
|
| }
|
| }
|
|
|
| - this_mv.as_mv.row = ref_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = ref_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = ref_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = ref_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX)
|
| - return
|
| - fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| - (unsigned int *)(&thissad)) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->vf(what, what_stride, best_address, in_what_stride,
|
| + (unsigned int *)(&thissad)) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| else
|
| return INT_MAX;
|
| }
|
| @@ -2100,7 +2050,8 @@
|
| /* Get compound pred by averaging two pred blocks. */
|
| bestsad = fn_ptr->sdaf(what, what_stride, best_address, in_what_stride,
|
| second_pred, 0x7fffffff) +
|
| - mvsad_err_cost(ref_mv, &fcenter_mv, mvjsadcost, mvsadcost, error_per_bit);
|
| + mvsad_err_cost(&ref_mv->as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
|
|
| for (i = 0; i < search_range; i++) {
|
| int best_site = -1;
|
| @@ -2123,9 +2074,8 @@
|
| if (thissad < bestsad) {
|
| this_mv.as_mv.row = this_row_offset;
|
| this_mv.as_mv.col = this_col_offset;
|
| - thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvjsadcost,
|
| - mvsadcost, error_per_bit);
|
| -
|
| + thissad += mvsad_err_cost(&this_mv.as_mv, &fcenter_mv.as_mv,
|
| + mvjsadcost, mvsadcost, error_per_bit);
|
| if (thissad < bestsad) {
|
| bestsad = thissad;
|
| best_site = j;
|
| @@ -2144,16 +2094,16 @@
|
| }
|
| }
|
|
|
| - this_mv.as_mv.row = ref_mv->as_mv.row << 3;
|
| - this_mv.as_mv.col = ref_mv->as_mv.col << 3;
|
| + this_mv.as_mv.row = ref_mv->as_mv.row * 8;
|
| + this_mv.as_mv.col = ref_mv->as_mv.col * 8;
|
|
|
| if (bestsad < INT_MAX) {
|
| // FIXME(rbultje, yunqing): add full-pixel averaging variance functions
|
| // so we don't have to use the subpixel with xoff=0,yoff=0 here.
|
| - return fn_ptr->svaf(best_address, in_what_stride, 0, 0,
|
| - what, what_stride, (unsigned int *)(&thissad),
|
| - second_pred) +
|
| - mv_err_cost(&this_mv, center_mv, mvjcost, mvcost, x->errorperbit);
|
| + return fn_ptr->svaf(best_address, in_what_stride, 0, 0, what, what_stride,
|
| + (unsigned int *)(&thissad), second_pred) +
|
| + mv_err_cost(&this_mv.as_mv, ¢er_mv->as_mv,
|
| + mvjcost, mvcost, x->errorperbit);
|
| } else {
|
| return INT_MAX;
|
| }
|
|
|