1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h"
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_ports/mem.h"
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_blockd.h"
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_common.h"
167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp9/common/vp9_entropy.h"
177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_COEFFICIENT_RANGE_CHECKING
187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp9/common/vp9_idct.h"
197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_detokenize.h"
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define EOB_CONTEXT_NODE            0
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define ZERO_CONTEXT_NODE           1
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define ONE_CONTEXT_NODE            2
262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define LOW_VAL_CONTEXT_NODE        0
272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define TWO_CONTEXT_NODE            1
282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define THREE_CONTEXT_NODE          2
292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define HIGH_LOW_CONTEXT_NODE       3
302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define CAT_ONE_CONTEXT_NODE        4
312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define CAT_THREEFOUR_CONTEXT_NODE  5
322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define CAT_THREE_CONTEXT_NODE      6
332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define CAT_FIVE_CONTEXT_NODE       7
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
359b35249446b07f40ac5fcc3205f2c048616efacchkuang#define INCREMENT_COUNT(token)                              \
369b35249446b07f40ac5fcc3205f2c048616efacchkuang  do {                                                      \
377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian     if (counts)                                            \
382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian       ++coef_counts[band][ctx][token];                     \
399b35249446b07f40ac5fcc3205f2c048616efacchkuang  } while (0)
409b35249446b07f40ac5fcc3205f2c048616efacchkuang
417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic INLINE int read_coeff(const vpx_prob *probs, int n, vpx_reader *r) {
427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, val = 0;
437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < n; ++i)
447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    val = (val << 1) | vpx_read(r, probs[i]);
457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return val;
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic int decode_coefs(const MACROBLOCKD *xd,
497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                        PLANE_TYPE type,
507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                        tran_low_t *dqcoeff, TX_SIZE tx_size, const int16_t *dq,
517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                        int ctx, const int16_t *scan, const int16_t *nb,
527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                        vpx_reader *r) {
537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  FRAME_COUNTS *counts = xd->counts;
542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const int max_eob = 16 << (tx_size << 1);
557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const FRAME_CONTEXT *const fc = xd->fc;
564fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang  const int ref = is_inter_block(&xd->mi[0]->mbmi);
571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int band, c = 0;
587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const vpx_prob (*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
59f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      fc->coef_probs[tx_size][type][ref];
607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const vpx_prob *prob;
617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned int (*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1];
627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  unsigned int (*eob_branch_count)[COEFF_CONTEXTS];
632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  uint8_t token_cache[32 * 32];
649b35249446b07f40ac5fcc3205f2c048616efacchkuang  const uint8_t *band_translate = get_band_translate(tx_size);
652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const int dq_shift = (tx_size == TX_32X32);
667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int v, token;
672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int16_t dqv = dq[0];
687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat1_prob;
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat2_prob;
707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat3_prob;
717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat4_prob;
727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat5_prob;
737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const uint8_t *cat6_prob;
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (counts) {
767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    coef_counts = counts->coef[tx_size][type][ref];
777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    eob_branch_count = counts->eob_branch[tx_size][type][ref];
787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (xd->bd > VPX_BITS_8) {
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (xd->bd == VPX_BITS_10) {
837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat1_prob = vp9_cat1_prob_high10;
847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat2_prob = vp9_cat2_prob_high10;
857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat3_prob = vp9_cat3_prob_high10;
867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat4_prob = vp9_cat4_prob_high10;
877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat5_prob = vp9_cat5_prob_high10;
887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat6_prob = vp9_cat6_prob_high10;
897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat1_prob = vp9_cat1_prob_high12;
917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat2_prob = vp9_cat2_prob_high12;
927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat3_prob = vp9_cat3_prob_high12;
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat4_prob = vp9_cat4_prob_high12;
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat5_prob = vp9_cat5_prob_high12;
957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      cat6_prob = vp9_cat6_prob_high12;
967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  } else {
987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat1_prob = vp9_cat1_prob;
997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat2_prob = vp9_cat2_prob;
1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat3_prob = vp9_cat3_prob;
1017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat4_prob = vp9_cat4_prob;
1027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat5_prob = vp9_cat5_prob;
1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    cat6_prob = vp9_cat6_prob;
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat1_prob = vp9_cat1_prob;
1077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat2_prob = vp9_cat2_prob;
1087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat3_prob = vp9_cat3_prob;
1097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat4_prob = vp9_cat4_prob;
1107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat5_prob = vp9_cat5_prob;
1117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  cat6_prob = vp9_cat6_prob;
1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  while (c < max_eob) {
1157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int val = -1;
1169b35249446b07f40ac5fcc3205f2c048616efacchkuang    band = *band_translate++;
1172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    prob = coef_probs[band][ctx];
1187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (counts)
1192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      ++eob_branch_count[band][ctx];
1207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (!vpx_read(r, prob[EOB_CONTEXT_NODE])) {
1212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      INCREMENT_COUNT(EOB_MODEL_TOKEN);
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      break;
1232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    }
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    while (!vpx_read(r, prob[ZERO_CONTEXT_NODE])) {
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      INCREMENT_COUNT(ZERO_TOKEN);
1272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      dqv = dq[1];
1282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      token_cache[scan[c]] = 0;
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      ++c;
1302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      if (c >= max_eob)
1312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian        return c;  // zero tokens at the end (no eob token)
1322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      ctx = get_coef_context(nb, token_cache, c);
1332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      band = *band_translate++;
1342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      prob = coef_probs[band][ctx];
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (!vpx_read(r, prob[ONE_CONTEXT_NODE])) {
1382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      INCREMENT_COUNT(ONE_TOKEN);
1397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      token = ONE_TOKEN;
1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      val = 1;
1417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
1427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      INCREMENT_COUNT(TWO_TOKEN);
1437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      token = vpx_read_tree(r, vp9_coef_con_tree,
1447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            vp9_pareto8_full[prob[PIVOT_NODE] - 1]);
1457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      switch (token) {
1467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case TWO_TOKEN:
1477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case THREE_TOKEN:
1487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case FOUR_TOKEN:
1497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = token;
1507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY1_TOKEN:
1527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT1_MIN_VAL + read_coeff(cat1_prob, 1, r);
1537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY2_TOKEN:
1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT2_MIN_VAL + read_coeff(cat2_prob, 2, r);
1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY3_TOKEN:
1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT3_MIN_VAL + read_coeff(cat3_prob, 3, r);
1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY4_TOKEN:
1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT4_MIN_VAL + read_coeff(cat4_prob, 4, r);
1627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY5_TOKEN:
1647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT5_MIN_VAL + read_coeff(cat5_prob, 5, r);
1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        case CATEGORY6_TOKEN:
1677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          switch (xd->bd) {
1697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            case VPX_BITS_8:
1707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              val = CAT6_MIN_VAL + read_coeff(cat6_prob, 14, r);
1717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              break;
1727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            case VPX_BITS_10:
1737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              val = CAT6_MIN_VAL + read_coeff(cat6_prob, 16, r);
1747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              break;
1757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            case VPX_BITS_12:
1767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              val = CAT6_MIN_VAL + read_coeff(cat6_prob, 18, r);
1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              break;
1787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            default:
1797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              assert(0);
1807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian              return -1;
1817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          }
1827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          val = CAT6_MIN_VAL + read_coeff(cat6_prob, 14, r);
1847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
1857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          break;
1867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
1887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    v = (val * dqv) >> dq_shift;
1897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_COEFFICIENT_RANGE_CHECKING
1907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dqcoeff[scan[c]] = highbd_check_range((vpx_read_bit(r) ? -v : v),
1927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                          xd->bd);
1937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dqcoeff[scan[c]] = check_range(vpx_read_bit(r) ? -v : v);
1957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dqcoeff[scan[c]] = vpx_read_bit(r) ? -v : v;
1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_COEFFICIENT_RANGE_CHECKING
1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    token_cache[scan[c]] = vp9_pt_energy_class[token];
2007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    ++c;
2017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    ctx = get_coef_context(nb, token_cache, c);
2027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    dqv = dq[1];
2037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return c;
2067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
2072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// TODO(slavarnway): Decode version of vp9_set_context.  Modify vp9_set_context
2097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// after testing is complete, then delete this version.
2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic
2117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid dec_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd,
2127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                      TX_SIZE tx_size, int has_eob,
2137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                      int aoff, int loff) {
2147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  ENTROPY_CONTEXT *const a = pd->above_context + aoff;
2157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  ENTROPY_CONTEXT *const l = pd->left_context + loff;
2167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int tx_size_in_blocks = 1 << tx_size;
2172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // above
2197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (has_eob && xd->mb_to_right_edge < 0) {
2207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int i;
2217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    const int blocks_wide = pd->n4_w +
2227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            (xd->mb_to_right_edge >> (5 + pd->subsampling_x));
2237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int above_contexts = tx_size_in_blocks;
2247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (above_contexts + aoff > blocks_wide)
2257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      above_contexts = blocks_wide - aoff;
2262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (i = 0; i < above_contexts; ++i)
2287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      a[i] = has_eob;
2297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (i = above_contexts; i < tx_size_in_blocks; ++i)
2307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      a[i] = 0;
2317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  } else {
2327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(a, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks);
2337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
2342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // left
2367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  if (has_eob && xd->mb_to_bottom_edge < 0) {
2377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int i;
2387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    const int blocks_high = pd->n4_h +
2397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y));
2407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    int left_contexts = tx_size_in_blocks;
2417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (left_contexts + loff > blocks_high)
2427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      left_contexts = blocks_high - loff;
2432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
2447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (i = 0; i < left_contexts; ++i)
2457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      l[i] = has_eob;
2467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (i = left_contexts; i < tx_size_in_blocks; ++i)
2477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      l[i] = 0;
2487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  } else {
2497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(l, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks);
2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianint vp9_decode_block_tokens(MACROBLOCKD *xd,
2547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            int plane, const scan_order *sc,
2557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            int x, int y,
2567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            TX_SIZE tx_size, vpx_reader *r,
2577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            int seg_id) {
2585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct macroblockd_plane *const pd = &xd->plane[plane];
2597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int16_t *const dequant = pd->seg_dequant[seg_id];
2602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const int ctx = get_entropy_context(tx_size, pd->above_context + x,
2612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                               pd->left_context + y);
2627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  const int eob = decode_coefs(xd, pd->plane_type,
2637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               pd->dqcoeff, tx_size,
2647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               dequant, ctx, sc->scan, sc->neighbors, r);
2657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  dec_set_contexts(xd, pd, tx_size, eob > 0, x, y);
2665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return eob;
267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
270