vp9_detokenize.c 14.8 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/vp9_type_aliases.h"
#include "vp9/common/vp9_blockd.h"
14
#include "vp9/decoder/vp9_onyxd_int.h"
John Koleszar's avatar
John Koleszar committed
15
16
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/mem.h"
17
#include "vp9/decoder/vp9_detokenize.h"
John Koleszar's avatar
John Koleszar committed
18

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

John Koleszar's avatar
John Koleszar committed
21
22
23
24
25
26
27
28
29
30
31
32
#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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#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

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

61
void vp9_reset_mb_tokens_context(MACROBLOCKD* const xd) {
62
  /* Clear entropy contexts */
Paul Wilkins's avatar
Paul Wilkins committed
63
  if ((xd->mode_info_context->mbmi.mode != B_PRED &&
64
65
66
       xd->mode_info_context->mbmi.mode != I8X8_PRED &&
       xd->mode_info_context->mbmi.mode != SPLITMV)
      || xd->mode_info_context->mbmi.txfm_size == TX_16X16) {
Paul Wilkins's avatar
Paul Wilkins committed
67
68
    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
69
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
70
71
    vpx_memset(xd->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
    vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) - 1);
Yaowu Xu's avatar
Yaowu Xu committed
72
73
    xd->above_context->y2 = 1;
    xd->left_context->y2 = 1;
John Koleszar's avatar
John Koleszar committed
74
  }
John Koleszar's avatar
John Koleszar committed
75
}
76

77
DECLARE_ALIGNED(16, extern const unsigned char, vp9_norm[256]);
78

79
static int get_signed(BOOL_DECODER *br, int value_to_sign) {
John Koleszar's avatar
John Koleszar committed
80
  const int split = (br->range + 1) >> 1;
81
  const VP9_BD_VALUE bigsplit = (VP9_BD_VALUE)split << (VP9_BD_VALUE_SIZE - 8);
John Koleszar's avatar
John Koleszar committed
82
  int v;
John Koleszar's avatar
John Koleszar committed
83

John Koleszar's avatar
John Koleszar committed
84
  if (br->count < 0)
85
    vp9_bool_decoder_fill(br);
John Koleszar's avatar
John Koleszar committed
86

John Koleszar's avatar
John Koleszar committed
87
88
89
90
91
92
93
94
95
96
97
  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
98

John Koleszar's avatar
John Koleszar committed
99
  return v;
Daniel Kang's avatar
Daniel Kang committed
100
}
John Koleszar's avatar
John Koleszar committed
101

102
103
104
105
106
107
108
#define INCREMENT_COUNT(token)               \
  do {                                       \
    coef_counts[coef_bands[c]][pt][token]++; \
    pt = vp9_prev_token_class[token];        \
  } while (0)

#define WRITE_COEF_CONTINUE(val, token)                       \
Daniel Kang's avatar
Daniel Kang committed
109
  {                                                           \
110
    qcoeff_ptr[scan[c]] = (INT16) get_signed(br, val);        \
111
    INCREMENT_COUNT(token);                                   \
John Koleszar's avatar
John Koleszar committed
112
113
114
    c++;                                                      \
    continue;                                                 \
  }
John Koleszar's avatar
John Koleszar committed
115

Daniel Kang's avatar
Daniel Kang committed
116
117
#define ADJUST_COEF(prob, bits_count)  \
  do {                                 \
118
    if (vp9_read(br, prob))            \
John Koleszar's avatar
John Koleszar committed
119
120
      val += (UINT16)(1 << bits_count);\
  } while (0);
John Koleszar's avatar
John Koleszar committed
121

122
static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
John Koleszar's avatar
John Koleszar committed
123
124
125
126
                        BOOL_DECODER* const br,
                        ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                        PLANE_TYPE type,
                        TX_TYPE tx_type,
127
                        int seg_eob, INT16 *qcoeff_ptr,
128
                        const int *const scan, TX_SIZE txfm_size,
