Store inter coding bit costs to CU structure

To be used for calculating better coding cost later
This commit is contained in:
Marko Viitanen 2014-03-11 11:35:02 +02:00
parent d2d877933a
commit bdf8166e5c

View file

@ -118,7 +118,7 @@ static uint32_t get_mvd_coding_cost(vector2d *mvd)
static int calc_mvd_cost(int x, int y, const vector2d *pred, static int calc_mvd_cost(int x, int y, const vector2d *pred,
int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3], int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3],
int16_t num_cand,int32_t ref_idx) int16_t num_cand,int32_t ref_idx, uint32_t *bitcost)
{ {
int cost = 0; int cost = 0;
@ -159,7 +159,7 @@ static int calc_mvd_cost(int x, int y, const vector2d *pred,
} }
temp_bitcost += cur_mv_cand ? cand2_cost : cand1_cost; temp_bitcost += cur_mv_cand ? cand2_cost : cand1_cost;
} }
*bitcost = temp_bitcost;
return temp_bitcost*(int32_t)(g_cur_lambda_cost+0.5); return temp_bitcost*(int32_t)(g_cur_lambda_cost+0.5);
} }
@ -188,11 +188,12 @@ static unsigned hexagon_search(unsigned depth,
const picture *pic, const picture *ref, const picture *pic, const picture *ref,
const vector2d *orig, vector2d *mv_in_out, const vector2d *orig, vector2d *mv_in_out,
int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3], int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3],
int16_t num_cand, int32_t ref_idx) int16_t num_cand, int32_t ref_idx, uint32_t *bitcost_out)
{ {
vector2d mv = { mv_in_out->x >> 2, mv_in_out->y >> 2 }; vector2d mv = { mv_in_out->x >> 2, mv_in_out->y >> 2 };
int block_width = CU_WIDTH_FROM_DEPTH(depth); int block_width = CU_WIDTH_FROM_DEPTH(depth);
unsigned best_cost = UINT32_MAX; unsigned best_cost = UINT32_MAX;
uint32_t best_bitcost = 0, bitcost;
unsigned i; unsigned i;
unsigned best_index = 0; // Index of large_hexbs or finally small_hexbs. unsigned best_index = 0; // Index of large_hexbs or finally small_hexbs.
@ -203,11 +204,12 @@ static unsigned hexagon_search(unsigned depth,
unsigned cost = calc_sad(pic, ref, orig->x, orig->y, unsigned cost = calc_sad(pic, ref, orig->x, orig->y,
orig->x + mv.x + pattern->x, orig->y + mv.y + pattern->y, orig->x + mv.x + pattern->x, orig->y + mv.y + pattern->y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(mv.x + pattern->x, mv.y + pattern->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(mv.x + pattern->x, mv.y + pattern->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
if (cost < best_cost) { if (cost < best_cost) {
best_cost = cost; best_cost = cost;
best_index = i; best_index = i;
best_bitcost = bitcost;
} }
} }
@ -216,12 +218,13 @@ static unsigned hexagon_search(unsigned depth,
unsigned cost = calc_sad(pic, ref, orig->x, orig->y, unsigned cost = calc_sad(pic, ref, orig->x, orig->y,
orig->x, orig->y, orig->x, orig->y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(0, 0, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(0, 0, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
// If the 0,0 is better, redo the hexagon around that point. // If the 0,0 is better, redo the hexagon around that point.
if (cost < best_cost) { if (cost < best_cost) {
best_cost = cost; best_cost = cost;
best_index = 0; best_bitcost = bitcost;
best_index = 0;
mv.x = 0; mv.x = 0;
mv.y = 0; mv.y = 0;
@ -231,11 +234,12 @@ static unsigned hexagon_search(unsigned depth,
orig->x + pattern->x, orig->x + pattern->x,
orig->y + pattern->y, orig->y + pattern->y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(pattern->x, pattern->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(pattern->x, pattern->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
if (cost < best_cost) { if (cost < best_cost) {
best_cost = cost; best_cost = cost;
best_index = i; best_index = i;
best_bitcost = bitcost;
} }
} }
} }
@ -265,11 +269,12 @@ static unsigned hexagon_search(unsigned depth,
orig->x + mv.x + offset->x, orig->x + mv.x + offset->x,
orig->y + mv.y + offset->y, orig->y + mv.y + offset->y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(mv.x + offset->x, mv.y + offset->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(mv.x + offset->x, mv.y + offset->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
if (cost < best_cost) { if (cost < best_cost) {
best_cost = cost; best_cost = cost;
best_index = start + i; best_index = start + i;
best_bitcost = bitcost;
} }
++offset; ++offset;
} }
@ -287,11 +292,12 @@ static unsigned hexagon_search(unsigned depth,
orig->x + mv.x + offset->x, orig->x + mv.x + offset->x,
orig->y + mv.y + offset->y, orig->y + mv.y + offset->y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(mv.x + offset->x, mv.y + offset->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(mv.x + offset->x, mv.y + offset->y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
if (cost > 0 && cost < best_cost) { if (cost > 0 && cost < best_cost) {
best_cost = cost; best_cost = cost;
best_index = i; best_index = i;
best_bitcost = bitcost;
} }
} }
@ -303,6 +309,8 @@ static unsigned hexagon_search(unsigned depth,
mv_in_out->x = mv.x << 2; mv_in_out->x = mv.x << 2;
mv_in_out->y = mv.y << 2; mv_in_out->y = mv.y << 2;
*bitcost_out = best_bitcost;
return best_cost; return best_cost;
} }
@ -312,12 +320,13 @@ static unsigned search_mv_full(unsigned depth,
const picture *pic, const picture *ref, const picture *pic, const picture *ref,
const vector2d *orig, vector2d *mv_in_out, const vector2d *orig, vector2d *mv_in_out,
int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3], int16_t mv_cand[2][2], int16_t merge_cand[MRG_MAX_NUM_CANDS][3],
int16_t num_cand, int32_t ref_idx) int16_t num_cand, int32_t ref_idx, uint32_t *bitcost_out)
{ {
vector2d mv = { mv_in_out->x >> 2, mv_in_out->y >> 2 }; vector2d mv = { mv_in_out->x >> 2, mv_in_out->y >> 2 };
int block_width = CU_WIDTH_FROM_DEPTH(depth); int block_width = CU_WIDTH_FROM_DEPTH(depth);
unsigned best_cost = UINT32_MAX; unsigned best_cost = UINT32_MAX;
int x, y; int x, y;
uint32_t best_bitcost = 0, bitcost;
vector2d min_mv, max_mv; vector2d min_mv, max_mv;
/*if (abs(mv.x) > SEARCH_MV_FULL_RADIUS || abs(mv.y) > SEARCH_MV_FULL_RADIUS) { /*if (abs(mv.x) > SEARCH_MV_FULL_RADIUS || abs(mv.y) > SEARCH_MV_FULL_RADIUS) {
@ -339,9 +348,10 @@ static unsigned search_mv_full(unsigned depth,
orig->x + x, orig->x + x,
orig->y + y, orig->y + y,
block_width, block_width); block_width, block_width);
cost += calc_mvd_cost(x, y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx); cost += calc_mvd_cost(x, y, mv_in_out,mv_cand,merge_cand,num_cand,ref_idx, &bitcost);
if (cost < best_cost) { if (cost < best_cost) {
best_cost = cost; best_cost = cost;
best_bitcost = bitcost;
mv.x = x; mv.x = x;
mv.y = y; mv.y = y;
} }
@ -351,6 +361,8 @@ static unsigned search_mv_full(unsigned depth,
mv_in_out->x = mv.x << 2; mv_in_out->x = mv.x << 2;
mv_in_out->y = mv.y << 2; mv_in_out->y = mv.y << 2;
*bitcost_out = best_bitcost;
return best_cost; return best_cost;
} }
#endif #endif
@ -385,7 +397,7 @@ static int search_cu_inter(encoder_control *encoder, int x, int y, int depth, lc
picture *ref_pic = encoder->ref->pics[ref_idx]; picture *ref_pic = encoder->ref->pics[ref_idx];
unsigned width_in_scu = NO_SCU_IN_LCU(ref_pic->width_in_lcu); unsigned width_in_scu = NO_SCU_IN_LCU(ref_pic->width_in_lcu);
cu_info *ref_cu = &ref_pic->cu_array[MAX_DEPTH][y_cu * width_in_scu + x_cu]; cu_info *ref_cu = &ref_pic->cu_array[MAX_DEPTH][y_cu * width_in_scu + x_cu];
uint32_t temp_bitcost = ref_idx; uint32_t temp_bitcost = 0;
uint32_t temp_cost = 0; uint32_t temp_cost = 0;
vector2d orig, mv, mvd; vector2d orig, mv, mvd;
int32_t merged = 0; int32_t merged = 0;
@ -406,9 +418,9 @@ static int search_cu_inter(encoder_control *encoder, int x, int y, int depth, lc
cur_cu->inter.mv_ref = temp_ref_idx; cur_cu->inter.mv_ref = temp_ref_idx;
#if SEARCH_MV_FULL_RADIUS #if SEARCH_MV_FULL_RADIUS
temp_cost += search_mv_full(depth, cur_pic, ref_pic, &orig, &mv); temp_cost += search_mv_full(depth, cur_pic, ref_pic, &orig, &mv, mv_cand, merge_cand, num_cand, ref_idx, &temp_bitcost);
#else #else
temp_cost += hexagon_search(depth, cur_pic, ref_pic, &orig, &mv, mv_cand, merge_cand, num_cand, ref_idx); temp_cost += hexagon_search(depth, cur_pic, ref_pic, &orig, &mv, mv_cand, merge_cand, num_cand, ref_idx, &temp_bitcost);
#endif #endif
merged = 0; merged = 0;
@ -453,7 +465,7 @@ static int search_cu_inter(encoder_control *encoder, int x, int y, int depth, lc
cur_cu->inter.mvd[0] = (int16_t)mvd.x; cur_cu->inter.mvd[0] = (int16_t)mvd.x;
cur_cu->inter.mvd[1] = (int16_t)mvd.y; cur_cu->inter.mvd[1] = (int16_t)mvd.y;
cur_cu->inter.cost = temp_cost; cur_cu->inter.cost = temp_cost;
cur_cu->inter.bitcost = temp_bitcost; cur_cu->inter.bitcost = temp_bitcost + ref_idx;
cur_cu->inter.mv_cand = cu_mv_cand; cur_cu->inter.mv_cand = cu_mv_cand;
} }
} }