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, |