diff options
author | Jingning Han <jingning@google.com> | 2014-02-14 14:41:47 -0800 |
---|---|---|
committer | Jingning Han <jingning@google.com> | 2014-02-18 12:07:55 -0800 |
commit | 6478673933912195394d80fec5db94ea79c12105 (patch) | |
tree | 32df9613ae258ad0f6d27840246fe77721987c95 /vp9/encoder/vp9_pickmode.c | |
parent | cc10ee0adda3304e8e73a4372aa901fe6953f938 (diff) | |
download | libvpx-6478673933912195394d80fec5db94ea79c12105.tar libvpx-6478673933912195394d80fec5db94ea79c12105.tar.gz libvpx-6478673933912195394d80fec5db94ea79c12105.tar.bz2 libvpx-6478673933912195394d80fec5db94ea79c12105.zip |
Enable sub-pixel motion search for rtc mode
Run sub-pixel motion search when NEWMV gives lower rate-distortion
cost. This improves coding performance of derf set by 8%, std-hd by
2.2%.
Change-Id: Ife50f7fda8463927784fe59a41cc439c833e941a
Diffstat (limited to 'vp9/encoder/vp9_pickmode.c')
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 912968594..b84ba9ad2 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -128,9 +128,50 @@ static int full_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, // calculate the bit cost on motion vector *rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv.as_mv, x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); + return bestsme; +} +static void sub_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, + const TileInfo *const tile, + BLOCK_SIZE bsize, int mi_row, int mi_col, + int_mv *tmp_mv) { + MACROBLOCKD *xd = &x->e_mbd; + MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; + struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; + int ref = mbmi->ref_frame[0]; + int_mv ref_mv = mbmi->ref_mvs[ref][0]; + int dis; - return bestsme; + const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, + ref); + if (scaled_ref_frame) { + int i; + // Swap out the reference frame for a version that's been scaled to + // match the resolution of the current frame, allowing the existing + // motion search code to be used without additional modifications. + for (i = 0; i < MAX_MB_PLANE; i++) + backup_yv12[i] = xd->plane[i].pre[0]; + + setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); + } + + tmp_mv->as_mv.col >>= 3; + tmp_mv->as_mv.row >>= 3; + + cpi->find_fractional_mv_step(x, &tmp_mv->as_mv, &ref_mv.as_mv, + cpi->common.allow_high_precision_mv, + x->errorperbit, + &cpi->fn_ptr[bsize], + cpi->sf.subpel_force_stop, + cpi->sf.subpel_iters_per_step, + x->nmvjointcost, x->mvcost, + &dis, &x->pred_sse[ref]); + + if (scaled_ref_frame) { + int i; + for (i = 0; i < MAX_MB_PLANE; i++) + xd->plane[i].pre[0] = backup_yv12[i]; + } } // TODO(jingning) placeholder for inter-frame non-RD mode decision. @@ -162,6 +203,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, // initialize mode decisions *returnrate = INT_MAX; + *returndistortion = INT64_MAX; vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); mbmi->sb_type = bsize; mbmi->ref_frame[0] = NONE; @@ -201,9 +243,6 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, int64_t dist; if (this_mode == NEWMV) { - if (this_rd < 300) - continue; - x->mode_sad[ref_frame][INTER_OFFSET(NEWMV)] = full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, &frame_mv[NEWMV][ref_frame], &rate_mv); @@ -227,6 +266,13 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } // TODO(jingning) sub-pixel motion search, if NEWMV is chosen + if (mbmi->mode == NEWMV) { + ref_frame = mbmi->ref_frame[0]; + sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, + &frame_mv[NEWMV][ref_frame]); + mbmi->mv[0].as_int = frame_mv[NEWMV][ref_frame].as_int; + xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; + } // TODO(jingning) intra prediction search, if the best SAD is above a certain // threshold. |