Call set_scaled_offsets() just before scale_mv() call.
Before mv scaling it is required to calculate x_offset_q4/y_offset_q4 by calling set_scaled_offsets(). Now offset configuration can not be missed because it happens just before scale_mv(). Change-Id: I7dd1a85b85811a6cc67c46c9b01e6ccbbb06ce3a
This commit is contained in:
Родитель
5bfd475104
Коммит
c872d2be65
|
@ -80,17 +80,23 @@ static void inter_predictor(const uint8_t *src, int src_stride,
|
||||||
void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
|
void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
|
||||||
uint8_t *dst, int dst_stride,
|
uint8_t *dst, int dst_stride,
|
||||||
const MV *src_mv,
|
const MV *src_mv,
|
||||||
const struct scale_factors *scale,
|
struct scale_factors *scale,
|
||||||
int w, int h, int ref,
|
int w, int h, int ref,
|
||||||
const struct subpix_fn_table *subpix,
|
const struct subpix_fn_table *subpix,
|
||||||
enum mv_precision precision) {
|
enum mv_precision precision,
|
||||||
|
int x, int y) {
|
||||||
const int is_q4 = precision == MV_PRECISION_Q4;
|
const int is_q4 = precision == MV_PRECISION_Q4;
|
||||||
const MV mv_q4 = { is_q4 ? src_mv->row : src_mv->row * 2,
|
const MV mv_q4 = { is_q4 ? src_mv->row : src_mv->row * 2,
|
||||||
is_q4 ? src_mv->col : src_mv->col * 2 };
|
is_q4 ? src_mv->col : src_mv->col * 2 };
|
||||||
const struct scale_factors_common *sfc = scale->sfc;
|
const struct scale_factors_common *sfc = scale->sfc;
|
||||||
const MV32 mv = sfc->scale_mv(&mv_q4, scale);
|
int subpel_x, subpel_y;
|
||||||
const int subpel_x = mv.col & SUBPEL_MASK;
|
MV32 mv;
|
||||||
const int subpel_y = mv.row & SUBPEL_MASK;
|
|
||||||
|
sfc->set_scaled_offsets(scale, y, x);
|
||||||
|
mv = sfc->scale_mv(&mv_q4, scale);
|
||||||
|
subpel_x = mv.col & SUBPEL_MASK;
|
||||||
|
subpel_y = mv.row & SUBPEL_MASK;
|
||||||
|
|
||||||
src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
|
src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
|
||||||
|
|
||||||
inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
|
inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
|
||||||
|
|
|
@ -30,10 +30,11 @@ void vp9_dec_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
|
||||||
void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
|
void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
|
||||||
uint8_t *dst, int dst_stride,
|
uint8_t *dst, int dst_stride,
|
||||||
const MV *mv_q3,
|
const MV *mv_q3,
|
||||||
const struct scale_factors *scale,
|
struct scale_factors *scale,
|
||||||
int w, int h, int do_avg,
|
int w, int h, int do_avg,
|
||||||
const struct subpix_fn_table *subpix,
|
const struct subpix_fn_table *subpix,
|
||||||
enum mv_precision precision);
|
enum mv_precision precision,
|
||||||
|
int x, int y);
|
||||||
|
|
||||||
static int scaled_buffer_offset(int x_offset, int y_offset, int stride,
|
static int scaled_buffer_offset(int x_offset, int y_offset, int stride,
|
||||||
const struct scale_factors *scale) {
|
const struct scale_factors *scale) {
|
||||||
|
|
|
@ -1496,7 +1496,8 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi,
|
||||||
int *labelyrate,
|
int *labelyrate,
|
||||||
int64_t *distortion, int64_t *sse,
|
int64_t *distortion, int64_t *sse,
|
||||||
ENTROPY_CONTEXT *ta,
|
ENTROPY_CONTEXT *ta,
|
||||||
ENTROPY_CONTEXT *tl) {
|
ENTROPY_CONTEXT *tl,
|
||||||
|
int mi_row, int mi_col) {
|
||||||
int k;
|
int k;
|
||||||
MACROBLOCKD *xd = &x->e_mbd;
|
MACROBLOCKD *xd = &x->e_mbd;
|
||||||
struct macroblockd_plane *const pd = &xd->plane[0];
|
struct macroblockd_plane *const pd = &xd->plane[0];
|
||||||
|
@ -1522,7 +1523,9 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi,
|
||||||
dst, pd->dst.stride,
|
dst, pd->dst.stride,
|
||||||
&mi->bmi[i].as_mv[ref].as_mv,
|
&mi->bmi[i].as_mv[ref].as_mv,
|
||||||
&xd->scale_factor[ref],
|
&xd->scale_factor[ref],
|
||||||
width, height, ref, &xd->subpix, MV_PRECISION_Q3);
|
width, height, ref, &xd->subpix, MV_PRECISION_Q3,
|
||||||
|
mi_col * MI_SIZE + 4 * (i % 2),
|
||||||
|
mi_row * MI_SIZE + 4 * (i / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
vp9_subtract_block(height, width,
|
vp9_subtract_block(height, width,
|
||||||
|
@ -1956,7 +1959,8 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
&bsi->rdstat[i][mode_idx].bdist,
|
&bsi->rdstat[i][mode_idx].bdist,
|
||||||
&bsi->rdstat[i][mode_idx].bsse,
|
&bsi->rdstat[i][mode_idx].bsse,
|
||||||
bsi->rdstat[i][mode_idx].ta,
|
bsi->rdstat[i][mode_idx].ta,
|
||||||
bsi->rdstat[i][mode_idx].tl);
|
bsi->rdstat[i][mode_idx].tl,
|
||||||
|
mi_row, mi_col);
|
||||||
if (bsi->rdstat[i][mode_idx].brdcost < INT64_MAX) {
|
if (bsi->rdstat[i][mode_idx].brdcost < INT64_MAX) {
|
||||||
bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv,
|
bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv,
|
||||||
bsi->rdstat[i][mode_idx].brate, 0);
|
bsi->rdstat[i][mode_idx].brate, 0);
|
||||||
|
@ -2487,8 +2491,6 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, NULL);
|
setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
xd->scale_factor[ref].sfc->set_scaled_offsets(&xd->scale_factor[ref],
|
|
||||||
mi_row, mi_col);
|
|
||||||
frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2518,7 +2520,8 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
&frame_mv[refs[!id]].as_mv,
|
&frame_mv[refs[!id]].as_mv,
|
||||||
&xd->scale_factor[!id],
|
&xd->scale_factor[!id],
|
||||||
pw, ph, 0,
|
pw, ph, 0,
|
||||||
&xd->subpix, MV_PRECISION_Q3);
|
&xd->subpix, MV_PRECISION_Q3,
|
||||||
|
mi_col * MI_SIZE, mi_row * MI_SIZE);
|
||||||
|
|
||||||
// Compound motion search on first ref frame.
|
// Compound motion search on first ref frame.
|
||||||
if (id)
|
if (id)
|
||||||
|
|
|
@ -40,7 +40,8 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
|
||||||
int mv_row,
|
int mv_row,
|
||||||
int mv_col,
|
int mv_col,
|
||||||
uint8_t *pred,
|
uint8_t *pred,
|
||||||
struct scale_factors *scale) {
|
struct scale_factors *scale,
|
||||||
|
int x, int y) {
|
||||||
const int which_mv = 0;
|
const int which_mv = 0;
|
||||||
MV mv = { mv_row, mv_col };
|
MV mv = { mv_row, mv_col };
|
||||||
enum mv_precision mv_precision_uv;
|
enum mv_precision mv_precision_uv;
|
||||||
|
@ -59,8 +60,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
|
||||||
scale,
|
scale,
|
||||||
16, 16,
|
16, 16,
|
||||||
which_mv,
|
which_mv,
|
||||||
&xd->subpix, MV_PRECISION_Q3);
|
&xd->subpix, MV_PRECISION_Q3, x, y);
|
||||||
|
|
||||||
|
|
||||||
vp9_build_inter_predictor(u_mb_ptr, uv_stride,
|
vp9_build_inter_predictor(u_mb_ptr, uv_stride,
|
||||||
&pred[256], uv_block_size,
|
&pred[256], uv_block_size,
|
||||||
|
@ -68,7 +68,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
|
||||||
scale,
|
scale,
|
||||||
uv_block_size, uv_block_size,
|
uv_block_size, uv_block_size,
|
||||||
which_mv,
|
which_mv,
|
||||||
&xd->subpix, mv_precision_uv);
|
&xd->subpix, mv_precision_uv, x, y);
|
||||||
|
|
||||||
vp9_build_inter_predictor(v_mb_ptr, uv_stride,
|
vp9_build_inter_predictor(v_mb_ptr, uv_stride,
|
||||||
&pred[512], uv_block_size,
|
&pred[512], uv_block_size,
|
||||||
|
@ -76,7 +76,7 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd,
|
||||||
scale,
|
scale,
|
||||||
uv_block_size, uv_block_size,
|
uv_block_size, uv_block_size,
|
||||||
which_mv,
|
which_mv,
|
||||||
&xd->subpix, mv_precision_uv);
|
&xd->subpix, mv_precision_uv, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp9_temporal_filter_apply_c(uint8_t *frame1,
|
void vp9_temporal_filter_apply_c(uint8_t *frame1,
|
||||||
|
@ -296,7 +296,8 @@ static void temporal_filter_iterate_c(VP9_COMP *cpi,
|
||||||
mb_uv_height,
|
mb_uv_height,
|
||||||
mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.row,
|
mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.row,
|
||||||
mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.col,
|
mbd->mi_8x8[0]->bmi[0].as_mv[0].as_mv.col,
|
||||||
predictor, scale);
|
predictor, scale,
|
||||||
|
mb_col * 16, mb_row * 16);
|
||||||
|
|
||||||
// Apply the filter (YUV)
|
// Apply the filter (YUV)
|
||||||
vp9_temporal_filter_apply(f->y_buffer + mb_y_offset, f->y_stride,
|
vp9_temporal_filter_apply(f->y_buffer + mb_y_offset, f->y_stride,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче