Index: libvpx/source/libvpx/vp8/encoder/mcomp.c |
diff --git a/libvpx/source/libvpx/vp8/encoder/mcomp.c b/libvpx/source/libvpx/vp8/encoder/mcomp.c |
index ff84306e7bc1d2e15336136fac9dcdbef0d74902..de6642b75ffabe083297722a18ceba00b01df4f5 100644 |
--- a/libvpx/source/libvpx/vp8/encoder/mcomp.c |
+++ b/libvpx/source/libvpx/vp8/encoder/mcomp.c |
@@ -11,39 +11,55 @@ |
#include "mcomp.h" |
#include "vpx_mem/vpx_mem.h" |
-#include "vpx_ports/config.h" |
+ |
#include <stdio.h> |
#include <limits.h> |
#include <math.h> |
-#include "vp8/common/findnearmv.h" |
#ifdef ENTROPY_STATS |
static int mv_ref_ct [31] [4] [2]; |
static int mv_mode_cts [4] [2]; |
#endif |
-int vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight) |
+static int mv_bits_sadcost[256]; |
+ |
+void vp8cx_init_mv_bits_sadcost() |
+{ |
+ int i; |
+ |
+ for (i = 0; i < 256; i++) |
+ { |
+ mv_bits_sadcost[i] = (int)sqrt(i * 16); |
+ } |
+} |
+ |
+ |
+int vp8_mv_bit_cost(MV *mv, MV *ref, int *mvcost[2], int Weight) |
{ |
// MV costing is based on the distribution of vectors in the previous frame and as such will tend to |
// over state the cost of vectors. In addition coding a new vector can have a knock on effect on the |
// cost of subsequent vectors and the quality of prediction from NEAR and NEAREST for subsequent blocks. |
// The "Weight" parameter allows, to a limited extent, for some account to be taken of these factors. |
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] + mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) * Weight) >> 7; |
+ return ((mvcost[0][(mv->row - ref->row) >> 1] + mvcost[1][(mv->col - ref->col) >> 1]) * Weight) >> 7; |
} |
-static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int error_per_bit) |
+static int mv_err_cost(MV *mv, MV *ref, int *mvcost[2], int error_per_bit) |
{ |
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] + |
- mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) |
- * error_per_bit + 128) >> 8; |
+ //int i; |
+ //return ((mvcost[0][(mv->row - ref->row)>>1] + mvcost[1][(mv->col - ref->col)>>1] + 128) * error_per_bit) >> 8; |
+ //return ( (vp8_mv_bit_cost(mv, ref, mvcost, 100) + 128) * error_per_bit) >> 8; |
+ |
+ //i = (vp8_mv_bit_cost(mv, ref, mvcost, 100) * error_per_bit + 128) >> 8; |
+ return ((mvcost[0][(mv->row - ref->row) >> 1] + mvcost[1][(mv->col - ref->col) >> 1]) * error_per_bit + 128) >> 8; |
+ //return (vp8_mv_bit_cost(mv, ref, mvcost, 128) * error_per_bit + 128) >> 8; |
} |
-static int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvsadcost[2], int error_per_bit) |
+ |
+static int mv_bits(MV *mv, MV *ref, int *mvcost[2]) |
{ |
- /* Calculate sad error cost on full pixel basis. */ |
- return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] + |
- mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)]) |
- * error_per_bit + 128) >> 8; |
+ // get the estimated number of bits for a motion vector, to be used for costing in SAD based |
+ // motion estimation |
+ return ((mvcost[0][(mv->row - ref->row) >> 1] + mvcost[1][(mv->col - ref->col)>> 1]) + 128) >> 8; |
} |
void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride) |
@@ -166,36 +182,26 @@ void vp8_init3smotion_compensation(MACROBLOCK *x, int stride) |
x->searches_per_step = 8; |
} |
-/* |
- * To avoid the penalty for crossing cache-line read, preload the reference |
- * area in a small buffer, which is aligned to make sure there won't be crossing |
- * cache-line read while reading from this buffer. This reduced the cpu |
- * cycles spent on reading ref data in sub-pixel filter functions. |
- * TODO: Currently, since sub-pixel search range here is -3 ~ 3, copy 22 rows x |
- * 32 cols area that is enough for 16x16 macroblock. Later, for SPLITMV, we |
- * could reduce the area. |
- */ |
+ |
#define MVC(r,c) (((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 ) // estimated cost of a motion vector (r,c) |
-#define PRE(r,c) (y + (((r)>>2) * y_stride + ((c)>>2) -(offset))) // pointer to predictor base of a motionvector |
+#define PRE(r,c) (*(d->base_pre) + d->pre + ((r)>>2) * d->pre_stride + ((c)>>2)) // pointer to predictor base of a motionvector |
#define SP(x) (((x)&3)<<1) // convert motion vector component to offset for svf calc |
-#define DIST(r,c) vfp->svf( PRE(r,c), y_stride, SP(c),SP(r), z,b->src_stride,&sse) // returns subpixel variance error function. |
+#define DIST(r,c) vfp->svf( PRE(r,c), d->pre_stride, SP(c),SP(r), z,b->src_stride,&sse) // returns subpixel variance error function. |
#define IFMVCV(r,c,s,e) if ( c >= minc && c <= maxc && r >= minr && r <= maxr) s else e; |
#define ERR(r,c) (MVC(r,c)+DIST(r,c)) // returns distortion + motion vector cost |
-#define CHECK_BETTER(v,r,c) IFMVCV(r,c,{thismse = DIST(r,c); if((v = (MVC(r,c)+thismse)) < besterr) { besterr = v; br=r; bc=c; *distortion = thismse; *sse1 = sse; }}, v=INT_MAX;)// checks if (r,c) has better score than previous best |
+#define CHECK_BETTER(v,r,c) IFMVCV(r,c,{if((v = ERR(r,c)) < besterr) { besterr = v; br=r; bc=c; }}, v=INT_MAX;)// checks if (r,c) has better score than previous best |
#define MIN(x,y) (((x)<(y))?(x):(y)) |
#define MAX(x,y) (((x)>(y))?(x):(y)) |
-int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
- int_mv *bestmv, int_mv *ref_mv, |
- int error_per_bit, |
- const vp8_variance_fn_ptr_t *vfp, |
- int *mvcost[2], int *distortion, |
- unsigned int *sse1) |
+//#define CHECK_BETTER(v,r,c) if((v = ERR(r,c)) < besterr) { besterr = v; br=r; bc=c; } |
+ |
+int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *bestmv, MV *ref_mv, int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2]) |
{ |
+ unsigned char *y = *(d->base_pre) + d->pre + (bestmv->row) * d->pre_stride + bestmv->col; |
unsigned char *z = (*(b->base_src) + b->src); |
- int rr = ref_mv->as_mv.row >> 1, rc = ref_mv->as_mv.col >> 1; |
- int br = bestmv->as_mv.row << 2, bc = bestmv->as_mv.col << 2; |
+ int rr = ref_mv->row >> 1, rc = ref_mv->col >> 1; |
+ int br = bestmv->row << 2, bc = bestmv->col << 2; |
int tr = br, tc = bc; |
unsigned int besterr = INT_MAX; |
unsigned int left, right, up, down, diag; |
@@ -203,46 +209,18 @@ int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
unsigned int whichdir; |
unsigned int halfiters = 4; |
unsigned int quarteriters = 4; |
- int thismse; |
- |
- int minc = MAX(x->mv_col_min << 2, (ref_mv->as_mv.col >> 1) - ((1 << mvlong_width) - 1)); |
- int maxc = MIN(x->mv_col_max << 2, (ref_mv->as_mv.col >> 1) + ((1 << mvlong_width) - 1)); |
- int minr = MAX(x->mv_row_min << 2, (ref_mv->as_mv.row >> 1) - ((1 << mvlong_width) - 1)); |
- int maxr = MIN(x->mv_row_max << 2, (ref_mv->as_mv.row >> 1) + ((1 << mvlong_width) - 1)); |
- |
- int y_stride; |
- int offset; |
- |
-#if ARCH_X86 || ARCH_X86_64 |
- MACROBLOCKD *xd = &x->e_mbd; |
- unsigned char *y0 = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- unsigned char *y; |
- int buf_r1, buf_r2, buf_c1, buf_c2; |
- |
- // Clamping to avoid out-of-range data access |
- buf_r1 = ((bestmv->as_mv.row - 3) < x->mv_row_min)?(bestmv->as_mv.row - x->mv_row_min):3; |
- buf_r2 = ((bestmv->as_mv.row + 3) > x->mv_row_max)?(x->mv_row_max - bestmv->as_mv.row):3; |
- buf_c1 = ((bestmv->as_mv.col - 3) < x->mv_col_min)?(bestmv->as_mv.col - x->mv_col_min):3; |
- buf_c2 = ((bestmv->as_mv.col + 3) > x->mv_col_max)?(x->mv_col_max - bestmv->as_mv.col):3; |
- y_stride = 32; |
- |
- /* Copy to intermediate buffer before searching. */ |
- vfp->copymem(y0 - buf_c1 - d->pre_stride*buf_r1, d->pre_stride, xd->y_buf, y_stride, 16+buf_r1+buf_r2); |
- y = xd->y_buf + y_stride*buf_r1 +buf_c1; |
-#else |
- unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- y_stride = d->pre_stride; |
-#endif |
- offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col; |
+ int minc = MAX(x->mv_col_min << 2, (ref_mv->col >> 1) - ((1 << mvlong_width) - 1)); |
+ int maxc = MIN(x->mv_col_max << 2, (ref_mv->col >> 1) + ((1 << mvlong_width) - 1)); |
+ int minr = MAX(x->mv_row_min << 2, (ref_mv->row >> 1) - ((1 << mvlong_width) - 1)); |
+ int maxr = MIN(x->mv_row_max << 2, (ref_mv->row >> 1) + ((1 << mvlong_width) - 1)); |
// 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, b->src_stride, sse1); |
- *distortion = besterr; |
+ besterr = vfp->vf(y, d->pre_stride, z, b->src_stride, &sse); |
besterr += mv_err_cost(bestmv, ref_mv, 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) |
@@ -315,11 +293,10 @@ int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
tc = bc; |
} |
- bestmv->as_mv.row = br << 1; |
- bestmv->as_mv.col = bc << 1; |
+ bestmv->row = br << 1; |
+ bestmv->col = bc << 1; |
- 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) || (abs(bestmv->row - ref_mv->row) > MAX_FULL_PEL_VAL)) |
return INT_MAX; |
return besterr; |
@@ -328,102 +305,82 @@ int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
#undef PRE |
#undef SP |
#undef DIST |
-#undef IFMVCV |
#undef ERR |
#undef CHECK_BETTER |
#undef MIN |
#undef MAX |
-int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
- int_mv *bestmv, int_mv *ref_mv, |
- int error_per_bit, |
- const vp8_variance_fn_ptr_t *vfp, |
- int *mvcost[2], int *distortion, |
- unsigned int *sse1) |
+int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *bestmv, MV *ref_mv, int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2]) |
{ |
int bestmse = INT_MAX; |
- int_mv startmv; |
- int_mv this_mv; |
+ MV startmv; |
+ //MV this_mv; |
+ MV this_mv; |
+ unsigned char *y = *(d->base_pre) + d->pre + (bestmv->row) * d->pre_stride + bestmv->col; |
unsigned char *z = (*(b->base_src) + b->src); |
int left, right, up, down, diag; |
unsigned int sse; |
int whichdir ; |
- int thismse; |
- int y_stride; |
- |
-#if ARCH_X86 || ARCH_X86_64 |
- MACROBLOCKD *xd = &x->e_mbd; |
- unsigned char *y0 = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- unsigned char *y; |
- |
- y_stride = 32; |
- /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */ |
- vfp->copymem(y0 - 1 - d->pre_stride, d->pre_stride, xd->y_buf, y_stride, 18); |
- y = xd->y_buf + y_stride + 1; |
-#else |
- unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- y_stride = d->pre_stride; |
-#endif |
+ |
+ |
+ // Trap uncodable vectors |
+ if ((abs((bestmv->col << 3) - ref_mv->col) > MAX_FULL_PEL_VAL) || (abs((bestmv->row << 3) - ref_mv->row) > MAX_FULL_PEL_VAL)) |
+ { |
+ bestmv->row <<= 3; |
+ bestmv->col <<= 3; |
+ return INT_MAX; |
+ } |
// central mv |
- bestmv->as_mv.row <<= 3; |
- bestmv->as_mv.col <<= 3; |
+ bestmv->row <<= 3; |
+ bestmv->col <<= 3; |
startmv = *bestmv; |
// calculate central point error |
- bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1); |
- *distortion = bestmse; |
+ bestmse = vfp->vf(y, d->pre_stride, z, b->src_stride, &sse); |
bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit); |
// go left then right and check error |
- this_mv.as_mv.row = startmv.as_mv.row; |
- this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4); |
- thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse); |
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.row = startmv.row; |
+ this_mv.col = ((startmv.col - 8) | 4); |
+ left = vfp->svf_halfpix_h(y - 1, d->pre_stride, z, b->src_stride, &sse); |
+ left += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (left < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = left; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col += 8; |
- thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse); |
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col += 8; |
+ right = vfp->svf_halfpix_h(y, d->pre_stride, z, b->src_stride, &sse); |
+ right += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (right < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = right; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
// go up then down and check error |
- this_mv.as_mv.col = startmv.as_mv.col; |
- this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4); |
- thismse = vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse); |
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col = startmv.col; |
+ this_mv.row = ((startmv.row - 8) | 4); |
+ up = vfp->svf_halfpix_v(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
+ up += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (up < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = up; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.row += 8; |
- thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse); |
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.row += 8; |
+ down = vfp->svf_halfpix_v(y, d->pre_stride, z, b->src_stride, &sse); |
+ down += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (down < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = down; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
@@ -436,46 +393,44 @@ int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
switch (whichdir) |
{ |
case 0: |
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4; |
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4; |
- thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse); |
+ this_mv.col = (this_mv.col - 8) | 4; |
+ this_mv.row = (this_mv.row - 8) | 4; |
+ diag = vfp->svf_halfpix_hv(y - 1 - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
break; |
case 1: |
- this_mv.as_mv.col += 4; |
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4; |
- thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse); |
+ this_mv.col += 4; |
+ this_mv.row = (this_mv.row - 8) | 4; |
+ diag = vfp->svf_halfpix_hv(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
break; |
case 2: |
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4; |
- this_mv.as_mv.row += 4; |
- thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse); |
+ this_mv.col = (this_mv.col - 8) | 4; |
+ this_mv.row += 4; |
+ diag = vfp->svf_halfpix_hv(y - 1, d->pre_stride, z, b->src_stride, &sse); |
break; |
case 3: |
default: |
- this_mv.as_mv.col += 4; |
- this_mv.as_mv.row += 4; |
- thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse); |
+ this_mv.col += 4; |
+ this_mv.row += 4; |
+ diag = vfp->svf_halfpix_hv(y, d->pre_stride, z, b->src_stride, &sse); |
break; |
} |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
// } |
// time to check quarter pels. |
- if (bestmv->as_mv.row < startmv.as_mv.row) |
- y -= y_stride; |
+ if (bestmv->row < startmv.row) |
+ y -= d->pre_stride; |
- if (bestmv->as_mv.col < startmv.as_mv.col) |
+ if (bestmv->col < startmv.col) |
y--; |
startmv = *bestmv; |
@@ -483,75 +438,67 @@ int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
// go left then right and check error |
- this_mv.as_mv.row = startmv.as_mv.row; |
+ this_mv.row = startmv.row; |
- if (startmv.as_mv.col & 7) |
+ if (startmv.col & 7) |
{ |
- this_mv.as_mv.col = startmv.as_mv.col - 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col = startmv.col - 2; |
+ left = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6; |
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col = (startmv.col - 8) | 6; |
+ left = vfp->svf(y - 1, d->pre_stride, 6, this_mv.row & 7, z, b->src_stride, &sse); |
} |
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ left += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (left < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = left; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col += 4; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col += 4; |
+ right = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
+ right += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (right < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = right; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
// go up then down and check error |
- this_mv.as_mv.col = startmv.as_mv.col; |
+ this_mv.col = startmv.col; |
- if (startmv.as_mv.row & 7) |
+ if (startmv.row & 7) |
{ |
- this_mv.as_mv.row = startmv.as_mv.row - 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.row = startmv.row - 2; |
+ up = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6; |
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse); |
+ this_mv.row = (startmv.row - 8) | 6; |
+ up = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.col & 7, 6, z, b->src_stride, &sse); |
} |
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ up += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (up < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = up; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.row += 4; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.row += 4; |
+ down = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
+ down += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (down < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = down; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
@@ -566,178 +513,158 @@ int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
{ |
case 0: |
- if (startmv.as_mv.row & 7) |
+ if (startmv.row & 7) |
{ |
- this_mv.as_mv.row -= 2; |
+ this_mv.row -= 2; |
- if (startmv.as_mv.col & 7) |
+ if (startmv.col & 7) |
{ |
- this_mv.as_mv.col -= 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col -= 2; |
+ diag = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6; |
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);; |
+ this_mv.col = (startmv.col - 8) | 6; |
+ diag = vfp->svf(y - 1, d->pre_stride, 6, this_mv.row & 7, z, b->src_stride, &sse);; |
} |
} |
else |
{ |
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6; |
+ this_mv.row = (startmv.row - 8) | 6; |
- if (startmv.as_mv.col & 7) |
+ if (startmv.col & 7) |
{ |
- this_mv.as_mv.col -= 2; |
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse); |
+ this_mv.col -= 2; |
+ diag = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.col & 7, 6, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6; |
- thismse = vfp->svf(y - y_stride - 1, y_stride, 6, 6, z, b->src_stride, &sse); |
+ this_mv.col = (startmv.col - 8) | 6; |
+ diag = vfp->svf(y - d->pre_stride - 1, d->pre_stride, 6, 6, z, b->src_stride, &sse); |
} |
} |
break; |
case 1: |
- this_mv.as_mv.col += 2; |
+ this_mv.col += 2; |
- if (startmv.as_mv.row & 7) |
+ if (startmv.row & 7) |
{ |
- this_mv.as_mv.row -= 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.row -= 2; |
+ diag = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6; |
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse); |
+ this_mv.row = (startmv.row - 8) | 6; |
+ diag = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.col & 7, 6, z, b->src_stride, &sse); |
} |
break; |
case 2: |
- this_mv.as_mv.row += 2; |
+ this_mv.row += 2; |
- if (startmv.as_mv.col & 7) |
+ if (startmv.col & 7) |
{ |
- this_mv.as_mv.col -= 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col -= 2; |
+ diag = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
} |
else |
{ |
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6; |
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col = (startmv.col - 8) | 6; |
+ diag = vfp->svf(y - 1, d->pre_stride, 6, this_mv.row & 7, z, b->src_stride, &sse);; |
} |
break; |
case 3: |
- this_mv.as_mv.col += 2; |
- this_mv.as_mv.row += 2; |
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse); |
+ this_mv.col += 2; |
+ this_mv.row += 2; |
+ diag = vfp->svf(y, d->pre_stride, this_mv.col & 7, this_mv.row & 7, z, b->src_stride, &sse); |
break; |
} |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
+// } |
+ |
return bestmse; |
} |
-int vp8_find_best_half_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
- int_mv *bestmv, int_mv *ref_mv, |
- int error_per_bit, |
- const vp8_variance_fn_ptr_t *vfp, |
- int *mvcost[2], int *distortion, |
- unsigned int *sse1) |
+int vp8_find_best_half_pixel_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, MV *bestmv, MV *ref_mv, int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2]) |
{ |
int bestmse = INT_MAX; |
- int_mv startmv; |
- int_mv this_mv; |
+ MV startmv; |
+ //MV this_mv; |
+ MV this_mv; |
+ unsigned char *y = *(d->base_pre) + d->pre + (bestmv->row) * d->pre_stride + bestmv->col; |
unsigned char *z = (*(b->base_src) + b->src); |
int left, right, up, down, diag; |
unsigned int sse; |
- int thismse; |
- int y_stride; |
- |
-#if ARCH_X86 || ARCH_X86_64 |
- MACROBLOCKD *xd = &x->e_mbd; |
- unsigned char *y0 = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- unsigned char *y; |
- |
- y_stride = 32; |
- /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */ |
- vfp->copymem(y0 - 1 - d->pre_stride, d->pre_stride, xd->y_buf, y_stride, 18); |
- y = xd->y_buf + y_stride + 1; |
-#else |
- unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col; |
- y_stride = d->pre_stride; |
-#endif |
+ |
+ // Trap uncodable vectors |
+ if ((abs((bestmv->col << 3) - ref_mv->col) > MAX_FULL_PEL_VAL) || (abs((bestmv->row << 3) - ref_mv->row) > MAX_FULL_PEL_VAL)) |
+ { |
+ bestmv->row <<= 3; |
+ bestmv->col <<= 3; |
+ return INT_MAX; |
+ } |
// central mv |
- bestmv->as_mv.row <<= 3; |
- bestmv->as_mv.col <<= 3; |
+ bestmv->row <<= 3; |
+ bestmv->col <<= 3; |
startmv = *bestmv; |
// calculate central point error |
- bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1); |
- *distortion = bestmse; |
+ bestmse = vfp->vf(y, d->pre_stride, z, b->src_stride, &sse); |
bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit); |
// go left then right and check error |
- this_mv.as_mv.row = startmv.as_mv.row; |
- this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4); |
- thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse); |
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.row = startmv.row; |
+ this_mv.col = ((startmv.col - 8) | 4); |
+ left = vfp->svf_halfpix_h(y - 1, d->pre_stride, z, b->src_stride, &sse); |
+ left += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (left < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = left; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col += 8; |
- thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse); |
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col += 8; |
+ right = vfp->svf_halfpix_h(y, d->pre_stride, z, b->src_stride, &sse); |
+ right += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (right < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = right; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
// go up then down and check error |
- this_mv.as_mv.col = startmv.as_mv.col; |
- this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4); |
- thismse = vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse); |
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col = startmv.col; |
+ this_mv.row = ((startmv.row - 8) | 4); |
+ up = vfp->svf_halfpix_v(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
+ up += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (up < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = up; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.row += 8; |
- thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse); |
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.row += 8; |
+ down = vfp->svf_halfpix_v(y, d->pre_stride, z, b->src_stride, &sse); |
+ down += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (down < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = down; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
// somewhat strangely not doing all the diagonals for half pel is slower than doing them. |
@@ -751,22 +678,22 @@ int vp8_find_best_half_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
case 0: |
this_mv.col = (this_mv.col - 8) | 4; |
this_mv.row = (this_mv.row - 8) | 4; |
- diag = vfp->svf(y - 1 - y_stride, y_stride, 4, 4, z, b->src_stride, &sse); |
+ diag = vfp->svf(y - 1 - d->pre_stride, d->pre_stride, 4, 4, z, b->src_stride, &sse); |
break; |
case 1: |
this_mv.col += 4; |
this_mv.row = (this_mv.row - 8) | 4; |
- diag = vfp->svf(y - y_stride, y_stride, 4, 4, z, b->src_stride, &sse); |
+ diag = vfp->svf(y - d->pre_stride, d->pre_stride, 4, 4, z, b->src_stride, &sse); |
break; |
case 2: |
this_mv.col = (this_mv.col - 8) | 4; |
this_mv.row += 4; |
- diag = vfp->svf(y - 1, y_stride, 4, 4, z, b->src_stride, &sse); |
+ diag = vfp->svf(y - 1, d->pre_stride, 4, 4, z, b->src_stride, &sse); |
break; |
case 3: |
this_mv.col += 4; |
this_mv.row += 4; |
- diag = vfp->svf(y, y_stride, 4, 4, z, b->src_stride, &sse); |
+ diag = vfp->svf(y, d->pre_stride, 4, 4, z, b->src_stride, &sse); |
break; |
} |
@@ -779,90 +706,58 @@ int vp8_find_best_half_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
} |
#else |
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4; |
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4; |
- thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse); |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col = (this_mv.col - 8) | 4; |
+ this_mv.row = (this_mv.row - 8) | 4; |
+ diag = vfp->svf_halfpix_hv(y - 1 - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col += 8; |
- thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse); |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col += 8; |
+ diag = vfp->svf_halfpix_hv(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4; |
- this_mv.as_mv.row = startmv.as_mv.row + 4; |
- thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse); |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col = (this_mv.col - 8) | 4; |
+ this_mv.row = startmv.row + 4; |
+ diag = vfp->svf_halfpix_hv(y - 1, d->pre_stride, z, b->src_stride, &sse); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
- this_mv.as_mv.col += 8; |
- thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse); |
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
+ this_mv.col += 8; |
+ diag = vfp->svf_halfpix_hv(y, d->pre_stride, z, b->src_stride, &sse); |
+ diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit); |
if (diag < bestmse) |
{ |
*bestmv = this_mv; |
bestmse = diag; |
- *distortion = thismse; |
- *sse1 = sse; |
} |
#endif |
return bestmse; |
} |
-#define CHECK_BOUNDS(range) \ |
-{\ |
- all_in = 1;\ |
- all_in &= ((br-range) >= x->mv_row_min);\ |
- all_in &= ((br+range) <= x->mv_row_max);\ |
- all_in &= ((bc-range) >= x->mv_col_min);\ |
- all_in &= ((bc+range) <= x->mv_col_max);\ |
-} |
- |
-#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;\ |
-} |
- |
-#define CHECK_BETTER \ |
-{\ |
- if (thissad < bestsad)\ |
- {\ |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);\ |
- if (thissad < bestsad)\ |
- {\ |
- bestsad = thissad;\ |
- best_site = i;\ |
- }\ |
- }\ |
-} |
+#define MVC(r,c) (((mvsadcost[0][((r)<<2)-rr] + mvsadcost[1][((c)<<2) - rc]) * error_per_bit + 128 )>>8 ) // estimated cost of a motion vector (r,c) |
+#define PRE(r,c) (*(d->base_pre) + d->pre + (r) * d->pre_stride + (c)) // pointer to predictor base of a motionvector |
+#define DIST(r,c,v) vfp->sdf( src,src_stride,PRE(r,c),d->pre_stride, v) // returns sad error score. |
+#define ERR(r,c,v) (MVC(r,c)+DIST(r,c,v)) // returns distortion + motion vector cost |
+#define CHECK_BETTER(v,r,c) if ((v = ERR(r,c,besterr)) < besterr) { besterr = v; br=r; bc=c; } // checks if (r,c) has better score than previous best |
static const MV next_chkpts[6][3] = |
{ |
{{ -2, 0}, { -1, -2}, {1, -2}}, |
@@ -872,194 +767,157 @@ static const MV next_chkpts[6][3] = |
{{1, 2}, { -1, 2}, { -2, 0}}, |
{{ -1, 2}, { -2, 0}, { -1, -2}} |
}; |
- |
int vp8_hex_search |
( |
MACROBLOCK *x, |
BLOCK *b, |
BLOCKD *d, |
- int_mv *ref_mv, |
- int_mv *best_mv, |
+ MV *ref_mv, |
+ MV *best_mv, |
int search_param, |
- int sad_per_bit, |
+ int error_per_bit, |
+ int *num00, |
const vp8_variance_fn_ptr_t *vfp, |
int *mvsadcost[2], |
int *mvcost[2], |
- int_mv *center_mv |
+ MV *center_mv |
) |
{ |
MV hex[6] = { { -1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0} } ; |
- MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}} ; |
+ MV neighbors[8] = { { -1, -1}, {0, -1}, {1, -1}, { -1, 0}, {1, 0}, { -1, 1}, {0, 1}, {1, 1} } ; |
int i, j; |
+ unsigned char *src = (*(b->base_src) + b->src); |
+ int src_stride = b->src_stride; |
+ int rr = center_mv->row, rc = center_mv->col; |
+ int br = ref_mv->row >> 3, bc = ref_mv->col >> 3, tr, tc; |
+ unsigned int besterr, thiserr = 0x7fffffff; |
+ int k = -1, tk; |
- unsigned char *what = (*(b->base_src) + b->src); |
- int what_stride = b->src_stride; |
- int in_what_stride = d->pre_stride; |
- int br, bc; |
- int_mv this_mv; |
- unsigned int bestsad = 0x7fffffff; |
- unsigned int thissad; |
- unsigned char *base_offset; |
- unsigned char *this_offset; |
- int k = -1; |
- int all_in; |
- int best_site = -1; |
+ if (bc < x->mv_col_min) bc = x->mv_col_min; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
+ if (bc > x->mv_col_max) bc = x->mv_col_max; |
- // adjust ref_mv to make sure it is within MV range |
- vp8_clamp_mv(ref_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; |
+ if (br < x->mv_row_min) br = x->mv_row_min; |
- // Work out the start point for the search |
- base_offset = (unsigned char *)(*(d->base_pre) + d->pre); |
- this_offset = base_offset + (br * (d->pre_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, mvsadcost, sad_per_bit); |
+ if (br > x->mv_row_max) br = x->mv_row_max; |
+ |
+ rr >>= 1; |
+ rc >>= 1; |
+ |
+ besterr = ERR(br, bc, thiserr); |
// hex search |
//j=0 |
- CHECK_BOUNDS(2) |
+ tr = br; |
+ tc = bc; |
- if(all_in) |
- { |
- for (i = 0; i < 6; i++) |
- { |
- this_mv.as_mv.row = br + hex[i].row; |
- this_mv.as_mv.col = bc + hex[i].col; |
- this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col; |
- thissad=vfp->sdf( what, what_stride, this_offset, in_what_stride, bestsad); |
- CHECK_BETTER |
- } |
- }else |
+ for (i = 0; i < 6; i++) |
{ |
- for (i = 0; i < 6; i++) |
+ int nr = tr + hex[i].row, nc = tc + hex[i].col; |
+ |
+ if (nc < x->mv_col_min) continue; |
+ |
+ if (nc > x->mv_col_max) continue; |
+ |
+ if (nr < x->mv_row_min) continue; |
+ |
+ if (nr > x->mv_row_max) continue; |
+ |
+ //CHECK_BETTER(thiserr,nr,nc); |
+ if ((thiserr = ERR(nr, nc, besterr)) < besterr) |
{ |
- this_mv.as_mv.row = br + hex[i].row; |
- this_mv.as_mv.col = bc + hex[i].col; |
- CHECK_POINT |
- this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col; |
- thissad=vfp->sdf( what, what_stride, this_offset, in_what_stride, bestsad); |
- CHECK_BETTER |
+ besterr = thiserr; |
+ br = nr; |
+ bc = nc; |
+ k = i; |
} |
} |
- if (best_site == -1) |
+ if (tr == br && tc == bc) |
goto cal_neighbors; |
- else |
- { |
- br += hex[best_site].row; |
- bc += hex[best_site].col; |
- k = best_site; |
- } |
for (j = 1; j < 127; j++) |
{ |
- best_site = -1; |
- CHECK_BOUNDS(2) |
+ tr = br; |
+ tc = bc; |
+ tk = k; |
- if(all_in) |
+ for (i = 0; i < 3; i++) |
{ |
- for (i = 0; i < 3; i++) |
- { |
- this_mv.as_mv.row = br + next_chkpts[k][i].row; |
- this_mv.as_mv.col = bc + next_chkpts[k][i].col; |
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col; |
- thissad = vfp->sdf( what, what_stride, this_offset, in_what_stride, bestsad); |
- CHECK_BETTER |
- } |
- }else |
- { |
- for (i = 0; i < 3; i++) |
+ int nr = tr + next_chkpts[tk][i].row, nc = tc + next_chkpts[tk][i].col; |
+ |
+ if (nc < x->mv_col_min) continue; |
+ |
+ if (nc > x->mv_col_max) continue; |
+ |
+ if (nr < x->mv_row_min) continue; |
+ |
+ if (nr > x->mv_row_max) continue; |
+ |
+ //CHECK_BETTER(thiserr,nr,nc); |
+ if ((thiserr = ERR(nr, nc, besterr)) < besterr) |
{ |
- this_mv.as_mv.row = br + next_chkpts[k][i].row; |
- this_mv.as_mv.col = bc + next_chkpts[k][i].col; |
- CHECK_POINT |
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col; |
- thissad = vfp->sdf( what, what_stride, this_offset, in_what_stride, bestsad); |
- CHECK_BETTER |
+ besterr = thiserr; |
+ br = nr; |
+ bc = nc; //k=(tk+5+i)%6;} |
+ k = tk + 5 + i; |
+ |
+ if (k >= 12) k -= 12; |
+ else if (k >= 6) k -= 6; |
} |
} |
- if (best_site == -1) |
+ if (tr == br && tc == bc) |
break; |
- else |
- { |
- br += next_chkpts[k][best_site].row; |
- bc += next_chkpts[k][best_site].col; |
- k += 5 + best_site; |
- if (k >= 12) k -= 12; |
- else if (k >= 6) k -= 6; |
- } |
} |
- // check 4 1-away neighbors |
+ // check 8 1 away neighbors |
cal_neighbors: |
- for (j = 0; j < 32; j++) |
+ tr = br; |
+ tc = bc; |
+ |
+ for (i = 0; i < 8; i++) |
{ |
- best_site = -1; |
- CHECK_BOUNDS(1) |
+ int nr = tr + neighbors[i].row, nc = tc + neighbors[i].col; |
- 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; |
- 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; |
- CHECK_POINT |
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col; |
- thissad = vfp->sdf( what, what_stride, this_offset, in_what_stride, bestsad); |
- CHECK_BETTER |
- } |
- } |
+ if (nc < x->mv_col_min) continue; |
- if (best_site == -1) |
- break; |
- else |
- { |
- br += neighbors[best_site].row; |
- bc += neighbors[best_site].col; |
- } |
+ if (nc > x->mv_col_max) continue; |
+ |
+ if (nr < x->mv_row_min) continue; |
+ |
+ if (nr > x->mv_row_max) continue; |
+ |
+ CHECK_BETTER(thiserr, nr, nc); |
} |
- best_mv->as_mv.row = br; |
- best_mv->as_mv.col = bc; |
+ best_mv->row = br; |
+ best_mv->col = bc; |
- return bestsad; |
+ return vfp->vf(src, src_stride, PRE(br, bc), d->pre_stride, &thiserr) + mv_err_cost(best_mv, center_mv, mvcost, error_per_bit) ; |
} |
-#undef CHECK_BOUNDS |
-#undef CHECK_POINT |
+#undef MVC |
+#undef PRE |
+#undef SP |
+#undef DIST |
+#undef ERR |
#undef CHECK_BETTER |
+ |
int vp8_diamond_search_sad |
( |
MACROBLOCK *x, |
BLOCK *b, |
BLOCKD *d, |
- int_mv *ref_mv, |
- int_mv *best_mv, |
+ MV *ref_mv, |
+ MV *best_mv, |
int search_param, |
- int sad_per_bit, |
+ int error_per_bit, |
int *num00, |
vp8_variance_fn_ptr_t *fn_ptr, |
+ int *mvsadcost[2], |
int *mvcost[2], |
- int_mv *center_mv |
+ MV *center_mv |
) |
{ |
int i, j, step; |
@@ -1071,14 +929,14 @@ int vp8_diamond_search_sad |
unsigned char *best_address; |
int tot_steps; |
- int_mv this_mv; |
+ MV this_mv; |
int bestsad = INT_MAX; |
int best_site = 0; |
int last_site = 0; |
- int ref_row; |
- int ref_col; |
+ int ref_row = ref_mv->row >> 3; |
+ int ref_col = ref_mv->col >> 3; |
int this_row_offset; |
int this_col_offset; |
search_site *ss; |
@@ -1086,26 +944,19 @@ int vp8_diamond_search_sad |
unsigned char *check_here; |
int thissad; |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
- |
- vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); |
- ref_row = ref_mv->as_mv.row; |
- ref_col = ref_mv->as_mv.col; |
*num00 = 0; |
- best_mv->as_mv.row = ref_row; |
- best_mv->as_mv.col = ref_col; |
// Work out the start point for the search |
in_what = (unsigned char *)(*(d->base_pre) + d->pre + (ref_row * (d->pre_stride)) + ref_col); |
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, mvsadcost, sad_per_bit); |
+ // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits |
+ if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) && |
+ (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) |
+ { |
+ // Check the starting position |
+ bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mv_err_cost(ref_mv, center_mv, mvsadcost, error_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. |
@@ -1113,14 +964,16 @@ int vp8_diamond_search_sad |
tot_steps = (x->ss_count / x->searches_per_step) - search_param; |
i = 1; |
+ best_mv->row = ref_row; |
+ best_mv->col = ref_col; |
for (step = 0; step < tot_steps ; step++) |
{ |
for (j = 0 ; j < x->searches_per_step ; j++) |
{ |
// Trap illegal vectors |
- this_row_offset = best_mv->as_mv.row + ss[i].mv.row; |
- this_col_offset = best_mv->as_mv.col + ss[i].mv.col; |
+ this_row_offset = best_mv->row + ss[i].mv.row; |
+ this_col_offset = best_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)) |
@@ -1131,10 +984,9 @@ int vp8_diamond_search_sad |
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, |
- mvsadcost, sad_per_bit); |
+ this_mv.row = this_row_offset << 3; |
+ this_mv.col = this_col_offset << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
@@ -1149,8 +1001,8 @@ int vp8_diamond_search_sad |
if (best_site != last_site) |
{ |
- best_mv->as_mv.row += ss[best_site].mv.row; |
- best_mv->as_mv.col += ss[best_site].mv.col; |
+ best_mv->row += ss[best_site].mv.row; |
+ best_mv->col += ss[best_site].mv.col; |
best_address += ss[best_site].offset; |
last_site = best_site; |
} |
@@ -1158,14 +1010,14 @@ int vp8_diamond_search_sad |
(*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.row = best_mv->row << 3; |
+ this_mv.col = best_mv->col << 3; |
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, mvcost, x->errorperbit); |
+ + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit); |
} |
int vp8_diamond_search_sadx4 |
@@ -1173,14 +1025,15 @@ int vp8_diamond_search_sadx4 |
MACROBLOCK *x, |
BLOCK *b, |
BLOCKD *d, |
- int_mv *ref_mv, |
- int_mv *best_mv, |
+ MV *ref_mv, |
+ MV *best_mv, |
int search_param, |
- int sad_per_bit, |
+ int error_per_bit, |
int *num00, |
vp8_variance_fn_ptr_t *fn_ptr, |
+ int *mvsadcost[2], |
int *mvcost[2], |
- int_mv *center_mv |
+ MV *center_mv |
) |
{ |
int i, j, step; |
@@ -1192,14 +1045,14 @@ int vp8_diamond_search_sadx4 |
unsigned char *best_address; |
int tot_steps; |
- int_mv this_mv; |
+ MV this_mv; |
int bestsad = INT_MAX; |
int best_site = 0; |
int last_site = 0; |
- int ref_row; |
- int ref_col; |
+ int ref_row = ref_mv->row >> 3; |
+ int ref_col = ref_mv->col >> 3; |
int this_row_offset; |
int this_col_offset; |
search_site *ss; |
@@ -1207,26 +1060,19 @@ int vp8_diamond_search_sadx4 |
unsigned char *check_here; |
unsigned int thissad; |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
- |
- vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); |
- ref_row = ref_mv->as_mv.row; |
- ref_col = ref_mv->as_mv.col; |
*num00 = 0; |
- best_mv->as_mv.row = ref_row; |
- best_mv->as_mv.col = ref_col; |
// Work out the start point for the search |
in_what = (unsigned char *)(*(d->base_pre) + d->pre + (ref_row * (d->pre_stride)) + ref_col); |
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, mvsadcost, sad_per_bit); |
+ // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits |
+ if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) && |
+ (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) |
+ { |
+ // Check the starting position |
+ bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mv_err_cost(ref_mv, center_mv, mvsadcost, error_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. |
@@ -1234,6 +1080,8 @@ int vp8_diamond_search_sadx4 |
tot_steps = (x->ss_count / x->searches_per_step) - search_param; |
i = 1; |
+ best_mv->row = ref_row; |
+ best_mv->col = ref_col; |
for (step = 0; step < tot_steps ; step++) |
{ |
@@ -1241,10 +1089,10 @@ int vp8_diamond_search_sadx4 |
// 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 &= ((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); |
+ all_in &= ((best_mv->row + ss[i].mv.row)> x->mv_row_min); |
+ all_in &= ((best_mv->row + ss[i+1].mv.row) < x->mv_row_max); |
+ all_in &= ((best_mv->col + ss[i+2].mv.col) > x->mv_col_min); |
+ all_in &= ((best_mv->col + ss[i+3].mv.col) < x->mv_col_max); |
if (all_in) |
{ |
@@ -1263,10 +1111,9 @@ int vp8_diamond_search_sadx4 |
{ |
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, |
- mvsadcost, sad_per_bit); |
+ this_mv.row = (best_mv->row + ss[i].mv.row) << 3; |
+ this_mv.col = (best_mv->col + ss[i].mv.col) << 3; |
+ sad_array[t] += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (sad_array[t] < bestsad) |
{ |
@@ -1282,8 +1129,8 @@ int vp8_diamond_search_sadx4 |
for (j = 0 ; j < x->searches_per_step ; j++) |
{ |
// Trap illegal vectors |
- this_row_offset = best_mv->as_mv.row + ss[i].mv.row; |
- this_col_offset = best_mv->as_mv.col + ss[i].mv.col; |
+ this_row_offset = best_mv->row + ss[i].mv.row; |
+ this_col_offset = best_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)) |
@@ -1293,10 +1140,9 @@ int vp8_diamond_search_sadx4 |
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, |
- mvsadcost, sad_per_bit); |
+ this_mv.row = this_row_offset << 3; |
+ this_mv.col = this_col_offset << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
@@ -1311,8 +1157,8 @@ int vp8_diamond_search_sadx4 |
if (best_site != last_site) |
{ |
- best_mv->as_mv.row += ss[best_site].mv.row; |
- best_mv->as_mv.col += ss[best_site].mv.col; |
+ best_mv->row += ss[best_site].mv.row; |
+ best_mv->col += ss[best_site].mv.col; |
best_address += ss[best_site].offset; |
last_site = best_site; |
} |
@@ -1320,20 +1166,19 @@ int vp8_diamond_search_sadx4 |
(*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.row = best_mv->row << 3; |
+ this_mv.col = best_mv->col << 3; |
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, mvcost, x->errorperbit); |
+ + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit); |
} |
-int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
- int sad_per_bit, int distance, |
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], |
- int_mv *center_mv) |
+ |
+#if !(CONFIG_REALTIME_ONLY) |
+int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int distance, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], int *mvsadcost[2], MV *center_mv) |
{ |
unsigned char *what = (*(b->base_src) + b->src); |
int what_stride = b->src_stride; |
@@ -1341,38 +1186,38 @@ int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
int in_what_stride = d->pre_stride; |
int mv_stride = d->pre_stride; |
unsigned char *bestaddress; |
- int_mv *best_mv = &d->bmi.mv; |
- int_mv this_mv; |
+ MV *best_mv = &d->bmi.mv.as_mv; |
+ MV this_mv; |
int bestsad = INT_MAX; |
int r, c; |
unsigned char *check_here; |
int thissad; |
- int ref_row = ref_mv->as_mv.row; |
- int ref_col = ref_mv->as_mv.col; |
+ int ref_row = ref_mv->row >> 3; |
+ int ref_col = ref_mv->col >> 3; |
int row_min = ref_row - distance; |
int row_max = ref_row + distance; |
int col_min = ref_col - distance; |
int col_max = ref_col + distance; |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
- |
// Work out the mid point for the search |
in_what = *(d->base_pre) + d->pre; |
bestaddress = in_what + (ref_row * d->pre_stride) + ref_col; |
- best_mv->as_mv.row = ref_row; |
- best_mv->as_mv.col = ref_col; |
+ best_mv->row = ref_row; |
+ best_mv->col = ref_col; |
+ |
+ // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits |
+ if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) && |
+ (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) |
+ { |
+ // Baseline value at the centre |
- // Baseline value at the centre |
- bestsad = fn_ptr->sdf(what, what_stride, bestaddress, |
- in_what_stride, 0x7fffffff) |
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); |
+ //bestsad = fn_ptr->sf( what,what_stride,bestaddress,in_what_stride) + (int)sqrt(mv_err_cost(ref_mv,ref_mv, mvcost,error_per_bit*14)); |
+ bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mv_err_cost(ref_mv, center_mv, mvsadcost, error_per_bit); |
+ } |
// Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border |
if (col_min < x->mv_col_min) |
@@ -1389,22 +1234,23 @@ int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
for (r = row_min; r < row_max ; r++) |
{ |
- this_mv.as_mv.row = r; |
+ this_mv.row = r << 3; |
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); |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ //thissad += (int)sqrt(mv_err_cost(&this_mv,ref_mv, mvcost,error_per_bit*14)); |
+ //thissad += error_per_bit * mv_bits_sadcost[mv_bits(&this_mv, ref_mv, mvcost)]; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); //mv_bits(error_per_bit, &this_mv, ref_mv, mvsadcost); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
@@ -1412,20 +1258,17 @@ int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
} |
} |
- this_mv.as_mv.row = best_mv->as_mv.row << 3; |
- this_mv.as_mv.col = best_mv->as_mv.col << 3; |
+ this_mv.row = best_mv->row << 3; |
+ this_mv.col = best_mv->col << 3; |
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, mvcost, x->errorperbit); |
+ + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit); |
else |
return INT_MAX; |
} |
-int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
- int sad_per_bit, int distance, |
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], |
- int_mv *center_mv) |
+int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int distance, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], int *mvsadcost[2], MV *center_mv) |
{ |
unsigned char *what = (*(b->base_src) + b->src); |
int what_stride = b->src_stride; |
@@ -1433,16 +1276,16 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
int in_what_stride = d->pre_stride; |
int mv_stride = d->pre_stride; |
unsigned char *bestaddress; |
- int_mv *best_mv = &d->bmi.mv; |
- int_mv this_mv; |
+ MV *best_mv = &d->bmi.mv.as_mv; |
+ MV this_mv; |
int bestsad = INT_MAX; |
int r, c; |
unsigned char *check_here; |
unsigned int thissad; |
- int ref_row = ref_mv->as_mv.row; |
- int ref_col = ref_mv->as_mv.col; |
+ int ref_row = ref_mv->row >> 3; |
+ int ref_col = ref_mv->col >> 3; |
int row_min = ref_row - distance; |
int row_max = ref_row + distance; |
@@ -1451,22 +1294,20 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
unsigned int sad_array[3]; |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
- |
// Work out the mid point for the search |
in_what = *(d->base_pre) + d->pre; |
bestaddress = in_what + (ref_row * d->pre_stride) + ref_col; |
- best_mv->as_mv.row = ref_row; |
- best_mv->as_mv.col = ref_col; |
+ best_mv->row = ref_row; |
+ best_mv->col = ref_col; |
- // Baseline value at the centre |
- bestsad = fn_ptr->sdf(what, what_stride, |
- bestaddress, in_what_stride, 0x7fffffff) |
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); |
+ // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits |
+ if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) && |
+ (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) |
+ { |
+ // Baseline value at the centre |
+ bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mv_err_cost(ref_mv, center_mv, mvsadcost, error_per_bit); |
+ } |
// Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border |
if (col_min < x->mv_col_min) |
@@ -1483,7 +1324,7 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
for (r = row_min; r < row_max ; r++) |
{ |
- this_mv.as_mv.row = r; |
+ this_mv.row = r << 3; |
check_here = r * mv_stride + in_what + col_min; |
c = col_min; |
@@ -1499,15 +1340,14 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
if (thissad < bestsad) |
{ |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
} |
@@ -1523,15 +1363,14 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
if (thissad < bestsad) |
{ |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
} |
@@ -1542,20 +1381,17 @@ int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
} |
- this_mv.as_mv.row = best_mv->as_mv.row << 3; |
- this_mv.as_mv.col = best_mv->as_mv.col << 3; |
+ this_mv.row = best_mv->row << 3; |
+ this_mv.col = best_mv->col << 3; |
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, mvcost, x->errorperbit); |
+ + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit); |
else |
return INT_MAX; |
} |
-int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
- int sad_per_bit, int distance, |
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], |
- int_mv *center_mv) |
+int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int distance, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], int *mvsadcost[2], MV *center_mv) |
{ |
unsigned char *what = (*(b->base_src) + b->src); |
int what_stride = b->src_stride; |
@@ -1563,16 +1399,16 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
int in_what_stride = d->pre_stride; |
int mv_stride = d->pre_stride; |
unsigned char *bestaddress; |
- int_mv *best_mv = &d->bmi.mv; |
- int_mv this_mv; |
+ MV *best_mv = &d->bmi.mv.as_mv; |
+ MV this_mv; |
int bestsad = INT_MAX; |
int r, c; |
unsigned char *check_here; |
unsigned int thissad; |
- int ref_row = ref_mv->as_mv.row; |
- int ref_col = ref_mv->as_mv.col; |
+ int ref_row = ref_mv->row >> 3; |
+ int ref_col = ref_mv->col >> 3; |
int row_min = ref_row - distance; |
int row_max = ref_row + distance; |
@@ -1582,22 +1418,20 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
DECLARE_ALIGNED_ARRAY(16, unsigned short, sad_array8, 8); |
unsigned int sad_array[3]; |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3; |
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3; |
- |
// Work out the mid point for the search |
in_what = *(d->base_pre) + d->pre; |
bestaddress = in_what + (ref_row * d->pre_stride) + ref_col; |
- best_mv->as_mv.row = ref_row; |
- best_mv->as_mv.col = ref_col; |
+ best_mv->row = ref_row; |
+ best_mv->col = ref_col; |
- // Baseline value at the centre |
- bestsad = fn_ptr->sdf(what, what_stride, |
- bestaddress, in_what_stride, 0x7fffffff) |
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit); |
+ // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits |
+ if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) && |
+ (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max)) |
+ { |
+ // Baseline value at the centre |
+ bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mv_err_cost(ref_mv, center_mv, mvsadcost, error_per_bit); |
+ } |
// Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border |
if (col_min < x->mv_col_min) |
@@ -1614,7 +1448,7 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
for (r = row_min; r < row_max ; r++) |
{ |
- this_mv.as_mv.row = r; |
+ this_mv.row = r << 3; |
check_here = r * mv_stride + in_what + col_min; |
c = col_min; |
@@ -1630,15 +1464,14 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
if (thissad < bestsad) |
{ |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
} |
@@ -1660,15 +1493,14 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
if (thissad < bestsad) |
{ |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
} |
@@ -1684,15 +1516,14 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
if (thissad < bestsad) |
{ |
- this_mv.as_mv.col = c; |
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, |
- mvsadcost, sad_per_bit); |
+ this_mv.col = c << 3; |
+ thissad += mv_err_cost(&this_mv, center_mv, mvsadcost, error_per_bit); |
if (thissad < bestsad) |
{ |
bestsad = thissad; |
- best_mv->as_mv.row = r; |
- best_mv->as_mv.col = c; |
+ best_mv->row = r; |
+ best_mv->col = c; |
bestaddress = check_here; |
} |
} |
@@ -1702,205 +1533,16 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
} |
} |
- this_mv.as_mv.row = best_mv->as_mv.row << 3; |
- this_mv.as_mv.col = best_mv->as_mv.col << 3; |
+ this_mv.row = best_mv->row << 3; |
+ this_mv.col = best_mv->col << 3; |
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, mvcost, x->errorperbit); |
- else |
- return INT_MAX; |
-} |
- |
-int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, |
- int error_per_bit, int search_range, |
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], |
- int_mv *center_mv) |
-{ |
- MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}; |
- int i, j; |
- short this_row_offset, this_col_offset; |
- |
- int what_stride = b->src_stride; |
- int in_what_stride = d->pre_stride; |
- unsigned char *what = (*(b->base_src) + b->src); |
- unsigned char *best_address = (unsigned char *)(*(d->base_pre) + d->pre + |
- (ref_mv->as_mv.row * (d->pre_stride)) + ref_mv->as_mv.col); |
- unsigned char *check_here; |
- unsigned int thissad; |
- int_mv this_mv; |
- unsigned int bestsad = INT_MAX; |
- |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- |
- 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, mvsadcost, error_per_bit); |
- |
- for (i=0; i<search_range; i++) |
- { |
- int best_site = -1; |
- |
- for (j = 0 ; j < 4 ; j++) |
- { |
- 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 (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, mvsadcost, error_per_bit); |
- |
- if (thissad < bestsad) |
- { |
- bestsad = thissad; |
- best_site = j; |
- } |
- } |
- } |
- } |
- |
- if (best_site == -1) |
- break; |
- 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; |
- } |
- } |
- |
- this_mv.as_mv.row = ref_mv->as_mv.row << 3; |
- this_mv.as_mv.col = ref_mv->as_mv.col << 3; |
- |
- 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, mvcost, x->errorperbit); |
- else |
- return INT_MAX; |
-} |
- |
-int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d, |
- int_mv *ref_mv, int error_per_bit, |
- int search_range, vp8_variance_fn_ptr_t *fn_ptr, |
- int *mvcost[2], int_mv *center_mv) |
-{ |
- MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}}; |
- int i, j; |
- short this_row_offset, this_col_offset; |
- |
- int what_stride = b->src_stride; |
- int in_what_stride = d->pre_stride; |
- unsigned char *what = (*(b->base_src) + b->src); |
- unsigned char *best_address = (unsigned char *)(*(d->base_pre) + d->pre + |
- (ref_mv->as_mv.row * (d->pre_stride)) + ref_mv->as_mv.col); |
- unsigned char *check_here; |
- unsigned int thissad; |
- int_mv this_mv; |
- unsigned int bestsad = INT_MAX; |
- |
- int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]}; |
- int_mv fcenter_mv; |
- |
- 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, mvsadcost, error_per_bit); |
- |
- for (i=0; i<search_range; i++) |
- { |
- int best_site = -1; |
- int all_in = 1; |
- |
- all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min); |
- all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max); |
- all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min); |
- all_in &= ((ref_mv->as_mv.col + 1) < x->mv_col_max); |
- |
- if(all_in) |
- { |
- unsigned int sad_array[4]; |
- unsigned char *block_offset[4]; |
- block_offset[0] = best_address - in_what_stride; |
- block_offset[1] = best_address - 1; |
- 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); |
- |
- 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, mvsadcost, error_per_bit); |
- |
- if (sad_array[j] < bestsad) |
- { |
- bestsad = sad_array[j]; |
- best_site = j; |
- } |
- } |
- } |
- } |
- else |
- { |
- for (j = 0 ; j < 4 ; j++) |
- { |
- 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 (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, mvsadcost, error_per_bit); |
- |
- if (thissad < bestsad) |
- { |
- bestsad = thissad; |
- best_site = j; |
- } |
- } |
- } |
- } |
- } |
- |
- if (best_site == -1) |
- break; |
- 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; |
- } |
- } |
- |
- this_mv.as_mv.row = ref_mv->as_mv.row << 3; |
- this_mv.as_mv.col = ref_mv->as_mv.col << 3; |
- |
- 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, mvcost, x->errorperbit); |
+ + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit); |
else |
return INT_MAX; |
} |
+#endif /* !(CONFIG_REALTIME_ONLY) */ |
#ifdef ENTROPY_STATS |
void print_mode_context(void) |