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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 MACROBLOCKD *const xd = args->xd; | 254 MACROBLOCKD *const xd = args->xd; |
255 struct macroblock_plane *p = &args->cpi->mb.plane[plane]; | 255 struct macroblock_plane *p = &args->cpi->mb.plane[plane]; |
256 struct macroblockd_plane *pd = &xd->plane[plane]; | 256 struct macroblockd_plane *pd = &xd->plane[plane]; |
257 int aoff, loff; | 257 int aoff, loff; |
258 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); | 258 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); |
259 vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, | 259 vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, |
260 aoff, loff); | 260 aoff, loff); |
261 } | 261 } |
262 | 262 |
263 static INLINE void add_token(TOKENEXTRA **t, const vp9_prob *context_tree, | 263 static INLINE void add_token(TOKENEXTRA **t, const vp9_prob *context_tree, |
264 int16_t extra, uint8_t token, | 264 int32_t extra, uint8_t token, |
265 uint8_t skip_eob_node, | 265 uint8_t skip_eob_node, |
266 unsigned int *counts) { | 266 unsigned int *counts) { |
267 (*t)->token = token; | 267 (*t)->token = token; |
268 (*t)->extra = extra; | 268 (*t)->extra = extra; |
269 (*t)->context_tree = context_tree; | 269 (*t)->context_tree = context_tree; |
270 (*t)->skip_eob_node = skip_eob_node; | 270 (*t)->skip_eob_node = skip_eob_node; |
271 (*t)++; | 271 (*t)++; |
272 ++counts[token]; | 272 ++counts[token]; |
273 } | 273 } |
274 | 274 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 | 322 |
323 int aoff, loff; | 323 int aoff, loff; |
324 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); | 324 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); |
325 | 325 |
326 pt = get_entropy_context(tx_size, pd->above_context + aoff, | 326 pt = get_entropy_context(tx_size, pd->above_context + aoff, |
327 pd->left_context + loff); | 327 pd->left_context + loff); |
328 so = get_scan(xd, tx_size, type, block); | 328 so = get_scan(xd, tx_size, type, block); |
329 scan = so->scan; | 329 scan = so->scan; |
330 nb = so->neighbors; | 330 nb = so->neighbors; |
331 c = 0; | 331 c = 0; |
332 #if CONFIG_VP9_HIGH && CONFIG_HIGH_QUANT | 332 #if CONFIG_VP9_HIGHBITDEPTH |
333 if (cpi->common.profile >= PROFILE_2) { | 333 if (cpi->common.profile >= PROFILE_2) { |
334 dct_value_tokens = (cpi->common.bit_depth == VPX_BITS_10 ? | 334 dct_value_tokens = (cpi->common.bit_depth == VPX_BITS_10 ? |
335 vp9_dct_value_tokens_high10_ptr : | 335 vp9_dct_value_tokens_high10_ptr : |
336 vp9_dct_value_tokens_high12_ptr); | 336 vp9_dct_value_tokens_high12_ptr); |
337 } else { | 337 } else { |
338 dct_value_tokens = vp9_dct_value_tokens_ptr; | 338 dct_value_tokens = vp9_dct_value_tokens_ptr; |
339 } | 339 } |
340 #else | 340 #else |
341 dct_value_tokens = vp9_dct_value_tokens_ptr; | 341 dct_value_tokens = vp9_dct_value_tokens_ptr; |
342 #endif | 342 #endif |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 // TODO(yaowu): rewrite and optimize this function to remove the usage of | 396 // TODO(yaowu): rewrite and optimize this function to remove the usage of |
397 // vp9_foreach_transform_block() and simplify is_skippable(). | 397 // vp9_foreach_transform_block() and simplify is_skippable(). |
398 int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { | 398 int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
399 int result = 1; | 399 int result = 1; |
400 struct is_skippable_args args = {x, &result}; | 400 struct is_skippable_args args = {x, &result}; |
401 vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable, | 401 vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable, |
402 &args); | 402 &args); |
403 return result; | 403 return result; |
404 } | 404 } |
405 | 405 |
| 406 static void has_high_freq_coeff(int plane, int block, |
| 407 BLOCK_SIZE plane_bsize, TX_SIZE tx_size, |
| 408 void *argv) { |
| 409 struct is_skippable_args *args = argv; |
| 410 int eobs = (tx_size == TX_4X4) ? 3 : 10; |
| 411 (void) plane_bsize; |
| 412 |
| 413 *(args->skippable) |= (args->x->plane[plane].eobs[block] > eobs); |
| 414 } |
| 415 |
| 416 int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
| 417 int result = 0; |
| 418 struct is_skippable_args args = {x, &result}; |
| 419 vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, |
| 420 has_high_freq_coeff, &args); |
| 421 return result; |
| 422 } |
| 423 |
406 void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, | 424 void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, |
407 BLOCK_SIZE bsize) { | 425 BLOCK_SIZE bsize) { |
408 VP9_COMMON *const cm = &cpi->common; | 426 VP9_COMMON *const cm = &cpi->common; |
409 MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 427 MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
410 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; | 428 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; |
411 TOKENEXTRA *t_backup = *t; | 429 TOKENEXTRA *t_backup = *t; |
412 const int ctx = vp9_get_skip_context(xd); | 430 const int ctx = vp9_get_skip_context(xd); |
413 const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id, | 431 const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id, |
414 SEG_LVL_SKIP); | 432 SEG_LVL_SKIP); |
415 struct tokenize_b_args arg = {cpi, xd, t}; | 433 struct tokenize_b_args arg = {cpi, xd, t}; |
416 if (mbmi->skip) { | 434 if (mbmi->skip) { |
417 if (!dry_run) | 435 if (!dry_run) |
418 cm->counts.skip[ctx][1] += skip_inc; | 436 cm->counts.skip[ctx][1] += skip_inc; |
419 reset_skip_context(xd, bsize); | 437 reset_skip_context(xd, bsize); |
420 if (dry_run) | 438 if (dry_run) |
421 *t = t_backup; | 439 *t = t_backup; |
422 return; | 440 return; |
423 } | 441 } |
424 | 442 |
425 if (!dry_run) { | 443 if (!dry_run) { |
426 cm->counts.skip[ctx][0] += skip_inc; | 444 cm->counts.skip[ctx][0] += skip_inc; |
427 vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg); | 445 vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg); |
428 } else { | 446 } else { |
429 vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); | 447 vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); |
430 *t = t_backup; | 448 *t = t_backup; |
431 } | 449 } |
432 } | 450 } |
OLD | NEW |