Move token_cache from cost_coeffs to MACROBLOCK
This commit moves token_cache buffer into macroblock struct, instead of defining as a local variable in cost_coeffs. This avoids repeatedly re-allocating memory space in the rate-distortion optimization loop. The runtime at speed 0 reduces: bus 2000kbps, 161692ms to 159951ms football 600kbps, 229505ms to 225821ms Change-Id: If7da6b0b6d8c5138a16271a33c4548fba33d8840
This commit is contained in:
parent
4c20bff9d2
commit
f60a3910c4
@ -135,6 +135,7 @@ struct macroblock {
|
||||
|
||||
// note that token_costs is the cost when eob node is skipped
|
||||
vp9_coeff_cost token_costs[TX_SIZES];
|
||||
uint8_t token_cache[1024];
|
||||
|
||||
int optimize;
|
||||
|
||||
|
@ -467,12 +467,12 @@ static const int16_t band_counts[TX_SIZES][8] = {
|
||||
{ 1, 2, 3, 4, 11, 1024 - 21, 0 },
|
||||
};
|
||||
|
||||
static INLINE int cost_coeffs(MACROBLOCK *mb,
|
||||
static INLINE int cost_coeffs(MACROBLOCK *x,
|
||||
int plane, int block,
|
||||
ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L,
|
||||
TX_SIZE tx_size,
|
||||
const int16_t *scan, const int16_t *nb) {
|
||||
MACROBLOCKD *const xd = &mb->e_mbd;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
MB_MODE_INFO *mbmi = &xd->this_mi->mbmi;
|
||||
struct macroblockd_plane *pd = &xd->plane[plane];
|
||||
const PLANE_TYPE type = pd->plane_type;
|
||||
@ -481,9 +481,9 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
|
||||
const int16_t *const qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block);
|
||||
const int ref = mbmi->ref_frame[0] != INTRA_FRAME;
|
||||
unsigned int (*token_costs)[2][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS] =
|
||||
mb->token_costs[tx_size][type][ref];
|
||||
x->token_costs[tx_size][type][ref];
|
||||
const ENTROPY_CONTEXT above_ec = !!*A, left_ec = !!*L;
|
||||
uint8_t token_cache[1024];
|
||||
uint8_t *p_tok = x->token_cache;
|
||||
int pt = combine_entropy_contexts(above_ec, left_ec);
|
||||
int c, cost;
|
||||
|
||||
@ -502,7 +502,7 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
|
||||
int v = qcoeff_ptr[0];
|
||||
int prev_t = vp9_dct_value_tokens_ptr[v].token;
|
||||
cost = (*token_costs)[0][pt][prev_t] + vp9_dct_value_cost_ptr[v];
|
||||
token_cache[0] = vp9_pt_energy_class[prev_t];
|
||||
p_tok[0] = vp9_pt_energy_class[prev_t];
|
||||
++token_costs;
|
||||
|
||||
// ac tokens
|
||||
@ -512,9 +512,9 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
|
||||
|
||||
v = qcoeff_ptr[rc];
|
||||
t = vp9_dct_value_tokens_ptr[v].token;
|
||||
pt = get_coef_context(nb, token_cache, c);
|
||||
pt = get_coef_context(nb, p_tok, c);
|
||||
cost += (*token_costs)[!prev_t][pt][t] + vp9_dct_value_cost_ptr[v];
|
||||
token_cache[rc] = vp9_pt_energy_class[t];
|
||||
p_tok[rc] = vp9_pt_energy_class[t];
|
||||
prev_t = t;
|
||||
if (!--band_left) {
|
||||
band_left = *band_count++;
|
||||
@ -524,7 +524,7 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
|
||||
|
||||
// eob token
|
||||
if (band_left) {
|
||||
pt = get_coef_context(nb, token_cache, c);
|
||||
pt = get_coef_context(nb, p_tok, c);
|
||||
cost += (*token_costs)[0][pt][DCT_EOB_TOKEN];
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user