Fix use of scaling in joint motion search
To enable us to the scale-invariant motion estimation code during mode selection, each of the reference buffers is scaled to match the size of the frame being encoded. This fix ensures that a unit scaling factor is used in this case rather than the one calculated assuming that the reference frame is not scaled. (cherry picked from commit 8d8d7bfde5d311bb7d4ff4e921a9dbaa8f389af5) Change-Id: Id9a5c85dad402f3a7cc7ea9f30f204edad080ebf
This commit is contained in:
parent
bb5a39c1a7
commit
5ef2d1ddae
@ -1540,6 +1540,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
int mi_row, int mi_col,
|
int mi_row, int mi_col,
|
||||||
int_mv single_newmv[MAX_REF_FRAMES],
|
int_mv single_newmv[MAX_REF_FRAMES],
|
||||||
int *rate_mv) {
|
int *rate_mv) {
|
||||||
|
const VP9_COMMON *const cm = &cpi->common;
|
||||||
const int pw = 4 * num_4x4_blocks_wide_lookup[bsize];
|
const int pw = 4 * num_4x4_blocks_wide_lookup[bsize];
|
||||||
const int ph = 4 * num_4x4_blocks_high_lookup[bsize];
|
const int ph = 4 * num_4x4_blocks_high_lookup[bsize];
|
||||||
MACROBLOCKD *xd = &x->e_mbd;
|
MACROBLOCKD *xd = &x->e_mbd;
|
||||||
@ -1556,6 +1557,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
|
uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
const InterpKernel *kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
const InterpKernel *kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
||||||
|
struct scale_factors sf;
|
||||||
|
|
||||||
// Do joint motion search in compound mode to get more accurate mv.
|
// Do joint motion search in compound mode to get more accurate mv.
|
||||||
struct buf_2d backup_yv12[2][MAX_MB_PLANE];
|
struct buf_2d backup_yv12[2][MAX_MB_PLANE];
|
||||||
@ -1591,6 +1593,17 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since we have scaled the reference frames to match the size of the current
|
||||||
|
// frame we must use a unit scaling factor during mode selection.
|
||||||
|
#if CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
vp9_setup_scale_factors_for_frame(&sf, cm->width, cm->height,
|
||||||
|
cm->width, cm->height,
|
||||||
|
cm->use_highbitdepth);
|
||||||
|
#else
|
||||||
|
vp9_setup_scale_factors_for_frame(&sf, cm->width, cm->height,
|
||||||
|
cm->width, cm->height);
|
||||||
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
|
||||||
// Allow joint search multiple times iteratively for each reference frame
|
// Allow joint search multiple times iteratively for each reference frame
|
||||||
// and break out of the search loop if it couldn't find a better mv.
|
// and break out of the search loop if it couldn't find a better mv.
|
||||||
for (ite = 0; ite < 4; ite++) {
|
for (ite = 0; ite < 4; ite++) {
|
||||||
@ -1619,8 +1632,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
ref_yv12[!id].stride,
|
ref_yv12[!id].stride,
|
||||||
second_pred, pw,
|
second_pred, pw,
|
||||||
&frame_mv[refs[!id]].as_mv,
|
&frame_mv[refs[!id]].as_mv,
|
||||||
&xd->block_refs[!id]->sf,
|
&sf, pw, ph, 0,
|
||||||
pw, ph, 0,
|
|
||||||
kernel, MV_PRECISION_Q3,
|
kernel, MV_PRECISION_Q3,
|
||||||
mi_col * MI_SIZE, mi_row * MI_SIZE,
|
mi_col * MI_SIZE, mi_row * MI_SIZE,
|
||||||
xd->bd);
|
xd->bd);
|
||||||
@ -1629,8 +1641,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
ref_yv12[!id].stride,
|
ref_yv12[!id].stride,
|
||||||
second_pred, pw,
|
second_pred, pw,
|
||||||
&frame_mv[refs[!id]].as_mv,
|
&frame_mv[refs[!id]].as_mv,
|
||||||
&xd->block_refs[!id]->sf,
|
&sf, pw, ph, 0,
|
||||||
pw, ph, 0,
|
|
||||||
kernel, MV_PRECISION_Q3,
|
kernel, MV_PRECISION_Q3,
|
||||||
mi_col * MI_SIZE, mi_row * MI_SIZE);
|
mi_col * MI_SIZE, mi_row * MI_SIZE);
|
||||||
}
|
}
|
||||||
@ -1639,8 +1650,7 @@ static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
ref_yv12[!id].stride,
|
ref_yv12[!id].stride,
|
||||||
second_pred, pw,
|
second_pred, pw,
|
||||||
&frame_mv[refs[!id]].as_mv,
|
&frame_mv[refs[!id]].as_mv,
|
||||||
&xd->block_refs[!id]->sf,
|
&sf, pw, ph, 0,
|
||||||
pw, ph, 0,
|
|
||||||
kernel, MV_PRECISION_Q3,
|
kernel, MV_PRECISION_Q3,
|
||||||
mi_col * MI_SIZE, mi_row * MI_SIZE);
|
mi_col * MI_SIZE, mi_row * MI_SIZE);
|
||||||
#endif // CONFIG_VP9_HIGHBITDEPTH
|
#endif // CONFIG_VP9_HIGHBITDEPTH
|
||||||
|
Loading…
x
Reference in New Issue
Block a user