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 |