John Koleszar's avatar
John Koleszar committed
129
                        const int *coef_bands) {
John Koleszar's avatar
John Koleszar committed
130
  FRAME_CONTEXT *const fc = &dx->common.fc;
131
  int pt, c = (type == PLANE_TYPE_Y_NO_DC);
132
  vp9_prob (*coef_probs)[PREV_COEF_CONTEXTS][ENTROPY_NODES], *prob;
133
  unsigned int (*coef_counts)[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
Daniel Kang's avatar
Daniel Kang committed
134

135
  switch (txfm_size) {
Daniel Kang's avatar
Daniel Kang committed
136
    default:
Daniel Kang's avatar
Daniel Kang committed
137
    case TX_4X4:
138
      if (tx_type == DCT_DCT) {
139
        coef_probs  = fc->coef_probs[type];
140
141
        coef_counts = fc->coef_counts[type];
      } else {
142
        coef_probs  = fc->hybrid_coef_probs[type];
143
144
        coef_counts = fc->hybrid_coef_counts[type];
      }
Daniel Kang's avatar
Daniel Kang committed
145
146
      break;
    case TX_8X8:
147
      if (tx_type == DCT_DCT) {
148
        coef_probs  = fc->coef_probs_8x8[type];
149
150
        coef_counts = fc->coef_counts_8x8[type];
      } else {
151
        coef_probs  = fc->hybrid_coef_probs_8x8[type];
152
153
        coef_counts = fc->hybrid_coef_counts_8x8[type];
      }
Daniel Kang's avatar
Daniel Kang committed
154
      break;
Daniel Kang's avatar
Daniel Kang committed
155
    case TX_16X16:
156
      if (tx_type == DCT_DCT) {
157
        coef_probs  = fc->coef_probs_16x16[type];
158
159
        coef_counts = fc->coef_counts_16x16[type];
      } else {
160
        coef_probs  = fc->hybrid_coef_probs_16x16[type];
161
162
        coef_counts = fc->hybrid_coef_counts_16x16[type];
      }
Daniel Kang's avatar
Daniel Kang committed
163
164
      break;
  }
John Koleszar's avatar
John Koleszar committed
165

166
  VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
John Koleszar's avatar
John Koleszar committed
167
168
169
  while (1) {
    int val;
    const uint8_t *cat6 = cat6_prob;
170
    if (c >= seg_eob) break;
171
    prob = coef_probs[coef_bands[c]][pt];
172
    if (!vp9_read(br, prob[EOB_CONTEXT_NODE]))
John Koleszar's avatar
John Koleszar committed
173
      break;
Daniel Kang's avatar
Daniel Kang committed
174
SKIP_START:
175
    if (c >= seg_eob) break;
176
    if (!vp9_read(br, prob[ZERO_CONTEXT_NODE])) {
177
      INCREMENT_COUNT(ZERO_TOKEN);
John Koleszar's avatar
John Koleszar committed
178
      ++c;
179
      prob = coef_probs[coef_bands[c]][pt];
John Koleszar's avatar
John Koleszar committed
180
181
182
      goto SKIP_START;
    }
    // ONE_CONTEXT_NODE_0_
183
    if (!vp9_read(br, prob[ONE_CONTEXT_NODE])) {
184
      WRITE_COEF_CONTINUE(1, ONE_TOKEN);
John Koleszar's avatar
John Koleszar committed
185
186
    }
    // LOW_VAL_CONTEXT_NODE_0_
187
188
    if (!vp9_read(br, prob[LOW_VAL_CONTEXT_NODE])) {
      if (!vp9_read(br, prob[TWO_CONTEXT_NODE])) {
189
        WRITE_COEF_CONTINUE(2, TWO_TOKEN);
John Koleszar's avatar
John Koleszar committed
190
      }
191
      if (!vp9_read(br, prob[THREE_CONTEXT_NODE])) {
192
        WRITE_COEF_CONTINUE(3, THREE_TOKEN);
John Koleszar's avatar
John Koleszar committed
193
      }
194
      WRITE_COEF_CONTINUE(4, FOUR_TOKEN);
John Koleszar's avatar
John Koleszar committed
195
196
    }
    // HIGH_LOW_CONTEXT_NODE_0_
197
198
    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
199
200
        val = CAT1_MIN_VAL;
        ADJUST_COEF(CAT1_PROB0, 0);
201
        WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY1);
John Koleszar's avatar
John Koleszar committed
202
203
204
205
      }
      val = CAT2_MIN_VAL;
      ADJUST_COEF(CAT2_PROB1, 1);
      ADJUST_COEF(CAT2_PROB0, 0);
206
      WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY2);
