detokenize.c 14.1 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 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) {
John Koleszar's avatar
John Koleszar committed
62
  /* Clear entropy contexts for Y2 blocks */
Paul Wilkins's avatar
Paul Wilkins committed
63 64 65
  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
66
      || xd->mode_info_context->mbmi.txfm_size == TX_16X16
Daniel Kang's avatar
Daniel Kang committed
67
      ) {
Paul Wilkins's avatar
Paul Wilkins committed
68 69
    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
70
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
71 72
    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
73
  }
John Koleszar's avatar
John Koleszar committed
74
}
75

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

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

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

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

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

101 102 103 104 105 106 107
#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
108
  {                                                           \
109
    qcoeff_ptr[scan[c]] = (INT16) get_signed(br, val);        \
110
    INCREMENT_COUNT(token);                                   \
John Koleszar's avatar
John Koleszar committed
111 112 113
    c++;                                                      \
    continue;                                                 \
  }
John Koleszar's avatar
John Koleszar committed
114

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

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

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

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

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

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

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

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


259 260
int vp9_decode_mb_tokens_16x16(VP9D_COMP* const pbi,
                               MACROBLOCKD* const xd,
John Koleszar's avatar
John Koleszar committed
261
                               BOOL_DECODER* const bc) {
Daniel Kang's avatar
Daniel Kang committed
262 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;
266 267
  PLANE_TYPE type;
  int c, i, eobtotal = 0, seg_eob;
Daniel Kang's avatar
Daniel Kang committed
268 269
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
270
  TX_TYPE tx_type = get_tx_type(xd, &xd->block[0]);
Daniel Kang's avatar
Daniel Kang committed
271 272

  type = PLANE_TYPE_Y_WITH_DC;
273
  seg_eob = get_eob(xd, segment_id, 256);
Daniel Kang's avatar
Daniel Kang committed
274 275 276

  // Luma block
  {
277
    const int* const scan = vp9_default_zig_zag1d_16x16;
278 279 280
    eobs[0] = c = decode_coefs(pbi, xd, bc, A, L, type,
                               tx_type, seg_eob, qcoeff_ptr,
                               scan, TX_16X16, vp9_coef_bands_16x16);
281 282
    A[1] = A[2] = A[3] = A[0];
    L[1] = L[2] = L[3] = L[0];
Daniel Kang's avatar
Daniel Kang committed
283 284 285 286 287 288
    eobtotal += c;
  }

  // 8x8 chroma blocks
  qcoeff_ptr += 256;
  type = PLANE_TYPE_UV;
289
  tx_type = DCT_DCT;
290
  seg_eob = get_eob(xd, segment_id, 64);
Daniel Kang's avatar
Daniel Kang committed
291
  for (i = 16; i < 24; i += 4) {
292 293 294
    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
295

296 297 298
    eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, type,
                               tx_type, seg_eob, qcoeff_ptr,
                               scan, TX_8X8, vp9_coef_bands_8x8);
Daniel Kang's avatar
Daniel Kang committed
299 300 301 302 303 304 305 306 307 308 309
    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;
}

310 311
int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
                             MACROBLOCKD* const xd,
John Koleszar's avatar
John Koleszar committed
312
                             BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
313 314 315
  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
316
  unsigned short *const eobs = xd->eobs;
317 318
  PLANE_TYPE type;
  int c, i, eobtotal = 0, seg_eob;
John Koleszar's avatar
John Koleszar committed
319 320
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
321
  TX_TYPE tx_type = DCT_DCT;
322

323 324
  int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
                  xd->mode_info_context->mbmi.mode == SPLITMV) ? 16 : 24;
325 326 327
  if (xd->mode_info_context->mbmi.mode != B_PRED &&
      xd->mode_info_context->mbmi.mode != SPLITMV &&
      xd->mode_info_context->mbmi.mode != I8X8_PRED) {
328 329 330
    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
331
    type = PLANE_TYPE_Y2;
332

333
    seg_eob = get_eob(xd, segment_id, 4);
334 335 336
    eobs[24] = c = decode_coefs(pbi, xd, bc, a, l, type,
                                tx_type, seg_eob, qcoeff_ptr + 24 * 16,
                                scan, TX_8X8, vp9_coef_bands);
John Koleszar's avatar
John Koleszar committed
337 338 339 340 341 342 343

    eobtotal += c - 4;

    type = PLANE_TYPE_Y_NO_DC;
  } else
    type = PLANE_TYPE_Y_WITH_DC;

344
  seg_eob = get_eob(xd, segment_id, 64);
345 346

  for (i = 0; i < bufthred ; i += 4) {
347 348 349
    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;
350
    tx_type = DCT_DCT;
351

John Koleszar's avatar
John Koleszar committed
352 353
    if (i == 16)
      type = PLANE_TYPE_UV;
Deb Mukherjee's avatar
Deb Mukherjee committed
354
    if (type == PLANE_TYPE_Y_WITH_DC) {
355 356
      tx_type = get_tx_type(xd, xd->block + i);
    }
John Koleszar's avatar
John Koleszar committed
357

358 359 360
    eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, type,
                               tx_type, seg_eob, qcoeff_ptr,
                               scan, TX_8X8, vp9_coef_bands_8x8);
John Koleszar's avatar
John Koleszar committed
361 362 363 364 365 366 367
    a[1] = a[0];
    l[1] = l[0];

    eobtotal += c;
    qcoeff_ptr += 64;
  }

368
  if (bufthred == 16) {
369
    type = PLANE_TYPE_UV;
370
    tx_type = DCT_DCT;
371
    seg_eob = get_eob(xd, segment_id, 16);
372 373 374

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

379 380 381
      eobs[i] = c = decode_coefs(pbi, xd, bc, a, l, type,
                                 tx_type, seg_eob, qcoeff_ptr,
                                 scan, TX_4X4, vp9_coef_bands);
382 383 384 385 386 387

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

John Koleszar's avatar
John Koleszar committed
388
  return eobtotal;
389 390
}

391 392 393
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
394 395
  ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
  ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
396 397
  ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
  ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
John Koleszar's avatar
John Koleszar committed
398
  INT16 *qcoeff_ptr = &xd->qcoeff[0];
399 400
  const int *scan = vp9_default_zig_zag1d;
  unsigned short *const eobs = xd->eobs;
John Koleszar's avatar
John Koleszar committed
401
  int segment_id = xd->mode_info_context->mbmi.segment_id;
402 403
  int c, seg_eob = get_eob(xd, segment_id, 16);
  TX_TYPE tx_type = DCT_DCT;
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419

  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;
  }
420 421 422
  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);
423 424 425
  return c;
}

426 427 428 429 430 431 432 433 434 435 436
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;
}

437 438 439 440 441
int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
                             MACROBLOCKD* const xd,
                             BOOL_DECODER* const bc) {
  int i, eobtotal = 0;
  PLANE_TYPE type;
442

John Koleszar's avatar
John Koleszar committed
443 444 445
  if (xd->mode_info_context->mbmi.mode != B_PRED &&
      xd->mode_info_context->mbmi.mode != I8X8_PRED &&
      xd->mode_info_context->mbmi.mode != SPLITMV) {
446
    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
John Koleszar's avatar
John Koleszar committed
447 448 449 450
    type = PLANE_TYPE_Y_NO_DC;
  } else {
    type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
451

452
  for (i = 0; i < 16; ++i) {
453
    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i);
John Koleszar's avatar
John Koleszar committed
454
  }
455 456

  return eobtotal + vp9_decode_mb_tokens_4x4_uv(dx, xd, bc);
John Koleszar's avatar
John Koleszar committed
457
}