Merge "Cleaning up vp9_full_range_search_c() function."
This commit is contained in:
Коммит
3af5eab2c1
|
@ -878,89 +878,67 @@ int vp9_full_range_search_c(const MACROBLOCK *x,
|
|||
const vp9_variance_fn_ptr_t *fn_ptr,
|
||||
const MV *center_mv) {
|
||||
const MACROBLOCKD *const xd = &x->e_mbd;
|
||||
const uint8_t *what = x->plane[0].src.buf;
|
||||
const int what_stride = x->plane[0].src.stride;
|
||||
const uint8_t *in_what;
|
||||
const int in_what_stride = xd->plane[0].pre[0].stride;
|
||||
|
||||
unsigned int bestsad = INT_MAX;
|
||||
int ref_row, ref_col;
|
||||
|
||||
unsigned int thissad;
|
||||
const struct buf_2d *const what = &x->plane[0].src;
|
||||
const struct buf_2d *const in_what = &xd->plane[0].pre[0];
|
||||
const int range = 64;
|
||||
const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
|
||||
int tr, tc;
|
||||
int best_tr = 0;
|
||||
int best_tc = 0;
|
||||
int range = 64;
|
||||
|
||||
int start_col, end_col;
|
||||
int start_row, end_row;
|
||||
int i;
|
||||
unsigned int best_sad = INT_MAX;
|
||||
int r, c, i;
|
||||
int start_col, end_col, start_row, end_row;
|
||||
|
||||
clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
|
||||
ref_row = ref_mv->row;
|
||||
ref_col = ref_mv->col;
|
||||
*best_mv = *ref_mv;
|
||||
*num00 = 11;
|
||||
best_mv->row = ref_row;
|
||||
best_mv->col = ref_col;
|
||||
best_sad = fn_ptr->sdf(what->buf, what->stride,
|
||||
get_buf_from_mv(in_what, ref_mv), in_what->stride,
|
||||
0x7fffffff) +
|
||||
mvsad_err_cost(x, ref_mv, &fcenter_mv, sad_per_bit);
|
||||
start_row = MAX(-range, x->mv_row_min - ref_mv->row);
|
||||
start_col = MAX(-range, x->mv_col_min - ref_mv->col);
|
||||
end_row = MIN(range, x->mv_row_max - ref_mv->row);
|
||||
end_col = MIN(range, x->mv_col_max - ref_mv->col);
|
||||
|
||||
// Work out the start point for the search
|
||||
in_what = xd->plane[0].pre[0].buf + ref_row * in_what_stride + ref_col;
|
||||
for (r = start_row; r <= end_row; ++r) {
|
||||
for (c = start_col; c <= end_col; c += 4) {
|
||||
if (c + 3 <= end_col) {
|
||||
unsigned int sads[4];
|
||||
const uint8_t *addrs[4];
|
||||
for (i = 0; i < 4; ++i) {
|
||||
const MV mv = {ref_mv->row + r, ref_mv->col + c + i};
|
||||
addrs[i] = get_buf_from_mv(in_what, &mv);
|
||||
}
|
||||
|
||||
// Check the starting position
|
||||
bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff)
|
||||
+ mvsad_err_cost(x, best_mv, &fcenter_mv, sad_per_bit);
|
||||
|
||||
start_row = MAX(-range, x->mv_row_min - ref_row);
|
||||
start_col = MAX(-range, x->mv_col_min - ref_col);
|
||||
end_row = MIN(range, x->mv_row_max - ref_row);
|
||||
end_col = MIN(range, x->mv_col_max - ref_col);
|
||||
|
||||
for (tr = start_row; tr <= end_row; ++tr) {
|
||||
for (tc = start_col; tc <= end_col; tc += 4) {
|
||||
if ((tc + 3) <= end_col) {
|
||||
unsigned int sad_array[4];
|
||||
unsigned char const *addr_ref[4];
|
||||
for (i = 0; i < 4; ++i)
|
||||
addr_ref[i] = in_what + tr * in_what_stride + tc + i;
|
||||
|
||||
fn_ptr->sdx4df(what, what_stride, addr_ref, in_what_stride, sad_array);
|
||||
fn_ptr->sdx4df(what->buf, what->stride, addrs, in_what->stride, sads);
|
||||
|
||||
for (i = 0; i < 4; ++i) {
|
||||
if (sad_array[i] < bestsad) {
|
||||
const MV this_mv = {ref_row + tr, ref_col + tc + i};
|
||||
thissad = sad_array[i] +
|
||||
mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit);
|
||||
if (thissad < bestsad) {
|
||||
bestsad = thissad;
|
||||
best_tr = tr;
|
||||
best_tc = tc + i;
|
||||
if (sads[i] < best_sad) {
|
||||
const MV mv = {ref_mv->row + r, ref_mv->col + c + i};
|
||||
const unsigned int sad = sads[i] +
|
||||
mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
|
||||
if (sad < best_sad) {
|
||||
best_sad = sad;
|
||||
*best_mv = mv;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < end_col - tc; ++i) {
|
||||
const uint8_t *check_here = in_what + tr * in_what_stride + tc + i;
|
||||
thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride,
|
||||
bestsad);
|
||||
|
||||
if (thissad < bestsad) {
|
||||
const MV this_mv = {ref_row + tr, ref_col + tc + i};
|
||||
thissad += mvsad_err_cost(x, &this_mv, &fcenter_mv, sad_per_bit);
|
||||
|
||||
if (thissad < bestsad) {
|
||||
bestsad = thissad;
|
||||
best_tr = tr;
|
||||
best_tc = tc + i;
|
||||
for (i = 0; i < end_col - c; ++i) {
|
||||
const MV mv = {ref_mv->row + r, ref_mv->col + c + i};
|
||||
unsigned int sad = fn_ptr->sdf(what->buf, what->stride,
|
||||
get_buf_from_mv(in_what, &mv), in_what->stride, best_sad);
|
||||
if (sad < best_sad) {
|
||||
sad += mvsad_err_cost(x, &mv, &fcenter_mv, sad_per_bit);
|
||||
if (sad < best_sad) {
|
||||
best_sad = sad;
|
||||
*best_mv = mv;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
best_mv->row += best_tr;
|
||||
best_mv->col += best_tc;
|
||||
return bestsad;
|
||||
|
||||
return best_sad;
|
||||
}
|
||||
|
||||
int vp9_diamond_search_sad_c(const MACROBLOCK *x,
|
||||
|
|
Загрузка…
Ссылка в новой задаче