Daniel Kang's avatar
Daniel Kang committed
207
    }
John Koleszar's avatar
John Koleszar committed
208
    // CAT_THREEFOUR_CONTEXT_NODE_0_
209
210
    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
211
212
213
214
        val = CAT3_MIN_VAL;
        ADJUST_COEF(CAT3_PROB2, 2);
        ADJUST_COEF(CAT3_PROB1, 1);
        ADJUST_COEF(CAT3_PROB0, 0);
215
        WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY3);
John Koleszar's avatar
John Koleszar committed
216
217
218
219
220
221
      }
      val = CAT4_MIN_VAL;
      ADJUST_COEF(CAT4_PROB3, 3);
      ADJUST_COEF(CAT4_PROB2, 2);
      ADJUST_COEF(CAT4_PROB1, 1);
      ADJUST_COEF(CAT4_PROB0, 0);
222
      WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY4);
John Koleszar's avatar
John Koleszar committed
223
224
    }
    // CAT_FIVE_CONTEXT_NODE_0_:
225
    if (!vp9_read(br, prob[CAT_FIVE_CONTEXT_NODE])) {
John Koleszar's avatar
John Koleszar committed
226
227
228
229
230
231
      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);
232
      WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY5);
John Koleszar's avatar
John Koleszar committed
233
234
235
    }
    val = 0;
    while (*cat6) {
236
      val = (val << 1) | vp9_read(br, *cat6++);
John Koleszar's avatar
John Koleszar committed
237
238
    }
    val += CAT6_MIN_VAL;
239
    WRITE_COEF_CONTINUE(val, DCT_VAL_CATEGORY6);
John Koleszar's avatar
John Koleszar committed
240
  }
Jingning Han's avatar
Jingning Han committed
241

242
243
  if (c < seg_eob)
    coef_counts[coef_bands[c]][pt][DCT_EOB_TOKEN]++;
244

245
  a[0] = l[0] = (c > !type);
246

John Koleszar's avatar
John Koleszar committed
247
  return c;
Daniel Kang's avatar
Daniel Kang committed
248
}
John Koleszar's avatar
John Koleszar committed
249

250
static int get_eob(MACROBLOCKD* const xd, int segment_id, int eob_max) {
251
252
253
254
255
256
257
258
259
  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;
}


