| 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;
|
| }
|
| }
|
|
|