media/libvpx/vp9/common/vp9_entropy.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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_

mercurial