260
261
262
static int vp9_decode_mb_tokens_16x16(VP9D_COMP* const pbi,
                                      MACROBLOCKD* const xd,
                                      BOOL_DECODER* const bc) {
Daniel Kang's avatar
Daniel Kang committed
263
264
  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
265
  unsigned short* const eobs = xd->eobs;
Daniel Kang's avatar
Daniel Kang committed
266
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
267
  int c, i, eobtotal = 0, seg_eob;
Daniel Kang's avatar
Daniel Kang committed
268
269

  // Luma block
270
271
272
273
274
275
276
277
  eobs[0] = c = decode_coefs(pbi, xd, bc, A, L, PLANE_TYPE_Y_WITH_DC,
                             get_tx_type(xd, &xd->block[0]),
                             get_eob(xd, segment_id, 256),
                             xd->qcoeff, vp9_default_zig_zag1d_16x16,
                             TX_16X16, vp9_coef_bands_16x16);
  A[1] = A[2] = A[3] = A[0];
  L[1] = L[2] = L[3] = L[0];
  eobtotal += c;
Daniel Kang's avatar
Daniel Kang committed
278
279

  // 8x8 chroma blocks
280
  seg_eob = get_eob(xd, segment_id, 64);
Daniel Kang's avatar
Daniel Kang committed
281
  for (i = 16; i < 24; i += 4) {
282
283
    ENTROPY_CONTEXT* const a = A + vp9_block2above_8x8[i];
    ENTROPY_CONTEXT* const l = L + vp9_block2left_8x8[i];
Daniel Kang's avatar
Daniel Kang committed
284

285
286
287
288
    eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, PLANE_TYPE_UV,
                               DCT_DCT, seg_eob, xd->block[i].qcoeff,
                               vp9_default_zig_zag1d_8x8,
                               TX_8X8, vp9_coef_bands_8x8);
Daniel Kang's avatar
Daniel Kang committed
289
290
291
292
    a[1] = a[0];
    l[1] = l[0];
    eobtotal += c;
  }
293
294
  A[8] = 0;
  L[8] = 0;
Daniel Kang's avatar
Daniel Kang committed
295
296
297
  return eobtotal;
}

298
299
300
static int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
                                    MACROBLOCKD* const xd,
                                    BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
301
302
  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
303
  unsigned short *const eobs = xd->eobs;
304
305
  PLANE_TYPE type;
  int c, i, eobtotal = 0, seg_eob;
John Koleszar's avatar
John Koleszar committed
306
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
307

308
  int has_2nd_order = get_2nd_order_usage(xd);
309
  // 2nd order DC block
310
  if (has_2nd_order) {
311
312
    ENTROPY_CONTEXT *const a = A + vp9_block2above_8x8[24];
    ENTROPY_CONTEXT *const l = L + vp9_block2left_8x8[24];
John Koleszar's avatar
John Koleszar committed
313

314
315
316
317
    eobs[24] = c = decode_coefs(pbi, xd, bc, a, l, PLANE_TYPE_Y2,
                                DCT_DCT, get_eob(xd, segment_id, 4),
                                xd->block[24].qcoeff,
                                vp9_default_zig_zag1d, TX_8X8, vp9_coef_bands);
John Koleszar's avatar
John Koleszar committed
318
319
    eobtotal += c - 4;
    type = PLANE_TYPE_Y_NO_DC;
320
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
321
322
    xd->above_context->y2 = 1;
    xd->left_context->y2 = 1;
323
    eobs[24] = 0;
John Koleszar's avatar
John Koleszar committed
324
    type = PLANE_TYPE_Y_WITH_DC;
325
  }
John Koleszar's avatar
John Koleszar committed
326

327
  // luma blocks
328
  seg_eob = get_eob(xd, segment_id, 64);
329
  for (i = 0; i < 16; i += 4) {
330
331
    ENTROPY_CONTEXT *const a = A + vp9_block2above_8x8[i];
    ENTROPY_CONTEXT *const l = L + vp9_block2left_8x8[i];
John Koleszar's avatar
John Koleszar committed
332

333
    eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, type,
334
                               type == PLANE_TYPE_Y_WITH_DC ?
335
                               get_tx_type(xd, xd->block + i) : DCT_DCT,
336
337
338
                               seg_eob, xd->block[i].qcoeff,
                               vp9_default_zig_zag1d_8x8,
                               TX_8X8, vp9_coef_bands_8x8);
John Koleszar's avatar
John Koleszar committed
339
340
341
342
343
    a[1] = a[0];
    l[1] = l[0];
    eobtotal += c;
  }

