diff options
author | Yaowu Xu <yaowu@google.com> | 2012-11-16 06:31:53 -0800 |
---|---|---|
committer | Yaowu Xu <yaowu@google.com> | 2012-11-16 07:01:13 -0800 |
commit | 415e6bff4d67cb8ad842bfb4ff57edb5538fd818 (patch) | |
tree | d995febd6b904f9bfd36c3b582e4cfce7acd937b | |
parent | 61416aedc269eceb1c85e553cd6da9a9884b9d7d (diff) | |
download | libvpx-415e6bff4d67cb8ad842bfb4ff57edb5538fd818.tar libvpx-415e6bff4d67cb8ad842bfb4ff57edb5538fd818.tar.gz libvpx-415e6bff4d67cb8ad842bfb4ff57edb5538fd818.tar.bz2 libvpx-415e6bff4d67cb8ad842bfb4ff57edb5538fd818.zip |
changed mv candidate search for superblocks
added additional motion vectors at close neighborhood of a superblock
to the list of candiate motion vectors, and removed a couple that are
further away.
The change helped std-hd set about .8% (all metrics) and smaller gain
for derf set.
Change-Id: Iaa69b98614db43420ed3fd4738d0ca5587b90045
-rw-r--r-- | vp9/common/mvref_common.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/vp9/common/mvref_common.c b/vp9/common/mvref_common.c index a412a6c8a..654b4903f 100644 --- a/vp9/common/mvref_common.c +++ b/vp9/common/mvref_common.c @@ -11,11 +11,20 @@ #include "mvref_common.h" #define MVREF_NEIGHBOURS 8 -static int mv_ref_search[MVREF_NEIGHBOURS][2] = - { {0,-1},{-1,0},{-1,-1},{0,-2},{-2,0},{-1,-2},{-2,-1},{-2,-2} }; -static int ref_distance_weight[MVREF_NEIGHBOURS] = - { 3,3,2,1,1,1,1,1 }; - +static int mb_mv_ref_search[MVREF_NEIGHBOURS][2] = { + {0, -1}, {-1, 0}, {-1, -1}, {0, -2}, + {-2, 0}, {-1, -2}, {-2, -1}, {-2, -2} +}; +static int mb_ref_distance_weight[MVREF_NEIGHBOURS] = + { 3, 3, 2, 1, 1, 1, 1, 1 }; +#if CONFIG_SUPERBLOCKS +static int sb_mv_ref_search[MVREF_NEIGHBOURS][2] = { + {0, -1}, {-1, 0}, {1, -1}, {-1, 1}, + {-1, -1}, {0, -2}, {-2, 0}, {-1, -2} +}; +static int sb_ref_distance_weight[MVREF_NEIGHBOURS] = + { 3, 3, 2, 2, 2, 1, 1, 1 }; +#endif // clamp_mv #define MV_BORDER (16 << 3) // Allow 16 pels in 1/8th pel units static void clamp_mv(const MACROBLOCKD *xd, int_mv *mv) { @@ -224,12 +233,26 @@ void vp9_find_mv_refs( int index = 0; int ref_weight = 0; int valid_mv_ref; + int (*mv_ref_search)[2]; + int *ref_distance_weight; // Blank the reference vector lists and other local structures. vpx_memset(mv_ref_list, 0, sizeof(int_mv) * MAX_MV_REFS); vpx_memset(candidate_mvs, 0, sizeof(int_mv) * MAX_MV_REFS); vpx_memset(candidate_scores, 0, sizeof(candidate_scores)); +#if CONFIG_SUPERBLOCKS + if (mbmi->encoded_as_sb) { + mv_ref_search = sb_mv_ref_search; + ref_distance_weight = sb_ref_distance_weight; + } else { + mv_ref_search = mb_mv_ref_search; + ref_distance_weight = mb_ref_distance_weight; + } +#else + mv_ref_search = mb_mv_ref_search; + ref_distance_weight = mb_ref_distance_weight; +#endif // Populate a list with candidate reference vectors from the // spatial neighbours. for (i = 0; i < 2; ++i) { |