| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "vpx_mem/vpx_mem.h" | 11 #include "vpx_mem/vpx_mem.h" |
| 12 #include "vpx_ports/mem.h" | 12 #include "vpx_ports/mem.h" |
| 13 | 13 |
| 14 #include "vp9/common/vp9_blockd.h" | 14 #include "vp9/common/vp9_blockd.h" |
| 15 #include "vp9/common/vp9_common.h" | 15 #include "vp9/common/vp9_common.h" |
| 16 #include "vp9/common/vp9_entropy.h" | 16 #include "vp9/common/vp9_entropy.h" |
| 17 #if CONFIG_COEFFICIENT_RANGE_CHECKING |
| 18 #include "vp9/common/vp9_idct.h" |
| 19 #endif |
| 17 | 20 |
| 18 #include "vp9/decoder/vp9_detokenize.h" | 21 #include "vp9/decoder/vp9_detokenize.h" |
| 19 | 22 |
| 20 #define EOB_CONTEXT_NODE 0 | 23 #define EOB_CONTEXT_NODE 0 |
| 21 #define ZERO_CONTEXT_NODE 1 | 24 #define ZERO_CONTEXT_NODE 1 |
| 22 #define ONE_CONTEXT_NODE 2 | 25 #define ONE_CONTEXT_NODE 2 |
| 23 #define LOW_VAL_CONTEXT_NODE 0 | 26 #define LOW_VAL_CONTEXT_NODE 0 |
| 24 #define TWO_CONTEXT_NODE 1 | 27 #define TWO_CONTEXT_NODE 1 |
| 25 #define THREE_CONTEXT_NODE 2 | 28 #define THREE_CONTEXT_NODE 2 |
| 26 #define HIGH_LOW_CONTEXT_NODE 3 | 29 #define HIGH_LOW_CONTEXT_NODE 3 |
| 27 #define CAT_ONE_CONTEXT_NODE 4 | 30 #define CAT_ONE_CONTEXT_NODE 4 |
| 28 #define CAT_THREEFOUR_CONTEXT_NODE 5 | 31 #define CAT_THREEFOUR_CONTEXT_NODE 5 |
| 29 #define CAT_THREE_CONTEXT_NODE 6 | 32 #define CAT_THREE_CONTEXT_NODE 6 |
| 30 #define CAT_FIVE_CONTEXT_NODE 7 | 33 #define CAT_FIVE_CONTEXT_NODE 7 |
| 31 | 34 |
| 32 #define INCREMENT_COUNT(token) \ | 35 #define INCREMENT_COUNT(token) \ |
| 33 do { \ | 36 do { \ |
| 34 if (!cm->frame_parallel_decoding_mode) \ | 37 if (!cm->frame_parallel_decoding_mode) \ |
| 35 ++coef_counts[band][ctx][token]; \ | 38 ++coef_counts[band][ctx][token]; \ |
| 36 } while (0) | 39 } while (0) |
| 37 | 40 |
| 38 static INLINE int read_coeff(const vp9_prob *probs, int n, vp9_reader *r) { | 41 static INLINE int read_coeff(const vp9_prob *probs, int n, vp9_reader *r) { |
| 39 int i, val = 0; | 42 int i, val = 0; |
| 40 for (i = 0; i < n; ++i) | 43 for (i = 0; i < n; ++i) |
| 41 val = (val << 1) | vp9_read(r, probs[i]); | 44 val = (val << 1) | vp9_read(r, probs[i]); |
| 42 return val; | 45 return val; |
| 43 } | 46 } |
| 44 | 47 |
| 45 static const vp9_tree_index coeff_subtree_high[TREE_SIZE(ENTROPY_TOKENS)] = { | 48 static const vp9_tree_index coeff_subtree_high[TREE_SIZE(ENTROPY_TOKENS)] = { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 return -1; | 187 return -1; |
| 185 } | 188 } |
| 186 #else | 189 #else |
| 187 val = CAT6_MIN_VAL + read_coeff(cat6_prob, 14, r); | 190 val = CAT6_MIN_VAL + read_coeff(cat6_prob, 14, r); |
| 188 #endif | 191 #endif |
| 189 break; | 192 break; |
| 190 } | 193 } |
| 191 } | 194 } |
| 192 v = (val * dqv) >> dq_shift; | 195 v = (val * dqv) >> dq_shift; |
| 193 #if CONFIG_COEFFICIENT_RANGE_CHECKING | 196 #if CONFIG_COEFFICIENT_RANGE_CHECKING |
| 197 #if CONFIG_VP9_HIGHBITDEPTH |
| 198 dqcoeff[scan[c]] = highbd_check_range((vp9_read_bit(r) ? -v : v), |
| 199 cm->bit_depth); |
| 200 #else |
| 194 dqcoeff[scan[c]] = check_range(vp9_read_bit(r) ? -v : v); | 201 dqcoeff[scan[c]] = check_range(vp9_read_bit(r) ? -v : v); |
| 202 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 195 #else | 203 #else |
| 196 dqcoeff[scan[c]] = vp9_read_bit(r) ? -v : v; | 204 dqcoeff[scan[c]] = vp9_read_bit(r) ? -v : v; |
| 197 #endif | 205 #endif // CONFIG_COEFFICIENT_RANGE_CHECKING |
| 198 token_cache[scan[c]] = vp9_pt_energy_class[token]; | 206 token_cache[scan[c]] = vp9_pt_energy_class[token]; |
| 199 ++c; | 207 ++c; |
| 200 ctx = get_coef_context(nb, token_cache, c); | 208 ctx = get_coef_context(nb, token_cache, c); |
| 201 dqv = dq[1]; | 209 dqv = dq[1]; |
| 202 } | 210 } |
| 203 | 211 |
| 204 return c; | 212 return c; |
| 205 } | 213 } |
| 206 | 214 |
| 207 int vp9_decode_block_tokens(VP9_COMMON *cm, MACROBLOCKD *xd, | 215 int vp9_decode_block_tokens(VP9_COMMON *cm, MACROBLOCKD *xd, |
| 208 int plane, int block, BLOCK_SIZE plane_bsize, | 216 int plane, int block, BLOCK_SIZE plane_bsize, |
| 209 int x, int y, TX_SIZE tx_size, vp9_reader *r) { | 217 int x, int y, TX_SIZE tx_size, vp9_reader *r) { |
| 210 struct macroblockd_plane *const pd = &xd->plane[plane]; | 218 struct macroblockd_plane *const pd = &xd->plane[plane]; |
| 211 const int ctx = get_entropy_context(tx_size, pd->above_context + x, | 219 const int ctx = get_entropy_context(tx_size, pd->above_context + x, |
| 212 pd->left_context + y); | 220 pd->left_context + y); |
| 213 const scan_order *so = get_scan(xd, tx_size, pd->plane_type, block); | 221 const scan_order *so = get_scan(xd, tx_size, pd->plane_type, block); |
| 214 const int eob = decode_coefs(cm, xd, pd->plane_type, | 222 const int eob = decode_coefs(cm, xd, pd->plane_type, |
| 215 BLOCK_OFFSET(pd->dqcoeff, block), tx_size, | 223 BLOCK_OFFSET(pd->dqcoeff, block), tx_size, |
| 216 pd->dequant, ctx, so->scan, so->neighbors, r); | 224 pd->dequant, ctx, so->scan, so->neighbors, r); |
| 217 vp9_set_contexts(xd, pd, plane_bsize, tx_size, eob > 0, x, y); | 225 vp9_set_contexts(xd, pd, plane_bsize, tx_size, eob > 0, x, y); |
| 218 return eob; | 226 return eob; |
| 219 } | 227 } |
| 220 | 228 |
| 221 | 229 |
| OLD | NEW |