entropy.h 11.3 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
4 5 6 7 8 9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10 11
 */

12 13
#ifndef AV1_COMMON_ENTROPY_H_
#define AV1_COMMON_ENTROPY_H_
Jingning Han's avatar
Jingning Han committed
14

15
#include "./aom_config.h"
16
#include "aom/aom_integer.h"
17
#include "aom_dsp/prob.h"
Jingning Han's avatar
Jingning Han committed
18

19
#include "av1/common/common.h"
20
#include "av1/common/common_data.h"
21
#include "av1/common/enums.h"
Jingning Han's avatar
Jingning Han committed
22 23 24 25 26

#ifdef __cplusplus
extern "C" {
#endif

27
#define DIFF_UPDATE_PROB 252
28
#define GROUP_DIFF_UPDATE_PROB 252
Jingning Han's avatar
Jingning Han committed
29

hui su's avatar
hui su committed
30
#define TOKEN_CDF_Q_CTXS 4
hui su's avatar
hui su committed
31

Jingning Han's avatar
Jingning Han committed
32
// Coefficient token alphabet
33 34 35 36 37
#define ZERO_TOKEN 0        // 0     Extra Bits 0+0
#define ONE_TOKEN 1         // 1     Extra Bits 0+1
#define TWO_TOKEN 2         // 2     Extra Bits 0+1
#define THREE_TOKEN 3       // 3     Extra Bits 0+1
#define FOUR_TOKEN 4        // 4     Extra Bits 0+1
Jingning Han's avatar
Jingning Han committed
38 39 40 41 42 43
#define CATEGORY1_TOKEN 5   // 5-6   Extra Bits 1+1
#define CATEGORY2_TOKEN 6   // 7-10  Extra Bits 2+1
#define CATEGORY3_TOKEN 7   // 11-18 Extra Bits 3+1
#define CATEGORY4_TOKEN 8   // 19-34 Extra Bits 4+1
#define CATEGORY5_TOKEN 9   // 35-66 Extra Bits 5+1
#define CATEGORY6_TOKEN 10  // 67+   Extra Bits 14+1
44
#define EOB_TOKEN 11        // EOB   Extra Bits 0+0
45 46 47 48
#define NO_EOB 0            // Not an end-of-block
#define EARLY_EOB 1         // End of block before the last position
#define LAST_EOB 2          // End of block in the last position (implicit)
#define BLOCK_Z_TOKEN 255   // block zero
49 50
#define HEAD_TOKENS 5
#define TAIL_TOKENS 9
51 52 53 54
#define ONE_TOKEN_EOB 1
#define ONE_TOKEN_NEOB 2
#define TWO_TOKEN_PLUS_EOB 3
#define TWO_TOKEN_PLUS_NEOB 4
Jingning Han's avatar
Jingning Han committed
55 56 57 58
#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

59
#define TXB_SKIP_CONTEXTS 13
60

Jingning Han's avatar
Jingning Han committed
61
#define EOB_COEF_CONTEXTS 22
62

63
#define SIG_COEF_CONTEXTS_2D 26
64
#define SIG_COEF_CONTEXTS_1D 16
65
#define SIG_COEF_CONTEXTS_EOB 4
Dake He's avatar
Dake He committed
66
#define SIG_COEF_CONTEXTS (SIG_COEF_CONTEXTS_2D + SIG_COEF_CONTEXTS_1D)
67 68

#define COEFF_BASE_CONTEXTS (SIG_COEF_CONTEXTS)
69 70 71 72
#define DC_SIGN_CONTEXTS 3

#define BR_TMP_OFFSET 12
#define BR_REF_CAT 4
73
#define LEVEL_CONTEXTS 21
74 75

#define NUM_BASE_LEVELS 2
76 77 78

#define BR_CDF_SIZE (4)
#define COEFF_BASE_RANGE (4 * (BR_CDF_SIZE - 1))
79 80 81

#define COEFF_CONTEXT_BITS 6
#define COEFF_CONTEXT_MASK ((1 << COEFF_CONTEXT_BITS) - 1)
82 83

#define BASE_CONTEXT_POSITION_NUM 12
84 85 86 87 88 89 90 91

typedef enum TX_CLASS {
  TX_CLASS_2D = 0,
  TX_CLASS_HORIZ = 1,
  TX_CLASS_VERT = 2,
  TX_CLASSES = 3,
} TX_CLASS;

92
DECLARE_ALIGNED(16, extern const uint8_t, av1_pt_energy_class[ENTROPY_TOKENS]);
Jingning Han's avatar
Jingning Han committed
93

94 95 96 97 98 99
#define CAT1_MIN_VAL 5
#define CAT2_MIN_VAL 7
#define CAT3_MIN_VAL 11
#define CAT4_MIN_VAL 19
#define CAT5_MIN_VAL 35
#define CAT6_MIN_VAL 67
Jingning Han's avatar
Jingning Han committed
100

101
#define CAT6_BIT_SIZE 18
Jingning Han's avatar
Jingning Han committed
102
// Extra bit probabilities.
103 104 105 106 107 108
extern const aom_cdf_prob *av1_cat1_cdf[];
extern const aom_cdf_prob *av1_cat2_cdf[];
extern const aom_cdf_prob *av1_cat3_cdf[];
extern const aom_cdf_prob *av1_cat4_cdf[];
extern const aom_cdf_prob *av1_cat5_cdf[];
extern const aom_cdf_prob *av1_cat6_cdf[];
Jingning Han's avatar
Jingning Han committed
109 110 111 112

#define EOB_MODEL_TOKEN 3

typedef struct {
113
  const aom_cdf_prob **cdf;
Jingning Han's avatar
Jingning Han committed
114 115 116
  int len;
  int base_val;
  const int16_t *cost;
117
} av1_extra_bit;
Jingning Han's avatar
Jingning Han committed
118 119

// indexed by token value
120
extern const av1_extra_bit av1_extra_bits[ENTROPY_TOKENS];
Jingning Han's avatar
Jingning Han committed
121

122 123 124 125 126
static INLINE int av1_get_cat6_extrabits_size(TX_SIZE tx_size,
                                              aom_bit_depth_t bit_depth) {
  tx_size = txsize_sqr_up_map[tx_size];
  // TODO(debargha): Does TX_64X64 require an additional extrabit?
  if (tx_size > TX_32X32) tx_size = TX_32X32;
127 128
  int tx_offset = (int)(tx_size - TX_4X4);
  int bits = (int)bit_depth + 3 + tx_offset;
129
  // Round up
130
  bits = AOMMIN(CAT6_BIT_SIZE, ((bits + 3) & ~3));
131 132 133
  return bits;
}

134 135 136
#define DCT_MAX_VALUE 16384
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
Jingning Han's avatar
Jingning Han committed
137

138 139
/* Coefficients are predicted via a 3-dimensional probability table indexed on
 * REF_TYPES, COEF_BANDS and COEF_CONTEXTS. */
Jingning Han's avatar
Jingning Han committed
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
#define REF_TYPES 2  // intra=0, inter=1

/* Middle dimension reflects the coefficient position within the transform. */
#define COEF_BANDS 6

/* Inside dimension is measure of nearby complexity, that reflects the energy
   of nearby coefficients are nonzero.  For the first coefficient (DC, unless
   block type is 0), we look at the (already encoded) blocks above and to the
   left of the current block.  The context index is then the number (0,1,or 2)
   of these blocks having nonzero coefficients.
   After decoding a coefficient, the measure is determined by the size of the
   most recently decoded coefficient.
   Note that the intuitive meaning of this measure changes as coefficients
   are decoded, e.g., prior to the first token, a zero means that my neighbors
   are empty while, after the first token, because of the use of end-of-block,
   a zero means we just decoded a zero and hence guarantees that a non-zero
   coefficient will appear later in this block.  However, this shift
   in meaning is perfectly OK because our context depends also on the
   coefficient band (and since zigzag positions 0, 1, and 2 are in
   distinct bands). */
#define COEFF_CONTEXTS 6
161 162 163
#define COEFF_CONTEXTS0 3  // for band 0
#define BAND_COEFF_CONTEXTS(band) \
  ((band) == 0 ? COEFF_CONTEXTS0 : COEFF_CONTEXTS)
Jingning Han's avatar
Jingning Han committed
164

165 166
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
167

168
struct AV1Common;
169
struct frame_contexts;
170 171
void av1_default_coef_probs(struct AV1Common *cm);
void av1_adapt_coef_probs(struct AV1Common *cm);
Jingning Han's avatar
Jingning Han committed
172 173 174 175 176 177

// This is the index in the scan order beyond which all coefficients for
// 8x8 transform and above are in the top band.
// This macro is currently unused but may be used by certain implementations
#define MAXBAND_INDEX 21

178 179
DECLARE_ALIGNED(16, extern const uint8_t,
                av1_coefband_trans_8x8plus[MAX_TX_SQUARE]);
180 181
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x8_8x4[32]);
DECLARE_ALIGNED(16, extern const uint8_t, av1_coefband_trans_4x4[16]);
Jingning Han's avatar
Jingning Han committed
182 183

