Residual coding to cache energy class of tokens.
Proposal for tuning the residual coding by changing how the context from previous tokens is calculated. Storing the energy class of previous tokens instead of the token itself eases the critical path of HW implementations. Change-Id: I6d71d856b84518f6c88de771ddd818436f794bab
This commit is contained in:
parent
3d4e032e16
commit
88a4d4c510
@ -468,7 +468,7 @@ int vp9_get_coef_context(const int *scan, const int *neighbors,
|
||||
} else {
|
||||
ctx = token_cache[scan[neighbors[MAX_NEIGHBORS * c + 0]]];
|
||||
}
|
||||
return vp9_pt_energy_class[ctx];
|
||||
return ctx;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -58,13 +58,15 @@ static const vp9_prob cat6_prob[15] = {
|
||||
254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0
|
||||
};
|
||||
|
||||
DECLARE_ALIGNED(16, extern const uint8_t,
|
||||
vp9_pt_energy_class[MAX_ENTROPY_TOKENS]);
|
||||
#define INCREMENT_COUNT(token) \
|
||||
do { \
|
||||
coef_counts[type][ref][band][pt] \
|
||||
[token >= TWO_TOKEN ? \
|
||||
(token == DCT_EOB_TOKEN ? DCT_EOB_MODEL_TOKEN : TWO_TOKEN) : \
|
||||
token]++; \
|
||||
token_cache[scan[c]] = token; \
|
||||
token_cache[scan[c]] = vp9_pt_energy_class[token]; \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_COEF_CONTINUE(val, token) \
|
||||
|
@ -20,6 +20,9 @@
|
||||
#include "vp9/common/vp9_systemdependent.h"
|
||||
#include "vp9_rtcd.h"
|
||||
|
||||
DECLARE_ALIGNED(16, extern const uint8_t,
|
||||
vp9_pt_energy_class[MAX_ENTROPY_TOKENS]);
|
||||
|
||||
void vp9_subtract_block(int rows, int cols,
|
||||
int16_t *diff_ptr, int diff_stride,
|
||||
const uint8_t *src_ptr, int src_stride,
|
||||
@ -105,7 +108,7 @@ static int trellis_get_coeff_context(const int *scan,
|
||||
uint8_t *token_cache,
|
||||
int pad, int l) {
|
||||
int bak = token_cache[scan[idx]], pt;
|
||||
token_cache[scan[idx]] = token;
|
||||
token_cache[scan[idx]] = vp9_pt_energy_class[token];
|
||||
pt = vp9_get_coef_context(scan, nb, pad, token_cache, idx + 1, l);
|
||||
token_cache[scan[idx]] = bak;
|
||||
return pt;
|
||||
@ -189,7 +192,8 @@ static void optimize_b(VP9_COMMON *const cm, MACROBLOCK *mb,
|
||||
*(tokens[eob] + 1) = *(tokens[eob] + 0);
|
||||
next = eob;
|
||||
for (i = 0; i < eob; i++)
|
||||
token_cache[scan[i]] = vp9_dct_value_tokens_ptr[qcoeff_ptr[scan[i]]].token;
|
||||
token_cache[scan[i]] = vp9_pt_energy_class[vp9_dct_value_tokens_ptr[
|
||||
qcoeff_ptr[scan[i]]].token];
|
||||
nb = vp9_get_coef_neighbors_handle(scan, &pad);
|
||||
|
||||
for (i = eob; i-- > i0;) {
|
||||
|
@ -46,6 +46,9 @@
|
||||
/* Factor to weigh the rate for switchable interp filters */
|
||||
#define SWITCHABLE_INTERP_RATE_FACTOR 1
|
||||
|
||||
DECLARE_ALIGNED(16, extern const uint8_t,
|
||||
vp9_pt_energy_class[MAX_ENTROPY_TOKENS]);
|
||||
|
||||
const MODE_DEFINITION vp9_mode_order[MAX_MODES] = {
|
||||
{ZEROMV, LAST_FRAME, NONE},
|
||||
{DC_PRED, INTRA_FRAME, NONE},
|
||||
@ -366,7 +369,7 @@ static INLINE int cost_coeffs(VP9_COMMON *const cm, MACROBLOCK *mb,
|
||||
|
||||
if (!c || token_cache[scan[c - 1]])
|
||||
cost += vp9_cost_bit(coef_probs[band][pt][0], 1);
|
||||
token_cache[scan[c]] = t;
|
||||
token_cache[scan[c]] = vp9_pt_energy_class[t];
|
||||
}
|
||||
if (c < seg_eob) {
|
||||
if (c)
|
||||
|
@ -36,6 +36,9 @@ extern vp9_coeff_stats tree_update_hist_16x16[BLOCK_TYPES];
|
||||
extern vp9_coeff_stats tree_update_hist_32x32[BLOCK_TYPES];
|
||||
#endif /* ENTROPY_STATS */
|
||||
|
||||
DECLARE_ALIGNED(16, extern const uint8_t,
|
||||
vp9_pt_energy_class[MAX_ENTROPY_TOKENS]);
|
||||
|
||||
static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE * 2];
|
||||
const TOKENVALUE *vp9_dct_value_tokens_ptr;
|
||||
static int dct_value_cost[DCT_MAX_VALUE * 2];
|
||||
@ -228,7 +231,7 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE_TYPE bsize,
|
||||
if (!t->skip_eob_node)
|
||||
++cpi->common.fc.eob_branch_counts[tx_size][type][ref][band][pt];
|
||||
}
|
||||
token_cache[scan[c]] = token;
|
||||
token_cache[scan[c]] = vp9_pt_energy_class[token];
|
||||
++t;
|
||||
} while (c < eob && ++c < seg_eob);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user