void vp10_enable_segfeature(struct segmentation *seg, int segment_id, SEG_LVL_FEATURES feature_id) { seg->feature_mask[segment_id] |= 1 << feature_id; } int vp10_seg_feature_data_max(SEG_LVL_FEATURES feature_id) { return seg_feature_data_max[feature_id]; } int vp10_is_segfeature_signed(SEG_LVL_FEATURES feature_id) { return seg_feature_data_signed[feature_id]; } void vp10_set_segdata(struct segmentation *seg, int segment_id, SEG_LVL_FEATURES feature_id, int seg_data) { assert(seg_data <= seg_feature_data_max[feature_id]); if (seg_data < 0) { assert(seg_feature_data_signed[feature_id]); assert(-seg_data <= seg_feature_data_max[feature_id]); } seg->feature_data[segment_id][feature_id] = seg_data; } const vpx_tree_index vp10_segment_tree[TREE_SIZE(MAX_SEGMENTS)] = { 2, 4, 6, 8, 10, 12, 0, -1, -2, -3, -4, -5, -6, -7 }; // TBD? Functions to read and write segment data with range / validity checking
{ 10, 7, 6 }, // a/l both split }; static const vp9_prob default_inter_mode_probs[INTER_MODE_CONTEXTS] [INTER_MODES - 1] = { {2, 173, 34}, // 0 = both zero mv {7, 145, 85}, // 1 = one zero mv + one a predicted mv {7, 166, 63}, // 2 = two predicted mvs {7, 94, 66}, // 3 = one predicted/zero and one new mv {8, 64, 46}, // 4 = two new mvs {17, 81, 31}, // 5 = one intra neighbour + x {25, 29, 30}, // 6 = two intra neighbours }; /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ const vp9_tree_index vp9_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = { -DC_PRED, 2, /* 0 = DC_NODE */ -TM_PRED, 4, /* 1 = TM_NODE */ -V_PRED, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -H_PRED, 10, /* 4 = H_NODE */ -D135_PRED, -D117_PRED, /* 5 = D135_NODE */ -D45_PRED, 14, /* 6 = D45_NODE */ -D63_PRED, 16, /* 7 = D63_NODE */ -D153_PRED, -D207_PRED /* 8 = D153_NODE */ }; struct vp9_token vp9_intra_mode_encodings[INTRA_MODES]; const vp9_tree_index vp9_inter_mode_tree[TREE_SIZE(INTER_MODES)] = { -INTER_OFFSET(ZEROMV), 2, -INTER_OFFSET(NEARESTMV), 4,
{7, 0}, {7, 2}, {7, 4}, {7, 6}, {7, 8}, {7, 10}, {7, 12}, {7, 14}, {8, 0}, {8, 2}, {8, 4}, {8, 6}, {8, 8}, {8, 10}, {8, 12}, {8, 14}, {8, 16}, {8, 18}, {8, 20}, {8, 22}, {8, 24}, {8, 26}, {8, 28}, {8, 30}, {9, 0}, {9, 2}, {9, 4}, {9, 6}, {9, 8}, {9, 10}, {9, 12}, {9, 14}, {9, 16}, {9, 18}, {9, 20}, {9, 22}, {9, 24}, {9, 26}, {9, 28}, {9, 30}, {9, 32}, {9, 34}, {9, 36}, {9, 38}, {9, 40}, {9, 42}, {9, 44}, {9, 46}, {9, 48}, {9, 50}, {9, 52}, {9, 54}, {9, 56}, {9, 58}, {9, 60}, {9, 62} }; const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens = dct_cat_lt_10_value_tokens + (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens)) / 2; // 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 -ZERO_TOKEN, 4, // 1 = ZERO -ONE_TOKEN, 6, // 2 = ONE 8, 12, // 3 = LOW_VAL -TWO_TOKEN, 10, // 4 = TWO -THREE_TOKEN, -FOUR_TOKEN, // 5 = THREE 14, 16, // 6 = HIGH_LOW -CATEGORY1_TOKEN, -CATEGORY2_TOKEN, // 7 = CAT_ONE 18, 20, // 8 = CAT_THREEFOUR -CATEGORY3_TOKEN, -CATEGORY4_TOKEN, // 9 = CAT_THREE -CATEGORY5_TOKEN, -CATEGORY6_TOKEN // 10 = CAT_FIVE }; // Unconstrained Node Tree const vp9_tree_index vp9_coef_con_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
* Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "vp10/common/entropy.h" #include "vp10/common/blockd.h" #include "vp10/common/onyxc_int.h" #include "vp10/common/entropymode.h" #include "vpx_mem/vpx_mem.h" #include "vpx/vpx_integer.h" // Unconstrained Node Tree const vpx_tree_index vp10_coef_con_tree[TREE_SIZE(ENTROPY_TOKENS)] = { 2, 6, // 0 = LOW_VAL -TWO_TOKEN, 4, // 1 = TWO -THREE_TOKEN, -FOUR_TOKEN, // 2 = THREE 8, 10, // 3 = HIGH_LOW -CATEGORY1_TOKEN, -CATEGORY2_TOKEN, // 4 = CAT_ONE 12, 14, // 5 = CAT_THREEFOUR -CATEGORY3_TOKEN, -CATEGORY4_TOKEN, // 6 = CAT_THREE -CATEGORY5_TOKEN, -CATEGORY6_TOKEN // 7 = CAT_FIVE }; const vpx_prob vp10_cat1_prob[] = { 159 }; const vpx_prob vp10_cat2_prob[] = { 165, 145 }; const vpx_prob vp10_cat3_prob[] = { 173, 148, 140 }; const vpx_prob vp10_cat4_prob[] = { 176, 155, 140, 135 }; const vpx_prob vp10_cat5_prob[] = { 180, 157, 141, 134, 130 };
void av1_enable_segfeature(struct segmentation *seg, int segment_id, SEG_LVL_FEATURES feature_id) { seg->feature_mask[segment_id] |= 1 << feature_id; } int av1_seg_feature_data_max(SEG_LVL_FEATURES feature_id) { return seg_feature_data_max[feature_id]; } int av1_is_segfeature_signed(SEG_LVL_FEATURES feature_id) { return seg_feature_data_signed[feature_id]; } void av1_set_segdata(struct segmentation *seg, int segment_id, SEG_LVL_FEATURES feature_id, int seg_data) { assert(seg_data <= seg_feature_data_max[feature_id]); if (seg_data < 0) { assert(seg_feature_data_signed[feature_id]); assert(-seg_data <= seg_feature_data_max[feature_id]); } seg->feature_data[segment_id][feature_id] = seg_data; } const aom_tree_index av1_segment_tree[TREE_SIZE(MAX_SEGMENTS)] = { 2, 4, 6, 8, 10, 12, 0, -1, -2, -3, -4, -5, -6, -7 }; // TBD? Functions to read and write segment data with range / validity checking
{ 7, 0 }, { 7, 2 }, { 7, 4 }, { 7, 6 }, { 7, 8 }, { 7, 10 }, { 7, 12 }, { 7, 14 }, { 8, 0 }, { 8, 2 }, { 8, 4 }, { 8, 6 }, { 8, 8 }, { 8, 10 }, { 8, 12 }, { 8, 14 }, { 8, 16 }, { 8, 18 }, { 8, 20 }, { 8, 22 }, { 8, 24 }, { 8, 26 }, { 8, 28 }, { 8, 30 }, { 9, 0 }, { 9, 2 }, { 9, 4 }, { 9, 6 }, { 9, 8 }, { 9, 10 }, { 9, 12 }, { 9, 14 }, { 9, 16 }, { 9, 18 }, { 9, 20 }, { 9, 22 }, { 9, 24 }, { 9, 26 }, { 9, 28 }, { 9, 30 }, { 9, 32 }, { 9, 34 }, { 9, 36 }, { 9, 38 }, { 9, 40 }, { 9, 42 }, { 9, 44 }, { 9, 46 }, { 9, 48 }, { 9, 50 }, { 9, 52 }, { 9, 54 }, { 9, 56 }, { 9, 58 }, { 9, 60 }, { 9, 62 } }; const TOKENVALUE *av1_dct_cat_lt_10_value_tokens = dct_cat_lt_10_value_tokens + (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens)) / 2; // Array indices are identical to previously-existing CONTEXT_NODE indices const aom_tree_index av1_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = { -EOB_TOKEN, 2, // 0 = EOB -ZERO_TOKEN, 4, // 1 = ZERO -ONE_TOKEN, 6, // 2 = ONE 8, 12, // 3 = LOW_VAL -TWO_TOKEN, 10, // 4 = TWO -THREE_TOKEN, -FOUR_TOKEN, // 5 = THREE 14, 16, // 6 = HIGH_LOW -CATEGORY1_TOKEN,
{ 10, 7, 6 }, // a/l both split }; static const vpx_prob default_inter_mode_probs[INTER_MODE_CONTEXTS] [INTER_MODES - 1] = { {2, 173, 34}, // 0 = both zero mv {7, 145, 85}, // 1 = one zero mv + one a predicted mv {7, 166, 63}, // 2 = two predicted mvs {7, 94, 66}, // 3 = one predicted/zero and one new mv {8, 64, 46}, // 4 = two new mvs {17, 81, 31}, // 5 = one intra neighbour + x {25, 29, 30}, // 6 = two intra neighbours }; /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ const vpx_tree_index vp10_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = { -DC_PRED, 2, /* 0 = DC_NODE */ -TM_PRED, 4, /* 1 = TM_NODE */ -V_PRED, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -H_PRED, 10, /* 4 = H_NODE */ -D135_PRED, -D117_PRED, /* 5 = D135_NODE */ -D45_PRED, 14, /* 6 = D45_NODE */ -D63_PRED, 16, /* 7 = D63_NODE */ -D153_PRED, -D207_PRED /* 8 = D153_NODE */ }; const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)] = { -INTER_OFFSET(ZEROMV), 2, -INTER_OFFSET(NEARESTMV), 4, -INTER_OFFSET(NEARMV), -INTER_OFFSET(NEWMV)
#define CAT_FIVE_CONTEXT_NODE 7 #define INCREMENT_COUNT(token) \ do { \ if (!cm->frame_parallel_decoding_mode) \ ++coef_counts[band][ctx][token]; \ } while (0) static INLINE int read_coeff(const vp9_prob *probs, int n, vp9_reader *r) { int i, val = 0; for (i = 0; i < n; ++i) val = (val << 1) | vp9_read(r, probs[i]); return val; } static const vp9_tree_index coeff_subtree_high[TREE_SIZE(ENTROPY_TOKENS)] = { 2, 6, /* 0 = LOW_VAL */ -TWO_TOKEN, 4, /* 1 = TWO */ -THREE_TOKEN, -FOUR_TOKEN, /* 2 = THREE */ 8, 10, /* 3 = HIGH_LOW */ -CATEGORY1_TOKEN, -CATEGORY2_TOKEN, /* 4 = CAT_ONE */ 12, 14, /* 5 = CAT_THREEFOUR */ -CATEGORY3_TOKEN, -CATEGORY4_TOKEN, /* 6 = CAT_THREE */ -CATEGORY5_TOKEN, -CATEGORY6_TOKEN /* 7 = CAT_FIVE */ }; static int decode_coefs(VP9_COMMON *cm, const MACROBLOCKD *xd, FRAME_COUNTS *counts, PLANE_TYPE type, tran_low_t *dqcoeff, TX_SIZE tx_size, const int16_t *dq, int ctx, const int16_t *scan, const int16_t *nb, vp9_reader *r) {
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, }; const uint8_t vp9_coefband_trans_4x4[16] = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, }; const uint8_t vp9_pt_energy_class[ENTROPY_TOKENS] = { 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 }; const vp9_tree_index vp9_coefmodel_tree[TREE_SIZE(UNCONSTRAINED_NODES + 1)] = { -EOB_MODEL_TOKEN, 2, -ZERO_TOKEN, 4, -ONE_TOKEN, -TWO_TOKEN, }; // Model obtained from a 2-sided zero-centerd distribuition derived // from a Pareto distribution. The cdf of the distribution is: // cdf(x) = 0.5 + 0.5 * sgn(x) * [1 - {alpha/(alpha + |x|)} ^ beta] // // For a given beta and a given probablity of the 1-node, the alpha // is first solved, and then the {alpha, beta} pair is used to generate // the probabilities for the rest of the nodes. // beta = 8