static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
184
  switch (tx_size) {
185
    case TX_4X4: return av1_coefband_trans_4x4;
186
    case TX_8X4:
187 188
    case TX_4X8: return av1_coefband_trans_4x8_8x4;
    default: return av1_coefband_trans_8x8plus;
189
  }
Jingning Han's avatar
Jingning Han committed
190 191 192 193 194
}

// 128 lists of probabilities are stored for the following ONE node probs:
// 1, 3, 5, 7, ..., 253, 255
// In between probabilities are interpolated linearly
195
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
196

197
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
198 199

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
200
#define TAIL_NODES (MODEL_NODES + 1)
Jingning Han's avatar
Jingning Han committed
201

202
typedef aom_cdf_prob coeff_cdf_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
203
                                    [CDF_SIZE(ENTROPY_TOKENS)];
204 205
extern const aom_cdf_prob av1_pareto8_token_probs[COEFF_PROB_MODELS]
                                                 [ENTROPY_TOKENS - 2];
206 207
extern const aom_cdf_prob av1_pareto8_tail_probs[COEFF_PROB_MODELS]
                                                [ENTROPY_TOKENS - 3];
208
struct frame_contexts;
209

210
void av1_coef_head_cdfs(struct frame_contexts *fc);
211 212
void av1_coef_pareto_cdfs(struct frame_contexts *fc);

