Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: source/libvpx/vp8/encoder/tokenize.c

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698