344
345
346
347
  // chroma blocks
  if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
      xd->mode_info_context->mbmi.mode == SPLITMV) {
    // use 4x4 transform for U, V components in I8X8/splitmv prediction mode
348
    seg_eob = get_eob(xd, segment_id, 16);
349
    for (i = 16; i < 24; i++) {
350
351
      ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
      ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
352

353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
      eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, PLANE_TYPE_UV,
                                 DCT_DCT, seg_eob, xd->block[i].qcoeff,
                                 vp9_default_zig_zag1d, TX_4X4, vp9_coef_bands);
      eobtotal += c;
    }
  } else {
    for (i = 16; i < 24; i += 4) {
      ENTROPY_CONTEXT *const a = A + vp9_block2above_8x8[i];
      ENTROPY_CONTEXT *const l = L + vp9_block2left_8x8[i];

      eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, PLANE_TYPE_UV,
                                 DCT_DCT, seg_eob, xd->block[i].qcoeff,
                                 vp9_default_zig_zag1d_8x8,
                                 TX_8X8, vp9_coef_bands_8x8);
      a[1] = a[0];
      l[1] = l[0];
369
370
371
372
      eobtotal += c;
    }
  }

John Koleszar's avatar
John Koleszar committed
373
  return eobtotal;
374
375
}

376
377
378
int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
                         BOOL_DECODER* const bc,
                         PLANE_TYPE type, int i) {
John Koleszar's avatar
John Koleszar committed
379
380
  ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
  ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
381
382
  ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
  ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
John Koleszar's avatar
John Koleszar committed
383
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
384
385
  const int *scan = vp9_default_zig_zag1d;
  unsigned short *const eobs = xd->eobs;
John Koleszar's avatar
John Koleszar committed
386
  int segment_id = xd->mode_info_context->mbmi.segment_id;
387
388
  int c, seg_eob = get_eob(xd, segment_id, 16);
  TX_TYPE tx_type = DCT_DCT;
389
390

  if (type == PLANE_TYPE_Y_WITH_DC)
391
    tx_type = get_tx_type_4x4(xd, &xd->block[i]);
392
393
394
395
396
397
398
399
400
401
402
403
404
  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;
  }
405
406
407
  eobs[i] = c = decode_coefs(dx, xd, bc, a, l, type,
                             tx_type, seg_eob, qcoeff_ptr + i * 16,
                             scan, TX_4X4, vp9_coef_bands);
408
409
410
  return c;
}

411
412
413
414
415
416
417
418
419
420
421
int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
                                MACROBLOCKD* const xd,
                                BOOL_DECODER* const bc) {
  int eobtotal = 0, i;

  for (i = 16; i < 24; i++)
    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);

  return eobtotal;
}

422
423
424
static int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
                                    MACROBLOCKD* const xd,
                                    BOOL_DECODER* const bc) {
425
426
  int i, eobtotal = 0;
  PLANE_TYPE type;
427

428
429
430
  int has_2nd_order = get_2nd_order_usage(xd);

  if (has_2nd_order) {
431
    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
John Koleszar's avatar
John Koleszar committed
432
433
    type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
434
435
    xd->above_context->y2 = 1;
    xd->left_context->y2 = 1;
436
    xd->eobs[24] = 0;
John Koleszar's avatar
John Koleszar committed
437
438
    type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
439

440
  for (i = 0; i < 16; ++i) {
441
    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i);
John Koleszar's avatar
John Koleszar committed
442
  }
443
444

  return eobtotal + vp9_decode_mb_tokens_4x4_uv(dx, xd, bc);
John Koleszar's avatar
John Koleszar committed
445
}
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463

int vp9_decode_mb_tokens(VP9D_COMP* const dx,
                         MACROBLOCKD* const xd,
                         BOOL_DECODER* const bc) {
  const TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size;
  int eobtotal;

  if (tx_size == TX_16X16) {
    eobtotal = vp9_decode_mb_tokens_16x16(dx, xd, bc);
  } else if (tx_size == TX_8X8) {
    eobtotal = vp9_decode_mb_tokens_8x8(dx, xd, bc);
  } else {
    assert(tx_size == TX_4X4);
    eobtotal = vp9_decode_mb_tokens_4x4(dx, xd, bc);
  }

  return eobtotal;
}