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 14 matching lines...) Expand all Loading... |
25 #include "vp9/common/vp9_mvref_common.h" | 25 #include "vp9/common/vp9_mvref_common.h" |
26 #include "vp9/common/vp9_treecoder.h" | 26 #include "vp9/common/vp9_treecoder.h" |
27 #include "vp9/common/vp9_systemdependent.h" | 27 #include "vp9/common/vp9_systemdependent.h" |
28 #include "vp9/common/vp9_pragmas.h" | 28 #include "vp9/common/vp9_pragmas.h" |
29 | 29 |
30 #include "vp9/encoder/vp9_mcomp.h" | 30 #include "vp9/encoder/vp9_mcomp.h" |
31 #include "vp9/encoder/vp9_encodemv.h" | 31 #include "vp9/encoder/vp9_encodemv.h" |
32 #include "vp9/encoder/vp9_bitstream.h" | 32 #include "vp9/encoder/vp9_bitstream.h" |
33 #include "vp9/encoder/vp9_segmentation.h" | 33 #include "vp9/encoder/vp9_segmentation.h" |
34 #include "vp9/encoder/vp9_subexp.h" | 34 #include "vp9/encoder/vp9_subexp.h" |
| 35 #include "vp9/encoder/vp9_tokenize.h" |
35 #include "vp9/encoder/vp9_write_bit_buffer.h" | 36 #include "vp9/encoder/vp9_write_bit_buffer.h" |
36 | 37 |
37 | 38 |
38 #if defined(SECTIONBITS_OUTPUT) | 39 #if defined(SECTIONBITS_OUTPUT) |
39 unsigned __int64 Sectionbits[500]; | 40 unsigned __int64 Sectionbits[500]; |
40 #endif | 41 #endif |
41 | 42 |
42 #ifdef ENTROPY_STATS | 43 #ifdef ENTROPY_STATS |
43 int intra_mode_stats[INTRA_MODES] | 44 int intra_mode_stats[INTRA_MODES] |
44 [INTRA_MODES] | 45 [INTRA_MODES] |
45 [INTRA_MODES]; | 46 [INTRA_MODES]; |
46 vp9_coeff_stats tree_update_hist[TX_SIZES][BLOCK_TYPES]; | 47 vp9_coeff_stats tree_update_hist[TX_SIZES][PLANE_TYPES]; |
47 | 48 |
48 extern unsigned int active_section; | 49 extern unsigned int active_section; |
49 #endif | 50 #endif |
50 | 51 |
| 52 static struct vp9_token intra_mode_encodings[INTRA_MODES]; |
| 53 static struct vp9_token switchable_interp_encodings[SWITCHABLE_FILTERS]; |
| 54 static struct vp9_token partition_encodings[PARTITION_TYPES]; |
| 55 static struct vp9_token inter_mode_encodings[INTER_MODES]; |
51 | 56 |
52 #ifdef MODE_STATS | 57 void vp9_entropy_mode_init() { |
53 int64_t tx_count_32x32p_stats[TX_SIZE_CONTEXTS][TX_SIZES]; | 58 vp9_tokens_from_tree(intra_mode_encodings, vp9_intra_mode_tree); |
54 int64_t tx_count_16x16p_stats[TX_SIZE_CONTEXTS][TX_SIZES - 1]; | 59 vp9_tokens_from_tree(switchable_interp_encodings, vp9_switchable_interp_tree); |
55 int64_t tx_count_8x8p_stats[TX_SIZE_CONTEXTS][TX_SIZES - 2]; | 60 vp9_tokens_from_tree(partition_encodings, vp9_partition_tree); |
56 int64_t switchable_interp_stats[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS]; | 61 vp9_tokens_from_tree(inter_mode_encodings, vp9_inter_mode_tree); |
57 | |
58 void init_tx_count_stats() { | |
59 vp9_zero(tx_count_32x32p_stats); | |
60 vp9_zero(tx_count_16x16p_stats); | |
61 vp9_zero(tx_count_8x8p_stats); | |
62 } | 62 } |
63 | 63 |
64 void init_switchable_interp_stats() { | 64 static void write_intra_mode(vp9_writer *w, MB_PREDICTION_MODE mode, |
65 vp9_zero(switchable_interp_stats); | 65 const vp9_prob *probs) { |
| 66 vp9_write_token(w, vp9_intra_mode_tree, probs, &intra_mode_encodings[mode]); |
66 } | 67 } |
67 | 68 |
68 static void update_tx_count_stats(VP9_COMMON *cm) { | 69 static void write_inter_mode(vp9_writer *w, MB_PREDICTION_MODE mode, |
69 int i, j; | 70 const vp9_prob *probs) { |
70 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | 71 assert(is_inter_mode(mode)); |
71 for (j = 0; j < TX_SIZES; j++) { | 72 vp9_write_token(w, vp9_inter_mode_tree, probs, |
72 tx_count_32x32p_stats[i][j] += cm->fc.tx_count_32x32p[i][j]; | 73 &inter_mode_encodings[INTER_OFFSET(mode)]); |
73 } | |
74 } | |
75 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | |
76 for (j = 0; j < TX_SIZES - 1; j++) { | |
77 tx_count_16x16p_stats[i][j] += cm->fc.tx_count_16x16p[i][j]; | |
78 } | |
79 } | |
80 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | |
81 for (j = 0; j < TX_SIZES - 2; j++) { | |
82 tx_count_8x8p_stats[i][j] += cm->fc.tx_count_8x8p[i][j]; | |
83 } | |
84 } | |
85 } | 74 } |
86 | 75 |
87 static void update_switchable_interp_stats(VP9_COMMON *cm) { | |
88 int i, j; | |
89 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) | |
90 for (j = 0; j < SWITCHABLE_FILTERS; ++j) | |
91 switchable_interp_stats[i][j] += cm->fc.switchable_interp_count[i][j]; | |
92 } | |
93 | |
94 void write_tx_count_stats() { | |
95 int i, j; | |
96 FILE *fp = fopen("tx_count.bin", "wb"); | |
97 fwrite(tx_count_32x32p_stats, sizeof(tx_count_32x32p_stats), 1, fp); | |
98 fwrite(tx_count_16x16p_stats, sizeof(tx_count_16x16p_stats), 1, fp); | |
99 fwrite(tx_count_8x8p_stats, sizeof(tx_count_8x8p_stats), 1, fp); | |
100 fclose(fp); | |
101 | |
102 printf( | |
103 "vp9_default_tx_count_32x32p[TX_SIZE_CONTEXTS][TX_SIZES] = {\n"); | |
104 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | |
105 printf(" { "); | |
106 for (j = 0; j < TX_SIZES; j++) { | |
107 printf("%"PRId64", ", tx_count_32x32p_stats[i][j]); | |
108 } | |
109 printf("},\n"); | |
110 } | |
111 printf("};\n"); | |
112 printf( | |
113 "vp9_default_tx_count_16x16p[TX_SIZE_CONTEXTS][TX_SIZES-1] = {\n"); | |
114 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | |
115 printf(" { "); | |
116 for (j = 0; j < TX_SIZES - 1; j++) { | |
117 printf("%"PRId64", ", tx_count_16x16p_stats[i][j]); | |
118 } | |
119 printf("},\n"); | |
120 } | |
121 printf("};\n"); | |
122 printf( | |
123 "vp9_default_tx_count_8x8p[TX_SIZE_CONTEXTS][TX_SIZES-2] = {\n"); | |
124 for (i = 0; i < TX_SIZE_CONTEXTS; i++) { | |
125 printf(" { "); | |
126 for (j = 0; j < TX_SIZES - 2; j++) { | |
127 printf("%"PRId64", ", tx_count_8x8p_stats[i][j]); | |
128 } | |
129 printf("},\n"); | |
130 } | |
131 printf("};\n"); | |
132 } | |
133 | |
134 void write_switchable_interp_stats() { | |
135 int i, j; | |
136 FILE *fp = fopen("switchable_interp.bin", "wb"); | |
137 fwrite(switchable_interp_stats, sizeof(switchable_interp_stats), 1, fp); | |
138 fclose(fp); | |
139 | |
140 printf( | |
141 "vp9_default_switchable_filter_count[SWITCHABLE_FILTER_CONTEXTS]" | |
142 "[SWITCHABLE_FILTERS] = {\n"); | |
143 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { | |
144 printf(" { "); | |
145 for (j = 0; j < SWITCHABLE_FILTERS; j++) { | |
146 printf("%"PRId64", ", switchable_interp_stats[i][j]); | |
147 } | |
148 printf("},\n"); | |
149 } | |
150 printf("};\n"); | |
151 } | |
152 #endif | |
153 | |
154 static INLINE void write_be32(uint8_t *p, int value) { | 76 static INLINE void write_be32(uint8_t *p, int value) { |
155 p[0] = value >> 24; | 77 p[0] = value >> 24; |
156 p[1] = value >> 16; | 78 p[1] = value >> 16; |
157 p[2] = value >> 8; | 79 p[2] = value >> 8; |
158 p[3] = value; | 80 p[3] = value; |
159 } | 81 } |
160 | 82 |
161 void vp9_encode_unsigned_max(struct vp9_write_bit_buffer *wb, | 83 void vp9_encode_unsigned_max(struct vp9_write_bit_buffer *wb, |
162 int data, int max) { | 84 int data, int max) { |
163 vp9_wb_write_literal(wb, data, get_unsigned_bits(max)); | 85 vp9_wb_write_literal(wb, data, get_unsigned_bits(max)); |
164 } | 86 } |
165 | 87 |
166 static void update_mode( | 88 static void prob_diff_update(const vp9_tree_index *tree, |
167 vp9_writer *w, | 89 vp9_prob probs[/*n - 1*/], |
168 int n, | 90 const unsigned int counts[/*n - 1*/], |
169 vp9_tree tree, | 91 int n, vp9_writer *w) { |
170 vp9_prob Pnew[/* n-1 */], | 92 int i; |
171 vp9_prob Pcur[/* n-1 */], | 93 unsigned int branch_ct[32][2]; |
172 unsigned int bct[/* n-1 */] [2], | |
173 const unsigned int num_events[/* n */] | |
174 ) { | |
175 int i = 0; | |
176 | 94 |
177 vp9_tree_probs_from_distribution(tree, Pnew, bct, num_events, 0); | 95 // Assuming max number of probabilities <= 32 |
178 n--; | 96 assert(n <= 32); |
179 | 97 |
180 for (i = 0; i < n; ++i) | 98 vp9_tree_probs_from_distribution(tree, branch_ct, counts); |
181 vp9_cond_prob_diff_update(w, &Pcur[i], bct[i]); | 99 for (i = 0; i < n - 1; ++i) |
182 } | 100 vp9_cond_prob_diff_update(w, &probs[i], branch_ct[i]); |
183 | |
184 static void update_mbintra_mode_probs(VP9_COMP* const cpi, | |
185 vp9_writer* const bc) { | |
186 VP9_COMMON *const cm = &cpi->common; | |
187 int j; | |
188 vp9_prob pnew[INTRA_MODES - 1]; | |
189 unsigned int bct[INTRA_MODES - 1][2]; | |
190 | |
191 for (j = 0; j < BLOCK_SIZE_GROUPS; j++) | |
192 update_mode(bc, INTRA_MODES, vp9_intra_mode_tree, pnew, | |
193 cm->fc.y_mode_prob[j], bct, | |
194 (unsigned int *)cpi->y_mode_count[j]); | |
195 } | 101 } |
196 | 102 |
197 static void write_selected_tx_size(const VP9_COMP *cpi, MODE_INFO *m, | 103 static void write_selected_tx_size(const VP9_COMP *cpi, MODE_INFO *m, |
198 TX_SIZE tx_size, BLOCK_SIZE bsize, | 104 TX_SIZE tx_size, BLOCK_SIZE bsize, |
199 vp9_writer *w) { | 105 vp9_writer *w) { |
| 106 const TX_SIZE max_tx_size = max_txsize_lookup[bsize]; |
200 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 107 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
201 const vp9_prob *tx_probs = get_tx_probs2(xd, &cpi->common.fc.tx_probs, m); | 108 const vp9_prob *const tx_probs = get_tx_probs2(max_tx_size, xd, |
| 109 &cpi->common.fc.tx_probs); |
202 vp9_write(w, tx_size != TX_4X4, tx_probs[0]); | 110 vp9_write(w, tx_size != TX_4X4, tx_probs[0]); |
203 if (bsize >= BLOCK_16X16 && tx_size != TX_4X4) { | 111 if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) { |
204 vp9_write(w, tx_size != TX_8X8, tx_probs[1]); | 112 vp9_write(w, tx_size != TX_8X8, tx_probs[1]); |
205 if (bsize >= BLOCK_32X32 && tx_size != TX_8X8) | 113 if (tx_size != TX_8X8 && max_tx_size >= TX_32X32) |
206 vp9_write(w, tx_size != TX_16X16, tx_probs[2]); | 114 vp9_write(w, tx_size != TX_16X16, tx_probs[2]); |
207 } | 115 } |
208 } | 116 } |
209 | 117 |
210 static int write_skip_coeff(const VP9_COMP *cpi, int segment_id, MODE_INFO *m, | 118 static int write_skip_coeff(const VP9_COMP *cpi, int segment_id, MODE_INFO *m, |
211 vp9_writer *w) { | 119 vp9_writer *w) { |
212 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 120 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
213 if (vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { | 121 if (vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { |
214 return 1; | 122 return 1; |
215 } else { | 123 } else { |
216 const int skip_coeff = m->mbmi.skip_coeff; | 124 const int skip = m->mbmi.skip_coeff; |
217 vp9_write(w, skip_coeff, vp9_get_pred_prob_mbskip(&cpi->common, xd)); | 125 vp9_write(w, skip, vp9_get_skip_prob(&cpi->common, xd)); |
218 return skip_coeff; | 126 return skip; |
219 } | 127 } |
220 } | 128 } |
221 | 129 |
222 void vp9_update_skip_probs(VP9_COMP *cpi, vp9_writer *w) { | 130 void vp9_update_skip_probs(VP9_COMP *cpi, vp9_writer *w) { |
223 VP9_COMMON *cm = &cpi->common; | 131 VP9_COMMON *cm = &cpi->common; |
224 int k; | 132 int k; |
225 | 133 |
226 for (k = 0; k < MBSKIP_CONTEXTS; ++k) | 134 for (k = 0; k < MBSKIP_CONTEXTS; ++k) |
227 vp9_cond_prob_diff_update(w, &cm->fc.mbskip_probs[k], cm->counts.mbskip[k]); | 135 vp9_cond_prob_diff_update(w, &cm->fc.mbskip_probs[k], cm->counts.mbskip[k]); |
228 } | 136 } |
229 | 137 |
230 static void write_intra_mode(vp9_writer *bc, int m, const vp9_prob *p) { | 138 static void update_switchable_interp_probs(VP9_COMP *cpi, vp9_writer *w) { |
231 write_token(bc, vp9_intra_mode_tree, p, vp9_intra_mode_encodings + m); | 139 VP9_COMMON *const cm = &cpi->common; |
232 } | 140 int j; |
| 141 for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) |
| 142 prob_diff_update(vp9_switchable_interp_tree, |
| 143 cm->fc.switchable_interp_prob[j], |
| 144 cm->counts.switchable_interp[j], SWITCHABLE_FILTERS, w); |
233 | 145 |
234 static void update_switchable_interp_probs(VP9_COMP *const cpi, | |
235 vp9_writer* const bc) { | |
236 VP9_COMMON *const cm = &cpi->common; | |
237 unsigned int branch_ct[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS - 1][2]; | |
238 vp9_prob new_prob[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS - 1]; | |
239 int i, j; | |
240 for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) { | |
241 vp9_tree_probs_from_distribution( | |
242 vp9_switchable_interp_tree, | |
243 new_prob[j], branch_ct[j], | |
244 cm->counts.switchable_interp[j], 0); | |
245 } | |
246 for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) { | |
247 for (i = 0; i < SWITCHABLE_FILTERS - 1; ++i) { | |
248 vp9_cond_prob_diff_update(bc, &cm->fc.switchable_interp_prob[j][i], | |
249 branch_ct[j][i]); | |
250 } | |
251 } | |
252 #ifdef MODE_STATS | 146 #ifdef MODE_STATS |
253 if (!cpi->dummy_packing) | 147 if (!cpi->dummy_packing) |
254 update_switchable_interp_stats(cm); | 148 update_switchable_interp_stats(cm); |
255 #endif | 149 #endif |
256 } | 150 } |
257 | 151 |
258 static void update_inter_mode_probs(VP9_COMMON *cm, vp9_writer* const bc) { | 152 static void pack_mb_tokens(vp9_writer* const w, |
259 int i, j; | |
260 | |
261 for (i = 0; i < INTER_MODE_CONTEXTS; ++i) { | |
262 unsigned int branch_ct[INTER_MODES - 1][2]; | |
263 vp9_prob new_prob[INTER_MODES - 1]; | |
264 | |
265 vp9_tree_probs_from_distribution(vp9_inter_mode_tree, | |
266 new_prob, branch_ct, | |
267 cm->counts.inter_mode[i], NEARESTMV); | |
268 | |
269 for (j = 0; j < INTER_MODES - 1; ++j) | |
270 vp9_cond_prob_diff_update(bc, &cm->fc.inter_mode_probs[i][j], | |
271 branch_ct[j]); | |
272 } | |
273 } | |
274 | |
275 static void pack_mb_tokens(vp9_writer* const bc, | |
276 TOKENEXTRA **tp, | 153 TOKENEXTRA **tp, |
277 const TOKENEXTRA *const stop) { | 154 const TOKENEXTRA *const stop) { |
278 TOKENEXTRA *p = *tp; | 155 TOKENEXTRA *p = *tp; |
279 | 156 |
280 while (p < stop && p->token != EOSB_TOKEN) { | 157 while (p < stop && p->token != EOSB_TOKEN) { |
281 const int t = p->token; | 158 const int t = p->token; |
282 const struct vp9_token *const a = vp9_coef_encodings + t; | 159 const struct vp9_token *const a = &vp9_coef_encodings[t]; |
283 const vp9_extra_bit *const b = vp9_extra_bits + t; | 160 const vp9_extra_bit *const b = &vp9_extra_bits[t]; |
284 int i = 0; | 161 int i = 0; |
285 const vp9_prob *pp; | |
286 int v = a->value; | 162 int v = a->value; |
287 int n = a->len; | 163 int n = a->len; |
288 vp9_prob probs[ENTROPY_NODES]; | |
289 | |
290 if (t >= TWO_TOKEN) { | |
291 vp9_model_to_full_probs(p->context_tree, probs); | |
292 pp = probs; | |
293 } else { | |
294 pp = p->context_tree; | |
295 } | |
296 assert(pp != 0); | |
297 | 164 |
298 /* skip one or two nodes */ | 165 /* skip one or two nodes */ |
299 if (p->skip_eob_node) { | 166 if (p->skip_eob_node) { |
300 n -= p->skip_eob_node; | 167 n -= p->skip_eob_node; |
301 i = 2 * p->skip_eob_node; | 168 i = 2 * p->skip_eob_node; |
302 } | 169 } |
303 | 170 |
304 do { | 171 // TODO(jbb): expanding this can lead to big gains. It allows |
305 const int bb = (v >> --n) & 1; | 172 // much better branch prediction and would enable us to avoid numerous |
306 vp9_write(bc, bb, pp[i >> 1]); | 173 // lookups and compares. |
307 i = vp9_coef_tree[i + bb]; | 174 |
308 } while (n); | 175 // If we have a token that's in the constrained set, the coefficient tree |
| 176 // is split into two treed writes. The first treed write takes care of the |
| 177 // unconstrained nodes. The second treed write takes care of the |
| 178 // constrained nodes. |
| 179 if (t >= TWO_TOKEN && t < EOB_TOKEN) { |
| 180 int len = UNCONSTRAINED_NODES - p->skip_eob_node; |
| 181 int bits = v >> (n - len); |
| 182 vp9_write_tree(w, vp9_coef_tree, p->context_tree, bits, len, i); |
| 183 vp9_write_tree(w, vp9_coef_con_tree, |
| 184 vp9_pareto8_full[p->context_tree[PIVOT_NODE] - 1], |
| 185 v, n - len, 0); |
| 186 } else { |
| 187 vp9_write_tree(w, vp9_coef_tree, p->context_tree, v, n, i); |
| 188 } |
309 | 189 |
310 if (b->base_val) { | 190 if (b->base_val) { |
311 const int e = p->extra, l = b->len; | 191 const int e = p->extra, l = b->len; |
312 | 192 |
313 if (l) { | 193 if (l) { |
314 const unsigned char *pb = b->prob; | 194 const unsigned char *pb = b->prob; |
315 int v = e >> 1; | 195 int v = e >> 1; |
316 int n = l; /* number of bits in v, assumed nonzero */ | 196 int n = l; /* number of bits in v, assumed nonzero */ |
317 int i = 0; | 197 int i = 0; |
318 | 198 |
319 do { | 199 do { |
320 const int bb = (v >> --n) & 1; | 200 const int bb = (v >> --n) & 1; |
321 vp9_write(bc, bb, pb[i >> 1]); | 201 vp9_write(w, bb, pb[i >> 1]); |
322 i = b->tree[i + bb]; | 202 i = b->tree[i + bb]; |
323 } while (n); | 203 } while (n); |
324 } | 204 } |
325 | 205 |
326 vp9_write_bit(bc, e & 1); | 206 vp9_write_bit(w, e & 1); |
327 } | 207 } |
328 ++p; | 208 ++p; |
329 } | 209 } |
330 | 210 |
331 *tp = p + (p->token == EOSB_TOKEN); | 211 *tp = p + (p->token == EOSB_TOKEN); |
332 } | 212 } |
333 | 213 |
334 static void write_sb_mv_ref(vp9_writer *w, MB_PREDICTION_MODE mode, | |
335 const vp9_prob *p) { | |
336 assert(is_inter_mode(mode)); | |
337 write_token(w, vp9_inter_mode_tree, p, | |
338 &vp9_inter_mode_encodings[inter_mode_offset(mode)]); | |
339 } | |
340 | |
341 | |
342 static void write_segment_id(vp9_writer *w, const struct segmentation *seg, | 214 static void write_segment_id(vp9_writer *w, const struct segmentation *seg, |
343 int segment_id) { | 215 int segment_id) { |
344 if (seg->enabled && seg->update_map) | 216 if (seg->enabled && seg->update_map) |
345 treed_write(w, vp9_segment_tree, seg->tree_probs, segment_id, 3); | 217 vp9_write_tree(w, vp9_segment_tree, seg->tree_probs, segment_id, 3, 0); |
346 } | 218 } |
347 | 219 |
348 // This function encodes the reference frame | 220 // This function encodes the reference frame |
349 static void encode_ref_frame(VP9_COMP *cpi, vp9_writer *bc) { | 221 static void encode_ref_frame(VP9_COMP *cpi, vp9_writer *bc) { |
350 VP9_COMMON *const cm = &cpi->common; | 222 VP9_COMMON *const cm = &cpi->common; |
351 MACROBLOCK *const x = &cpi->mb; | 223 MACROBLOCK *const x = &cpi->mb; |
352 MACROBLOCKD *const xd = &x->e_mbd; | 224 MACROBLOCKD *const xd = &x->e_mbd; |
353 MB_MODE_INFO *mi = &xd->mi_8x8[0]->mbmi; | 225 MB_MODE_INFO *mi = &xd->mi_8x8[0]->mbmi; |
354 const int segment_id = mi->segment_id; | 226 const int segment_id = mi->segment_id; |
355 int seg_ref_active = vp9_segfeature_active(&cm->seg, segment_id, | 227 int seg_ref_active = vp9_segfeature_active(&cm->seg, segment_id, |
356 SEG_LVL_REF_FRAME); | 228 SEG_LVL_REF_FRAME); |
357 // If segment level coding of this signal is disabled... | 229 // If segment level coding of this signal is disabled... |
358 // or the segment allows multiple reference frame options | 230 // or the segment allows multiple reference frame options |
359 if (!seg_ref_active) { | 231 if (!seg_ref_active) { |
360 // does the feature use compound prediction or not | 232 // does the feature use compound prediction or not |
361 // (if not specified at the frame/segment level) | 233 // (if not specified at the frame/segment level) |
362 if (cm->comp_pred_mode == HYBRID_PREDICTION) { | 234 if (cm->reference_mode == REFERENCE_MODE_SELECT) { |
363 vp9_write(bc, mi->ref_frame[1] > INTRA_FRAME, | 235 vp9_write(bc, mi->ref_frame[1] > INTRA_FRAME, |
364 vp9_get_pred_prob_comp_inter_inter(cm, xd)); | 236 vp9_get_reference_mode_prob(cm, xd)); |
365 } else { | 237 } else { |
366 assert((mi->ref_frame[1] <= INTRA_FRAME) == | 238 assert((mi->ref_frame[1] <= INTRA_FRAME) == |
367 (cm->comp_pred_mode == SINGLE_PREDICTION_ONLY)); | 239 (cm->reference_mode == SINGLE_REFERENCE)); |
368 } | 240 } |
369 | 241 |
370 if (mi->ref_frame[1] > INTRA_FRAME) { | 242 if (mi->ref_frame[1] > INTRA_FRAME) { |
371 vp9_write(bc, mi->ref_frame[0] == GOLDEN_FRAME, | 243 vp9_write(bc, mi->ref_frame[0] == GOLDEN_FRAME, |
372 vp9_get_pred_prob_comp_ref_p(cm, xd)); | 244 vp9_get_pred_prob_comp_ref_p(cm, xd)); |
373 } else { | 245 } else { |
374 vp9_write(bc, mi->ref_frame[0] != LAST_FRAME, | 246 vp9_write(bc, mi->ref_frame[0] != LAST_FRAME, |
375 vp9_get_pred_prob_single_ref_p1(cm, xd)); | 247 vp9_get_pred_prob_single_ref_p1(cm, xd)); |
376 if (mi->ref_frame[0] != LAST_FRAME) | 248 if (mi->ref_frame[0] != LAST_FRAME) |
377 vp9_write(bc, mi->ref_frame[0] != GOLDEN_FRAME, | 249 vp9_write(bc, mi->ref_frame[0] != GOLDEN_FRAME, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 if (!pred_flag) | 285 if (!pred_flag) |
414 write_segment_id(bc, seg, segment_id); | 286 write_segment_id(bc, seg, segment_id); |
415 } else { | 287 } else { |
416 write_segment_id(bc, seg, segment_id); | 288 write_segment_id(bc, seg, segment_id); |
417 } | 289 } |
418 } | 290 } |
419 | 291 |
420 skip_coeff = write_skip_coeff(cpi, segment_id, m, bc); | 292 skip_coeff = write_skip_coeff(cpi, segment_id, m, bc); |
421 | 293 |
422 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) | 294 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) |
423 vp9_write(bc, rf != INTRA_FRAME, | 295 vp9_write(bc, rf != INTRA_FRAME, vp9_get_intra_inter_prob(cm, xd)); |
424 vp9_get_pred_prob_intra_inter(cm, xd)); | |
425 | 296 |
426 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT && | 297 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT && |
427 !(rf != INTRA_FRAME && | 298 !(rf != INTRA_FRAME && |
428 (skip_coeff || vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)))) { | 299 (skip_coeff || vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)))) { |
429 write_selected_tx_size(cpi, m, mi->tx_size, bsize, bc); | 300 write_selected_tx_size(cpi, m, mi->tx_size, bsize, bc); |
430 } | 301 } |
431 | 302 |
432 if (rf == INTRA_FRAME) { | 303 if (rf == INTRA_FRAME) { |
433 #ifdef ENTROPY_STATS | 304 #ifdef ENTROPY_STATS |
434 active_section = 6; | 305 active_section = 6; |
(...skipping 18 matching lines...) Expand all Loading... |
453 encode_ref_frame(cpi, bc); | 324 encode_ref_frame(cpi, bc); |
454 mv_ref_p = cpi->common.fc.inter_mode_probs[mi->mode_context[rf]]; | 325 mv_ref_p = cpi->common.fc.inter_mode_probs[mi->mode_context[rf]]; |
455 | 326 |
456 #ifdef ENTROPY_STATS | 327 #ifdef ENTROPY_STATS |
457 active_section = 3; | 328 active_section = 3; |
458 #endif | 329 #endif |
459 | 330 |
460 // If segment skip is not enabled code the mode. | 331 // If segment skip is not enabled code the mode. |
461 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)) { | 332 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)) { |
462 if (bsize >= BLOCK_8X8) { | 333 if (bsize >= BLOCK_8X8) { |
463 write_sb_mv_ref(bc, mode, mv_ref_p); | 334 write_inter_mode(bc, mode, mv_ref_p); |
464 ++cm->counts.inter_mode[mi->mode_context[rf]] | 335 ++cm->counts.inter_mode[mi->mode_context[rf]][INTER_OFFSET(mode)]; |
465 [inter_mode_offset(mode)]; | |
466 } | 336 } |
467 } | 337 } |
468 | 338 |
469 if (cm->mcomp_filter_type == SWITCHABLE) { | 339 if (cm->mcomp_filter_type == SWITCHABLE) { |
470 const int ctx = vp9_get_pred_context_switchable_interp(xd); | 340 const int ctx = vp9_get_pred_context_switchable_interp(xd); |
471 write_token(bc, vp9_switchable_interp_tree, | 341 vp9_write_token(bc, vp9_switchable_interp_tree, |
472 cm->fc.switchable_interp_prob[ctx], | 342 cm->fc.switchable_interp_prob[ctx], |
473 &vp9_switchable_interp_encodings[mi->interp_filter]); | 343 &switchable_interp_encodings[mi->interp_filter]); |
474 } else { | 344 } else { |
475 assert(mi->interp_filter == cm->mcomp_filter_type); | 345 assert(mi->interp_filter == cm->mcomp_filter_type); |
476 } | 346 } |
477 | 347 |
478 if (bsize < BLOCK_8X8) { | 348 if (bsize < BLOCK_8X8) { |
479 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; | 349 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; |
480 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; | 350 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; |
481 int idx, idy; | 351 int idx, idy; |
482 for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { | 352 for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { |
483 for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { | 353 for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { |
484 const int j = idy * 2 + idx; | 354 const int j = idy * 2 + idx; |
485 const MB_PREDICTION_MODE blockmode = m->bmi[j].as_mode; | 355 const MB_PREDICTION_MODE blockmode = m->bmi[j].as_mode; |
486 write_sb_mv_ref(bc, blockmode, mv_ref_p); | 356 write_inter_mode(bc, blockmode, mv_ref_p); |
487 ++cm->counts.inter_mode[mi->mode_context[rf]] | 357 ++cm->counts.inter_mode[mi->mode_context[rf]] |
488 [inter_mode_offset(blockmode)]; | 358 [INTER_OFFSET(blockmode)]; |
489 | 359 |
490 if (blockmode == NEWMV) { | 360 if (blockmode == NEWMV) { |
491 #ifdef ENTROPY_STATS | 361 #ifdef ENTROPY_STATS |
492 active_section = 11; | 362 active_section = 11; |
493 #endif | 363 #endif |
494 vp9_encode_mv(cpi, bc, &m->bmi[j].as_mv[0].as_mv, | 364 vp9_encode_mv(cpi, bc, &m->bmi[j].as_mv[0].as_mv, |
495 &mi->best_mv[0].as_mv, nmvc, allow_hp); | 365 &mi->best_mv[0].as_mv, nmvc, allow_hp); |
496 | 366 |
497 if (has_second_ref(mi)) | 367 if (has_second_ref(mi)) |
498 vp9_encode_mv(cpi, bc, &m->bmi[j].as_mv[1].as_mv, | 368 vp9_encode_mv(cpi, bc, &m->bmi[j].as_mv[1].as_mv, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 #endif | 422 #endif |
553 write_intra_mode(bc, bm, vp9_kf_y_mode_prob[A][L]); | 423 write_intra_mode(bc, bm, vp9_kf_y_mode_prob[A][L]); |
554 } | 424 } |
555 } | 425 } |
556 } | 426 } |
557 | 427 |
558 write_intra_mode(bc, m->mbmi.uv_mode, vp9_kf_uv_mode_prob[ym]); | 428 write_intra_mode(bc, m->mbmi.uv_mode, vp9_kf_uv_mode_prob[ym]); |
559 } | 429 } |
560 | 430 |
561 static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile, | 431 static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile, |
562 MODE_INFO **mi_8x8, vp9_writer *bc, | 432 vp9_writer *w, TOKENEXTRA **tok, TOKENEXTRA *tok_end, |
563 TOKENEXTRA **tok, TOKENEXTRA *tok_end, | 433 int mi_row, int mi_col) { |
564 int mi_row, int mi_col, int index) { | |
565 VP9_COMMON *const cm = &cpi->common; | 434 VP9_COMMON *const cm = &cpi->common; |
566 MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 435 MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
567 MODE_INFO *m = mi_8x8[0]; | 436 MODE_INFO *m; |
568 | 437 |
569 if (m->mbmi.sb_type < BLOCK_8X8) | 438 xd->mi_8x8 = cm->mi_grid_visible + (mi_row * cm->mode_info_stride + mi_col); |
570 if (index > 0) | 439 m = xd->mi_8x8[0]; |
571 return; | |
572 | |
573 xd->mi_8x8 = mi_8x8; | |
574 | 440 |
575 set_mi_row_col(xd, tile, | 441 set_mi_row_col(xd, tile, |
576 mi_row, num_8x8_blocks_high_lookup[m->mbmi.sb_type], | 442 mi_row, num_8x8_blocks_high_lookup[m->mbmi.sb_type], |
577 mi_col, num_8x8_blocks_wide_lookup[m->mbmi.sb_type], | 443 mi_col, num_8x8_blocks_wide_lookup[m->mbmi.sb_type], |
578 cm->mi_rows, cm->mi_cols); | 444 cm->mi_rows, cm->mi_cols); |
579 if (frame_is_intra_only(cm)) { | 445 if (frame_is_intra_only(cm)) { |
580 write_mb_modes_kf(cpi, mi_8x8, bc); | 446 write_mb_modes_kf(cpi, xd->mi_8x8, w); |
581 #ifdef ENTROPY_STATS | 447 #ifdef ENTROPY_STATS |
582 active_section = 8; | 448 active_section = 8; |
583 #endif | 449 #endif |
584 } else { | 450 } else { |
585 pack_inter_mode_mvs(cpi, m, bc); | 451 pack_inter_mode_mvs(cpi, m, w); |
586 #ifdef ENTROPY_STATS | 452 #ifdef ENTROPY_STATS |
587 active_section = 1; | 453 active_section = 1; |
588 #endif | 454 #endif |
589 } | 455 } |
590 | 456 |
591 assert(*tok < tok_end); | 457 assert(*tok < tok_end); |
592 pack_mb_tokens(bc, tok, tok_end); | 458 pack_mb_tokens(w, tok, tok_end); |
593 } | 459 } |
594 | 460 |
595 static void write_partition(PARTITION_TYPE partition, | 461 static void write_partition(VP9_COMP *cpi, int hbs, int mi_row, int mi_col, |
596 int hbs, int mi_rows, int mi_cols, | 462 PARTITION_TYPE p, BLOCK_SIZE bsize, vp9_writer *w) { |
597 int mi_row, int mi_col, | 463 VP9_COMMON *const cm = &cpi->common; |
598 vp9_prob probs[PARTITION_TYPES - 1], | 464 const int ctx = partition_plane_context(cpi->above_seg_context, |
599 vp9_writer *w) { | 465 cpi->left_seg_context, |
600 const int has_rows = (mi_row + hbs) < mi_rows; | 466 mi_row, mi_col, bsize); |
601 const int has_cols = (mi_col + hbs) < mi_cols; | 467 const vp9_prob *const probs = get_partition_probs(cm, ctx); |
| 468 const int has_rows = (mi_row + hbs) < cm->mi_rows; |
| 469 const int has_cols = (mi_col + hbs) < cm->mi_cols; |
602 | 470 |
603 if (has_rows && has_cols) { | 471 if (has_rows && has_cols) { |
604 write_token(w, vp9_partition_tree, probs, | 472 vp9_write_token(w, vp9_partition_tree, probs, &partition_encodings[p]); |
605 &vp9_partition_encodings[partition]); | |
606 } else if (!has_rows && has_cols) { | 473 } else if (!has_rows && has_cols) { |
607 assert(partition == PARTITION_SPLIT || partition == PARTITION_HORZ); | 474 assert(p == PARTITION_SPLIT || p == PARTITION_HORZ); |
608 vp9_write(w, partition == PARTITION_SPLIT, probs[1]); | 475 vp9_write(w, p == PARTITION_SPLIT, probs[1]); |
609 } else if (has_rows && !has_cols) { | 476 } else if (has_rows && !has_cols) { |
610 assert(partition == PARTITION_SPLIT || partition == PARTITION_VERT); | 477 assert(p == PARTITION_SPLIT || p == PARTITION_VERT); |
611 vp9_write(w, partition == PARTITION_SPLIT, probs[2]); | 478 vp9_write(w, p == PARTITION_SPLIT, probs[2]); |
612 } else { | 479 } else { |
613 assert(partition == PARTITION_SPLIT); | 480 assert(p == PARTITION_SPLIT); |
614 } | 481 } |
615 } | 482 } |
616 | 483 |
617 static void write_modes_sb(VP9_COMP *cpi, const TileInfo *const tile, | 484 static void write_modes_sb(VP9_COMP *cpi, const TileInfo *const tile, |
618 MODE_INFO **mi_8x8, vp9_writer *bc, | 485 vp9_writer *w, TOKENEXTRA **tok, TOKENEXTRA *tok_end, |
619 TOKENEXTRA **tok, TOKENEXTRA *tok_end, | 486 int mi_row, int mi_col, BLOCK_SIZE bsize) { |
620 int mi_row, int mi_col, BLOCK_SIZE bsize, | |
621 int index) { | |
622 VP9_COMMON *const cm = &cpi->common; | 487 VP9_COMMON *const cm = &cpi->common; |
623 const int mis = cm->mode_info_stride; | 488 const int bsl = b_width_log2(bsize); |
624 int bsl = b_width_log2(bsize); | 489 const int bs = (1 << bsl) / 4; |
625 int bs = (1 << bsl) / 4; // mode_info step for subsize | 490 PARTITION_TYPE partition; |
626 int n; | |
627 PARTITION_TYPE partition = PARTITION_NONE; | |
628 BLOCK_SIZE subsize; | 491 BLOCK_SIZE subsize; |
629 MODE_INFO *m = mi_8x8[0]; | 492 MODE_INFO *m = cm->mi_grid_visible[mi_row * cm->mode_info_stride + mi_col]; |
630 | 493 |
631 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) | 494 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) |
632 return; | 495 return; |
633 | 496 |
634 partition = partition_lookup[bsl][m->mbmi.sb_type]; | 497 partition = partition_lookup[bsl][m->mbmi.sb_type]; |
635 | 498 write_partition(cpi, bs, mi_row, mi_col, partition, bsize, w); |
636 if (bsize < BLOCK_8X8) { | 499 subsize = get_subsize(bsize, partition); |
637 if (index > 0) | 500 if (subsize < BLOCK_8X8) { |
638 return; | 501 write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col); |
639 } else { | 502 } else { |
640 const int ctx = partition_plane_context(cpi->above_seg_context, | 503 switch (partition) { |
641 cpi->left_seg_context, | 504 case PARTITION_NONE: |
642 mi_row, mi_col, bsize); | 505 write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col); |
643 write_partition(partition, bs, cm->mi_rows, cm->mi_cols, mi_row, mi_col, | 506 break; |
644 cm->fc.partition_prob[cm->frame_type][ctx], bc); | 507 case PARTITION_HORZ: |
645 } | 508 write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col); |
646 | 509 if (mi_row + bs < cm->mi_rows) |
647 subsize = get_subsize(bsize, partition); | 510 write_modes_b(cpi, tile, w, tok, tok_end, mi_row + bs, mi_col); |
648 | 511 break; |
649 switch (partition) { | 512 case PARTITION_VERT: |
650 case PARTITION_NONE: | 513 write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col); |
651 write_modes_b(cpi, tile, mi_8x8, bc, tok, tok_end, mi_row, mi_col, 0); | 514 if (mi_col + bs < cm->mi_cols) |
652 break; | 515 write_modes_b(cpi, tile, w, tok, tok_end, mi_row, mi_col + bs); |
653 case PARTITION_HORZ: | 516 break; |
654 write_modes_b(cpi, tile, mi_8x8, bc, tok, tok_end, mi_row, mi_col, 0); | 517 case PARTITION_SPLIT: |
655 if ((mi_row + bs) < cm->mi_rows) | 518 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row, mi_col, subsize); |
656 write_modes_b(cpi, tile, mi_8x8 + bs * mis, bc, tok, tok_end, | 519 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row, mi_col + bs, |
657 mi_row + bs, mi_col, 1); | 520 subsize); |
658 break; | 521 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row + bs, mi_col, |
659 case PARTITION_VERT: | 522 subsize); |
660 write_modes_b(cpi, tile, mi_8x8, bc, tok, tok_end, mi_row, mi_col, 0); | 523 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row + bs, mi_col + bs, |
661 if ((mi_col + bs) < cm->mi_cols) | 524 subsize); |
662 write_modes_b(cpi, tile, mi_8x8 + bs, bc, tok, tok_end, | 525 break; |
663 mi_row, mi_col + bs, 1); | 526 default: |
664 break; | 527 assert(0); |
665 case PARTITION_SPLIT: | 528 } |
666 for (n = 0; n < 4; n++) { | |
667 const int j = n >> 1, i = n & 1; | |
668 write_modes_sb(cpi, tile, mi_8x8 + j * bs * mis + i * bs, bc, | |
669 tok, tok_end, | |
670 mi_row + j * bs, mi_col + i * bs, subsize, n); | |
671 } | |
672 break; | |
673 default: | |
674 assert(0); | |
675 } | 529 } |
676 | 530 |
677 // update partition context | 531 // update partition context |
678 if (bsize >= BLOCK_8X8 && | 532 if (bsize >= BLOCK_8X8 && |
679 (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT)) | 533 (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT)) |
680 update_partition_context(cpi->above_seg_context, cpi->left_seg_context, | 534 update_partition_context(cpi->above_seg_context, cpi->left_seg_context, |
681 mi_row, mi_col, subsize, bsize); | 535 mi_row, mi_col, subsize, bsize); |
682 } | 536 } |
683 | 537 |
684 static void write_modes(VP9_COMP *cpi, const TileInfo *const tile, | 538 static void write_modes(VP9_COMP *cpi, const TileInfo *const tile, |
685 vp9_writer* const bc, | 539 vp9_writer *w, TOKENEXTRA **tok, TOKENEXTRA *tok_end) { |
686 TOKENEXTRA **tok, TOKENEXTRA *tok_end) { | |
687 VP9_COMMON *const cm = &cpi->common; | |
688 const int mis = cm->mode_info_stride; | |
689 int mi_row, mi_col; | 540 int mi_row, mi_col; |
690 MODE_INFO **mi_8x8 = cm->mi_grid_visible; | |
691 MODE_INFO **m_8x8; | |
692 | |
693 mi_8x8 += tile->mi_col_start + tile->mi_row_start * mis; | |
694 | 541 |
695 for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end; | 542 for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end; |
696 mi_row += 8, mi_8x8 += 8 * mis) { | 543 mi_row += MI_BLOCK_SIZE) { |
697 m_8x8 = mi_8x8; | 544 vp9_zero(cpi->left_seg_context); |
698 vp9_zero(cpi->left_seg_context); | |
699 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; | 545 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; |
700 mi_col += MI_BLOCK_SIZE, m_8x8 += MI_BLOCK_SIZE) { | 546 mi_col += MI_BLOCK_SIZE) |
701 write_modes_sb(cpi, tile, m_8x8, bc, tok, tok_end, mi_row, mi_col, | 547 write_modes_sb(cpi, tile, w, tok, tok_end, mi_row, mi_col, BLOCK_64X64); |
702 BLOCK_64X64, 0); | |
703 } | |
704 } | 548 } |
705 } | 549 } |
706 | 550 |
707 static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size) { | 551 static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size) { |
708 vp9_coeff_probs_model *coef_probs = cpi->frame_coef_probs[tx_size]; | 552 vp9_coeff_probs_model *coef_probs = cpi->frame_coef_probs[tx_size]; |
709 vp9_coeff_count *coef_counts = cpi->coef_counts[tx_size]; | 553 vp9_coeff_count *coef_counts = cpi->coef_counts[tx_size]; |
710 unsigned int (*eob_branch_ct)[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] = | 554 unsigned int (*eob_branch_ct)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] = |
711 cpi->common.counts.eob_branch[tx_size]; | 555 cpi->common.counts.eob_branch[tx_size]; |
712 vp9_coeff_stats *coef_branch_ct = cpi->frame_branch_ct[tx_size]; | 556 vp9_coeff_stats *coef_branch_ct = cpi->frame_branch_ct[tx_size]; |
713 vp9_prob full_probs[ENTROPY_NODES]; | 557 int i, j, k, l, m; |
714 int i, j, k, l; | |
715 | 558 |
716 for (i = 0; i < BLOCK_TYPES; ++i) { | 559 for (i = 0; i < PLANE_TYPES; ++i) { |
717 for (j = 0; j < REF_TYPES; ++j) { | 560 for (j = 0; j < REF_TYPES; ++j) { |
718 for (k = 0; k < COEF_BANDS; ++k) { | 561 for (k = 0; k < COEF_BANDS; ++k) { |
719 for (l = 0; l < PREV_COEF_CONTEXTS; ++l) { | 562 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { |
720 if (l >= 3 && k == 0) | |
721 continue; | |
722 vp9_tree_probs_from_distribution(vp9_coef_tree, | 563 vp9_tree_probs_from_distribution(vp9_coef_tree, |
723 full_probs, | |
724 coef_branch_ct[i][j][k][l], | 564 coef_branch_ct[i][j][k][l], |
725 coef_counts[i][j][k][l], 0); | 565 coef_counts[i][j][k][l]); |
726 vpx_memcpy(coef_probs[i][j][k][l], full_probs, | |
727 sizeof(vp9_prob) * UNCONSTRAINED_NODES); | |
728 coef_branch_ct[i][j][k][l][0][1] = eob_branch_ct[i][j][k][l] - | 566 coef_branch_ct[i][j][k][l][0][1] = eob_branch_ct[i][j][k][l] - |
729 coef_branch_ct[i][j][k][l][0][0]; | 567 coef_branch_ct[i][j][k][l][0][0]; |
730 coef_probs[i][j][k][l][0] = | 568 for (m = 0; m < UNCONSTRAINED_NODES; ++m) |
731 get_binary_prob(coef_branch_ct[i][j][k][l][0][0], | 569 coef_probs[i][j][k][l][m] = get_binary_prob( |
732 coef_branch_ct[i][j][k][l][0][1]); | 570 coef_branch_ct[i][j][k][l][m][0], |
| 571 coef_branch_ct[i][j][k][l][m][1]); |
733 #ifdef ENTROPY_STATS | 572 #ifdef ENTROPY_STATS |
734 if (!cpi->dummy_packing) { | 573 if (!cpi->dummy_packing) { |
735 int t; | 574 int t; |
736 for (t = 0; t < MAX_ENTROPY_TOKENS; ++t) | 575 for (t = 0; t < ENTROPY_TOKENS; ++t) |
737 context_counters[tx_size][i][j][k][l][t] += | 576 context_counters[tx_size][i][j][k][l][t] += |
738 coef_counts[i][j][k][l][t]; | 577 coef_counts[i][j][k][l][t]; |
739 context_counters[tx_size][i][j][k][l][MAX_ENTROPY_TOKENS] += | 578 context_counters[tx_size][i][j][k][l][ENTROPY_TOKENS] += |
740 eob_branch_ct[i][j][k][l]; | 579 eob_branch_ct[i][j][k][l]; |
741 } | 580 } |
742 #endif | 581 #endif |
743 } | 582 } |
744 } | 583 } |
745 } | 584 } |
746 } | 585 } |
747 } | 586 } |
748 | 587 |
749 static void build_coeff_contexts(VP9_COMP *cpi) { | |
750 TX_SIZE t; | |
751 for (t = TX_4X4; t <= TX_32X32; t++) | |
752 build_tree_distribution(cpi, t); | |
753 } | |
754 | |
755 static void update_coef_probs_common(vp9_writer* const bc, VP9_COMP *cpi, | 588 static void update_coef_probs_common(vp9_writer* const bc, VP9_COMP *cpi, |
756 TX_SIZE tx_size) { | 589 TX_SIZE tx_size) { |
757 vp9_coeff_probs_model *new_frame_coef_probs = cpi->frame_coef_probs[tx_size]; | 590 vp9_coeff_probs_model *new_frame_coef_probs = cpi->frame_coef_probs[tx_size]; |
758 vp9_coeff_probs_model *old_frame_coef_probs = | 591 vp9_coeff_probs_model *old_frame_coef_probs = |
759 cpi->common.fc.coef_probs[tx_size]; | 592 cpi->common.fc.coef_probs[tx_size]; |
760 vp9_coeff_stats *frame_branch_ct = cpi->frame_branch_ct[tx_size]; | 593 vp9_coeff_stats *frame_branch_ct = cpi->frame_branch_ct[tx_size]; |
761 const vp9_prob upd = DIFF_UPDATE_PROB; | 594 const vp9_prob upd = DIFF_UPDATE_PROB; |
762 const int entropy_nodes_update = UNCONSTRAINED_NODES; | 595 const int entropy_nodes_update = UNCONSTRAINED_NODES; |
763 int i, j, k, l, t; | 596 int i, j, k, l, t; |
764 switch (cpi->sf.use_fast_coef_updates) { | 597 switch (cpi->sf.use_fast_coef_updates) { |
765 case 0: { | 598 case 0: { |
766 /* dry run to see if there is any udpate at all needed */ | 599 /* dry run to see if there is any udpate at all needed */ |
767 int savings = 0; | 600 int savings = 0; |
768 int update[2] = {0, 0}; | 601 int update[2] = {0, 0}; |
769 for (i = 0; i < BLOCK_TYPES; ++i) { | 602 for (i = 0; i < PLANE_TYPES; ++i) { |
770 for (j = 0; j < REF_TYPES; ++j) { | 603 for (j = 0; j < REF_TYPES; ++j) { |
771 for (k = 0; k < COEF_BANDS; ++k) { | 604 for (k = 0; k < COEF_BANDS; ++k) { |
772 for (l = 0; l < PREV_COEF_CONTEXTS; ++l) { | 605 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { |
773 for (t = 0; t < entropy_nodes_update; ++t) { | 606 for (t = 0; t < entropy_nodes_update; ++t) { |
774 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; | 607 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; |
775 const vp9_prob oldp = old_frame_coef_probs[i][j][k][l][t]; | 608 const vp9_prob oldp = old_frame_coef_probs[i][j][k][l][t]; |
776 int s; | 609 int s; |
777 int u = 0; | 610 int u = 0; |
778 | |
779 if (l >= 3 && k == 0) | |
780 continue; | |
781 if (t == PIVOT_NODE) | 611 if (t == PIVOT_NODE) |
782 s = vp9_prob_diff_update_savings_search_model( | 612 s = vp9_prob_diff_update_savings_search_model( |
783 frame_branch_ct[i][j][k][l][0], | 613 frame_branch_ct[i][j][k][l][0], |
784 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); | 614 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); |
785 else | 615 else |
786 s = vp9_prob_diff_update_savings_search( | 616 s = vp9_prob_diff_update_savings_search( |
787 frame_branch_ct[i][j][k][l][t], oldp, &newp, upd); | 617 frame_branch_ct[i][j][k][l][t], oldp, &newp, upd); |
788 if (s > 0 && newp != oldp) | 618 if (s > 0 && newp != oldp) |
789 u = 1; | 619 u = 1; |
790 if (u) | 620 if (u) |
791 savings += s - (int)(vp9_cost_zero(upd)); | 621 savings += s - (int)(vp9_cost_zero(upd)); |
792 else | 622 else |
793 savings -= (int)(vp9_cost_zero(upd)); | 623 savings -= (int)(vp9_cost_zero(upd)); |
794 update[u]++; | 624 update[u]++; |
795 } | 625 } |
796 } | 626 } |
797 } | 627 } |
798 } | 628 } |
799 } | 629 } |
800 | 630 |
801 // printf("Update %d %d, savings %d\n", update[0], update[1], savings); | 631 // printf("Update %d %d, savings %d\n", update[0], update[1], savings); |
802 /* Is coef updated at all */ | 632 /* Is coef updated at all */ |
803 if (update[1] == 0 || savings < 0) { | 633 if (update[1] == 0 || savings < 0) { |
804 vp9_write_bit(bc, 0); | 634 vp9_write_bit(bc, 0); |
805 return; | 635 return; |
806 } | 636 } |
807 vp9_write_bit(bc, 1); | 637 vp9_write_bit(bc, 1); |
808 for (i = 0; i < BLOCK_TYPES; ++i) { | 638 for (i = 0; i < PLANE_TYPES; ++i) { |
809 for (j = 0; j < REF_TYPES; ++j) { | 639 for (j = 0; j < REF_TYPES; ++j) { |
810 for (k = 0; k < COEF_BANDS; ++k) { | 640 for (k = 0; k < COEF_BANDS; ++k) { |
811 for (l = 0; l < PREV_COEF_CONTEXTS; ++l) { | 641 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { |
812 // calc probs and branch cts for this frame only | 642 // calc probs and branch cts for this frame only |
813 for (t = 0; t < entropy_nodes_update; ++t) { | 643 for (t = 0; t < entropy_nodes_update; ++t) { |
814 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; | 644 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; |
815 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; | 645 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; |
816 const vp9_prob upd = DIFF_UPDATE_PROB; | 646 const vp9_prob upd = DIFF_UPDATE_PROB; |
817 int s; | 647 int s; |
818 int u = 0; | 648 int u = 0; |
819 if (l >= 3 && k == 0) | |
820 continue; | |
821 if (t == PIVOT_NODE) | 649 if (t == PIVOT_NODE) |
822 s = vp9_prob_diff_update_savings_search_model( | 650 s = vp9_prob_diff_update_savings_search_model( |
823 frame_branch_ct[i][j][k][l][0], | 651 frame_branch_ct[i][j][k][l][0], |
824 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); | 652 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); |
825 else | 653 else |
826 s = vp9_prob_diff_update_savings_search( | 654 s = vp9_prob_diff_update_savings_search( |
827 frame_branch_ct[i][j][k][l][t], | 655 frame_branch_ct[i][j][k][l][t], |
828 *oldp, &newp, upd); | 656 *oldp, &newp, upd); |
829 if (s > 0 && newp != *oldp) | 657 if (s > 0 && newp != *oldp) |
830 u = 1; | 658 u = 1; |
(...skipping 11 matching lines...) Expand all Loading... |
842 } | 670 } |
843 } | 671 } |
844 } | 672 } |
845 } | 673 } |
846 return; | 674 return; |
847 } | 675 } |
848 | 676 |
849 case 1: | 677 case 1: |
850 case 2: { | 678 case 2: { |
851 const int prev_coef_contexts_to_update = | 679 const int prev_coef_contexts_to_update = |
852 (cpi->sf.use_fast_coef_updates == 2 ? | 680 cpi->sf.use_fast_coef_updates == 2 ? COEFF_CONTEXTS >> 1 |
853 PREV_COEF_CONTEXTS >> 1 : PREV_COEF_CONTEXTS); | 681 : COEFF_CONTEXTS; |
854 const int coef_band_to_update = | 682 const int coef_band_to_update = |
855 (cpi->sf.use_fast_coef_updates == 2 ? | 683 cpi->sf.use_fast_coef_updates == 2 ? COEF_BANDS >> 1 |
856 COEF_BANDS >> 1 : COEF_BANDS); | 684 : COEF_BANDS; |
857 int updates = 0; | 685 int updates = 0; |
858 int noupdates_before_first = 0; | 686 int noupdates_before_first = 0; |
859 for (i = 0; i < BLOCK_TYPES; ++i) { | 687 for (i = 0; i < PLANE_TYPES; ++i) { |
860 for (j = 0; j < REF_TYPES; ++j) { | 688 for (j = 0; j < REF_TYPES; ++j) { |
861 for (k = 0; k < COEF_BANDS; ++k) { | 689 for (k = 0; k < COEF_BANDS; ++k) { |
862 for (l = 0; l < PREV_COEF_CONTEXTS; ++l) { | 690 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { |
863 // calc probs and branch cts for this frame only | 691 // calc probs and branch cts for this frame only |
864 for (t = 0; t < entropy_nodes_update; ++t) { | 692 for (t = 0; t < entropy_nodes_update; ++t) { |
865 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; | 693 vp9_prob newp = new_frame_coef_probs[i][j][k][l][t]; |
866 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; | 694 vp9_prob *oldp = old_frame_coef_probs[i][j][k][l] + t; |
867 int s; | 695 int s; |
868 int u = 0; | 696 int u = 0; |
869 if (l >= 3 && k == 0) | |
870 continue; | |
871 if (l >= prev_coef_contexts_to_update || | 697 if (l >= prev_coef_contexts_to_update || |
872 k >= coef_band_to_update) { | 698 k >= coef_band_to_update) { |
873 u = 0; | 699 u = 0; |
874 } else { | 700 } else { |
875 if (t == PIVOT_NODE) | 701 if (t == PIVOT_NODE) |
876 s = vp9_prob_diff_update_savings_search_model( | 702 s = vp9_prob_diff_update_savings_search_model( |
877 frame_branch_ct[i][j][k][l][0], | 703 frame_branch_ct[i][j][k][l][0], |
878 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); | 704 old_frame_coef_probs[i][j][k][l], &newp, upd, i, j); |
879 else | 705 else |
880 s = vp9_prob_diff_update_savings_search( | 706 s = vp9_prob_diff_update_savings_search( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 vp9_write_bit(bc, 0); // no updates | 744 vp9_write_bit(bc, 0); // no updates |
919 } | 745 } |
920 return; | 746 return; |
921 } | 747 } |
922 | 748 |
923 default: | 749 default: |
924 assert(0); | 750 assert(0); |
925 } | 751 } |
926 } | 752 } |
927 | 753 |
928 static void update_coef_probs(VP9_COMP* const cpi, vp9_writer* const bc) { | 754 static void update_coef_probs(VP9_COMP* cpi, vp9_writer* w) { |
929 const TX_MODE tx_mode = cpi->common.tx_mode; | 755 const TX_MODE tx_mode = cpi->common.tx_mode; |
930 | 756 const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode]; |
| 757 TX_SIZE tx_size; |
931 vp9_clear_system_state(); | 758 vp9_clear_system_state(); |
932 | 759 |
933 // Build the cofficient contexts based on counts collected in encode loop | 760 for (tx_size = TX_4X4; tx_size <= TX_32X32; ++tx_size) |
934 build_coeff_contexts(cpi); | 761 build_tree_distribution(cpi, tx_size); |
935 | 762 |
936 update_coef_probs_common(bc, cpi, TX_4X4); | 763 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) |
937 | 764 update_coef_probs_common(w, cpi, tx_size); |
938 // do not do this if not even allowed | |
939 if (tx_mode > ONLY_4X4) | |
940 update_coef_probs_common(bc, cpi, TX_8X8); | |
941 | |
942 if (tx_mode > ALLOW_8X8) | |
943 update_coef_probs_common(bc, cpi, TX_16X16); | |
944 | |
945 if (tx_mode > ALLOW_16X16) | |
946 update_coef_probs_common(bc, cpi, TX_32X32); | |
947 } | 765 } |
948 | 766 |
949 static void encode_loopfilter(struct loopfilter *lf, | 767 static void encode_loopfilter(struct loopfilter *lf, |
950 struct vp9_write_bit_buffer *wb) { | 768 struct vp9_write_bit_buffer *wb) { |
951 int i; | 769 int i; |
952 | 770 |
953 // Encode the loop filter level and type | 771 // Encode the loop filter level and type |
954 vp9_wb_write_literal(wb, lf->filter_level, 6); | 772 vp9_wb_write_literal(wb, lf->filter_level, 6); |
955 vp9_wb_write_literal(wb, lf->sharpness_level, 3); | 773 vp9_wb_write_literal(wb, lf->sharpness_level, 3); |
956 | 774 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1230 | 1048 |
1231 for (tile_col = 1; tile_col < tile_cols; tile_col++) | 1049 for (tile_col = 1; tile_col < tile_cols; tile_col++) |
1232 tok[tile_row][tile_col] = tok[tile_row][tile_col - 1] + | 1050 tok[tile_row][tile_col] = tok[tile_row][tile_col - 1] + |
1233 cpi->tok_count[tile_row][tile_col - 1]; | 1051 cpi->tok_count[tile_row][tile_col - 1]; |
1234 } | 1052 } |
1235 | 1053 |
1236 for (tile_row = 0; tile_row < tile_rows; tile_row++) { | 1054 for (tile_row = 0; tile_row < tile_rows; tile_row++) { |
1237 for (tile_col = 0; tile_col < tile_cols; tile_col++) { | 1055 for (tile_col = 0; tile_col < tile_cols; tile_col++) { |
1238 TileInfo tile; | 1056 TileInfo tile; |
1239 | 1057 |
1240 vp9_tile_init(&tile, cm, 0, tile_col); | 1058 vp9_tile_init(&tile, cm, tile_row, tile_col); |
1241 tok_end = tok[tile_row][tile_col] + cpi->tok_count[tile_row][tile_col]; | 1059 tok_end = tok[tile_row][tile_col] + cpi->tok_count[tile_row][tile_col]; |
1242 | 1060 |
1243 if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) | 1061 if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) |
1244 vp9_start_encode(&residual_bc, data_ptr + total_size + 4); | 1062 vp9_start_encode(&residual_bc, data_ptr + total_size + 4); |
1245 else | 1063 else |
1246 vp9_start_encode(&residual_bc, data_ptr + total_size); | 1064 vp9_start_encode(&residual_bc, data_ptr + total_size); |
1247 | 1065 |
1248 write_modes(cpi, &tile, &residual_bc, &tok[tile_row][tile_col], tok_end); | 1066 write_modes(cpi, &tile, &residual_bc, &tok[tile_row][tile_col], tok_end); |
1249 assert(tok[tile_row][tile_col] == tok_end); | 1067 assert(tok[tile_row][tile_col] == tok_end); |
1250 vp9_stop_encode(&residual_bc); | 1068 vp9_stop_encode(&residual_bc); |
(...skipping 27 matching lines...) Expand all Loading... |
1278 VP9_COMMON *const cm = &cpi->common; | 1096 VP9_COMMON *const cm = &cpi->common; |
1279 vp9_wb_write_literal(wb, cm->width - 1, 16); | 1097 vp9_wb_write_literal(wb, cm->width - 1, 16); |
1280 vp9_wb_write_literal(wb, cm->height - 1, 16); | 1098 vp9_wb_write_literal(wb, cm->height - 1, 16); |
1281 | 1099 |
1282 write_display_size(cpi, wb); | 1100 write_display_size(cpi, wb); |
1283 } | 1101 } |
1284 | 1102 |
1285 static void write_frame_size_with_refs(VP9_COMP *cpi, | 1103 static void write_frame_size_with_refs(VP9_COMP *cpi, |
1286 struct vp9_write_bit_buffer *wb) { | 1104 struct vp9_write_bit_buffer *wb) { |
1287 VP9_COMMON *const cm = &cpi->common; | 1105 VP9_COMMON *const cm = &cpi->common; |
1288 int refs[ALLOWED_REFS_PER_FRAME] = {cpi->lst_fb_idx, cpi->gld_fb_idx, | 1106 int refs[REFS_PER_FRAME] = {cpi->lst_fb_idx, cpi->gld_fb_idx, |
1289 cpi->alt_fb_idx}; | 1107 cpi->alt_fb_idx}; |
1290 int i, found = 0; | 1108 int i, found = 0; |
1291 | 1109 |
1292 for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i) { | 1110 for (i = 0; i < REFS_PER_FRAME; ++i) { |
1293 YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[cm->ref_frame_map[refs[i]]]; | 1111 YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[cm->ref_frame_map[refs[i]]]; |
1294 found = cm->width == cfg->y_crop_width && | 1112 found = cm->width == cfg->y_crop_width && |
1295 cm->height == cfg->y_crop_height; | 1113 cm->height == cfg->y_crop_height; |
1296 | 1114 |
1297 // TODO(ivan): This prevents a bug while more than 3 buffers are used. Do it | 1115 // TODO(ivan): This prevents a bug while more than 3 buffers are used. Do it |
1298 // in a better way. | 1116 // in a better way. |
1299 if (cpi->use_svc) { | 1117 if (cpi->use_svc) { |
1300 found = 0; | 1118 found = 0; |
1301 } | 1119 } |
1302 vp9_wb_write_bit(wb, found); | 1120 vp9_wb_write_bit(wb, found); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1347 vp9_wb_write_bit(wb, cm->subsampling_y); | 1165 vp9_wb_write_bit(wb, cm->subsampling_y); |
1348 vp9_wb_write_bit(wb, 0); // has extra plane | 1166 vp9_wb_write_bit(wb, 0); // has extra plane |
1349 } | 1167 } |
1350 } else { | 1168 } else { |
1351 assert(cm->version == 1); | 1169 assert(cm->version == 1); |
1352 vp9_wb_write_bit(wb, 0); // has extra plane | 1170 vp9_wb_write_bit(wb, 0); // has extra plane |
1353 } | 1171 } |
1354 | 1172 |
1355 write_frame_size(cpi, wb); | 1173 write_frame_size(cpi, wb); |
1356 } else { | 1174 } else { |
1357 const int refs[ALLOWED_REFS_PER_FRAME] = {cpi->lst_fb_idx, cpi->gld_fb_idx, | 1175 const int refs[REFS_PER_FRAME] = {cpi->lst_fb_idx, cpi->gld_fb_idx, |
1358 cpi->alt_fb_idx}; | 1176 cpi->alt_fb_idx}; |
1359 if (!cm->show_frame) | 1177 if (!cm->show_frame) |
1360 vp9_wb_write_bit(wb, cm->intra_only); | 1178 vp9_wb_write_bit(wb, cm->intra_only); |
1361 | 1179 |
1362 if (!cm->error_resilient_mode) | 1180 if (!cm->error_resilient_mode) |
1363 vp9_wb_write_literal(wb, cm->reset_frame_context, 2); | 1181 vp9_wb_write_literal(wb, cm->reset_frame_context, 2); |
1364 | 1182 |
1365 if (cm->intra_only) { | 1183 if (cm->intra_only) { |
1366 write_sync_code(wb); | 1184 write_sync_code(wb); |
1367 | 1185 |
1368 vp9_wb_write_literal(wb, get_refresh_mask(cpi), NUM_REF_FRAMES); | 1186 vp9_wb_write_literal(wb, get_refresh_mask(cpi), REF_FRAMES); |
1369 write_frame_size(cpi, wb); | 1187 write_frame_size(cpi, wb); |
1370 } else { | 1188 } else { |
1371 int i; | 1189 int i; |
1372 vp9_wb_write_literal(wb, get_refresh_mask(cpi), NUM_REF_FRAMES); | 1190 vp9_wb_write_literal(wb, get_refresh_mask(cpi), REF_FRAMES); |
1373 for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i) { | 1191 for (i = 0; i < REFS_PER_FRAME; ++i) { |
1374 vp9_wb_write_literal(wb, refs[i], NUM_REF_FRAMES_LOG2); | 1192 vp9_wb_write_literal(wb, refs[i], REF_FRAMES_LOG2); |
1375 vp9_wb_write_bit(wb, cm->ref_frame_sign_bias[LAST_FRAME + i]); | 1193 vp9_wb_write_bit(wb, cm->ref_frame_sign_bias[LAST_FRAME + i]); |
1376 } | 1194 } |
1377 | 1195 |
1378 write_frame_size_with_refs(cpi, wb); | 1196 write_frame_size_with_refs(cpi, wb); |
1379 | 1197 |
1380 vp9_wb_write_bit(wb, cm->allow_high_precision_mv); | 1198 vp9_wb_write_bit(wb, cm->allow_high_precision_mv); |
1381 | 1199 |
1382 fix_mcomp_filter_type(cpi); | 1200 fix_mcomp_filter_type(cpi); |
1383 write_interp_filter_type(cm->mcomp_filter_type, wb); | 1201 write_interp_filter_type(cm->mcomp_filter_type, wb); |
1384 } | 1202 } |
1385 } | 1203 } |
1386 | 1204 |
1387 if (!cm->error_resilient_mode) { | 1205 if (!cm->error_resilient_mode) { |
1388 vp9_wb_write_bit(wb, cm->refresh_frame_context); | 1206 vp9_wb_write_bit(wb, cm->refresh_frame_context); |
1389 vp9_wb_write_bit(wb, cm->frame_parallel_decoding_mode); | 1207 vp9_wb_write_bit(wb, cm->frame_parallel_decoding_mode); |
1390 } | 1208 } |
1391 | 1209 |
1392 vp9_wb_write_literal(wb, cm->frame_context_idx, NUM_FRAME_CONTEXTS_LOG2); | 1210 vp9_wb_write_literal(wb, cm->frame_context_idx, FRAME_CONTEXTS_LOG2); |
1393 | 1211 |
1394 encode_loopfilter(&cm->lf, wb); | 1212 encode_loopfilter(&cm->lf, wb); |
1395 encode_quantization(cm, wb); | 1213 encode_quantization(cm, wb); |
1396 encode_segmentation(cpi, wb); | 1214 encode_segmentation(cpi, wb); |
1397 | 1215 |
1398 write_tile_info(cm, wb); | 1216 write_tile_info(cm, wb); |
1399 } | 1217 } |
1400 | 1218 |
1401 static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data) { | 1219 static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data) { |
1402 VP9_COMMON *const cm = &cpi->common; | 1220 VP9_COMMON *const cm = &cpi->common; |
(...skipping 15 matching lines...) Expand all Loading... |
1418 #endif | 1236 #endif |
1419 | 1237 |
1420 vp9_update_skip_probs(cpi, &header_bc); | 1238 vp9_update_skip_probs(cpi, &header_bc); |
1421 | 1239 |
1422 if (!frame_is_intra_only(cm)) { | 1240 if (!frame_is_intra_only(cm)) { |
1423 int i; | 1241 int i; |
1424 #ifdef ENTROPY_STATS | 1242 #ifdef ENTROPY_STATS |
1425 active_section = 1; | 1243 active_section = 1; |
1426 #endif | 1244 #endif |
1427 | 1245 |
1428 update_inter_mode_probs(cm, &header_bc); | 1246 for (i = 0; i < INTER_MODE_CONTEXTS; ++i) |
| 1247 prob_diff_update(vp9_inter_mode_tree, cm->fc.inter_mode_probs[i], |
| 1248 cm->counts.inter_mode[i], INTER_MODES, &header_bc); |
| 1249 |
1429 vp9_zero(cm->counts.inter_mode); | 1250 vp9_zero(cm->counts.inter_mode); |
1430 | 1251 |
1431 if (cm->mcomp_filter_type == SWITCHABLE) | 1252 if (cm->mcomp_filter_type == SWITCHABLE) |
1432 update_switchable_interp_probs(cpi, &header_bc); | 1253 update_switchable_interp_probs(cpi, &header_bc); |
1433 | 1254 |
1434 for (i = 0; i < INTRA_INTER_CONTEXTS; i++) | 1255 for (i = 0; i < INTRA_INTER_CONTEXTS; i++) |
1435 vp9_cond_prob_diff_update(&header_bc, &fc->intra_inter_prob[i], | 1256 vp9_cond_prob_diff_update(&header_bc, &fc->intra_inter_prob[i], |
1436 cpi->intra_inter_count[i]); | 1257 cpi->intra_inter_count[i]); |
1437 | 1258 |
1438 if (cm->allow_comp_inter_inter) { | 1259 if (cm->allow_comp_inter_inter) { |
1439 const int comp_pred_mode = cpi->common.comp_pred_mode; | 1260 const int reference_mode = cpi->common.reference_mode; |
1440 const int use_compound_pred = comp_pred_mode != SINGLE_PREDICTION_ONLY; | 1261 const int use_compound_pred = reference_mode != SINGLE_REFERENCE; |
1441 const int use_hybrid_pred = comp_pred_mode == HYBRID_PREDICTION; | 1262 const int use_hybrid_pred = reference_mode == REFERENCE_MODE_SELECT; |
1442 | 1263 |
1443 vp9_write_bit(&header_bc, use_compound_pred); | 1264 vp9_write_bit(&header_bc, use_compound_pred); |
1444 if (use_compound_pred) { | 1265 if (use_compound_pred) { |
1445 vp9_write_bit(&header_bc, use_hybrid_pred); | 1266 vp9_write_bit(&header_bc, use_hybrid_pred); |
1446 if (use_hybrid_pred) | 1267 if (use_hybrid_pred) |
1447 for (i = 0; i < COMP_INTER_CONTEXTS; i++) | 1268 for (i = 0; i < COMP_INTER_CONTEXTS; i++) |
1448 vp9_cond_prob_diff_update(&header_bc, &fc->comp_inter_prob[i], | 1269 vp9_cond_prob_diff_update(&header_bc, &fc->comp_inter_prob[i], |
1449 cpi->comp_inter_count[i]); | 1270 cpi->comp_inter_count[i]); |
1450 } | 1271 } |
1451 } | 1272 } |
1452 | 1273 |
1453 if (cm->comp_pred_mode != COMP_PREDICTION_ONLY) { | 1274 if (cm->reference_mode != COMPOUND_REFERENCE) { |
1454 for (i = 0; i < REF_CONTEXTS; i++) { | 1275 for (i = 0; i < REF_CONTEXTS; i++) { |
1455 vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][0], | 1276 vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][0], |
1456 cpi->single_ref_count[i][0]); | 1277 cpi->single_ref_count[i][0]); |
1457 vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][1], | 1278 vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][1], |
1458 cpi->single_ref_count[i][1]); | 1279 cpi->single_ref_count[i][1]); |
1459 } | 1280 } |
1460 } | 1281 } |
1461 | 1282 |
1462 if (cm->comp_pred_mode != SINGLE_PREDICTION_ONLY) | 1283 if (cm->reference_mode != SINGLE_REFERENCE) |
1463 for (i = 0; i < REF_CONTEXTS; i++) | 1284 for (i = 0; i < REF_CONTEXTS; i++) |
1464 vp9_cond_prob_diff_update(&header_bc, &fc->comp_ref_prob[i], | 1285 vp9_cond_prob_diff_update(&header_bc, &fc->comp_ref_prob[i], |
1465 cpi->comp_ref_count[i]); | 1286 cpi->comp_ref_count[i]); |
1466 | 1287 |
1467 update_mbintra_mode_probs(cpi, &header_bc); | 1288 for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) |
| 1289 prob_diff_update(vp9_intra_mode_tree, cm->fc.y_mode_prob[i], |
| 1290 (unsigned int *)cpi->y_mode_count[i], INTRA_MODES, |
| 1291 &header_bc); |
1468 | 1292 |
1469 for (i = 0; i < PARTITION_CONTEXTS; ++i) { | 1293 for (i = 0; i < PARTITION_CONTEXTS; ++i) |
1470 vp9_prob pnew[PARTITION_TYPES - 1]; | 1294 prob_diff_update(vp9_partition_tree, fc->partition_prob[i], |
1471 unsigned int bct[PARTITION_TYPES - 1][2]; | 1295 cm->counts.partition[i], PARTITION_TYPES, &header_bc); |
1472 update_mode(&header_bc, PARTITION_TYPES, | |
1473 vp9_partition_tree, pnew, | |
1474 fc->partition_prob[cm->frame_type][i], bct, | |
1475 (unsigned int *)cpi->partition_count[i]); | |
1476 } | |
1477 | 1296 |
1478 vp9_write_nmv_probs(cpi, cm->allow_high_precision_mv, &header_bc); | 1297 vp9_write_nmv_probs(cpi, cm->allow_high_precision_mv, &header_bc); |
1479 } | 1298 } |
1480 | 1299 |
1481 vp9_stop_encode(&header_bc); | 1300 vp9_stop_encode(&header_bc); |
1482 assert(header_bc.pos <= 0xffff); | 1301 assert(header_bc.pos <= 0xffff); |
1483 | 1302 |
1484 return header_bc.pos; | 1303 return header_bc.pos; |
1485 } | 1304 } |
1486 | 1305 |
1487 void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) { | 1306 void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, size_t *size) { |
1488 uint8_t *data = dest; | 1307 uint8_t *data = dest; |
1489 size_t first_part_size; | 1308 size_t first_part_size; |
1490 struct vp9_write_bit_buffer wb = {data, 0}; | 1309 struct vp9_write_bit_buffer wb = {data, 0}; |
1491 struct vp9_write_bit_buffer saved_wb; | 1310 struct vp9_write_bit_buffer saved_wb; |
1492 | 1311 |
1493 write_uncompressed_header(cpi, &wb); | 1312 write_uncompressed_header(cpi, &wb); |
1494 saved_wb = wb; | 1313 saved_wb = wb; |
1495 vp9_wb_write_literal(&wb, 0, 16); // don't know in advance first part. size | 1314 vp9_wb_write_literal(&wb, 0, 16); // don't know in advance first part. size |
1496 | 1315 |
1497 data += vp9_rb_bytes_written(&wb); | 1316 data += vp9_rb_bytes_written(&wb); |
(...skipping 11 matching lines...) Expand all Loading... |
1509 | 1328 |
1510 first_part_size = write_compressed_header(cpi, data); | 1329 first_part_size = write_compressed_header(cpi, data); |
1511 data += first_part_size; | 1330 data += first_part_size; |
1512 vp9_wb_write_literal(&saved_wb, first_part_size, 16); | 1331 vp9_wb_write_literal(&saved_wb, first_part_size, 16); |
1513 | 1332 |
1514 data += encode_tiles(cpi, data); | 1333 data += encode_tiles(cpi, data); |
1515 | 1334 |
1516 *size = data - dest; | 1335 *size = data - dest; |
1517 } | 1336 } |
1518 | 1337 |
1519 #ifdef ENTROPY_STATS | |
1520 static void print_tree_update_for_type(FILE *f, | |
1521 vp9_coeff_stats *tree_update_hist, | |
1522 int block_types, const char *header) { | |
1523 int i, j, k, l, m; | |
1524 | |
1525 fprintf(f, "const vp9_coeff_prob %s = {\n", header); | |
1526 for (i = 0; i < block_types; i++) { | |
1527 fprintf(f, " { \n"); | |
1528 for (j = 0; j < REF_TYPES; j++) { | |
1529 fprintf(f, " { \n"); | |
1530 for (k = 0; k < COEF_BANDS; k++) { | |
1531 fprintf(f, " {\n"); | |
1532 for (l = 0; l < PREV_COEF_CONTEXTS; l++) { | |
1533 fprintf(f, " {"); | |
1534 for (m = 0; m < ENTROPY_NODES; m++) { | |
1535 fprintf(f, "%3d, ", | |
1536 get_binary_prob(tree_update_hist[i][j][k][l][m][0], | |
1537 tree_update_hist[i][j][k][l][m][1])); | |
1538 } | |
1539 fprintf(f, "},\n"); | |
1540 } | |
1541 fprintf(f, "},\n"); | |
1542 } | |
1543 fprintf(f, " },\n"); | |
1544 } | |
1545 fprintf(f, " },\n"); | |
1546 } | |
1547 fprintf(f, "};\n"); | |
1548 } | |
1549 | |
1550 void print_tree_update_probs() { | |
1551 FILE *f = fopen("coefupdprob.h", "w"); | |
1552 fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n"); | |
1553 | |
1554 print_tree_update_for_type(f, tree_update_hist[TX_4X4], BLOCK_TYPES, | |
1555 "vp9_coef_update_probs_4x4[BLOCK_TYPES]"); | |
1556 print_tree_update_for_type(f, tree_update_hist[TX_8X8], BLOCK_TYPES, | |
1557 "vp9_coef_update_probs_8x8[BLOCK_TYPES]"); | |
1558 print_tree_update_for_type(f, tree_update_hist[TX_16X16], BLOCK_TYPES, | |
1559 "vp9_coef_update_probs_16x16[BLOCK_TYPES]"); | |
1560 print_tree_update_for_type(f, tree_update_hist[TX_32X32], BLOCK_TYPES, | |
1561 "vp9_coef_update_probs_32x32[BLOCK_TYPES]"); | |
1562 | |
1563 fclose(f); | |
1564 f = fopen("treeupdate.bin", "wb"); | |
1565 fwrite(tree_update_hist, sizeof(tree_update_hist), 1, f); | |
1566 fclose(f); | |
1567 } | |
1568 #endif | |
OLD | NEW |