diff options
author | Yunqing Wang <yunqingwang@google.com> | 2011-07-07 11:21:41 -0400 |
---|---|---|
committer | Yunqing Wang <yunqingwang@google.com> | 2011-07-08 11:34:28 -0400 |
commit | 40991faeae8ded446de7ca2d9efeae54644b294b (patch) | |
tree | d1d39100bc95541dd5fccd7dae9a0451995c81c8 /vp8/encoder/rdopt.c | |
parent | b4f70084cc64b8304005a385cb0a670431aced20 (diff) | |
download | libvpx-40991faeae8ded446de7ca2d9efeae54644b294b.tar libvpx-40991faeae8ded446de7ca2d9efeae54644b294b.tar.gz libvpx-40991faeae8ded446de7ca2d9efeae54644b294b.tar.bz2 libvpx-40991faeae8ded446de7ca2d9efeae54644b294b.zip |
Adjust full-pixel clamping and motion vector limit calculation
Do mvp clamping in full-pixel precision instead of 1/8-pixel
precision to avoid error caused by right shifting operation.
Also, further fixed the motion vector limit calculation in change:
b7480454706a6b15bf091e659cd6227ab373c1a6
Change-Id: Ied88a4f7ddfb0476eb9f7afc6ceeddbf209fffd7
Diffstat (limited to 'vp8/encoder/rdopt.c')
-rw-r--r-- | vp8/encoder/rdopt.c | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 355542e47..451a81845 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -1133,6 +1133,10 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, { int sadpb = x->sadperbit4; + int_mv mvp_full; + + mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3; + mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3; // find first label n = vp8_mbsplit_offset[segmentation][i]; @@ -1141,7 +1145,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, e = &x->e_mbd.block[n]; { - bestsme = cpi->diamond_search_sad(x, c, e, &bsi->mvp, + bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full, &mode_mv[NEW4X4], step_param, sadpb, &num00, v_fn_ptr, x->mvcost, bsi->ref_mv); @@ -1158,7 +1162,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, else { thissme = cpi->diamond_search_sad(x, c, e, - &bsi->mvp, &temp_mv, + &mvp_full, &temp_mv, step_param + n, sadpb, &num00, v_fn_ptr, x->mvcost, bsi->ref_mv); @@ -1177,12 +1181,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, // Should we do a full search (best quality only) if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) { - int_mv full_mvp; - - full_mvp.as_mv.row = bsi->mvp.as_mv.row >>3; - full_mvp.as_mv.col = bsi->mvp.as_mv.col >>3; - - thissme = cpi->full_search_sad(x, c, e, &full_mvp, + thissme = cpi->full_search_sad(x, c, e, &mvp_full, sadpb, 16, v_fn_ptr, x->mvcost, bsi->ref_mv); @@ -1330,14 +1329,10 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, if (bsi.segment_rd < best_rd) { - int col_min = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) - MAX_FULL_PEL_VAL) - :((best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL); - int col_max = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) + MAX_FULL_PEL_VAL) - :((best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL); - int row_min = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) - MAX_FULL_PEL_VAL) - :((best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL); - int row_max = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) + MAX_FULL_PEL_VAL) - :((best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL); + int col_min = (best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.col & 7)?1:0); + int row_min = (best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.row & 7)?1:0); + int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL; + int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL; int tmp_col_min = x->mv_col_min; int tmp_col_max = x->mv_col_max; @@ -1879,13 +1874,6 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]); - - /* adjust mvp to make sure it is within MV range */ - vp8_clamp_mv(&mvp, - best_ref_mv.as_mv.col - (MAX_FULL_PEL_VAL<<3), - best_ref_mv.as_mv.col + (MAX_FULL_PEL_VAL<<3), - best_ref_mv.as_mv.row - (MAX_FULL_PEL_VAL<<3), - best_ref_mv.as_mv.row + (MAX_FULL_PEL_VAL<<3)); } // Check to see if the testing frequency for this mode is at its max @@ -2016,21 +2004,24 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int we will do a final 1-away diamond refining search */ int sadpb = x->sadperbit16; + int_mv mvp_full; - int col_min = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) - MAX_FULL_PEL_VAL) - :((best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL); - int col_max = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) + MAX_FULL_PEL_VAL) - :((best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL); - int row_min = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) - MAX_FULL_PEL_VAL) - :((best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL); - int row_max = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) + MAX_FULL_PEL_VAL) - :((best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL); + int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0); + int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0); + int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; + int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; int tmp_col_min = x->mv_col_min; int tmp_col_max = x->mv_col_max; int tmp_row_min = x->mv_row_min; int tmp_row_max = x->mv_row_max; + mvp_full.as_mv.col = mvp.as_mv.col>>3; + mvp_full.as_mv.row = mvp.as_mv.row>>3; + + /* adjust mvp to make sure it is within MV range */ + vp8_clamp_mv(&mvp_full, col_min, col_max, row_min, row_max); + // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search. if (x->mv_col_min < col_min ) x->mv_col_min = col_min; @@ -2047,7 +2038,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int // Initial step/diamond search { - bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv, + bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv, step_param, sadpb, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); @@ -2072,7 +2063,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int num00--; else { - thissme = cpi->diamond_search_sad(x, b, d, &mvp, + thissme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv, step_param + n, sadpb, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); |