Modification and issue fix in full-pixel refining search

Further modification and wrong implementation fix which caused
refining_search and refining_searchx4 result mismatching.

Change-Id: I80cb3a44bf5824413fd50c972e383eebb75f9b6f
This commit is contained in:
Yunqing Wang 2011-05-11 13:38:29 -04:00
parent c7a56f677d
commit b4da1f83e6

View File

@ -1624,7 +1624,6 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int er
int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int search_range, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], MV *center_mv)
{
MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
MV tempmv;
int i, j;
short this_row_offset, this_col_offset;
@ -1647,8 +1646,7 @@ int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int
for (i=0; i<search_range; i++)
{
tempmv.row = ref_mv->row;
tempmv.col = ref_mv->col;
int best_site = -1;
for (j = 0 ; j < 4 ; j++)
{
@ -1670,16 +1668,20 @@ int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int
if (thissad < bestsad)
{
bestsad = thissad;
ref_mv->row = this_row_offset;
ref_mv->col = this_col_offset;
best_address = check_here;
best_site = j;
}
}
}
}
if (tempmv.row == ref_mv->row && tempmv.col == ref_mv->col )
if (best_site == -1)
break;
else
{
ref_mv->row += neighbors[best_site].row;
ref_mv->col += neighbors[best_site].col;
best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
}
}
this_mv.row = ref_mv->row << 3;
@ -1695,7 +1697,6 @@ int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int
int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, int error_per_bit, int search_range, vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2], MV *center_mv)
{
MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
MV tempmv;
int i, j;
short this_row_offset, this_col_offset;
@ -1718,11 +1719,9 @@ int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, in
for (i=0; i<search_range; i++)
{
int best_site = -1;
int all_in = 1;
tempmv.row = ref_mv->row;
tempmv.col = ref_mv->col;
all_in &= ((ref_mv->row - 1) > x->mv_row_min);
all_in &= ((ref_mv->row + 1) < x->mv_row_max);
all_in &= ((ref_mv->col - 1) > x->mv_col_min);
@ -1750,9 +1749,7 @@ int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, in
if (sad_array[j] < bestsad)
{
bestsad = sad_array[j];
ref_mv->row = this_mv.row;
ref_mv->col = this_mv.col;
best_address = block_offset[j];
best_site = j;
}
}
}
@ -1779,17 +1776,21 @@ int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *ref_mv, in
if (thissad < bestsad)
{
bestsad = thissad;
ref_mv->row = this_row_offset;
ref_mv->col = this_col_offset;
best_address = check_here;
best_site = j;
}
}
}
}
}
if (tempmv.row == ref_mv->row && tempmv.col == ref_mv->col )
break;
if (best_site == -1)
break;
else
{
ref_mv->row += neighbors[best_site].row;
ref_mv->col += neighbors[best_site].col;
best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
}
}
this_mv.row = ref_mv->row << 3;