ref: 74050401423d1925dd8aef299e9af5806b070c63
parent: d345e65d3cae3efdb838560d3a2f259916126333
parent: 4cc657ec6e17ab975ebba43034d6de5aa8e413ee
author: Paul Wilkins <paulwilkins@google.com>
date: Wed Dec 5 04:14:46 EST 2012
Merge "Change to MV reference search." into experimental
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -45,6 +45,7 @@
#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 @@
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;
--- a/vp9/common/vp9_findnearmv.c
+++ b/vp9/common/vp9_findnearmv.c
@@ -139,8 +139,8 @@
#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 @@
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 @@
}
// 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);
}
--- a/vp9/common/vp9_mvref_common.c
+++ b/vp9/common/vp9_mvref_common.c
@@ -170,14 +170,20 @@
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 @@
}
}
- // 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 @@
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 @@
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 @@
}
}
- // 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 @@
}
// 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.
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -70,7 +70,7 @@
PARTITION_INFO partition_info;
int_mv best_ref_mv;
int_mv second_best_ref_mv;
- int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REFS];
+ int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
int rate;
int distortion;
int64_t intra_error;
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -395,8 +395,7 @@
vp9_mv_bit_cost(&target_mv, &mv_ref_list[0], x->nmvjointcost,
x->mvcost, 96, xd->allow_high_precision_mv);
- // Use 4 for now : for (i = 1; i < MAX_MV_REFS; ++i ) {
- for (i = 1; i < 4; ++i) {
+ for (i = 1; i < MAX_MV_REF_CANDIDATES; ++i) {
// If we see a 0,0 reference vector for a second time we have reached
// the end of the list of valid candidate vectors.
if (!mv_ref_list[i].as_int) {
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -3821,7 +3821,7 @@
{
FILE *f = fopen("mv_ref_dist.stt", "a");
unsigned int i;
- for (i = 0; i < MAX_MV_REFS; ++i) {
+ for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) {
fprintf(f, "%10d", cpi->best_ref_index_counts[0][i]);
}
fprintf(f, "\n" );
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -790,7 +790,7 @@
unsigned int switchable_interp_count[VP9_SWITCHABLE_FILTERS + 1]
[VP9_SWITCHABLE_FILTERS];
#if CONFIG_NEW_MVREF
- unsigned int best_ref_index_counts[MAX_REF_FRAMES][MAX_MV_REFS];
+ unsigned int best_ref_index_counts[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
#endif
} VP9_COMP;