| Index: source/libvpx/vp9/encoder/vp9_tokenize.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_tokenize.c (revision 292072)
|
| +++ source/libvpx/vp9/encoder/vp9_tokenize.c (working copy)
|
| @@ -28,6 +28,18 @@
|
| static int16_t dct_value_cost[DCT_MAX_VALUE * 2];
|
| const int16_t *vp9_dct_value_cost_ptr;
|
|
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| +static TOKENVALUE dct_value_tokens_high10[DCT_MAX_VALUE_HIGH10 * 2];
|
| +const TOKENVALUE *vp9_dct_value_tokens_high10_ptr;
|
| +static int16_t dct_value_cost_high10[DCT_MAX_VALUE_HIGH10 * 2];
|
| +const int16_t *vp9_dct_value_cost_high10_ptr;
|
| +
|
| +static TOKENVALUE dct_value_tokens_high12[DCT_MAX_VALUE_HIGH12 * 2];
|
| +const TOKENVALUE *vp9_dct_value_tokens_high12_ptr;
|
| +static int16_t dct_value_cost_high12[DCT_MAX_VALUE_HIGH12 * 2];
|
| +const int16_t *vp9_dct_value_cost_high12_ptr;
|
| +#endif
|
| +
|
| // Array indices are identical to previously-existing CONTEXT_NODE indices
|
| const vp9_tree_index vp9_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
|
| -EOB_TOKEN, 2, // 0 = EOB
|
| @@ -57,6 +69,21 @@
|
|
|
| static vp9_tree_index cat1[2], cat2[4], cat3[6], cat4[8], cat5[10], cat6[28];
|
|
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| +static vp9_tree_index cat1_high10[2];
|
| +static vp9_tree_index cat2_high10[4];
|
| +static vp9_tree_index cat3_high10[6];
|
| +static vp9_tree_index cat4_high10[8];
|
| +static vp9_tree_index cat5_high10[10];
|
| +static vp9_tree_index cat6_high10[32];
|
| +static vp9_tree_index cat1_high12[2];
|
| +static vp9_tree_index cat2_high12[4];
|
| +static vp9_tree_index cat3_high12[6];
|
| +static vp9_tree_index cat4_high12[8];
|
| +static vp9_tree_index cat5_high12[10];
|
| +static vp9_tree_index cat6_high12[36];
|
| +#endif
|
| +
|
| static void init_bit_tree(vp9_tree_index *p, int n) {
|
| int i = 0;
|
|
|
| @@ -75,6 +102,20 @@
|
| init_bit_tree(cat4, 4);
|
| init_bit_tree(cat5, 5);
|
| init_bit_tree(cat6, 14);
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + init_bit_tree(cat1_high10, 1);
|
| + init_bit_tree(cat2_high10, 2);
|
| + init_bit_tree(cat3_high10, 3);
|
| + init_bit_tree(cat4_high10, 4);
|
| + init_bit_tree(cat5_high10, 5);
|
| + init_bit_tree(cat6_high10, 16);
|
| + init_bit_tree(cat1_high12, 1);
|
| + init_bit_tree(cat2_high12, 2);
|
| + init_bit_tree(cat3_high12, 3);
|
| + init_bit_tree(cat4_high12, 4);
|
| + init_bit_tree(cat5_high12, 5);
|
| + init_bit_tree(cat6_high12, 18);
|
| +#endif
|
| }
|
|
|
| const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS] = {
|
| @@ -92,6 +133,37 @@
|
| {0, 0, 0, 0} // EOB_TOKEN
|
| };
|
|
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| +const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS] = {
|
| + {0, 0, 0, 0}, // ZERO_TOKEN
|
| + {0, 0, 0, 1}, // ONE_TOKEN
|
| + {0, 0, 0, 2}, // TWO_TOKEN
|
| + {0, 0, 0, 3}, // THREE_TOKEN
|
| + {0, 0, 0, 4}, // FOUR_TOKEN
|
| + {cat1_high10, vp9_cat1_prob_high10, 1, CAT1_MIN_VAL}, // CATEGORY1_TOKEN
|
| + {cat2_high10, vp9_cat2_prob_high10, 2, CAT2_MIN_VAL}, // CATEGORY2_TOKEN
|
| + {cat3_high10, vp9_cat3_prob_high10, 3, CAT3_MIN_VAL}, // CATEGORY3_TOKEN
|
| + {cat4_high10, vp9_cat4_prob_high10, 4, CAT4_MIN_VAL}, // CATEGORY4_TOKEN
|
| + {cat5_high10, vp9_cat5_prob_high10, 5, CAT5_MIN_VAL}, // CATEGORY5_TOKEN
|
| + {cat6_high10, vp9_cat6_prob_high10, 16, CAT6_MIN_VAL}, // CATEGORY6_TOKEN
|
| + {0, 0, 0, 0} // EOB_TOKEN
|
| +};
|
| +const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS] = {
|
| + {0, 0, 0, 0}, // ZERO_TOKEN
|
| + {0, 0, 0, 1}, // ONE_TOKEN
|
| + {0, 0, 0, 2}, // TWO_TOKEN
|
| + {0, 0, 0, 3}, // THREE_TOKEN
|
| + {0, 0, 0, 4}, // FOUR_TOKEN
|
| + {cat1_high12, vp9_cat1_prob_high12, 1, CAT1_MIN_VAL}, // CATEGORY1_TOKEN
|
| + {cat2_high12, vp9_cat2_prob_high12, 2, CAT2_MIN_VAL}, // CATEGORY2_TOKEN
|
| + {cat3_high12, vp9_cat3_prob_high12, 3, CAT3_MIN_VAL}, // CATEGORY3_TOKEN
|
| + {cat4_high12, vp9_cat4_prob_high12, 4, CAT4_MIN_VAL}, // CATEGORY4_TOKEN
|
| + {cat5_high12, vp9_cat5_prob_high12, 5, CAT5_MIN_VAL}, // CATEGORY5_TOKEN
|
| + {cat6_high12, vp9_cat6_prob_high12, 18, CAT6_MIN_VAL}, // CATEGORY6_TOKEN
|
| + {0, 0, 0, 0} // EOB_TOKEN
|
| +};
|
| +#endif
|
| +
|
| struct vp9_token vp9_coef_encodings[ENTROPY_TOKENS];
|
|
|
| void vp9_coef_tree_initialize() {
|
| @@ -99,11 +171,9 @@
|
| vp9_tokens_from_tree(vp9_coef_encodings, vp9_coef_tree);
|
| }
|
|
|
| -void vp9_tokenize_initialize() {
|
| - TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
|
| - const vp9_extra_bit *const e = vp9_extra_bits;
|
| -
|
| - int i = -DCT_MAX_VALUE;
|
| +static void tokenize_init_one(TOKENVALUE *t, const vp9_extra_bit *const e,
|
| + int16_t *value_cost, int max_value) {
|
| + int i = -max_value;
|
| int sign = 1;
|
|
|
| do {
|
| @@ -130,7 +200,7 @@
|
| // initialize the cost for extra bits for all possible coefficient value.
|
| {
|
| int cost = 0;
|
| - const vp9_extra_bit *p = &vp9_extra_bits[t[i].token];
|
| + const vp9_extra_bit *p = &e[t[i].token];
|
|
|
| if (p->base_val) {
|
| const int extra = t[i].extra;
|
| @@ -140,13 +210,36 @@
|
| cost += treed_cost(p->tree, p->prob, extra >> 1, length);
|
|
|
| cost += vp9_cost_bit(vp9_prob_half, extra & 1); /* sign */
|
| - dct_value_cost[i + DCT_MAX_VALUE] = cost;
|
| + value_cost[i] = cost;
|
| }
|
| }
|
| - } while (++i < DCT_MAX_VALUE);
|
| + } while (++i < max_value);
|
| +}
|
|
|
| +void vp9_tokenize_initialize() {
|
| vp9_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
|
| vp9_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;
|
| +
|
| + tokenize_init_one(dct_value_tokens + DCT_MAX_VALUE, vp9_extra_bits,
|
| + dct_value_cost + DCT_MAX_VALUE, DCT_MAX_VALUE);
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + vp9_dct_value_tokens_high10_ptr = dct_value_tokens_high10 +
|
| + DCT_MAX_VALUE_HIGH10;
|
| + vp9_dct_value_cost_high10_ptr = dct_value_cost_high10 + DCT_MAX_VALUE_HIGH10;
|
| +
|
| + tokenize_init_one(dct_value_tokens_high10 + DCT_MAX_VALUE_HIGH10,
|
| + vp9_extra_bits_high10,
|
| + dct_value_cost_high10 + DCT_MAX_VALUE_HIGH10,
|
| + DCT_MAX_VALUE_HIGH10);
|
| + vp9_dct_value_tokens_high12_ptr = dct_value_tokens_high12 +
|
| + DCT_MAX_VALUE_HIGH12;
|
| + vp9_dct_value_cost_high12_ptr = dct_value_cost_high12 + DCT_MAX_VALUE_HIGH12;
|
| +
|
| + tokenize_init_one(dct_value_tokens_high12 + DCT_MAX_VALUE_HIGH12,
|
| + vp9_extra_bits_high12,
|
| + dct_value_cost_high12 + DCT_MAX_VALUE_HIGH12,
|
| + DCT_MAX_VALUE_HIGH12);
|
| +#endif
|
| }
|
|
|
| struct tokenize_b_args {
|
| @@ -206,13 +299,13 @@
|
| uint8_t token_cache[32 * 32];
|
| struct macroblock_plane *p = &cpi->mb.plane[plane];
|
| struct macroblockd_plane *pd = &xd->plane[plane];
|
| - MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
|
| int pt; /* near block/prev token context index */
|
| int c;
|
| TOKENEXTRA *t = *tp; /* store tokens starting here */
|
| int eob = p->eobs[block];
|
| const PLANE_TYPE type = pd->plane_type;
|
| - const int16_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
|
| + const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
|
| const int segment_id = mbmi->segment_id;
|
| const int16_t *scan, *nb;
|
| const scan_order *so;
|
| @@ -225,6 +318,7 @@
|
| 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);
|
| + const TOKENVALUE *dct_value_tokens;
|
|
|
| int aoff, loff;
|
| txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff);
|
| @@ -235,6 +329,18 @@
|
| scan = so->scan;
|
| nb = so->neighbors;
|
| c = 0;
|
| +#if CONFIG_VP9_HIGH && CONFIG_HIGH_QUANT
|
| + if (cpi->common.profile >= PROFILE_2) {
|
| + dct_value_tokens = (cpi->common.bit_depth == VPX_BITS_10 ?
|
| + vp9_dct_value_tokens_high10_ptr :
|
| + vp9_dct_value_tokens_high12_ptr);
|
| + } else {
|
| + dct_value_tokens = vp9_dct_value_tokens_ptr;
|
| + }
|
| +#else
|
| + dct_value_tokens = vp9_dct_value_tokens_ptr;
|
| +#endif
|
| +
|
| while (c < eob) {
|
| int v = 0;
|
| int skip_eob = 0;
|
| @@ -253,14 +359,13 @@
|
| }
|
|
|
| add_token(&t, coef_probs[band[c]][pt],
|
| - vp9_dct_value_tokens_ptr[v].extra,
|
| - (uint8_t)vp9_dct_value_tokens_ptr[v].token,
|
| + dct_value_tokens[v].extra,
|
| + (uint8_t)dct_value_tokens[v].token,
|
| (uint8_t)skip_eob,
|
| counts[band[c]][pt]);
|
| eob_branch[band[c]][pt] += !skip_eob;
|
|
|
| - token_cache[scan[c]] =
|
| - vp9_pt_energy_class[vp9_dct_value_tokens_ptr[v].token];
|
| + token_cache[scan[c]] = vp9_pt_energy_class[dct_value_tokens[v].token];
|
| ++c;
|
| pt = get_coef_context(nb, token_cache, c);
|
| }
|
| @@ -302,7 +407,7 @@
|
| BLOCK_SIZE bsize) {
|
| VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &cpi->mb.e_mbd;
|
| - MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
|
| TOKENEXTRA *t_backup = *t;
|
| const int ctx = vp9_get_skip_context(xd);
|
| const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id,
|
|
|