From f60a3910c4ab7725dc6dd54877bbdd3ed5f0e187 Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Fri, 11 Oct 2013 11:26:32 -0700 Subject: [PATCH] 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 --- vp9/encoder/vp9_block.h | 1 + vp9/encoder/vp9_rdopt.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h index a63bd1b..9b57bc3 100644 --- a/vp9/encoder/vp9_block.h +++ b/vp9/encoder/vp9_block.h @@ -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; diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index a1be626..5eb0ed0 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -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]; } } -- 2.7.4