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 | 11 |
12 #include <math.h> | 12 #include <math.h> |
13 #include <stdio.h> | 13 #include <stdio.h> |
14 #include <string.h> | 14 #include <string.h> |
15 #include <assert.h> | 15 #include <assert.h> |
16 #include "onyx_int.h" | 16 #include "onyx_int.h" |
17 #include "tokenize.h" | 17 #include "tokenize.h" |
18 #include "vpx_mem/vpx_mem.h" | 18 #include "vpx_mem/vpx_mem.h" |
19 | 19 |
20 /* Global event counters used for accumulating statistics across several | 20 /* Global event counters used for accumulating statistics across several |
21 compressions, then generating context.c = initial stats. */ | 21 compressions, then generating context.c = initial stats. */ |
22 | 22 |
23 #ifdef ENTROPY_STATS | 23 #ifdef ENTROPY_STATS |
24 _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTR
OPY_TOKENS]; | 24 _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTR
OPY_TOKENS]; |
25 #endif | 25 #endif |
26 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ; | 26 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ; |
27 void vp8_fix_contexts(MACROBLOCKD *x); | 27 void vp8_fix_contexts(MACROBLOCKD *x); |
28 | 28 |
29 #include "dct_value_tokens.h" | 29 #include "dct_value_tokens.h" |
30 #include "dct_value_cost.h" | 30 #include "dct_value_cost.h" |
31 | 31 |
32 const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens + | 32 const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens + |
33 DCT_MAX_VALUE; | 33 DCT_MAX_VALUE; |
34 const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; | 34 const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; |
35 | 35 |
36 #if 0 | 36 #if 0 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 } | 95 } |
96 while (++i < DCT_MAX_VALUE); | 96 while (++i < DCT_MAX_VALUE); |
97 | 97 |
98 vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; | 98 vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; |
99 vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; | 99 vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; |
100 } | 100 } |
101 */ | 101 */ |
102 | 102 |
103 static void tokenize2nd_order_b | 103 static void tokenize2nd_order_b |
104 ( | 104 ( |
105 MACROBLOCK *x, | 105 MACROBLOCKD *x, |
106 TOKENEXTRA **tp, | 106 TOKENEXTRA **tp, |
107 VP8_COMP *cpi | 107 VP8_COMP *cpi |
108 ) | 108 ) |
109 { | 109 { |
110 MACROBLOCKD *xd = &x->e_mbd; | |
111 int pt; /* near block/prev token context index */ | 110 int pt; /* near block/prev token context index */ |
112 int c; /* start at DC */ | 111 int c; /* start at DC */ |
113 TOKENEXTRA *t = *tp;/* store tokens starting here */ | 112 TOKENEXTRA *t = *tp;/* store tokens starting here */ |
114 const BLOCKD *b; | 113 const BLOCKD *b; |
115 const short *qcoeff_ptr; | 114 const short *qcoeff_ptr; |
116 ENTROPY_CONTEXT * a; | 115 ENTROPY_CONTEXT * a; |
117 ENTROPY_CONTEXT * l; | 116 ENTROPY_CONTEXT * l; |
118 int band, rc, v, token; | 117 int band, rc, v, token; |
119 int eob; | 118 int eob; |
120 | 119 |
121 b = xd->block + 24; | 120 b = x->block + 24; |
122 qcoeff_ptr = b->qcoeff; | 121 qcoeff_ptr = b->qcoeff; |
123 a = (ENTROPY_CONTEXT *)xd->above_context + 8; | 122 a = (ENTROPY_CONTEXT *)x->above_context + 8; |
124 l = (ENTROPY_CONTEXT *)xd->left_context + 8; | 123 l = (ENTROPY_CONTEXT *)x->left_context + 8; |
125 eob = xd->eobs[24]; | 124 eob = x->eobs[24]; |
126 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 125 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
127 | 126 |
128 if(!eob) | 127 if(!eob) |
129 { | 128 { |
130 /* c = band for this case */ | 129 /* c = band for this case */ |
131 t->Token = DCT_EOB_TOKEN; | 130 t->Token = DCT_EOB_TOKEN; |
132 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 131 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
133 t->skip_eob_node = 0; | 132 t->skip_eob_node = 0; |
134 | 133 |
135 ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; | 134 ++cpi->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; |
136 t++; | 135 t++; |
137 *tp = t; | 136 *tp = t; |
138 *a = *l = 0; | 137 *a = *l = 0; |
139 return; | 138 return; |
140 } | 139 } |
141 | 140 |
142 v = qcoeff_ptr[0]; | 141 v = qcoeff_ptr[0]; |
143 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 142 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
144 token = vp8_dct_value_tokens_ptr[v].Token; | 143 token = vp8_dct_value_tokens_ptr[v].Token; |
145 t->Token = token; | 144 t->Token = token; |
146 | 145 |
147 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 146 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
148 t->skip_eob_node = 0; | 147 t->skip_eob_node = 0; |
149 ++x->coef_counts [1] [0] [pt] [token]; | 148 ++cpi->coef_counts [1] [0] [pt] [token]; |
150 pt = vp8_prev_token_class[token]; | 149 pt = vp8_prev_token_class[token]; |
151 t++; | 150 t++; |
152 c = 1; | 151 c = 1; |
153 | 152 |
154 for (; c < eob; c++) | 153 for (; c < eob; c++) |
155 { | 154 { |
156 rc = vp8_default_zig_zag1d[c]; | 155 rc = vp8_default_zig_zag1d[c]; |
157 band = vp8_coef_bands[c]; | 156 band = vp8_coef_bands[c]; |
158 v = qcoeff_ptr[rc]; | 157 v = qcoeff_ptr[rc]; |
159 | 158 |
160 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 159 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
161 token = vp8_dct_value_tokens_ptr[v].Token; | 160 token = vp8_dct_value_tokens_ptr[v].Token; |
162 | 161 |
163 t->Token = token; | 162 t->Token = token; |
164 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; | 163 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; |
165 | 164 |
166 t->skip_eob_node = ((pt == 0)); | 165 t->skip_eob_node = ((pt == 0)); |
167 | 166 |
168 ++x->coef_counts [1] [band] [pt] [token]; | 167 ++cpi->coef_counts [1] [band] [pt] [token]; |
169 | 168 |
170 pt = vp8_prev_token_class[token]; | 169 pt = vp8_prev_token_class[token]; |
171 t++; | 170 t++; |
172 } | 171 } |
173 if (c < 16) | 172 if (c < 16) |
174 { | 173 { |
175 band = vp8_coef_bands[c]; | 174 band = vp8_coef_bands[c]; |
176 t->Token = DCT_EOB_TOKEN; | 175 t->Token = DCT_EOB_TOKEN; |
177 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; | 176 t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; |
178 | 177 |
179 t->skip_eob_node = 0; | 178 t->skip_eob_node = 0; |
180 | 179 |
181 ++x->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN]; | 180 ++cpi->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN]; |
182 | 181 |
183 t++; | 182 t++; |
184 } | 183 } |
185 | 184 |
186 *tp = t; | 185 *tp = t; |
187 *a = *l = 1; | 186 *a = *l = 1; |
188 | 187 |
189 } | 188 } |
190 | 189 |
191 static void tokenize1st_order_b | 190 static void tokenize1st_order_b |
192 ( | 191 ( |
193 MACROBLOCK *x, | 192 MACROBLOCKD *x, |
194 TOKENEXTRA **tp, | 193 TOKENEXTRA **tp, |
195 int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */ | 194 int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */ |
196 VP8_COMP *cpi | 195 VP8_COMP *cpi |
197 ) | 196 ) |
198 { | 197 { |
199 MACROBLOCKD *xd = &x->e_mbd; | |
200 unsigned int block; | 198 unsigned int block; |
201 const BLOCKD *b; | 199 const BLOCKD *b; |
202 int pt; /* near block/prev token context index */ | 200 int pt; /* near block/prev token context index */ |
203 int c; | 201 int c; |
204 int token; | 202 int token; |
205 TOKENEXTRA *t = *tp;/* store tokens starting here */ | 203 TOKENEXTRA *t = *tp;/* store tokens starting here */ |
206 const short *qcoeff_ptr; | 204 const short *qcoeff_ptr; |
207 ENTROPY_CONTEXT * a; | 205 ENTROPY_CONTEXT * a; |
208 ENTROPY_CONTEXT * l; | 206 ENTROPY_CONTEXT * l; |
209 int band, rc, v; | 207 int band, rc, v; |
210 int tmp1, tmp2; | 208 int tmp1, tmp2; |
211 | 209 |
212 b = xd->block; | 210 b = x->block; |
213 /* Luma */ | 211 /* Luma */ |
214 for (block = 0; block < 16; block++, b++) | 212 for (block = 0; block < 16; block++, b++) |
215 { | 213 { |
216 tmp1 = vp8_block2above[block]; | 214 tmp1 = vp8_block2above[block]; |
217 tmp2 = vp8_block2left[block]; | 215 tmp2 = vp8_block2left[block]; |
218 qcoeff_ptr = b->qcoeff; | 216 qcoeff_ptr = b->qcoeff; |
219 a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; | 217 a = (ENTROPY_CONTEXT *)x->above_context + tmp1; |
220 l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; | 218 l = (ENTROPY_CONTEXT *)x->left_context + tmp2; |
221 | 219 |
222 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 220 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
223 | 221 |
224 c = type ? 0 : 1; | 222 c = type ? 0 : 1; |
225 | 223 |
226 if(c >= *b->eob) | 224 if(c >= *b->eob) |
227 { | 225 { |
228 /* c = band for this case */ | 226 /* c = band for this case */ |
229 t->Token = DCT_EOB_TOKEN; | 227 t->Token = DCT_EOB_TOKEN; |
230 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; | 228 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; |
231 t->skip_eob_node = 0; | 229 t->skip_eob_node = 0; |
232 | 230 |
233 ++x->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN]; | 231 ++cpi->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN]; |
234 t++; | 232 t++; |
235 *tp = t; | 233 *tp = t; |
236 *a = *l = 0; | 234 *a = *l = 0; |
237 continue; | 235 continue; |
238 } | 236 } |
239 | 237 |
240 v = qcoeff_ptr[c]; | 238 v = qcoeff_ptr[c]; |
241 | 239 |
242 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 240 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
243 token = vp8_dct_value_tokens_ptr[v].Token; | 241 token = vp8_dct_value_tokens_ptr[v].Token; |
244 t->Token = token; | 242 t->Token = token; |
245 | 243 |
246 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; | 244 t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; |
247 t->skip_eob_node = 0; | 245 t->skip_eob_node = 0; |
248 ++x->coef_counts [type] [c] [pt] [token]; | 246 ++cpi->coef_counts [type] [c] [pt] [token]; |
249 pt = vp8_prev_token_class[token]; | 247 pt = vp8_prev_token_class[token]; |
250 t++; | 248 t++; |
251 c++; | 249 c++; |
252 | 250 |
253 for (; c < *b->eob; c++) | 251 for (; c < *b->eob; c++) |
254 { | 252 { |
255 rc = vp8_default_zig_zag1d[c]; | 253 rc = vp8_default_zig_zag1d[c]; |
256 band = vp8_coef_bands[c]; | 254 band = vp8_coef_bands[c]; |
257 v = qcoeff_ptr[rc]; | 255 v = qcoeff_ptr[rc]; |
258 | 256 |
259 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 257 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
260 token = vp8_dct_value_tokens_ptr[v].Token; | 258 token = vp8_dct_value_tokens_ptr[v].Token; |
261 | 259 |
262 t->Token = token; | 260 t->Token = token; |
263 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 261 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
264 | 262 |
265 t->skip_eob_node = (pt == 0); | 263 t->skip_eob_node = (pt == 0); |
266 ++x->coef_counts [type] [band] [pt] [token]; | 264 ++cpi->coef_counts [type] [band] [pt] [token]; |
267 | 265 |
268 pt = vp8_prev_token_class[token]; | 266 pt = vp8_prev_token_class[token]; |
269 t++; | 267 t++; |
270 } | 268 } |
271 if (c < 16) | 269 if (c < 16) |
272 { | 270 { |
273 band = vp8_coef_bands[c]; | 271 band = vp8_coef_bands[c]; |
274 t->Token = DCT_EOB_TOKEN; | 272 t->Token = DCT_EOB_TOKEN; |
275 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 273 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
276 | 274 |
277 t->skip_eob_node = 0; | 275 t->skip_eob_node = 0; |
278 ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; | 276 ++cpi->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; |
279 | 277 |
280 t++; | 278 t++; |
281 } | 279 } |
282 *tp = t; | 280 *tp = t; |
283 *a = *l = 1; | 281 *a = *l = 1; |
284 } | 282 } |
285 | 283 |
286 /* Chroma */ | 284 /* Chroma */ |
287 for (block = 16; block < 24; block++, b++) | 285 for (block = 16; block < 24; block++, b++) |
288 { | 286 { |
289 tmp1 = vp8_block2above[block]; | 287 tmp1 = vp8_block2above[block]; |
290 tmp2 = vp8_block2left[block]; | 288 tmp2 = vp8_block2left[block]; |
291 qcoeff_ptr = b->qcoeff; | 289 qcoeff_ptr = b->qcoeff; |
292 a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; | 290 a = (ENTROPY_CONTEXT *)x->above_context + tmp1; |
293 l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; | 291 l = (ENTROPY_CONTEXT *)x->left_context + tmp2; |
294 | 292 |
295 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 293 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
296 | 294 |
297 if(!(*b->eob)) | 295 if(!(*b->eob)) |
298 { | 296 { |
299 /* c = band for this case */ | 297 /* c = band for this case */ |
300 t->Token = DCT_EOB_TOKEN; | 298 t->Token = DCT_EOB_TOKEN; |
301 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 299 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
302 t->skip_eob_node = 0; | 300 t->skip_eob_node = 0; |
303 | 301 |
304 ++x->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN]; | 302 ++cpi->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN]; |
305 t++; | 303 t++; |
306 *tp = t; | 304 *tp = t; |
307 *a = *l = 0; | 305 *a = *l = 0; |
308 continue; | 306 continue; |
309 } | 307 } |
310 | 308 |
311 v = qcoeff_ptr[0]; | 309 v = qcoeff_ptr[0]; |
312 | 310 |
313 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 311 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
314 token = vp8_dct_value_tokens_ptr[v].Token; | 312 token = vp8_dct_value_tokens_ptr[v].Token; |
315 t->Token = token; | 313 t->Token = token; |
316 | 314 |
317 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 315 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
318 t->skip_eob_node = 0; | 316 t->skip_eob_node = 0; |
319 ++x->coef_counts [2] [0] [pt] [token]; | 317 ++cpi->coef_counts [2] [0] [pt] [token]; |
320 pt = vp8_prev_token_class[token]; | 318 pt = vp8_prev_token_class[token]; |
321 t++; | 319 t++; |
322 c = 1; | 320 c = 1; |
323 | 321 |
324 for (; c < *b->eob; c++) | 322 for (; c < *b->eob; c++) |
325 { | 323 { |
326 rc = vp8_default_zig_zag1d[c]; | 324 rc = vp8_default_zig_zag1d[c]; |
327 band = vp8_coef_bands[c]; | 325 band = vp8_coef_bands[c]; |
328 v = qcoeff_ptr[rc]; | 326 v = qcoeff_ptr[rc]; |
329 | 327 |
330 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; | 328 t->Extra = vp8_dct_value_tokens_ptr[v].Extra; |
331 token = vp8_dct_value_tokens_ptr[v].Token; | 329 token = vp8_dct_value_tokens_ptr[v].Token; |
332 | 330 |
333 t->Token = token; | 331 t->Token = token; |
334 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; | 332 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; |
335 | 333 |
336 t->skip_eob_node = (pt == 0); | 334 t->skip_eob_node = (pt == 0); |
337 | 335 |
338 ++x->coef_counts [2] [band] [pt] [token]; | 336 ++cpi->coef_counts [2] [band] [pt] [token]; |
339 | 337 |
340 pt = vp8_prev_token_class[token]; | 338 pt = vp8_prev_token_class[token]; |
341 t++; | 339 t++; |
342 } | 340 } |
343 if (c < 16) | 341 if (c < 16) |
344 { | 342 { |
345 band = vp8_coef_bands[c]; | 343 band = vp8_coef_bands[c]; |
346 t->Token = DCT_EOB_TOKEN; | 344 t->Token = DCT_EOB_TOKEN; |
347 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; | 345 t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; |
348 | 346 |
349 t->skip_eob_node = 0; | 347 t->skip_eob_node = 0; |
350 | 348 |
351 ++x->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN]; | 349 ++cpi->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN]; |
352 | 350 |
353 t++; | 351 t++; |
354 } | 352 } |
355 *tp = t; | 353 *tp = t; |
356 *a = *l = 1; | 354 *a = *l = 1; |
357 } | 355 } |
358 } | 356 } |
359 | 357 |
360 | 358 |
361 static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block) | 359 static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block) |
362 { | 360 { |
363 int skip = 1; | 361 int skip = 1; |
364 int i = 0; | 362 int i = 0; |
365 | 363 |
366 if (has_y2_block) | 364 if (has_y2_block) |
367 { | 365 { |
368 for (i = 0; i < 16; i++) | 366 for (i = 0; i < 16; i++) |
369 skip &= (x->eobs[i] < 2); | 367 skip &= (x->eobs[i] < 2); |
370 } | 368 } |
371 | 369 |
372 for (; i < 24 + has_y2_block; i++) | 370 for (; i < 24 + has_y2_block; i++) |
373 skip &= (!x->eobs[i]); | 371 skip &= (!x->eobs[i]); |
374 | 372 |
375 return skip; | 373 return skip; |
376 } | 374 } |
377 | 375 |
378 | 376 |
379 void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) | 377 void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) |
380 { | 378 { |
381 MACROBLOCKD *xd = &x->e_mbd; | |
382 int plane_type; | 379 int plane_type; |
383 int has_y2_block; | 380 int has_y2_block; |
384 | 381 |
385 has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED | 382 has_y2_block = (x->mode_info_context->mbmi.mode != B_PRED |
386 && xd->mode_info_context->mbmi.mode != SPLITMV); | 383 && x->mode_info_context->mbmi.mode != SPLITMV); |
387 | 384 |
388 xd->mode_info_context->mbmi.mb_skip_coeff = | 385 x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x, has_y2_block); |
389 mb_is_skippable(xd, has_y2_block); | 386 if (x->mode_info_context->mbmi.mb_skip_coeff) |
390 if (xd->mode_info_context->mbmi.mb_skip_coeff) | |
391 { | 387 { |
392 if (!cpi->common.mb_no_coeff_skip) | 388 if (!cpi->common.mb_no_coeff_skip) |
393 { | 389 { |
394 vp8_stuff_mb(cpi, x, t); | 390 vp8_stuff_mb(cpi, x, t); |
395 } | 391 } |
396 else | 392 else |
397 { | 393 { |
398 vp8_fix_contexts(xd); | 394 vp8_fix_contexts(x); |
399 x->skip_true_count++; | 395 cpi->skip_true_count++; |
400 } | 396 } |
401 | 397 |
402 return; | 398 return; |
403 } | 399 } |
404 | 400 |
405 plane_type = 3; | 401 plane_type = 3; |
406 if(has_y2_block) | 402 if(has_y2_block) |
407 { | 403 { |
408 tokenize2nd_order_b(x, t, cpi); | 404 tokenize2nd_order_b(x, t, cpi); |
409 plane_type = 0; | 405 plane_type = 0; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 fclose(f); | 481 fclose(f); |
486 } | 482 } |
487 #endif | 483 #endif |
488 | 484 |
489 | 485 |
490 static void stuff2nd_order_b | 486 static void stuff2nd_order_b |
491 ( | 487 ( |
492 TOKENEXTRA **tp, | 488 TOKENEXTRA **tp, |
493 ENTROPY_CONTEXT *a, | 489 ENTROPY_CONTEXT *a, |
494 ENTROPY_CONTEXT *l, | 490 ENTROPY_CONTEXT *l, |
495 VP8_COMP *cpi, | 491 VP8_COMP *cpi |
496 MACROBLOCK *x | |
497 ) | 492 ) |
498 { | 493 { |
499 int pt; /* near block/prev token context index */ | 494 int pt; /* near block/prev token context index */ |
500 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 495 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
501 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 496 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
502 | 497 |
503 t->Token = DCT_EOB_TOKEN; | 498 t->Token = DCT_EOB_TOKEN; |
504 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; | 499 t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; |
505 t->skip_eob_node = 0; | 500 t->skip_eob_node = 0; |
506 ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; | 501 ++cpi->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; |
507 ++t; | 502 ++t; |
508 | 503 |
509 *tp = t; | 504 *tp = t; |
510 pt = 0; | 505 pt = 0; |
511 *a = *l = pt; | 506 *a = *l = pt; |
| 507 |
512 } | 508 } |
513 | 509 |
514 static void stuff1st_order_b | 510 static void stuff1st_order_b |
515 ( | 511 ( |
516 TOKENEXTRA **tp, | 512 TOKENEXTRA **tp, |
517 ENTROPY_CONTEXT *a, | 513 ENTROPY_CONTEXT *a, |
518 ENTROPY_CONTEXT *l, | 514 ENTROPY_CONTEXT *l, |
519 int type, | 515 int type, |
520 VP8_COMP *cpi, | 516 VP8_COMP *cpi |
521 MACROBLOCK *x | |
522 ) | 517 ) |
523 { | 518 { |
524 int pt; /* near block/prev token context index */ | 519 int pt; /* near block/prev token context index */ |
525 int band; | 520 int band; |
526 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 521 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
527 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 522 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
528 band = type ? 0 : 1; | 523 band = type ? 0 : 1; |
529 t->Token = DCT_EOB_TOKEN; | 524 t->Token = DCT_EOB_TOKEN; |
530 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; | 525 t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; |
531 t->skip_eob_node = 0; | 526 t->skip_eob_node = 0; |
532 ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; | 527 ++cpi->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; |
533 ++t; | 528 ++t; |
534 *tp = t; | 529 *tp = t; |
535 pt = 0; /* 0 <-> all coeff data is zero */ | 530 pt = 0; /* 0 <-> all coeff data is zero */ |
536 *a = *l = pt; | 531 *a = *l = pt; |
| 532 |
537 } | 533 } |
538 | |
539 static | 534 static |
540 void stuff1st_order_buv | 535 void stuff1st_order_buv |
541 ( | 536 ( |
542 TOKENEXTRA **tp, | 537 TOKENEXTRA **tp, |
543 ENTROPY_CONTEXT *a, | 538 ENTROPY_CONTEXT *a, |
544 ENTROPY_CONTEXT *l, | 539 ENTROPY_CONTEXT *l, |
545 VP8_COMP *cpi, | 540 VP8_COMP *cpi |
546 MACROBLOCK *x | |
547 ) | 541 ) |
548 { | 542 { |
549 int pt; /* near block/prev token context index */ | 543 int pt; /* near block/prev token context index */ |
550 TOKENEXTRA *t = *tp; /* store tokens starting here */ | 544 TOKENEXTRA *t = *tp; /* store tokens starting here */ |
551 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 545 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
552 | 546 |
553 t->Token = DCT_EOB_TOKEN; | 547 t->Token = DCT_EOB_TOKEN; |
554 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; | 548 t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; |
555 t->skip_eob_node = 0; | 549 t->skip_eob_node = 0; |
556 ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN]; | 550 ++cpi->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN]; |
557 ++t; | 551 ++t; |
558 *tp = t; | 552 *tp = t; |
559 pt = 0; /* 0 <-> all coeff data is zero */ | 553 pt = 0; /* 0 <-> all coeff data is zero */ |
560 *a = *l = pt; | 554 *a = *l = pt; |
| 555 |
561 } | 556 } |
562 | 557 |
563 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) | 558 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) |
564 { | 559 { |
565 MACROBLOCKD *xd = &x->e_mbd; | 560 ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context; |
566 ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context; | 561 ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context; |
567 ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context; | |
568 int plane_type; | 562 int plane_type; |
569 int b; | 563 int b; |
570 plane_type = 3; | 564 plane_type = 3; |
571 if((xd->mode_info_context->mbmi.mode != B_PRED | 565 if((x->mode_info_context->mbmi.mode != B_PRED |
572 && xd->mode_info_context->mbmi.mode != SPLITMV)) | 566 && x->mode_info_context->mbmi.mode != SPLITMV)) |
573 { | 567 { |
574 stuff2nd_order_b(t, | 568 stuff2nd_order_b(t, |
575 A + vp8_block2above[24], L + vp8_block2left[24], cpi, x); | 569 A + vp8_block2above[24], L + vp8_block2left[24], cpi); |
576 plane_type = 0; | 570 plane_type = 0; |
577 } | 571 } |
578 | 572 |
579 for (b = 0; b < 16; b++) | 573 for (b = 0; b < 16; b++) |
580 stuff1st_order_b(t, | 574 stuff1st_order_b(t, |
581 A + vp8_block2above[b], | 575 A + vp8_block2above[b], |
582 L + vp8_block2left[b], plane_type, cpi, x); | 576 L + vp8_block2left[b], plane_type, cpi); |
583 | 577 |
584 for (b = 16; b < 24; b++) | 578 for (b = 16; b < 24; b++) |
585 stuff1st_order_buv(t, | 579 stuff1st_order_buv(t, |
586 A + vp8_block2above[b], | 580 A + vp8_block2above[b], |
587 L + vp8_block2left[b], cpi, x); | 581 L + vp8_block2left[b], cpi); |
588 | 582 |
589 } | 583 } |
590 void vp8_fix_contexts(MACROBLOCKD *x) | 584 void vp8_fix_contexts(MACROBLOCKD *x) |
591 { | 585 { |
592 /* Clear entropy contexts for Y2 blocks */ | 586 /* Clear entropy contexts for Y2 blocks */ |
593 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.
mode != SPLITMV) | 587 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.
mode != SPLITMV) |
594 { | 588 { |
595 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); | 589 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); |
596 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); | 590 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); |
597 } | 591 } |
598 else | 592 else |
599 { | 593 { |
600 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); | 594 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); |
601 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); | 595 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); |
602 } | 596 } |
603 | 597 |
604 } | 598 } |
OLD | NEW |