From 81043e8d625efbafe0668b6b04f3dc812b65c4a4 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Tue, 5 Feb 2013 10:28:26 +0000 Subject: [PATCH] Change definition of NearestMV. This commit makes the NearestMV match the chosen best reference MV. It can be a 0,0 or non zero vector which means the the compound nearest mv mode can combine a 0,0 and a non zero vector. Change-Id: I2213d09996ae2916e53e6458d7d110350dcffd7a --- vp9/common/vp9_findnearmv.c | 23 +++++++++-------------- vp9/encoder/vp9_rdopt.c | 7 +------ 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/vp9/common/vp9_findnearmv.c b/vp9/common/vp9_findnearmv.c index 88f2ea9c1..9585611dd 100644 --- a/vp9/common/vp9_findnearmv.c +++ b/vp9/common/vp9_findnearmv.c @@ -279,21 +279,16 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, clamp_mv2(&sorted_mvs[i], xd); } - // Provided that there are non zero vectors available there will not - // be more than one 0,0 entry in the sorted list. - // The best ref mv is always set to the first entry (which gave the best - // results. The nearest is set to the first non zero vector if available and - // near to the second non zero vector if available. - // We do not use 0,0 as a nearest or near as 0,0 has its own mode. - if ( sorted_mvs[0].as_int ) { - nearest->as_int = sorted_mvs[0].as_int; - if ( sorted_mvs[1].as_int ) - near->as_int = sorted_mvs[1].as_int; - else - near->as_int = sorted_mvs[2].as_int; + // Nearest may be a 0,0 or non zero vector and now matches the chosen + // "best reference". This has advantages when it is used as part of a + // compound predictor as it means a non zero vector can be paired using + // this mode with a 0 vector. The Near vector is still forced to be a + // non zero candidate if one is avaialble. + nearest->as_int = sorted_mvs[0].as_int; + if ( sorted_mvs[1].as_int ) { + near->as_int = sorted_mvs[1].as_int; } else { - nearest->as_int = sorted_mvs[1].as_int; - near->as_int = sorted_mvs[2].as_int; + near->as_int = sorted_mvs[2].as_int; } // Copy back the re-ordered mv list diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 2e9bbcfc1..110e07057 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -3301,13 +3301,8 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 96, xd->allow_high_precision_mv); } break; - case NEARESTMV: case NEARMV: - // Do not bother proceeding if the vector (from newmv, nearest or - // near) is 0,0 as this should then be coded using the zeromv mode. - for (i = 0; i < num_refs; ++i) - if (frame_mv[this_mode][refs[i]].as_int == 0) - return INT64_MAX; + case NEARESTMV: case ZEROMV: default: break;