summaryrefslogtreecommitdiff
path: root/vp8/encoder
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2011-05-11 13:38:29 -0400
committerYunqing Wang <yunqingwang@google.com>2011-05-12 10:18:40 -0400
commitb4da1f83e616d71932c3f5a32b1b4ed5fa36a5cb (patch)
tree963d1489c54825bfabc4eea413204811510dc0af /vp8/encoder
parentc7a56f677d4c5336fa6b0f07b10d3cdccc14f9b3 (diff)
downloadlibvpx-b4da1f83e616d71932c3f5a32b1b4ed5fa36a5cb.tar
libvpx-b4da1f83e616d71932c3f5a32b1b4ed5fa36a5cb.tar.gz
libvpx-b4da1f83e616d71932c3f5a32b1b4ed5fa36a5cb.tar.bz2
libvpx-b4da1f83e616d71932c3f5a32b1b4ed5fa36a5cb.zip
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
Diffstat (limited to 'vp8/encoder')
-rw-r--r--vp8/encoder/mcomp.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c
index 90e398383..a0afcd0a4 100644
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -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;