entropy.h 7.54 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
2
3
4
5
6
7
8
9
10
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  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.
 */

11
12
#ifndef VP10_COMMON_ENTROPY_H_
#define VP10_COMMON_ENTROPY_H_
Jingning Han's avatar
Jingning Han committed
13

Yaowu Xu's avatar
Yaowu Xu committed
14
15
#include "aom/vpx_integer.h"
#include "aom_dsp/prob.h"
Jingning Han's avatar
Jingning Han committed
16

Yaowu Xu's avatar
Yaowu Xu committed
17
18
#include "av1/common/common.h"
#include "av1/common/enums.h"
Jingning Han's avatar
Jingning Han committed
19
20
21
22
23

#ifdef __cplusplus
extern "C" {
#endif

clang-format's avatar
clang-format committed
24
25
#define DIFF_UPDATE_PROB 252
#define GROUP_DIFF_UPDATE_PROB 252
Jingning Han's avatar
Jingning Han committed
26
27

// Coefficient token alphabet
clang-format's avatar
clang-format committed
28
29
30
31
32
#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
33
34
35
36
37
38
#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
clang-format's avatar
clang-format committed
39
#define EOB_TOKEN 11        // EOB   Extra Bits 0+0
Jingning Han's avatar
Jingning Han committed
40
41
42
43
44
45
46

#define ENTROPY_TOKENS 12

#define ENTROPY_NODES 11

DECLARE_ALIGNED(16, extern const uint8_t, vp10_pt_energy_class[ENTROPY_TOKENS]);

clang-format's avatar
clang-format committed
47
48
49
50
51
52
#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
53
54
55
56
57
58
59
60
61

// Extra bit probabilities.
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat1_prob[1]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat2_prob[2]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat3_prob[3]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat4_prob[4]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat5_prob[5]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat6_prob[14]);

62
#if CONFIG_VPX_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
63
64
65
66
67
68
69
70
71
72
73
74
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat1_prob_high10[1]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat2_prob_high10[2]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat3_prob_high10[3]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat4_prob_high10[4]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat5_prob_high10[5]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat6_prob_high10[16]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat1_prob_high12[1]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat2_prob_high12[2]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat3_prob_high12[3]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat4_prob_high12[4]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat5_prob_high12[5]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_cat6_prob_high12[18]);
75
#endif  // CONFIG_VPX_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
76
77
78
79
80
81
82
83
84
85
86
87
88

#define EOB_MODEL_TOKEN 3

typedef struct {
  const vpx_tree_index *tree;
  const vpx_prob *prob;
  int len;
  int base_val;
  const int16_t *cost;
} vp10_extra_bit;

// indexed by token value
extern const vp10_extra_bit vp10_extra_bits[ENTROPY_TOKENS];
89
#if CONFIG_VPX_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
90
91
extern const vp10_extra_bit vp10_extra_bits_high10[ENTROPY_TOKENS];
extern const vp10_extra_bit vp10_extra_bits_high12[ENTROPY_TOKENS];
92
#endif  // CONFIG_VPX_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
93

clang-format's avatar
clang-format committed
94
#define DCT_MAX_VALUE 16384
95
#if CONFIG_VPX_HIGHBITDEPTH
clang-format's avatar
clang-format committed
96
97
#define DCT_MAX_VALUE_HIGH10 65536
#define DCT_MAX_VALUE_HIGH12 262144
98
#endif  // CONFIG_VPX_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

/* Coefficients are predicted via a 3-dimensional probability table. */

#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
#define BAND_COEFF_CONTEXTS(band) ((band) == 0 ? 3 : COEFF_CONTEXTS)

// #define ENTROPY_STATS

clang-format's avatar
clang-format committed
128
129
130
131
typedef unsigned int
    vp10_coeff_count[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS][ENTROPY_TOKENS];
typedef unsigned int
    vp10_coeff_stats[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS][ENTROPY_NODES][2];
Jingning Han's avatar
Jingning Han committed
132

clang-format's avatar
clang-format committed
133
134
#define SUBEXP_PARAM 4   /* Subexponential code parameter */
#define MODULUS_PARAM 13 /* Modulus parameter */
Jingning Han's avatar
Jingning Han committed
135

Yaowu Xu's avatar
Yaowu Xu committed
136
137
138
struct VP10Common;
void vp10_default_coef_probs(struct VP10Common *cm);
void vp10_adapt_coef_probs(struct VP10Common *cm);
Jingning Han's avatar
Jingning Han committed
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

// 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

DECLARE_ALIGNED(16, extern const uint8_t, vp10_coefband_trans_8x8plus[1024]);
DECLARE_ALIGNED(16, extern const uint8_t, vp10_coefband_trans_4x4[16]);

static INLINE const uint8_t *get_band_translate(TX_SIZE tx_size) {
  return tx_size == TX_4X4 ? vp10_coefband_trans_4x4
                           : vp10_coefband_trans_8x8plus;
}

// 128 lists of probabilities are stored for the following ONE node probs:
// 1, 3, 5, 7, ..., 253, 255
// In between probabilities are interpolated linearly

157
#define COEFF_PROB_MODELS 255
Jingning Han's avatar
Jingning Han committed
158

clang-format's avatar
clang-format committed
159
#define UNCONSTRAINED_NODES 3
Jingning Han's avatar
Jingning Han committed
160

clang-format's avatar
clang-format committed
161
#define PIVOT_NODE 2  // which node is pivot
Jingning Han's avatar
Jingning Han committed
162
163
164
165
166

#define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
extern const vpx_tree_index vp10_coef_con_tree[TREE_SIZE(ENTROPY_TOKENS)];
extern const vpx_prob vp10_pareto8_full[COEFF_PROB_MODELS][MODEL_NODES];

clang-format's avatar
clang-format committed
167
168
typedef vpx_prob vp10_coeff_probs_model[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
                                       [UNCONSTRAINED_NODES];
Jingning Han's avatar
Jingning Han committed
169

clang-format's avatar
clang-format committed
170
171
typedef unsigned int vp10_coeff_count_model
    [REF_TYPES][COEF_BANDS][COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1];
Jingning Han's avatar
Jingning Han committed
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192

void vp10_model_to_full_probs(const vpx_prob *model, vpx_prob *full);

typedef char ENTROPY_CONTEXT;

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

static INLINE int get_entropy_context(TX_SIZE tx_size, const ENTROPY_CONTEXT *a,
                                      const ENTROPY_CONTEXT *l) {
  ENTROPY_CONTEXT above_ec = 0, left_ec = 0;

  switch (tx_size) {
    case TX_4X4:
      above_ec = a[0] != 0;
      left_ec = l[0] != 0;
      break;
    case TX_8X8:
      above_ec = !!*(const uint16_t *)a;
clang-format's avatar
clang-format committed
193
      left_ec = !!*(const uint16_t *)l;
Jingning Han's avatar
Jingning Han committed
194
195
196
      break;
    case TX_16X16:
      above_ec = !!*(const uint32_t *)a;
clang-format's avatar
clang-format committed
197
      left_ec = !!*(const uint32_t *)l;
Jingning Han's avatar
Jingning Han committed
198
199
200
      break;
    case TX_32X32:
      above_ec = !!*(const uint64_t *)a;
clang-format's avatar
clang-format committed
201
      left_ec = !!*(const uint64_t *)l;
Jingning Han's avatar
Jingning Han committed
202
      break;
clang-format's avatar
clang-format committed
203
    default: assert(0 && "Invalid transform size."); break;
Jingning Han's avatar
Jingning Han committed
204
205
206
207
208
209
210
211
212
  }

  return combine_entropy_contexts(above_ec, left_ec);
}

#ifdef __cplusplus
}  // extern "C"
#endif

213
#endif  // VP10_COMMON_ENTROPY_H_