1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_ENTROPY_H_ 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_ENTROPY_H_ 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx/vpx_integer.h" 155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h" 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_common.h" 185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_scan.h" 195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define DIFF_UPDATE_PROB 252 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Coefficient token alphabet 27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ZERO_TOKEN 0 // 0 Extra Bits 0+0 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ONE_TOKEN 1 // 1 Extra Bits 0+1 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define TWO_TOKEN 2 // 2 Extra Bits 0+1 30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define THREE_TOKEN 3 // 3 Extra Bits 0+1 31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define FOUR_TOKEN 4 // 4 Extra Bits 0+1 32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY1_TOKEN 5 // 5-6 Extra Bits 1+1 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY2_TOKEN 6 // 7-10 Extra Bits 2+1 34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY3_TOKEN 7 // 11-18 Extra Bits 3+1 35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY4_TOKEN 8 // 19-34 Extra Bits 4+1 36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY5_TOKEN 9 // 35-66 Extra Bits 5+1 37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define CATEGORY6_TOKEN 10 // 67+ Extra Bits 14+1 38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define EOB_TOKEN 11 // EOB Extra Bits 0+0 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ENTROPY_TOKENS 12 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define ENTROPY_NODES 11 435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_pt_energy_class[ENTROPY_TOKENS]); 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define EOB_MODEL_TOKEN 3 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangextern const vp9_tree_index vp9_coefmodel_tree[]; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct { 509b35249446b07f40ac5fcc3205f2c048616efacchkuang const vp9_tree_index *tree; 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const vp9_prob *prob; 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int len; 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int base_val; 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} vp9_extra_bit; 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// indexed by token value 57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS]; 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define DCT_MAX_VALUE 16384 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Coefficients are predicted via a 3-dimensional probability table. */ 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define REF_TYPES 2 // intra=0, inter=1 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Middle dimension reflects the coefficient position within the transform. */ 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define COEF_BANDS 6 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Inside dimension is measure of nearby complexity, that reflects the energy 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang of nearby coefficients are nonzero. For the first coefficient (DC, unless 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang block type is 0), we look at the (already encoded) blocks above and to the 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang left of the current block. The context index is then the number (0,1,or 2) 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang of these blocks having nonzero coefficients. 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang After decoding a coefficient, the measure is determined by the size of the 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang most recently decoded coefficient. 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang Note that the intuitive meaning of this measure changes as coefficients 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang are decoded, e.g., prior to the first token, a zero means that my neighbors 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang are empty while, after the first token, because of the use of end-of-block, 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang a zero means we just decoded a zero and hence guarantees that a non-zero 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang coefficient will appear later in this block. However, this shift 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang in meaning is perfectly OK because our context depends also on the 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang coefficient band (and since zigzag positions 0, 1, and 2 are in 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang distinct bands). */ 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define COEFF_CONTEXTS 6 85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS) 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// #define ENTROPY_STATS 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] 90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian [ENTROPY_TOKENS]; 91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang [ENTROPY_NODES][2]; 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define SUBEXP_PARAM 4 /* Subexponential code parameter */ 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MODULUS_PARAM 13 /* Modulus parameter */ 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct VP9Common; 981184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_default_coef_probs(struct VP9Common *cm); 991184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_adapt_coef_probs(struct VP9Common *cm); 100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1011184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) { 102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < MAX_MB_PLANE; i++) { 1041184aebb761cbeac9124c37189a80a1a58f04b6bhkuang struct macroblockd_plane *const pd = &xd->plane[i]; 1051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); 1061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) * 1071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang num_4x4_blocks_wide_lookup[plane_bsize]); 1081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) * 1091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang num_4x4_blocks_high_lookup[plane_bsize]); 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// This is the index in the scan order beyond which all coefficients for 114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 8x8 transform and above are in the top band. 1159b35249446b07f40ac5fcc3205f2c048616efacchkuang// This macro is currently unused but may be used by certain implementations 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAXBAND_INDEX 21 117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_8x8plus[1024]); 119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianDECLARE_ALIGNED(16, extern const uint8_t, vp9_coefband_trans_4x4[16]); 120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) { 1229b35249446b07f40ac5fcc3205f2c048616efacchkuang return tx_size == TX_4X4 ? vp9_coefband_trans_4x4 1239b35249446b07f40ac5fcc3205f2c048616efacchkuang : vp9_coefband_trans_8x8plus; 124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 128 lists of probabilities are stored for the following ONE node probs: 127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// 1, 3, 5, 7, ..., 253, 255 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// In between probabilities are interpolated linearly 129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define COEFF_PROB_MODELS 256 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define UNCONSTRAINED_NODES 3 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define PIVOT_NODE 2 // which node is pivot 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES) 137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern const vp9_prob vp9_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES]; 138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef vp9_prob vp9_coeff_probs_model[REF_TYPES][COEF_BANDS] 140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian [COEFF_CONTEXTS][UNCONSTRAINED_NODES]; 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS] 143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian [COEFF_CONTEXTS] 144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang [UNCONSTRAINED_NODES + 1]; 145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full); 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a, 149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const ENTROPY_CONTEXT *l) { 1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ENTROPY_CONTEXT above_ec = 0, left_ec = 0; 151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang switch (tx_size) { 1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case TX_4X4: 1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang above_ec = a[0] != 0; 1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang left_ec = l[0] != 0; 15691037db265ecdd914a26e056cf69207b4f50924ehkuang break; 1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case TX_8X8: 1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang above_ec = !!*(const uint16_t *)a; 1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang left_ec = !!*(const uint16_t *)l; 16091037db265ecdd914a26e056cf69207b4f50924ehkuang break; 1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case TX_16X16: 1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang above_ec = !!*(const uint32_t *)a; 1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang left_ec = !!*(const uint32_t *)l; 16491037db265ecdd914a26e056cf69207b4f50924ehkuang break; 1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case TX_32X32: 1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang above_ec = !!*(const uint64_t *)a; 1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang left_ec = !!*(const uint64_t *)l; 16891037db265ecdd914a26e056cf69207b4f50924ehkuang break; 16991037db265ecdd914a26e056cf69207b4f50924ehkuang default: 170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian assert(0 && "Invalid transform size."); 171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang return combine_entropy_contexts(above_ec, left_ec); 17491037db265ecdd914a26e056cf69207b4f50924ehkuang} 17591037db265ecdd914a26e056cf69207b4f50924ehkuang 176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const INLINE scan_order *get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size, 177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PLANE_TYPE type, int block_idx) { 1786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MODE_INFO *const mi = xd->mi[0]; 179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (is_inter_block(&mi->mbmi) || type != PLANE_TYPE_Y || xd->lossless) { 181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return &vp9_default_scan_orders[tx_size]; 182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const MB_PREDICTION_MODE mode = get_y_mode(mi, block_idx); 184a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return &vp9_scan_orders[tx_size][intra_mode_to_tx_type_lookup[mode]]; 1851184aebb761cbeac9124c37189a80a1a58f04b6bhkuang } 1861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 1871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 188b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif // VP9_COMMON_VP9_ENTROPY_H_ 193