From fd49e9678e61f6660c9d59fb84b1a7bcc74cfcfe Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Tue, 25 Feb 2014 13:50:32 -0800 Subject: Use dedicated variables to store the best mode Use a set of dedicated variables to buffer the current best mode in non-RD mode decision. This allows to use mode_info for more complicated test in the non-RD process. Change-Id: I6024c9feb0662afd3eb29f7017f7b5a5446f303f --- vp9/encoder/vp9_pickmode.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 383d92751..7e1bcd45a 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -184,8 +184,8 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd = &x->e_mbd; MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]); - MB_PREDICTION_MODE this_mode; - MV_REFERENCE_FRAME ref_frame; + MB_PREDICTION_MODE this_mode, best_mode = ZEROMV; + MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; struct buf_2d yv12_mb[4][MAX_MB_PLANE]; static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, @@ -240,6 +240,8 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); + mbmi->ref_frame[0] = ref_frame; + for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { int rate = cost[INTER_OFFSET(this_mode)]; int64_t dist; @@ -258,15 +260,17 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, if (this_rd < best_rd) { best_rd = this_rd; - mbmi->mode = this_mode; - mbmi->ref_frame[0] = ref_frame; - mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; - xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; - mbmi->uv_mode = this_mode; + best_mode = this_mode; + best_ref_frame = ref_frame; } } } + mbmi->mode = best_mode; + mbmi->ref_frame[0] = best_ref_frame; + mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; + xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; + // Perform intra prediction search, if the best SAD is above a certain // threshold. if (best_rd > inter_mode_thresh) { -- cgit v1.2.3