Index: source/libvpx/vp9/encoder/vp9_tokenize.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_tokenize.c (revision 251189) |
+++ source/libvpx/vp9/encoder/vp9_tokenize.c (working copy) |
@@ -160,7 +160,6 @@ |
VP9_COMP *cpi; |
MACROBLOCKD *xd; |
TOKENEXTRA **tp; |
- TX_SIZE tx_size; |
uint8_t *token_cache; |
}; |
@@ -172,7 +171,8 @@ |
struct macroblockd_plane *pd = &xd->plane[plane]; |
int aoff, loff; |
txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); |
- set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, aoff, loff); |
+ vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, |
+ aoff, loff); |
} |
static INLINE void add_token(TOKENEXTRA **t, const vp9_prob *context_tree, |
@@ -187,6 +187,18 @@ |
++counts[token]; |
} |
+static INLINE void add_token_no_extra(TOKENEXTRA **t, |
+ const vp9_prob *context_tree, |
+ uint8_t token, |
+ uint8_t skip_eob_node, |
+ unsigned int *counts) { |
+ (*t)->token = token; |
+ (*t)->context_tree = context_tree; |
+ (*t)->skip_eob_node = skip_eob_node; |
+ (*t)++; |
+ ++counts[token]; |
+} |
+ |
static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, |
TX_SIZE tx_size, void *arg) { |
struct tokenize_b_args* const args = arg; |
@@ -198,7 +210,7 @@ |
struct macroblockd_plane *pd = &xd->plane[plane]; |
MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
int pt; /* near block/prev token context index */ |
- int c = 0; |
+ int c; |
TOKENEXTRA *t = *tp; /* store tokens starting here */ |
int eob = p->eobs[block]; |
const PLANE_TYPE type = pd->plane_type; |
@@ -206,9 +218,14 @@ |
const int segment_id = mbmi->segment_id; |
const int16_t *scan, *nb; |
const scan_order *so; |
- vp9_coeff_count *const counts = cpi->coef_counts[tx_size]; |
- vp9_coeff_probs_model *const coef_probs = cpi->common.fc.coef_probs[tx_size]; |
const int ref = is_inter_block(mbmi); |
+ unsigned int (*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] = |
+ cpi->coef_counts[tx_size][type][ref]; |
+ vp9_prob (*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] = |
+ cpi->common.fc.coef_probs[tx_size][type][ref]; |
+ unsigned int (*const eob_branch)[COEFF_CONTEXTS] = |
+ cpi->common.counts.eob_branch[tx_size][type][ref]; |
+ |
const uint8_t *const band = get_band_translate(tx_size); |
const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size); |
@@ -227,39 +244,37 @@ |
v = qcoeff_ptr[scan[c]]; |
while (!v) { |
- add_token(&t, coef_probs[type][ref][band[c]][pt], 0, ZERO_TOKEN, skip_eob, |
- counts[type][ref][band[c]][pt]); |
+ add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN, skip_eob, |
+ counts[band[c]][pt]); |
+ eob_branch[band[c]][pt] += !skip_eob; |
- cpi->common.counts.eob_branch[tx_size][type][ref][band[c]][pt] += |
- !skip_eob; |
- |
skip_eob = 1; |
token_cache[scan[c]] = 0; |
++c; |
pt = get_coef_context(nb, token_cache, c); |
v = qcoeff_ptr[scan[c]]; |
} |
- add_token(&t, coef_probs[type][ref][band[c]][pt], |
+ |
+ add_token(&t, coef_probs[band[c]][pt], |
vp9_dct_value_tokens_ptr[v].extra, |
vp9_dct_value_tokens_ptr[v].token, skip_eob, |
- counts[type][ref][band[c]][pt]); |
+ counts[band[c]][pt]); |
+ eob_branch[band[c]][pt] += !skip_eob; |
- cpi->common.counts.eob_branch[tx_size][type][ref][band[c]][pt] += !skip_eob; |
- |
token_cache[scan[c]] = |
vp9_pt_energy_class[vp9_dct_value_tokens_ptr[v].token]; |
++c; |
pt = get_coef_context(nb, token_cache, c); |
} |
if (c < seg_eob) { |
- add_token(&t, coef_probs[type][ref][band[c]][pt], 0, EOB_TOKEN, 0, |
- counts[type][ref][band[c]][pt]); |
- ++cpi->common.counts.eob_branch[tx_size][type][ref][band[c]][pt]; |
+ add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN, 0, |
+ counts[band[c]][pt]); |
+ ++eob_branch[band[c]][pt]; |
} |
*tp = t; |
- set_contexts(xd, pd, plane_bsize, tx_size, c > 0, aoff, loff); |
+ vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, aoff, loff); |
} |
struct is_skippable_args { |
@@ -277,15 +292,15 @@ |
static int sb_is_skippable(MACROBLOCK *x, BLOCK_SIZE bsize) { |
int result = 1; |
struct is_skippable_args args = {x, &result}; |
- foreach_transformed_block(&x->e_mbd, bsize, is_skippable, &args); |
+ vp9_foreach_transformed_block(&x->e_mbd, bsize, is_skippable, &args); |
return result; |
} |
int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
int result = 1; |
struct is_skippable_args args = {x, &result}; |
- foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable, |
- &args); |
+ vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable, |
+ &args); |
return result; |
} |
@@ -298,10 +313,10 @@ |
const int ctx = vp9_get_skip_context(xd); |
const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id, |
SEG_LVL_SKIP); |
- struct tokenize_b_args arg = {cpi, xd, t, mbmi->tx_size, cpi->mb.token_cache}; |
- if (mbmi->skip_coeff) { |
+ struct tokenize_b_args arg = {cpi, xd, t, cpi->mb.token_cache}; |
+ if (mbmi->skip) { |
if (!dry_run) |
- cm->counts.mbskip[ctx][1] += skip_inc; |
+ cm->counts.skip[ctx][1] += skip_inc; |
reset_skip_context(xd, bsize); |
if (dry_run) |
*t = t_backup; |
@@ -309,10 +324,10 @@ |
} |
if (!dry_run) { |
- cm->counts.mbskip[ctx][0] += skip_inc; |
- foreach_transformed_block(xd, bsize, tokenize_b, &arg); |
+ cm->counts.skip[ctx][0] += skip_inc; |
+ vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg); |
} else { |
- foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); |
+ vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); |
*t = t_backup; |
} |
} |