Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | /* |
michael@0 | 2 | * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
michael@0 | 3 | * |
michael@0 | 4 | * Use of this source code is governed by a BSD-style license |
michael@0 | 5 | * that can be found in the LICENSE file in the root of the source |
michael@0 | 6 | * tree. An additional intellectual property rights grant can be found |
michael@0 | 7 | * in the file PATENTS. All contributing project authors may |
michael@0 | 8 | * be found in the AUTHORS file in the root of the source tree. |
michael@0 | 9 | */ |
michael@0 | 10 | |
michael@0 | 11 | #ifndef VP9_COMMON_VP9_ENTROPY_H_ |
michael@0 | 12 | #define VP9_COMMON_VP9_ENTROPY_H_ |
michael@0 | 13 | |
michael@0 | 14 | #include "vpx/vpx_integer.h" |
michael@0 | 15 | |
michael@0 | 16 | #include "vp9/common/vp9_blockd.h" |
michael@0 | 17 | #include "vp9/common/vp9_common.h" |
michael@0 | 18 | #include "vp9/common/vp9_scan.h" |
michael@0 | 19 | #include "vp9/common/vp9_treecoder.h" |
michael@0 | 20 | |
michael@0 | 21 | #define DIFF_UPDATE_PROB 252 |
michael@0 | 22 | |
michael@0 | 23 | /* Coefficient token alphabet */ |
michael@0 | 24 | |
michael@0 | 25 | #define ZERO_TOKEN 0 /* 0 Extra Bits 0+0 */ |
michael@0 | 26 | #define ONE_TOKEN 1 /* 1 Extra Bits 0+1 */ |
michael@0 | 27 | #define TWO_TOKEN 2 /* 2 Extra Bits 0+1 */ |
michael@0 | 28 | #define THREE_TOKEN 3 /* 3 Extra Bits 0+1 */ |
michael@0 | 29 | #define FOUR_TOKEN 4 /* 4 Extra Bits 0+1 */ |
michael@0 | 30 | #define DCT_VAL_CATEGORY1 5 /* 5-6 Extra Bits 1+1 */ |
michael@0 | 31 | #define DCT_VAL_CATEGORY2 6 /* 7-10 Extra Bits 2+1 */ |
michael@0 | 32 | #define DCT_VAL_CATEGORY3 7 /* 11-18 Extra Bits 3+1 */ |
michael@0 | 33 | #define DCT_VAL_CATEGORY4 8 /* 19-34 Extra Bits 4+1 */ |
michael@0 | 34 | #define DCT_VAL_CATEGORY5 9 /* 35-66 Extra Bits 5+1 */ |
michael@0 | 35 | #define DCT_VAL_CATEGORY6 10 /* 67+ Extra Bits 14+1 */ |
michael@0 | 36 | #define DCT_EOB_TOKEN 11 /* EOB Extra Bits 0+0 */ |
michael@0 | 37 | #define MAX_ENTROPY_TOKENS 12 |
michael@0 | 38 | #define ENTROPY_NODES 11 |
michael@0 | 39 | #define EOSB_TOKEN 127 /* Not signalled, encoder only */ |
michael@0 | 40 | |
michael@0 | 41 | #define INTER_MODE_CONTEXTS 7 |
michael@0 | 42 | |
michael@0 | 43 | extern DECLARE_ALIGNED(16, const uint8_t, |
michael@0 | 44 | vp9_pt_energy_class[MAX_ENTROPY_TOKENS]); |
michael@0 | 45 | |
michael@0 | 46 | extern const vp9_tree_index vp9_coef_tree[TREE_SIZE(MAX_ENTROPY_TOKENS)]; |
michael@0 | 47 | |
michael@0 | 48 | #define DCT_EOB_MODEL_TOKEN 3 /* EOB Extra Bits 0+0 */ |
michael@0 | 49 | extern const vp9_tree_index vp9_coefmodel_tree[]; |
michael@0 | 50 | |
michael@0 | 51 | extern struct vp9_token vp9_coef_encodings[MAX_ENTROPY_TOKENS]; |
michael@0 | 52 | |
michael@0 | 53 | typedef struct { |
michael@0 | 54 | const vp9_tree_index *tree; |
michael@0 | 55 | const vp9_prob *prob; |
michael@0 | 56 | int len; |
michael@0 | 57 | int base_val; |
michael@0 | 58 | } vp9_extra_bit; |
michael@0 | 59 | |
michael@0 | 60 | // indexed by token value |
michael@0 | 61 | extern const vp9_extra_bit vp9_extra_bits[MAX_ENTROPY_TOKENS]; |
michael@0 | 62 | |
michael@0 | 63 | #define MAX_PROB 255 |
michael@0 | 64 | #define DCT_MAX_VALUE 16384 |
michael@0 | 65 | |
michael@0 | 66 | /* Coefficients are predicted via a 3-dimensional probability table. */ |
michael@0 | 67 | |
michael@0 | 68 | /* Outside dimension. 0 = Y with DC, 1 = UV */ |
michael@0 | 69 | #define BLOCK_TYPES 2 |
michael@0 | 70 | #define REF_TYPES 2 // intra=0, inter=1 |
michael@0 | 71 | |
michael@0 | 72 | /* Middle dimension reflects the coefficient position within the transform. */ |
michael@0 | 73 | #define COEF_BANDS 6 |
michael@0 | 74 | |
michael@0 | 75 | /* Inside dimension is measure of nearby complexity, that reflects the energy |
michael@0 | 76 | of nearby coefficients are nonzero. For the first coefficient (DC, unless |
michael@0 | 77 | block type is 0), we look at the (already encoded) blocks above and to the |
michael@0 | 78 | left of the current block. The context index is then the number (0,1,or 2) |
michael@0 | 79 | of these blocks having nonzero coefficients. |
michael@0 | 80 | After decoding a coefficient, the measure is determined by the size of the |
michael@0 | 81 | most recently decoded coefficient. |
michael@0 | 82 | Note that the intuitive meaning of this measure changes as coefficients |
michael@0 | 83 | are decoded, e.g., prior to the first token, a zero means that my neighbors |
michael@0 | 84 | are empty while, after the first token, because of the use of end-of-block, |
michael@0 | 85 | a zero means we just decoded a zero and hence guarantees that a non-zero |
michael@0 | 86 | coefficient will appear later in this block. However, this shift |
michael@0 | 87 | in meaning is perfectly OK because our context depends also on the |
michael@0 | 88 | coefficient band (and since zigzag positions 0, 1, and 2 are in |
michael@0 | 89 | distinct bands). */ |
michael@0 | 90 | |
michael@0 | 91 | #define PREV_COEF_CONTEXTS 6 |
michael@0 | 92 | |
michael@0 | 93 | // #define ENTROPY_STATS |
michael@0 | 94 | |
michael@0 | 95 | typedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
michael@0 | 96 | [MAX_ENTROPY_TOKENS]; |
michael@0 | 97 | typedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
michael@0 | 98 | [ENTROPY_NODES][2]; |
michael@0 | 99 | |
michael@0 | 100 | #define SUBEXP_PARAM 4 /* Subexponential code parameter */ |
michael@0 | 101 | #define MODULUS_PARAM 13 /* Modulus parameter */ |
michael@0 | 102 | |
michael@0 | 103 | struct VP9Common; |
michael@0 | 104 | void vp9_default_coef_probs(struct VP9Common *cm); |
michael@0 | 105 | |
michael@0 | 106 | void vp9_coef_tree_initialize(); |
michael@0 | 107 | void vp9_adapt_coef_probs(struct VP9Common *cm); |
michael@0 | 108 | |
michael@0 | 109 | static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) { |
michael@0 | 110 | int i; |
michael@0 | 111 | for (i = 0; i < MAX_MB_PLANE; i++) { |
michael@0 | 112 | struct macroblockd_plane *const pd = &xd->plane[i]; |
michael@0 | 113 | const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); |
michael@0 | 114 | vpx_memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) * |
michael@0 | 115 | num_4x4_blocks_wide_lookup[plane_bsize]); |
michael@0 | 116 | vpx_memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) * |
michael@0 | 117 | num_4x4_blocks_high_lookup[plane_bsize]); |
michael@0 | 118 | } |
michael@0 | 119 | } |
michael@0 | 120 | |
michael@0 | 121 | // This is the index in the scan order beyond which all coefficients for |
michael@0 | 122 | // 8x8 transform and above are in the top band. |
michael@0 | 123 | // This macro is currently unused but may be used by certain implementations |
michael@0 | 124 | #define MAXBAND_INDEX 21 |
michael@0 | 125 | |
michael@0 | 126 | extern const uint8_t vp9_coefband_trans_8x8plus[1024]; |
michael@0 | 127 | extern const uint8_t vp9_coefband_trans_4x4[16]; |
michael@0 | 128 | |
michael@0 | 129 | static const uint8_t *get_band_translate(TX_SIZE tx_size) { |
michael@0 | 130 | return tx_size == TX_4X4 ? vp9_coefband_trans_4x4 |
michael@0 | 131 | : vp9_coefband_trans_8x8plus; |
michael@0 | 132 | } |
michael@0 | 133 | |
michael@0 | 134 | // 128 lists of probabilities are stored for the following ONE node probs: |
michael@0 | 135 | // 1, 3, 5, 7, ..., 253, 255 |
michael@0 | 136 | // In between probabilities are interpolated linearly |
michael@0 | 137 | |
michael@0 | 138 | #define COEFPROB_MODELS 128 |
michael@0 | 139 | |
michael@0 | 140 | #define UNCONSTRAINED_NODES 3 |
michael@0 | 141 | |
michael@0 | 142 | #define PIVOT_NODE 2 // which node is pivot |
michael@0 | 143 | |
michael@0 | 144 | typedef vp9_prob vp9_coeff_probs_model[REF_TYPES][COEF_BANDS] |
michael@0 | 145 | [PREV_COEF_CONTEXTS] |
michael@0 | 146 | [UNCONSTRAINED_NODES]; |
michael@0 | 147 | |
michael@0 | 148 | typedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS] |
michael@0 | 149 | [PREV_COEF_CONTEXTS] |
michael@0 | 150 | [UNCONSTRAINED_NODES + 1]; |
michael@0 | 151 | |
michael@0 | 152 | void vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full); |
michael@0 | 153 | |
michael@0 | 154 | static int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a, |
michael@0 | 155 | const ENTROPY_CONTEXT *l) { |
michael@0 | 156 | ENTROPY_CONTEXT above_ec = 0, left_ec = 0; |
michael@0 | 157 | |
michael@0 | 158 | switch (tx_size) { |
michael@0 | 159 | case TX_4X4: |
michael@0 | 160 | above_ec = a[0] != 0; |
michael@0 | 161 | left_ec = l[0] != 0; |
michael@0 | 162 | break; |
michael@0 | 163 | case TX_8X8: |
michael@0 | 164 | above_ec = !!*(const uint16_t *)a; |
michael@0 | 165 | left_ec = !!*(const uint16_t *)l; |
michael@0 | 166 | break; |
michael@0 | 167 | case TX_16X16: |
michael@0 | 168 | above_ec = !!*(const uint32_t *)a; |
michael@0 | 169 | left_ec = !!*(const uint32_t *)l; |
michael@0 | 170 | break; |
michael@0 | 171 | case TX_32X32: |
michael@0 | 172 | above_ec = !!*(const uint64_t *)a; |
michael@0 | 173 | left_ec = !!*(const uint64_t *)l; |
michael@0 | 174 | break; |
michael@0 | 175 | default: |
michael@0 | 176 | assert(!"Invalid transform size."); |
michael@0 | 177 | } |
michael@0 | 178 | |
michael@0 | 179 | return combine_entropy_contexts(above_ec, left_ec); |
michael@0 | 180 | } |
michael@0 | 181 | |
michael@0 | 182 | static void get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size, |
michael@0 | 183 | PLANE_TYPE type, int block_idx, |
michael@0 | 184 | const int16_t **scan, const int16_t **scan_nb) { |
michael@0 | 185 | switch (tx_size) { |
michael@0 | 186 | case TX_4X4: |
michael@0 | 187 | get_scan_nb_4x4(get_tx_type_4x4(type, xd, block_idx), scan, scan_nb); |
michael@0 | 188 | break; |
michael@0 | 189 | case TX_8X8: |
michael@0 | 190 | get_scan_nb_8x8(get_tx_type_8x8(type, xd), scan, scan_nb); |
michael@0 | 191 | break; |
michael@0 | 192 | case TX_16X16: |
michael@0 | 193 | get_scan_nb_16x16(get_tx_type_16x16(type, xd), scan, scan_nb); |
michael@0 | 194 | break; |
michael@0 | 195 | case TX_32X32: |
michael@0 | 196 | *scan = vp9_default_scan_32x32; |
michael@0 | 197 | *scan_nb = vp9_default_scan_32x32_neighbors; |
michael@0 | 198 | break; |
michael@0 | 199 | default: |
michael@0 | 200 | assert(!"Invalid transform size."); |
michael@0 | 201 | } |
michael@0 | 202 | } |
michael@0 | 203 | |
michael@0 | 204 | #endif // VP9_COMMON_VP9_ENTROPY_H_ |