Commit 74050401 authored by Paul Wilkins's avatar Paul Wilkins Committed by Gerrit Code Review
Browse files

Merge "Change to MV reference search." into experimental

parents d345e65d 4cc657ec
...@@ -45,6 +45,7 @@ void vpx_log(const char *format, ...); ...@@ -45,6 +45,7 @@ void vpx_log(const char *format, ...);
#define SEGMENT_DELTADATA 0 #define SEGMENT_DELTADATA 0
#define SEGMENT_ABSDATA 1 #define SEGMENT_ABSDATA 1
#define MAX_MV_REFS 9 #define MAX_MV_REFS 9
#define MAX_MV_REF_CANDIDATES 4
typedef struct { typedef struct {
int r, c; int r, c;
...@@ -238,7 +239,7 @@ typedef struct { ...@@ -238,7 +239,7 @@ typedef struct {
MV_REFERENCE_FRAME ref_frame, second_ref_frame; MV_REFERENCE_FRAME ref_frame, second_ref_frame;
TX_SIZE txfm_size; TX_SIZE txfm_size;
int_mv mv[2]; // for each reference frame used 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; int_mv best_mv, best_second_mv;
#if CONFIG_NEW_MVREF #if CONFIG_NEW_MVREF
int best_index, best_second_index; int best_index, best_second_index;
......
...@@ -139,8 +139,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, ...@@ -139,8 +139,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
#if CONFIG_SUBPELREFMV #if CONFIG_SUBPELREFMV
unsigned int sse; unsigned int sse;
#endif #endif
unsigned int ref_scores[MAX_MV_REFS] = {0}; unsigned int ref_scores[MAX_MV_REF_CANDIDATES] = {0};
int_mv sorted_mvs[MAX_MV_REFS]; int_mv sorted_mvs[MAX_MV_REF_CANDIDATES];
int zero_seen = FALSE; int zero_seen = FALSE;
// Default all to 0,0 if nothing else available // Default all to 0,0 if nothing else available
...@@ -159,9 +159,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, ...@@ -159,9 +159,8 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
left_ref = ref_y_buffer - 3; left_ref = ref_y_buffer - 3;
#endif #endif
//for(i = 0; i < MAX_MV_REFS; ++i) { // Limit search to the predicted best few candidates
// Limit search to the predicted best 4 for(i = 0; i < MAX_MV_REF_CANDIDATES; ++i) {
for(i = 0; i < 4; ++i) {
int_mv this_mv; int_mv this_mv;
int offset = 0; int offset = 0;
int row_offset, col_offset; int row_offset, col_offset;
...@@ -268,7 +267,7 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd, ...@@ -268,7 +267,7 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
} }
// Make sure all the candidates are properly clamped etc // 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); lower_mv_precision(&sorted_mvs[i], xd->allow_high_precision_mv);
clamp_mv2(&sorted_mvs[i], xd); clamp_mv2(&sorted_mvs[i], xd);
} }
......
...@@ -170,14 +170,20 @@ static void addmv_and_shuffle( ...@@ -170,14 +170,20 @@ static void addmv_and_shuffle(
int weight int weight
) { ) {
int i = *index; int i;
int insert_point;
int duplicate_found = FALSE; int duplicate_found = FALSE;
// Check for duplicates. If there is one increment its score. // Check for duplicates. If there is one increase its score.
// Duplicate defined as being the same full pel vector with rounding. // 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) { while (i > 0) {
i--; i--;
if (candidate_mv.as_int == mv_list[i].as_int) { if (candidate_mv.as_int == mv_list[i].as_int) {
duplicate_found = TRUE; duplicate_found = TRUE;
mv_scores[i] += weight; mv_scores[i] += weight;
...@@ -185,11 +191,13 @@ static void addmv_and_shuffle( ...@@ -185,11 +191,13 @@ static void addmv_and_shuffle(
} }
} }
// If no duplicate was found add the new vector and give it a weight // If no duplicate and the new candidate is good enough then add it.
if (!duplicate_found) { if (!duplicate_found ) {
mv_list[*index].as_int = candidate_mv.as_int; if (weight > mv_scores[insert_point]) {
mv_scores[*index] = weight; mv_list[insert_point].as_int = candidate_mv.as_int;
i = *index; mv_scores[insert_point] = weight;
i = insert_point;
}
(*index)++; (*index)++;
} }
...@@ -224,12 +232,12 @@ void vp9_find_mv_refs( ...@@ -224,12 +232,12 @@ void vp9_find_mv_refs(
int i; int i;
MODE_INFO *candidate_mi; MODE_INFO *candidate_mi;
MB_MODE_INFO * mbmi = &xd->mode_info_context->mbmi; 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; int_mv c_refmv;
MV_REFERENCE_FRAME c_ref_frame;
int_mv c2_refmv; int_mv c2_refmv;
MV_REFERENCE_FRAME c_ref_frame;
MV_REFERENCE_FRAME c2_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 index = 0;
int split_count = 0; int split_count = 0;
int ref_weight = 0; int ref_weight = 0;
...@@ -238,8 +246,8 @@ void vp9_find_mv_refs( ...@@ -238,8 +246,8 @@ void vp9_find_mv_refs(
int *ref_distance_weight; int *ref_distance_weight;
// Blank the reference vector lists and other local structures. // Blank the reference vector lists and other local structures.
vpx_memset(mv_ref_list, 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_REFS); vpx_memset(candidate_mvs, 0, sizeof(int_mv) * MAX_MV_REF_CANDIDATES);
vpx_memset(candidate_scores, 0, sizeof(candidate_scores)); vpx_memset(candidate_scores, 0, sizeof(candidate_scores));
#if CONFIG_SUPERBLOCKS #if CONFIG_SUPERBLOCKS
...@@ -349,11 +357,6 @@ void vp9_find_mv_refs( ...@@ -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. // Define inter mode coding context.
// 0,0 was best // 0,0 was best
if (candidate_mvs[0].as_int == 0) { if (candidate_mvs[0].as_int == 0) {
...@@ -383,14 +386,12 @@ void vp9_find_mv_refs( ...@@ -383,14 +386,12 @@ void vp9_find_mv_refs(
} }
// 0,0 is always a valid reference. // 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) if (candidate_mvs[i].as_int == 0)
break; break;
} }
if (i == index) { if (i == MAX_MV_REF_CANDIDATES) {
c_refmv.as_int = 0; candidate_mvs[MAX_MV_REF_CANDIDATES-1].as_int = 0;
addmv_and_shuffle(candidate_mvs, candidate_scores,
&index, c_refmv, candidate_scores[3]+1 );
} }
// Copy over the candidate list. // Copy over the candidate list.
......
...@@ -70,7 +70,7 @@ typedef struct { ...@@ -70,7 +70,7 @@ typedef struct {
PARTITION_INFO partition_info; PARTITION_INFO partition_info;
int_mv best_ref_mv; int_mv best_ref_mv;
int_mv second_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 rate;
int distortion; int distortion;
int64_t intra_error; int64_t intra_error;
......
...@@ -395,8 +395,7 @@ static unsigned int pick_best_mv_ref(MACROBLOCK *x, ...@@ -395,8 +395,7 @@ static unsigned int pick_best_mv_ref(MACROBLOCK *x,
vp9_mv_bit_cost(&target_mv, &mv_ref_list[0], x->nmvjointcost, vp9_mv_bit_cost(&target_mv, &mv_ref_list[0], x->nmvjointcost,
x->mvcost, 96, xd->allow_high_precision_mv); x->mvcost, 96, xd->allow_high_precision_mv);
// Use 4 for now : for (i = 1; i < MAX_MV_REFS; ++i ) { for (i = 1; i < MAX_MV_REF_CANDIDATES; ++i) {
for (i = 1; i < 4; ++i) {
// If we see a 0,0 reference vector for a second time we have reached // If we see a 0,0 reference vector for a second time we have reached
// the end of the list of valid candidate vectors. // the end of the list of valid candidate vectors.
if (!mv_ref_list[i].as_int) { if (!mv_ref_list[i].as_int) {
......
...@@ -3821,7 +3821,7 @@ static void encode_frame_to_data_rate ...@@ -3821,7 +3821,7 @@ static void encode_frame_to_data_rate
{ {
FILE *f = fopen("mv_ref_dist.stt", "a"); FILE *f = fopen("mv_ref_dist.stt", "a");
unsigned int i; 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, "%10d", cpi->best_ref_index_counts[0][i]);
} }
fprintf(f, "\n" ); fprintf(f, "\n" );
......
...@@ -790,7 +790,7 @@ typedef struct VP9_COMP { ...@@ -790,7 +790,7 @@ typedef struct VP9_COMP {
unsigned int switchable_interp_count[VP9_SWITCHABLE_FILTERS + 1] unsigned int switchable_interp_count[VP9_SWITCHABLE_FILTERS + 1]
[VP9_SWITCHABLE_FILTERS]; [VP9_SWITCHABLE_FILTERS];
#if CONFIG_NEW_MVREF #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 #endif
} VP9_COMP; } VP9_COMP;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment