detokenize.c 22 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


12
13
#include "vp9/common/type_aliases.h"
#include "vp9/common/blockd.h"
John Koleszar's avatar
John Koleszar committed
14
15
16
#include "onyxd_int.h"
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/mem.h"
17
#include "detokenize.h"
John Koleszar's avatar
John Koleszar committed
18

19
#include "vp9/common/seg_common.h"
20

John Koleszar's avatar
John Koleszar committed
21
22
23
#define BOOL_DATA UINT8

#define OCB_X PREV_COEF_CONTEXTS * ENTROPY_NODES
24

25
DECLARE_ALIGNED(16, static const int, coef_bands_x[16]) = {
John Koleszar's avatar
John Koleszar committed
26
27
28
29
  0 * OCB_X, 1 * OCB_X, 2 * OCB_X, 3 * OCB_X,
  6 * OCB_X, 4 * OCB_X, 5 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X
30
};
31
DECLARE_ALIGNED(16, static const int, coef_bands_x_8x8[64]) = {
32
33
34
35
36
37
38
39
40
  0 * OCB_X, 1 * OCB_X, 2 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 4 * OCB_X, 5 * OCB_X,
  5 * OCB_X, 3 * OCB_X, 6 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 5 * OCB_X, 5 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
};
Yaowu Xu's avatar
Yaowu Xu committed
41

42
DECLARE_ALIGNED(16, static const int, coef_bands_x_16x16[256]) = {
Daniel Kang's avatar
Daniel Kang committed
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  0 * OCB_X, 1 * OCB_X, 2 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 4 * OCB_X, 5 * OCB_X, 5 * OCB_X, 3 * OCB_X, 6 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 5 * OCB_X, 5 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X,
  6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X,
  7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X
};

John Koleszar's avatar
John Koleszar committed
61
62
63
64
65
66
67
68
69
70
71
72
#define EOB_CONTEXT_NODE            0
#define ZERO_CONTEXT_NODE           1
#define ONE_CONTEXT_NODE            2
#define LOW_VAL_CONTEXT_NODE        3
#define TWO_CONTEXT_NODE            4
#define THREE_CONTEXT_NODE          5
#define HIGH_LOW_CONTEXT_NODE       6
#define CAT_ONE_CONTEXT_NODE        7
#define CAT_THREEFOUR_CONTEXT_NODE  8
#define CAT_THREE_CONTEXT_NODE      9
#define CAT_FIVE_CONTEXT_NODE       10

Scott LaVarnway's avatar
Scott LaVarnway committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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
#define CAT1_PROB0    159
#define CAT2_PROB0    145
#define CAT2_PROB1    165

#define CAT3_PROB0 140
#define CAT3_PROB1 148
#define CAT3_PROB2 173

#define CAT4_PROB0 135
#define CAT4_PROB1 140
#define CAT4_PROB2 155
#define CAT4_PROB3 176

#define CAT5_PROB0 130
#define CAT5_PROB1 134
#define CAT5_PROB2 141
#define CAT5_PROB3 157
#define CAT5_PROB4 180

98
static const unsigned char cat6_prob[14] =
99
{ 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 };
John Koleszar's avatar
John Koleszar committed
100

101
void vp9_reset_mb_tokens_context(MACROBLOCKD* const xd) {
John Koleszar's avatar
John Koleszar committed
102
  /* Clear entropy contexts for Y2 blocks */
Paul Wilkins's avatar
Paul Wilkins committed
103
104
105
  if ((xd->mode_info_context->mbmi.mode != B_PRED &&
      xd->mode_info_context->mbmi.mode != I8X8_PRED &&
      xd->mode_info_context->mbmi.mode != SPLITMV)
Deb Mukherjee's avatar
Deb Mukherjee committed
106
      || xd->mode_info_context->mbmi.txfm_size == TX_16X16
Daniel Kang's avatar
Daniel Kang committed
107
      ) {
Paul Wilkins's avatar
Paul Wilkins committed
108
109
    vpx_memset(xd->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
    vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
John Koleszar's avatar
John Koleszar committed
110
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
111
112
    vpx_memset(xd->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
    vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
John Koleszar's avatar
John Koleszar committed
113
  }
John Koleszar's avatar
John Koleszar committed
114
}
115

116
DECLARE_ALIGNED(16, extern const unsigned char, vp9_norm[256]);
117

John Koleszar's avatar
John Koleszar committed
118
// #define PREV_CONTEXT_INC(val) (2+((val)>2))
119
120
// #define PREV_CONTEXT_INC(val) (vp9_prev_token_class[(val)])
#define PREV_CONTEXT_INC(val) (vp9_prev_token_class[(val)>10?10:(val)])
121

122
static int get_token(int v) {
John Koleszar's avatar
John Koleszar committed
123
124
125
126
127
128
129
130
131
132
133
134
  if (v < 0) v = -v;
  if (v == 0) return ZERO_TOKEN;
  else if (v == 1) return ONE_TOKEN;
  else if (v == 2) return TWO_TOKEN;
  else if (v == 3) return THREE_TOKEN;
  else if (v == 4) return FOUR_TOKEN;
  else if (v <= 6) return DCT_VAL_CATEGORY1;
  else if (v <= 10) return DCT_VAL_CATEGORY2;
  else if (v <= 18) return DCT_VAL_CATEGORY3;
  else if (v <= 34) return DCT_VAL_CATEGORY4;
  else if (v <= 66) return DCT_VAL_CATEGORY5;
  else return DCT_VAL_CATEGORY6;
135
136
}

Jingning Han's avatar
Jingning Han committed
137
void static count_tokens_adaptive_scan(const MACROBLOCKD *xd, INT16 *qcoeff_ptr,
138
                                       int block, PLANE_TYPE type,
139
140
141
                                       TX_TYPE tx_type,
                                       ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                                       int eob, int seg_eob,
Jingning Han's avatar
Jingning Han committed
142
143
144
145
                                       FRAME_CONTEXT *fc) {
  int c, pt, token, band;
  const int *scan;

146
147
  switch(tx_type) {
    case ADST_DCT :
148
      scan = vp9_row_scan;
149
      break;
Jingning Han's avatar
Jingning Han committed
150

151
    case DCT_ADST :
152
      scan = vp9_col_scan;
153
      break;
Jingning Han's avatar
Jingning Han committed
154

155
    default :
156
      scan = vp9_default_zig_zag1d;
157
      break;
Jingning Han's avatar
Jingning Han committed
158
159
  }

160
  VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
Jingning Han's avatar
Jingning Han committed
161
162
163
  for (c = !type; c < eob; ++c) {
    int rc = scan[c];
    int v = qcoeff_ptr[rc];
164
    band = vp9_coef_bands[c];
Jingning Han's avatar
Jingning Han committed
165
    token = get_token(v);
166
167
168
169
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts[type][band][pt][token]++;
    else
      fc->coef_counts[type][band][pt][token]++;
170
    pt = vp9_prev_token_class[token];
Jingning Han's avatar
Jingning Han committed
171
172
173
  }

  if (eob < seg_eob) {
174
    band = vp9_coef_bands[c];
175
176
177
178
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts[type][band][pt][DCT_EOB_TOKEN]++;
    else
      fc->coef_counts[type][band][pt][DCT_EOB_TOKEN]++;
Jingning Han's avatar
Jingning Han committed
179
180
181
  }
}

182
void static count_tokens(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
183
                         ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
John Koleszar's avatar
John Koleszar committed
184
185
                         int eob, int seg_eob, FRAME_CONTEXT *const fc) {
  int c, pt, token, band;
186
  VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
John Koleszar's avatar
John Koleszar committed
187
  for (c = !type; c < eob; ++c) {
188
    int rc = vp9_default_zig_zag1d[c];
John Koleszar's avatar
John Koleszar committed
189
    int v = qcoeff_ptr[rc];
190
    band = vp9_coef_bands[c];
John Koleszar's avatar
John Koleszar committed
191
192
    token = get_token(v);
    fc->coef_counts[type][band][pt][token]++;
193
    pt = vp9_prev_token_class[token];
John Koleszar's avatar
John Koleszar committed
194
195
  }
  if (eob < seg_eob) {
196
    band = vp9_coef_bands[c];
John Koleszar's avatar
John Koleszar committed
197
198
    fc->coef_counts[type][band][pt][DCT_EOB_TOKEN]++;
  }
199
200
}

201
void static count_tokens_8x8(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
202
                             TX_TYPE tx_type,
203
                             ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
John Koleszar's avatar
John Koleszar committed
204
205
                             int eob, int seg_eob, FRAME_CONTEXT *fc) {
  int c, pt, token, band;
206
  VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
John Koleszar's avatar
John Koleszar committed
207
  for (c = !type; c < eob; ++c) {
208
    int rc = (type == 1 ? vp9_default_zig_zag1d[c] : vp9_default_zig_zag1d_8x8[c]);
John Koleszar's avatar
John Koleszar committed
209
    int v = qcoeff_ptr[rc];
210
    band = (type == 1 ? vp9_coef_bands[c] : vp9_coef_bands_8x8[c]);
John Koleszar's avatar
John Koleszar committed
211
    token = get_token(v);
212
213
214
215
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts_8x8[type][band][pt][token]++;
    else
      fc->coef_counts_8x8[type][band][pt][token]++;
216
    pt = vp9_prev_token_class[token];
John Koleszar's avatar
John Koleszar committed
217
218
  }
  if (eob < seg_eob) {
219
    band = (type == 1 ? vp9_coef_bands[c] : vp9_coef_bands_8x8[c]);
220
221
222
223
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]++;
    else
      fc->coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]++;
John Koleszar's avatar
John Koleszar committed
224
  }
225
226
}

227
void static count_tokens_16x16(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
228
                               TX_TYPE tx_type,
Daniel Kang's avatar
Daniel Kang committed
229
230
231
                               ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                               int eob, int seg_eob, FRAME_CONTEXT *fc) {
  int c, pt, token;
232
  VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
Daniel Kang's avatar
Daniel Kang committed
233
  for (c = !type; c < eob; ++c) {
234
    int rc = vp9_default_zig_zag1d_16x16[c];
Daniel Kang's avatar
Daniel Kang committed
235
    int v = qcoeff_ptr[rc];
236
    int band = vp9_coef_bands_16x16[c];
Daniel Kang's avatar
Daniel Kang committed
237
    token = get_token(v);
238
239
240
241
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts_16x16[type][band][pt][token]++;
    else
      fc->coef_counts_16x16[type][band][pt][token]++;
242
    pt = vp9_prev_token_class[token];
Daniel Kang's avatar
Daniel Kang committed
243
244
  }
  if (eob < seg_eob) {
245
    int band = vp9_coef_bands_16x16[c];
246
247
248
249
    if (tx_type != DCT_DCT)
      fc->hybrid_coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]++;
    else
      fc->coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]++;
Daniel Kang's avatar
Daniel Kang committed
250
251
  }
}
Yaowu Xu's avatar
Yaowu Xu committed
252