Jingning Han's avatar
Jingning Han committed
213 214 215 216 217 218 219
typedef char ENTROPY_CONTEXT;

static INLINE int combine_entropy_contexts(ENTROPY_CONTEXT a,
                                           ENTROPY_CONTEXT b) {
  return (a != 0) + (b != 0);
}

220
static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
Jingning Han's avatar
Jingning Han committed
221 222 223
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

224
  switch (tx_size) {
Jingning Han's avatar
Jingning Han committed
225 226 227 228
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
229 230 231 232 233 234 235 236
    case TX_4X8:
      above_ec = a[0] != 0;
      left_ec = !!*(const uint16_t *)l;
      break;
    case TX_8X4:
      above_ec = !!*(const uint16_t *)a;
      left_ec = l[0] != 0;
      break;
237 238
    case TX_8X16:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
239
      left_ec = !!*(const uint32_t *)l;
240 241 242
      break;
    case TX_16X8:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
243
      left_ec = !!*(const uint16_t *)l;
244 245 246
      break;
    case TX_16X32:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
247
      left_ec = !!*(const uint64_t *)l;
248 249 250
      break;
    case TX_32X16:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
251
      left_ec = !!*(const uint32_t *)l;
252
      break;
Jingning Han's avatar
Jingning Han committed
253 254
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
255
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
256 257 258
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
259
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
260 261 262
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
263
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
264
      break;
265 266 267 268
    case TX_64X64:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
269 270 271 272 273 274 275 276
    case TX_32X64:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
    case TX_64X32:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!*(const uint64_t *)l;
      break;
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
    case TX_4X16:
      above_ec = a[0] != 0;
      left_ec = !!*(const uint32_t *)l;
      break;
    case TX_16X4:
      above_ec = !!*(const uint32_t *)a;
      left_ec = l[0] != 0;
      break;
    case TX_8X32:
      above_ec = !!*(const uint16_t *)a;
      left_ec = !!*(const uint64_t *)l;
      break;
    case TX_32X8:
      above_ec = !!*(const uint64_t *)a;
      left_ec = !!*(const uint16_t *)l;
      break;
293 294 295 296 297 298 299 300
    case TX_16X64:
      above_ec = !!*(const uint32_t *)a;
      left_ec = !!(*(const uint64_t *)l | *(const uint64_t *)(l + 8));
      break;
    case TX_64X16:
      above_ec = !!(*(const uint64_t *)a | *(const uint64_t *)(a + 8));
      left_ec = !!*(const uint32_t *)l;
      break;
301
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
302 303 304 305
  }
  return combine_entropy_contexts(above_ec, left_ec);
}

306 307 308 309 310
#define COEF_COUNT_SAT 24
#define COEF_MAX_UPDATE_FACTOR 112
#define COEF_COUNT_SAT_AFTER_KEY 24
#define COEF_MAX_UPDATE_FACTOR_AFTER_KEY 128

311 312 313 314 315
static INLINE TX_SIZE get_txsize_entropy_ctx(TX_SIZE txsize) {
  return (TX_SIZE)((txsize_sqr_map[txsize] + txsize_sqr_up_map[txsize] + 1) >>
                   1);
}

316 317
void av1_average_tile_coef_cdfs(struct frame_contexts *fc,
                                struct frame_contexts *ec_ctxs[],
318
                                aom_cdf_prob *cdf_ptrs[], int num_tiles);
319 320
void av1_average_tile_mv_cdfs(struct frame_contexts *fc,
                              struct frame_contexts *ec_ctxs[],
321
                              aom_cdf_prob *cdf_ptrs[], int num_tiles);
322 323
void av1_average_tile_intra_cdfs(struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
324
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
325 326 327
void av1_average_tile_inter_cdfs(struct AV1Common *cm,
                                 struct frame_contexts *fc,
                                 struct frame_contexts *ec_ctxs[],
328
                                 aom_cdf_prob *cdf_ptrs[], int num_tiles);
329 330 331
void av1_average_tile_loopfilter_cdfs(struct frame_contexts *fc,
                                      struct frame_contexts *ec_ctxs[],
                                      aom_cdf_prob *cdf_ptrs[], int num_tiles);
Jingning Han's avatar
Jingning Han committed
332 333 334 335
#ifdef __cplusplus
}  // extern "C"
#endif

336
#endif  // AV1_COMMON_ENTROPY_H_