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