diff options
author | Paul Wilkins <paulwilkins@google.com> | 2012-12-05 09:14:46 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2012-12-05 09:14:46 -0800 |
commit | 74050401423d1925dd8aef299e9af5806b070c63 (patch) | |
tree | 38aacab377dd7d57ec2bae501c53fa75febe1354 /vp9/common | |
parent | d345e65d3cae3efdb838560d3a2f259916126333 (diff) | |
parent | 4cc657ec6e17ab975ebba43034d6de5aa8e413ee (diff) | |
download | libvpx-74050401423d1925dd8aef299e9af5806b070c63.tar libvpx-74050401423d1925dd8aef299e9af5806b070c63.tar.gz libvpx-74050401423d1925dd8aef299e9af5806b070c63.tar.bz2 libvpx-74050401423d1925dd8aef299e9af5806b070c63.zip |
Merge "Change to MV reference search." into experimental
Diffstat (limited to 'vp9/common')
-rw-r--r-- | vp9/common/vp9_blockd.h | 3 | ||||
-rw-r--r-- | vp9/common/vp9_findnearmv.c | 11 | ||||
-rw-r--r-- | vp9/common/vp9_mvref_common.c | 49 |
3 files changed, 32 insertions, 31 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index 17e847462..27ef22fff 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -45,6 +45,7 @@ void vpx_log(const char *format, ...); #define SEGMENT_DELTADATA 0 #define SEGMENT_ABSDATA 1 #define MAX_MV_REFS 9 +#define MAX_MV_REF_CANDIDATES 4 typedef struct { int r, c; @@ -238,7 +239,7 @@ typedef struct { MV_REFERENCE_FRAME ref_frame, second_ref_frame; TX_SIZE txfm_size; int_mv mv[2]; // for each reference frame used - int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REFS]; + int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; int_mv best_mv, best_second_mv; #if CONFIG_NEW_MVREF int best_index, best_second_index; diff --git a/vp9/common/vp9_findnearmv.c b/vp9/common/vp9_findnearmv.c index 02c28fbde..4fd468973 100644 --- a/vp9/common/vp9_findnearmv.c +++ b/vp9/common/vp9_findnearmv.c @@ -139,8 +139,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, #if CONFIG_SUBPELREFMV unsigned int sse; #endif - unsigned int ref_scores[MAX_MV_REFS] = {0}; - int_mv sorted_mvs[MAX_MV_REFS]; + unsigned int ref_scores[MAX_MV_REF_CANDIDATES] = {0}; + int_mv sorted_mvs[MAX_MV_REF_CANDIDATES]; int zero_seen = FALSE; // Default all to 0,0 if nothing else available @@ -159,9 +159,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, left_ref = ref_y_buffer - 3; #endif - //for(i = 0; i < MAX_MV_REFS; ++i) { - // Limit search to the predicted best 4 - for(i = 0; i < 4; ++i) { + // Limit search to the predicted best few candidates + for(i = 0; i < MAX_MV_REF_CANDIDATES; ++i) { int_mv this_mv; int offset = 0; int row_offset, col_offset; @@ -268,7 +267,7 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, } // Make sure all the candidates are properly clamped etc - for (i = 0; i < 4; ++i) { + for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) { lower_mv_precision(&sorted_mvs[i], xd->allow_high_precision_mv); clamp_mv2(&sorted_mvs[i], xd); } diff --git a/vp9/common/vp9_mvref_common.c b/vp9/common/vp9_mvref_common.c index bf60630e3..bbed0554f 100644 --- a/vp9/common/vp9_mvref_common.c +++ b/vp9/common/vp9_mvref_common.c @@ -170,14 +170,20 @@ static void addmv_and_shuffle( int weight ) { - int i = *index; + int i; + int insert_point; int duplicate_found = FALSE; - // Check for duplicates. If there is one increment its score. - // Duplicate defined as being the same full pel vector with rounding. + // Check for duplicates. If there is one increase its score. + // We only compare vs the current top candidates. + insert_point = (*index < (MAX_MV_REF_CANDIDATES - 1)) + ? *index : (MAX_MV_REF_CANDIDATES - 1); + + i = insert_point; + if (*index > i) + i++; while (i > 0) { i--; - if (candidate_mv.as_int == mv_list[i].as_int) { duplicate_found = TRUE; mv_scores[i] += weight; @@ -185,11 +191,13 @@ static void addmv_and_shuffle( } } - // If no duplicate was found add the new vector and give it a weight - if (!duplicate_found) { - mv_list[*index].as_int = candidate_mv.as_int; - mv_scores[*index] = weight; - i = *index; + // If no duplicate and the new candidate is good enough then add it. + if (!duplicate_found ) { + if (weight > mv_scores[insert_point]) { + mv_list[insert_point].as_int = candidate_mv.as_int; + mv_scores[insert_point] = weight; + i = insert_point; + } (*index)++; } @@ -224,12 +232,12 @@ void vp9_find_mv_refs( int i; MODE_INFO *candidate_mi; MB_MODE_INFO * mbmi = &xd->mode_info_context->mbmi; - int_mv candidate_mvs[MAX_MV_REFS]; + int_mv candidate_mvs[MAX_MV_REF_CANDIDATES]; int_mv c_refmv; - MV_REFERENCE_FRAME c_ref_frame; int_mv c2_refmv; + MV_REFERENCE_FRAME c_ref_frame; MV_REFERENCE_FRAME c2_ref_frame; - int candidate_scores[MAX_MV_REFS]; + int candidate_scores[MAX_MV_REF_CANDIDATES]; int index = 0; int split_count = 0; int ref_weight = 0; @@ -238,8 +246,8 @@ void vp9_find_mv_refs( 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(mv_ref_list, 0, sizeof(int_mv) * MAX_MV_REF_CANDIDATES); + vpx_memset(candidate_mvs, 0, sizeof(int_mv) * MAX_MV_REF_CANDIDATES); vpx_memset(candidate_scores, 0, sizeof(candidate_scores)); #if CONFIG_SUPERBLOCKS @@ -349,11 +357,6 @@ void vp9_find_mv_refs( } } - // Make sure we are able to add 0,0 - if (index > (MAX_MV_REFS - 1)) { - index = (MAX_MV_REFS - 1); - } - // Define inter mode coding context. // 0,0 was best if (candidate_mvs[0].as_int == 0) { @@ -383,14 +386,12 @@ void vp9_find_mv_refs( } // 0,0 is always a valid reference. - for (i = 0; i < index; ++i) { + for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) { if (candidate_mvs[i].as_int == 0) break; } - if (i == index) { - c_refmv.as_int = 0; - addmv_and_shuffle(candidate_mvs, candidate_scores, - &index, c_refmv, candidate_scores[3]+1 ); + if (i == MAX_MV_REF_CANDIDATES) { + candidate_mvs[MAX_MV_REF_CANDIDATES-1].as_int = 0; } // Copy over the candidate list. |