253
static int get_signed(BOOL_DECODER *br, int value_to_sign) {
John Koleszar's avatar
John Koleszar committed
254
  const int split = (br->range + 1) >> 1;
255
  const VP9_BD_VALUE bigsplit = (VP9_BD_VALUE)split << (VP9_BD_VALUE_SIZE - 8);
John Koleszar's avatar
John Koleszar committed
256
  int v;
John Koleszar's avatar
John Koleszar committed
257

John Koleszar's avatar
John Koleszar committed
258
  if (br->count < 0)
259
    vp9_bool_decoder_fill(br);
John Koleszar's avatar
John Koleszar committed
260

John Koleszar's avatar
John Koleszar committed
261
262
263
264
265
266
267
268
269
270
271
  if (br->value < bigsplit) {
    br->range = split;
    v = value_to_sign;
  } else {
    br->range = br->range - split;
    br->value = br->value - bigsplit;
    v = -value_to_sign;
  }
  br->range += br->range;
  br->value += br->value;
  --br->count;
Fritz Koenig's avatar
Fritz Koenig committed
272

John Koleszar's avatar
John Koleszar committed
273
  return v;
Daniel Kang's avatar
Daniel Kang committed
274
}
John Koleszar's avatar
John Koleszar committed
275

Daniel Kang's avatar
Daniel Kang committed
276
277
278
#define WRITE_COEF_CONTINUE(val)                              \
  {                                                           \
    prob = coef_probs + (ENTROPY_NODES*PREV_CONTEXT_INC(val));\
279
    qcoeff_ptr[scan[c]] = (INT16) get_signed(br, val);        \
John Koleszar's avatar
John Koleszar committed
280
281
282
    c++;                                                      \
    continue;                                                 \
  }
John Koleszar's avatar
John Koleszar committed
283

Daniel Kang's avatar
Daniel Kang committed
284
285
#define ADJUST_COEF(prob, bits_count)  \
  do {                                 \
286
    if (vp9_read(br, prob))            \
John Koleszar's avatar
John Koleszar committed
287
288
      val += (UINT16)(1 << bits_count);\
  } while (0);
John Koleszar's avatar
John Koleszar committed
289

