| Index: source/libvpx/vp9/encoder/vp9_rdopt.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_rdopt.c (revision 223160)
|
| +++ source/libvpx/vp9/encoder/vp9_rdopt.c (working copy)
|
| @@ -1771,6 +1771,7 @@
|
| max_mv = x->max_mv_context[mbmi->ref_frame[0]];
|
| else
|
| max_mv = MAX(abs(bsi->mvp.as_mv.row), abs(bsi->mvp.as_mv.col)) >> 3;
|
| +
|
| if (cpi->sf.auto_mv_step_size && cpi->common.show_frame) {
|
| // Take wtd average of the step_params based on the last frame's
|
| // max mv magnitude and the best ref mvs of the current block for
|
| @@ -1781,11 +1782,16 @@
|
| step_param = cpi->mv_step_param;
|
| }
|
|
|
| - further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
|
| -
|
| mvp_full.as_mv.row = bsi->mvp.as_mv.row >> 3;
|
| mvp_full.as_mv.col = bsi->mvp.as_mv.col >> 3;
|
|
|
| + if (cpi->sf.adaptive_motion_search && cpi->common.show_frame) {
|
| + mvp_full.as_mv.row = x->pred_mv[mbmi->ref_frame[0]].as_mv.row >> 3;
|
| + mvp_full.as_mv.col = x->pred_mv[mbmi->ref_frame[0]].as_mv.col >> 3;
|
| + step_param = MAX(step_param, 8);
|
| + }
|
| +
|
| + further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
|
| // adjust src pointer for this block
|
| mi_buf_shift(x, i);
|
| if (cpi->sf.search_method == HEX) {
|
| @@ -1839,10 +1845,13 @@
|
| x->nmvjointcost, x->mvcost,
|
| &distortion, &sse);
|
|
|
| - // safe motion search result for use in compound prediction
|
| + // save motion search result for use in compound prediction
|
| seg_mvs[i][mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int;
|
| }
|
|
|
| + if (cpi->sf.adaptive_motion_search)
|
| + x->pred_mv[mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int;
|
| +
|
| // restore src pointers
|
| mi_buf_restore(x, orig_src, orig_pre);
|
| }
|
| @@ -2085,10 +2094,14 @@
|
| uint8_t *src_y_ptr = x->plane[0].src.buf;
|
| uint8_t *ref_y_ptr;
|
| int row_offset, col_offset;
|
| + int num_mv_refs = MAX_MV_REF_CANDIDATES +
|
| + (cpi->sf.adaptive_motion_search &&
|
| + cpi->common.show_frame && block_size < BLOCK_64X64);
|
|
|
| // Get the sad for each candidate reference mv
|
| - for (i = 0; i < MAX_MV_REF_CANDIDATES; i++) {
|
| - this_mv.as_int = mbmi->ref_mvs[ref_frame][i].as_int;
|
| + for (i = 0; i < num_mv_refs; i++) {
|
| + this_mv.as_int = (i < MAX_MV_REF_CANDIDATES) ?
|
| + mbmi->ref_mvs[ref_frame][i].as_int : x->pred_mv[ref_frame].as_int;
|
|
|
| max_mv = MAX(max_mv,
|
| MAX(abs(this_mv.as_mv.row), abs(this_mv.as_mv.col)) >> 3);
|
| @@ -2349,7 +2362,7 @@
|
| step_param = 8;
|
|
|
| // Get prediction MV.
|
| - mvp_full.as_int = x->pred_mv.as_int;
|
| + mvp_full.as_int = x->pred_mv[ref].as_int;
|
|
|
| // Adjust MV sign if needed.
|
| if (cm->ref_frame_sign_bias[ref]) {
|
| @@ -2368,11 +2381,19 @@
|
| } else {
|
| step_param = cpi->mv_step_param;
|
| }
|
| - // mvp_full.as_int = ref_mv[0].as_int;
|
| - mvp_full.as_int =
|
| - mbmi->ref_mvs[ref][x->mv_best_ref_index[ref]].as_int;
|
| }
|
|
|
| + if (cpi->sf.adaptive_motion_search && bsize < BLOCK_64X64 &&
|
| + cpi->common.show_frame) {
|
| + int boffset = 2 * (b_width_log2(BLOCK_64X64) - MIN(b_height_log2(bsize),
|
| + b_width_log2(bsize)));
|
| + step_param = MAX(step_param, boffset);
|
| + }
|
| +
|
| + mvp_full.as_int = x->mv_best_ref_index[ref] < MAX_MV_REF_CANDIDATES ?
|
| + mbmi->ref_mvs[ref][x->mv_best_ref_index[ref]].as_int :
|
| + x->pred_mv[ref].as_int;
|
| +
|
| mvp_full.as_mv.col >>= 3;
|
| mvp_full.as_mv.row >>= 3;
|
|
|
| @@ -2422,6 +2443,10 @@
|
| *rate_mv = vp9_mv_bit_cost(tmp_mv, &ref_mv,
|
| x->nmvjointcost, x->mvcost,
|
| 96);
|
| +
|
| + if (cpi->sf.adaptive_motion_search && cpi->common.show_frame)
|
| + x->pred_mv[ref].as_int = tmp_mv->as_int;
|
| +
|
| if (scaled_ref_frame) {
|
| int i;
|
| for (i = 0; i < MAX_MB_PLANE; i++)
|
|
|