| 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 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #define ONE_CONTEXT_NODE 2 | 21 #define ONE_CONTEXT_NODE 2 |
| 22 #define LOW_VAL_CONTEXT_NODE 0 | 22 #define LOW_VAL_CONTEXT_NODE 0 |
| 23 #define TWO_CONTEXT_NODE 1 | 23 #define TWO_CONTEXT_NODE 1 |
| 24 #define THREE_CONTEXT_NODE 2 | 24 #define THREE_CONTEXT_NODE 2 |
| 25 #define HIGH_LOW_CONTEXT_NODE 3 | 25 #define HIGH_LOW_CONTEXT_NODE 3 |
| 26 #define CAT_ONE_CONTEXT_NODE 4 | 26 #define CAT_ONE_CONTEXT_NODE 4 |
| 27 #define CAT_THREEFOUR_CONTEXT_NODE 5 | 27 #define CAT_THREEFOUR_CONTEXT_NODE 5 |
| 28 #define CAT_THREE_CONTEXT_NODE 6 | 28 #define CAT_THREE_CONTEXT_NODE 6 |
| 29 #define CAT_FIVE_CONTEXT_NODE 7 | 29 #define CAT_FIVE_CONTEXT_NODE 7 |
| 30 | 30 |
| 31 #define CAT1_MIN_VAL 5 | |
| 32 #define CAT2_MIN_VAL 7 | |
| 33 #define CAT3_MIN_VAL 11 | |
| 34 #define CAT4_MIN_VAL 19 | |
| 35 #define CAT5_MIN_VAL 35 | |
| 36 #define CAT6_MIN_VAL 67 | |
| 37 #define CAT1_PROB0 159 | |
| 38 #define CAT2_PROB0 145 | |
| 39 #define CAT2_PROB1 165 | |
| 40 | |
| 41 #define CAT3_PROB0 140 | |
| 42 #define CAT3_PROB1 148 | |
| 43 #define CAT3_PROB2 173 | |
| 44 | |
| 45 #define CAT4_PROB0 135 | |
| 46 #define CAT4_PROB1 140 | |
| 47 #define CAT4_PROB2 155 | |
| 48 #define CAT4_PROB3 176 | |
| 49 | |
| 50 #define CAT5_PROB0 130 | |
| 51 #define CAT5_PROB1 134 | |
| 52 #define CAT5_PROB2 141 | |
| 53 #define CAT5_PROB3 157 | |
| 54 #define CAT5_PROB4 180 | |
| 55 | |
| 56 static const vp9_prob cat6_prob[15] = { | |
| 57 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 | |
| 58 }; | |
| 59 | |
| 60 #define INCREMENT_COUNT(token) \ | 31 #define INCREMENT_COUNT(token) \ |
| 61 do { \ | 32 do { \ |
| 62 if (!cm->frame_parallel_decoding_mode) \ | 33 if (!cm->frame_parallel_decoding_mode) \ |
| 63 ++coef_counts[band][ctx][token]; \ | 34 ++coef_counts[band][ctx][token]; \ |
| 64 } while (0) | 35 } while (0) |
| 65 | 36 |
| 66 #define WRITE_COEF_CONTINUE(val, token) \ | 37 #define WRITE_COEF_CONTINUE(val, token) \ |
| 67 { \ | 38 { \ |
| 68 v = (val * dqv) >> dq_shift; \ | 39 v = (val * dqv) >> dq_shift; \ |
| 69 dqcoeff[scan[c]] = vp9_read_bit(r) ? -v : v; \ | 40 dqcoeff[scan[c]] = vp9_read_bit(r) ? -v : v; \ |
| (...skipping 19 matching lines...) Expand all Loading... |
| 89 const int ref = is_inter_block(&xd->mi[0]->mbmi); | 60 const int ref = is_inter_block(&xd->mi[0]->mbmi); |
| 90 int band, c = 0; | 61 int band, c = 0; |
| 91 const vp9_prob (*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] = | 62 const vp9_prob (*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] = |
| 92 fc->coef_probs[tx_size][type][ref]; | 63 fc->coef_probs[tx_size][type][ref]; |
| 93 const vp9_prob *prob; | 64 const vp9_prob *prob; |
| 94 unsigned int (*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1] = | 65 unsigned int (*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1] = |
| 95 counts->coef[tx_size][type][ref]; | 66 counts->coef[tx_size][type][ref]; |
| 96 unsigned int (*eob_branch_count)[COEFF_CONTEXTS] = | 67 unsigned int (*eob_branch_count)[COEFF_CONTEXTS] = |
| 97 counts->eob_branch[tx_size][type][ref]; | 68 counts->eob_branch[tx_size][type][ref]; |
| 98 uint8_t token_cache[32 * 32]; | 69 uint8_t token_cache[32 * 32]; |
| 99 const uint8_t *cat6; | |
| 100 const uint8_t *band_translate = get_band_translate(tx_size); | 70 const uint8_t *band_translate = get_band_translate(tx_size); |
| 101 const int dq_shift = (tx_size == TX_32X32); | 71 const int dq_shift = (tx_size == TX_32X32); |
| 102 int v; | 72 int v; |
| 103 int16_t dqv = dq[0]; | 73 int16_t dqv = dq[0]; |
| 104 | 74 |
| 105 while (c < max_eob) { | 75 while (c < max_eob) { |
| 106 int val; | 76 int val; |
| 107 band = *band_translate++; | 77 band = *band_translate++; |
| 108 prob = coef_probs[band][ctx]; | 78 prob = coef_probs[band][ctx]; |
| 109 if (!cm->frame_parallel_decoding_mode) | 79 if (!cm->frame_parallel_decoding_mode) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 } | 111 } |
| 142 if (!vp9_read(r, prob[THREE_CONTEXT_NODE])) { | 112 if (!vp9_read(r, prob[THREE_CONTEXT_NODE])) { |
| 143 WRITE_COEF_CONTINUE(3, THREE_TOKEN); | 113 WRITE_COEF_CONTINUE(3, THREE_TOKEN); |
| 144 } | 114 } |
| 145 WRITE_COEF_CONTINUE(4, FOUR_TOKEN); | 115 WRITE_COEF_CONTINUE(4, FOUR_TOKEN); |
| 146 } | 116 } |
| 147 | 117 |
| 148 if (!vp9_read(r, prob[HIGH_LOW_CONTEXT_NODE])) { | 118 if (!vp9_read(r, prob[HIGH_LOW_CONTEXT_NODE])) { |
| 149 if (!vp9_read(r, prob[CAT_ONE_CONTEXT_NODE])) { | 119 if (!vp9_read(r, prob[CAT_ONE_CONTEXT_NODE])) { |
| 150 val = CAT1_MIN_VAL; | 120 val = CAT1_MIN_VAL; |
| 151 ADJUST_COEF(CAT1_PROB0, 0); | 121 ADJUST_COEF(vp9_cat1_prob[0], 0); |
| 152 WRITE_COEF_CONTINUE(val, CATEGORY1_TOKEN); | 122 WRITE_COEF_CONTINUE(val, CATEGORY1_TOKEN); |
| 153 } | 123 } |
| 154 val = CAT2_MIN_VAL; | 124 val = CAT2_MIN_VAL; |
| 155 ADJUST_COEF(CAT2_PROB1, 1); | 125 ADJUST_COEF(vp9_cat2_prob[0], 1); |
| 156 ADJUST_COEF(CAT2_PROB0, 0); | 126 ADJUST_COEF(vp9_cat2_prob[1], 0); |
| 157 WRITE_COEF_CONTINUE(val, CATEGORY2_TOKEN); | 127 WRITE_COEF_CONTINUE(val, CATEGORY2_TOKEN); |
| 158 } | 128 } |
| 159 | 129 |
| 160 if (!vp9_read(r, prob[CAT_THREEFOUR_CONTEXT_NODE])) { | 130 if (!vp9_read(r, prob[CAT_THREEFOUR_CONTEXT_NODE])) { |
| 161 if (!vp9_read(r, prob[CAT_THREE_CONTEXT_NODE])) { | 131 if (!vp9_read(r, prob[CAT_THREE_CONTEXT_NODE])) { |
| 162 val = CAT3_MIN_VAL; | 132 val = CAT3_MIN_VAL; |
| 163 ADJUST_COEF(CAT3_PROB2, 2); | 133 ADJUST_COEF(vp9_cat3_prob[0], 2); |
| 164 ADJUST_COEF(CAT3_PROB1, 1); | 134 ADJUST_COEF(vp9_cat3_prob[1], 1); |
| 165 ADJUST_COEF(CAT3_PROB0, 0); | 135 ADJUST_COEF(vp9_cat3_prob[2], 0); |
| 166 WRITE_COEF_CONTINUE(val, CATEGORY3_TOKEN); | 136 WRITE_COEF_CONTINUE(val, CATEGORY3_TOKEN); |
| 167 } | 137 } |
| 168 val = CAT4_MIN_VAL; | 138 val = CAT4_MIN_VAL; |
| 169 ADJUST_COEF(CAT4_PROB3, 3); | 139 ADJUST_COEF(vp9_cat4_prob[0], 3); |
| 170 ADJUST_COEF(CAT4_PROB2, 2); | 140 ADJUST_COEF(vp9_cat4_prob[1], 2); |
| 171 ADJUST_COEF(CAT4_PROB1, 1); | 141 ADJUST_COEF(vp9_cat4_prob[2], 1); |
| 172 ADJUST_COEF(CAT4_PROB0, 0); | 142 ADJUST_COEF(vp9_cat4_prob[3], 0); |
| 173 WRITE_COEF_CONTINUE(val, CATEGORY4_TOKEN); | 143 WRITE_COEF_CONTINUE(val, CATEGORY4_TOKEN); |
| 174 } | 144 } |
| 175 | 145 |
| 176 if (!vp9_read(r, prob[CAT_FIVE_CONTEXT_NODE])) { | 146 if (!vp9_read(r, prob[CAT_FIVE_CONTEXT_NODE])) { |
| 177 val = CAT5_MIN_VAL; | 147 val = CAT5_MIN_VAL; |
| 178 ADJUST_COEF(CAT5_PROB4, 4); | 148 ADJUST_COEF(vp9_cat5_prob[0], 4); |
| 179 ADJUST_COEF(CAT5_PROB3, 3); | 149 ADJUST_COEF(vp9_cat5_prob[1], 3); |
| 180 ADJUST_COEF(CAT5_PROB2, 2); | 150 ADJUST_COEF(vp9_cat5_prob[2], 2); |
| 181 ADJUST_COEF(CAT5_PROB1, 1); | 151 ADJUST_COEF(vp9_cat5_prob[3], 1); |
| 182 ADJUST_COEF(CAT5_PROB0, 0); | 152 ADJUST_COEF(vp9_cat5_prob[4], 0); |
| 183 WRITE_COEF_CONTINUE(val, CATEGORY5_TOKEN); | 153 WRITE_COEF_CONTINUE(val, CATEGORY5_TOKEN); |
| 184 } | 154 } |
| 185 val = 0; | 155 val = 0; |
| 186 cat6 = cat6_prob; | 156 val = (val << 1) | vp9_read(r, vp9_cat6_prob[0]); |
| 187 while (*cat6) | 157 val = (val << 1) | vp9_read(r, vp9_cat6_prob[1]); |
| 188 val = (val << 1) | vp9_read(r, *cat6++); | 158 val = (val << 1) | vp9_read(r, vp9_cat6_prob[2]); |
| 159 val = (val << 1) | vp9_read(r, vp9_cat6_prob[3]); |
| 160 val = (val << 1) | vp9_read(r, vp9_cat6_prob[4]); |
| 161 val = (val << 1) | vp9_read(r, vp9_cat6_prob[5]); |
| 162 val = (val << 1) | vp9_read(r, vp9_cat6_prob[6]); |
| 163 val = (val << 1) | vp9_read(r, vp9_cat6_prob[7]); |
| 164 val = (val << 1) | vp9_read(r, vp9_cat6_prob[8]); |
| 165 val = (val << 1) | vp9_read(r, vp9_cat6_prob[9]); |
| 166 val = (val << 1) | vp9_read(r, vp9_cat6_prob[10]); |
| 167 val = (val << 1) | vp9_read(r, vp9_cat6_prob[11]); |
| 168 val = (val << 1) | vp9_read(r, vp9_cat6_prob[12]); |
| 169 val = (val << 1) | vp9_read(r, vp9_cat6_prob[13]); |
| 189 val += CAT6_MIN_VAL; | 170 val += CAT6_MIN_VAL; |
| 190 | 171 |
| 191 WRITE_COEF_CONTINUE(val, CATEGORY6_TOKEN); | 172 WRITE_COEF_CONTINUE(val, CATEGORY6_TOKEN); |
| 192 } | 173 } |
| 193 | 174 |
| 194 return c; | 175 return c; |
| 195 } | 176 } |
| 196 | 177 |
| 197 int vp9_decode_block_tokens(VP9_COMMON *cm, MACROBLOCKD *xd, | 178 int vp9_decode_block_tokens(VP9_COMMON *cm, MACROBLOCKD *xd, |
| 198 int plane, int block, BLOCK_SIZE plane_bsize, | 179 int plane, int block, BLOCK_SIZE plane_bsize, |
| 199 int x, int y, TX_SIZE tx_size, vp9_reader *r) { | 180 int x, int y, TX_SIZE tx_size, vp9_reader *r) { |
| 200 struct macroblockd_plane *const pd = &xd->plane[plane]; | 181 struct macroblockd_plane *const pd = &xd->plane[plane]; |
| 201 const int ctx = get_entropy_context(tx_size, pd->above_context + x, | 182 const int ctx = get_entropy_context(tx_size, pd->above_context + x, |
| 202 pd->left_context + y); | 183 pd->left_context + y); |
| 203 const scan_order *so = get_scan(xd, tx_size, pd->plane_type, block); | 184 const scan_order *so = get_scan(xd, tx_size, pd->plane_type, block); |
| 204 const int eob = decode_coefs(cm, xd, pd->plane_type, | 185 const int eob = decode_coefs(cm, xd, pd->plane_type, |
| 205 BLOCK_OFFSET(pd->dqcoeff, block), tx_size, | 186 BLOCK_OFFSET(pd->dqcoeff, block), tx_size, |
| 206 pd->dequant, ctx, so->scan, so->neighbors, r); | 187 pd->dequant, ctx, so->scan, so->neighbors, r); |
| 207 vp9_set_contexts(xd, pd, plane_bsize, tx_size, eob > 0, x, y); | 188 vp9_set_contexts(xd, pd, plane_bsize, tx_size, eob > 0, x, y); |
| 208 return eob; | 189 return eob; |
| 209 } | 190 } |
| 210 | 191 |
| 211 | 192 |
| OLD | NEW |