290
static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
John Koleszar's avatar
John Koleszar committed
291
292
293
294
295
296
297
                        BOOL_DECODER* const br,
                        ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                        PLANE_TYPE type,
                        TX_TYPE tx_type,
                        int seg_eob, INT16 *qcoeff_ptr, int i,
                        const int *const scan, int block_type,
                        const int *coef_bands) {
John Koleszar's avatar
John Koleszar committed
298
  FRAME_CONTEXT *const fc = &dx->common.fc;
299
  int tmp, c = (type == PLANE_TYPE_Y_NO_DC);
300
  const vp9_prob *prob, *coef_probs;
Daniel Kang's avatar
Daniel Kang committed
301
302

  switch (block_type) {
Daniel Kang's avatar
Daniel Kang committed
303
    default:
Daniel Kang's avatar
Daniel Kang committed
304
    case TX_4X4:
305
306
307
      coef_probs =
        tx_type != DCT_DCT ? fc->hybrid_coef_probs[type][0][0] :
        fc->coef_probs[type][0][0];
Daniel Kang's avatar
Daniel Kang committed
308
309
      break;
    case TX_8X8:
310
311
312
      coef_probs =
        tx_type != DCT_DCT ? fc->hybrid_coef_probs_8x8[type][0][0] :
        fc->coef_probs_8x8[type][0][0];
Daniel Kang's avatar
Daniel Kang committed
313
      break;
Daniel Kang's avatar
Daniel Kang committed
314
    case TX_16X16:
315
316
317
      coef_probs =
        tx_type != DCT_DCT ? fc->hybrid_coef_probs_16x16[type][0][0] :
        fc->coef_probs_16x16[type][0][0];
Daniel Kang's avatar
Daniel Kang committed
318
319
      break;
  }
John Koleszar's avatar
John Koleszar committed
320

321
  VP9_COMBINEENTROPYCONTEXTS(tmp, *a, *l);
Daniel Kang's avatar
Daniel Kang committed
322
  prob = coef_probs + tmp * ENTROPY_NODES;
John Koleszar's avatar
John Koleszar committed
323
324
325
326

  while (1) {
    int val;
    const uint8_t *cat6 = cat6_prob;
327
    if (c >= seg_eob) break;
Daniel Kang's avatar
Daniel Kang committed
328
    prob += coef_bands[c];
329
    if (!vp9_read(br, prob[EOB_CONTEXT_NODE]))
John Koleszar's avatar
John Koleszar committed
330
      break;
Daniel Kang's avatar
Daniel Kang committed
331
SKIP_START:
332
    if (c >= seg_eob) break;
333
    if (!vp9_read(br, prob[ZERO_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
334
      ++c;
Daniel Kang's avatar
Daniel Kang committed
335
      prob = coef_probs + coef_bands[c];
John Koleszar's avatar
John Koleszar committed
336
337
338
      goto SKIP_START;
    }
    // ONE_CONTEXT_NODE_0_
339
    if (!vp9_read(br, prob[ONE_CONTEXT_NODE])) {
Daniel Kang's avatar
Daniel Kang committed
340
      prob = coef_probs + ENTROPY_NODES;
341
      qcoeff_ptr[scan[c]] = (INT16) get_signed(br, 1);
John Koleszar's avatar
John Koleszar committed
342
343
344
345
      ++c;
      continue;
    }
    // LOW_VAL_CONTEXT_NODE_0_
346
347
    if (!vp9_read(br, prob[LOW_VAL_CONTEXT_NODE])) {
      if (!vp9_read(br, prob[TWO_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
348
349
        WRITE_COEF_CONTINUE(2);
      }
350
      if (!vp9_read(br, prob[THREE_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
351
352
353
354
355
        WRITE_COEF_CONTINUE(3);
      }
      WRITE_COEF_CONTINUE(4);
    }
    // HIGH_LOW_CONTEXT_NODE_0_
356
357
    if (!vp9_read(br, prob[HIGH_LOW_CONTEXT_NODE])) {
      if (!vp9_read(br, prob[CAT_ONE_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
358
359
        val = CAT1_MIN_VAL;
        ADJUST_COEF(CAT1_PROB0, 0);
Daniel Kang's avatar
Daniel Kang committed
360
        WRITE_COEF_CONTINUE(val);
John Koleszar's avatar
John Koleszar committed
361
362
363
364
365
      }
      val = CAT2_MIN_VAL;
      ADJUST_COEF(CAT2_PROB1, 1);
      ADJUST_COEF(CAT2_PROB0, 0);
      WRITE_COEF_CONTINUE(val);
Daniel Kang's avatar
Daniel Kang committed
366
    }
John Koleszar's avatar
John Koleszar committed
367
    // CAT_THREEFOUR_CONTEXT_NODE_0_
368
369
    if (!vp9_read(br, prob[CAT_THREEFOUR_CONTEXT_NODE])) {
      if (!vp9_read(br, prob[CAT_THREE_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
370
371
372
373
374
375
376
377
378
379
380
381
382
383
        val = CAT3_MIN_VAL;
        ADJUST_COEF(CAT3_PROB2, 2);
        ADJUST_COEF(CAT3_PROB1, 1);
        ADJUST_COEF(CAT3_PROB0, 0);
        WRITE_COEF_CONTINUE(val);
      }
      val = CAT4_MIN_VAL;
      ADJUST_COEF(CAT4_PROB3, 3);
      ADJUST_COEF(CAT4_PROB2, 2);
      ADJUST_COEF(CAT4_PROB1, 1);
      ADJUST_COEF(CAT4_PROB0, 0);
      WRITE_COEF_CONTINUE(val);
    }
    // CAT_FIVE_CONTEXT_NODE_0_:
384
    if (!vp9_read(br, prob[CAT_FIVE_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
385
386
387
388
389
390
391
392
393
394
      val = CAT5_MIN_VAL;
      ADJUST_COEF(CAT5_PROB4, 4);
      ADJUST_COEF(CAT5_PROB3, 3);
      ADJUST_COEF(CAT5_PROB2, 2);
      ADJUST_COEF(CAT5_PROB1, 1);
      ADJUST_COEF(CAT5_PROB0, 0);
      WRITE_COEF_CONTINUE(val);
    }
    val = 0;
    while (*cat6) {
395
      val = (val << 1) | vp9_read(br, *cat6++);
John Koleszar's avatar
John Koleszar committed
396
397
398
399
    }
    val += CAT6_MIN_VAL;
    WRITE_COEF_CONTINUE(val);
  }
Jingning Han's avatar
Jingning Han committed
400

Daniel Kang's avatar
Daniel Kang committed
401
  if (block_type == TX_4X4) {
402
403
404
    count_tokens_adaptive_scan(xd, qcoeff_ptr, i, type,
                               tx_type,
                               a, l, c, seg_eob, fc);
Daniel Kang's avatar
Daniel Kang committed
405
406
  }
  else if (block_type == TX_8X8)
407
408
409
    count_tokens_8x8(qcoeff_ptr, i, type,
                     tx_type,
                     a, l, c, seg_eob, fc);
Daniel Kang's avatar
Daniel Kang committed
410
  else
411
412
413
    count_tokens_16x16(qcoeff_ptr, i, type,
                       tx_type,
                       a, l, c, seg_eob, fc);
John Koleszar's avatar
John Koleszar committed
414
  return c;
Daniel Kang's avatar
Daniel Kang committed
415
}
John Koleszar's avatar
John Koleszar committed
416

417
418
419
420
421
422
423
424
425
426
427

int get_eob(MACROBLOCKD* const xd, int segment_id, int eob_max) {
  int active = vp9_segfeature_active(xd, segment_id, SEG_LVL_EOB);
  int eob = vp9_get_segdata(xd, segment_id, SEG_LVL_EOB);

  if (!active || eob > eob_max)
    eob = eob_max;
  return eob;
}


428
429
int vp9_decode_mb_tokens_16x16(VP9D_COMP* const pbi,
                               MACROBLOCKD* const xd,
John Koleszar's avatar
John Koleszar committed
430
                               BOOL_DECODER* const bc) {
Daniel Kang's avatar
Daniel Kang committed
431
432
433
  ENTROPY_CONTEXT* const A = (ENTROPY_CONTEXT *)xd->above_context;
  ENTROPY_CONTEXT* const L = (ENTROPY_CONTEXT *)xd->left_context;

Yunqing Wang's avatar
Yunqing Wang committed
434
  unsigned short* const eobs = xd->eobs;
435
436
  PLANE_TYPE type;
  int c, i, eobtotal = 0, seg_eob;
Daniel Kang's avatar
Daniel Kang committed
437
438
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
439
  TX_TYPE tx_type = get_tx_type(xd, &xd->block[0]);
Daniel Kang's avatar
Daniel Kang committed
440
441

  type = PLANE_TYPE_Y_WITH_DC;
442
  seg_eob = get_eob(xd, segment_id, 256);
Daniel Kang's avatar
Daniel Kang committed
443
444
445

  // Luma block
  {
446
    const int* const scan = vp9_default_zig_zag1d_16x16;
John Koleszar's avatar
John Koleszar committed
447
448
449
450
    c = decode_coefs(pbi, xd, bc, A, L, type,
                     tx_type,
                     seg_eob, qcoeff_ptr,
                     0, scan, TX_16X16, coef_bands_x_16x16);
Daniel Kang's avatar
Daniel Kang committed
451
    eobs[0] = c;
452
453
454
    A[0] = L[0] = (c != !type);
    A[1] = A[2] = A[3] = A[0];
    L[1] = L[2] = L[3] = L[0];
Daniel Kang's avatar
Daniel Kang committed
455
456
457
458
459
460
    eobtotal += c;
  }

  // 8x8 chroma blocks
  qcoeff_ptr += 256;
  type = PLANE_TYPE_UV;
461
  tx_type = DCT_DCT;
462
  seg_eob = get_eob(xd, segment_id, 64);
Daniel Kang's avatar
Daniel Kang committed
463
  for (i = 16; i < 24; i += 4) {
464
465
466
    ENTROPY_CONTEXT* const a = A + vp9_block2above_8x8[i];
    ENTROPY_CONTEXT* const l = L + vp9_block2left_8x8[i];
    const int* const scan = vp9_default_zig_zag1d_8x8;
Daniel Kang's avatar
Daniel Kang committed
467

John Koleszar's avatar
John Koleszar committed
468
469
470
471
    c = decode_coefs(pbi, xd, bc, a, l, type,
                     tx_type,
                     seg_eob, qcoeff_ptr,
                     i, scan, TX_8X8, coef_bands_x_8x8);
Daniel Kang's avatar
Daniel Kang committed
472
473
474
475
476
477
478
479
480
481
482
483
    a[0] = l[0] = ((eobs[i] = c) != !type);
    a[1] = a[0];
    l[1] = l[0];

    eobtotal += c;
    qcoeff_ptr += 64;
  }
  vpx_memset(&A[8], 0, sizeof(A[8]));
  vpx_memset(&L[8], 0, sizeof(L[8]));
  return eobtotal;
}

484
485
int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
                             MACROBLOCKD* const xd,
John Koleszar's avatar
John Koleszar committed
486
                             BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
487
488
489
  ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
  ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;

Yunqing Wang's avatar
Yunqing Wang committed
490
  unsigned short *const eobs = xd->eobs;
491
492
  PLANE_TYPE type;
  int c, i, eobtotal = 0, seg_eob;
John Koleszar's avatar
John Koleszar committed
493
494
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
495
  TX_TYPE tx_type = DCT_DCT;
496

497
498
  int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
                  xd->mode_info_context->mbmi.mode == SPLITMV) ? 16 : 24;
499
500
501
  if (xd->mode_info_context->mbmi.mode != B_PRED &&
      xd->mode_info_context->mbmi.mode != SPLITMV &&
      xd->mode_info_context->mbmi.mode != I8X8_PRED) {
502
503
504
    ENTROPY_CONTEXT *const a = A + vp9_block2above_8x8[24];
    ENTROPY_CONTEXT *const l = L + vp9_block2left_8x8[24];
    const int *const scan = vp9_default_zig_zag1d;
John Koleszar's avatar
John Koleszar committed
505
    type = PLANE_TYPE_Y2;
506

507
    seg_eob = get_eob(xd, segment_id, 4);
John Koleszar's avatar
John Koleszar committed
508
509
510
511
    c = decode_coefs(pbi, xd, bc, a, l, type,
                     tx_type,
                     seg_eob, qcoeff_ptr + 24 * 16,
                     24, scan, TX_8X8, coef_bands_x);
John Koleszar's avatar
John Koleszar committed
512
513
514
515
516
517
518
519
    a[0] = l[0] = ((eobs[24] = c) != !type);

    eobtotal += c - 4;

    type = PLANE_TYPE_Y_NO_DC;
  } else
    type = PLANE_TYPE_Y_WITH_DC;

520
  seg_eob = get_eob(xd, segment_id, 64);
521
522

  for (i = 0; i < bufthred ; i += 4) {
523
524
525
    ENTROPY_CONTEXT *const a = A + vp9_block2above_8x8[i];
    ENTROPY_CONTEXT *const l = L + vp9_block2left_8x8[i];
    const int *const scan = vp9_default_zig_zag1d_8x8;
526
    tx_type = DCT_DCT;
527

John Koleszar's avatar
John Koleszar committed
528
529
    if (i == 16)
      type = PLANE_TYPE_UV;
Deb Mukherjee's avatar
Deb Mukherjee committed
530
    if (type == PLANE_TYPE_Y_WITH_DC) {
531
532
      tx_type = get_tx_type(xd, xd->block + i);
    }
John Koleszar's avatar
John Koleszar committed
533

John Koleszar's avatar
John Koleszar committed
534
535
536
537
    c = decode_coefs(pbi, xd, bc, a, l, type,
                     tx_type,
                     seg_eob, qcoeff_ptr,
                     i, scan, TX_8X8, coef_bands_x_8x8);
John Koleszar's avatar
John Koleszar committed
538
539
540
541
542
543
544
545
    a[0] = l[0] = ((eobs[i] = c) != !type);
    a[1] = a[0];
    l[1] = l[0];

    eobtotal += c;
    qcoeff_ptr += 64;
  }

546
  if (bufthred == 16) {
547
    type = PLANE_TYPE_UV;
548
    tx_type = DCT_DCT;
549
    seg_eob = get_eob(xd, segment_id, 16);
550
551
552

    // use 4x4 transform for U, V components in I8X8 prediction mode
    for (i = 16; i < 24; i++) {
553
554
555
      ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
      ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
      const int *scan = vp9_default_zig_zag1d;
556

John Koleszar's avatar
John Koleszar committed
557
558
559
560
      c = decode_coefs(pbi, xd, bc, a, l, type,
                       tx_type,
                       seg_eob, qcoeff_ptr,
                       i, scan, TX_4X4, coef_bands_x);
561
562
563
564
565
566
567
      a[0] = l[0] = ((eobs[i] = c) != !type);

      eobtotal += c;
      qcoeff_ptr += 16;
    }
  }

John Koleszar's avatar
John Koleszar committed
568
  return eobtotal;
569
570
}

571
572
573
static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
                            BOOL_DECODER* const bc,
                            PLANE_TYPE type, int i) {
John Koleszar's avatar
John Koleszar committed
574
575
  ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
  ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
576
577
  ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
  ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
John Koleszar's avatar
John Koleszar committed
578
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
579
580
  const int *scan = vp9_default_zig_zag1d;
  unsigned short *const eobs = xd->eobs;
John Koleszar's avatar
John Koleszar committed
581
  int segment_id = xd->mode_info_context->mbmi.segment_id;
582
583
  int c, seg_eob = get_eob(xd, segment_id, 16);
  TX_TYPE tx_type = DCT_DCT;
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607

  if (type == PLANE_TYPE_Y_WITH_DC)
    tx_type = get_tx_type(xd, &xd->block[i]);
  switch (tx_type) {
    case ADST_DCT :
      scan = vp9_row_scan;
      break;

    case DCT_ADST :
      scan = vp9_col_scan;
      break;

    default :
      scan = vp9_default_zig_zag1d;
      break;
  }
  c = decode_coefs(dx, xd, bc, a, l, type,
                   tx_type,
                   seg_eob, qcoeff_ptr + i * 16,
                   i, scan, TX_4X4, coef_bands_x);
  a[0] = l[0] = ((eobs[i] = c) != !type);
  return c;
}

608
609
610
611
612
int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
                             MACROBLOCKD* const xd,
                             BOOL_DECODER* const bc) {
  int i, eobtotal = 0;
  PLANE_TYPE type;
613

John Koleszar's avatar
John Koleszar committed
614
615
616
  if (xd->mode_info_context->mbmi.mode != B_PRED &&
      xd->mode_info_context->mbmi.mode != I8X8_PRED &&
      xd->mode_info_context->mbmi.mode != SPLITMV) {
617
    eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
John Koleszar's avatar
John Koleszar committed
618
619
620
621
    type = PLANE_TYPE_Y_NO_DC;
  } else {
    type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
622

623
624
  for (i = 0; i < 16; ++i) {
    eobtotal += decode_coefs_4x4(dx, xd, bc, type, i);
John Koleszar's avatar
John Koleszar committed
625
  }
626
627
628
  do {
    eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
  } while (++i < 24);
John Koleszar's avatar
John Koleszar committed
629
  return eobtotal;
John Koleszar's avatar
John Koleszar committed
630
}