| 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 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 int segment_id) { | 409 int segment_id) { |
| 410 VP9_COMMON * const cm = &cpi->common; | 410 VP9_COMMON * const cm = &cpi->common; |
| 411 variance_node vt; | 411 variance_node vt; |
| 412 const int block_width = num_8x8_blocks_wide_lookup[bsize]; | 412 const int block_width = num_8x8_blocks_wide_lookup[bsize]; |
| 413 const int block_height = num_8x8_blocks_high_lookup[bsize]; | 413 const int block_height = num_8x8_blocks_high_lookup[bsize]; |
| 414 | 414 |
| 415 assert(block_height == block_width); | 415 assert(block_height == block_width); |
| 416 tree_to_node(data, bsize, &vt); | 416 tree_to_node(data, bsize, &vt); |
| 417 | 417 |
| 418 // No 64x64 blocks on segments other than base (un-boosted) segment. | 418 // No 64x64 blocks on segments other than base (un-boosted) segment. |
| 419 if (segment_id != CR_SEGMENT_ID_BASE && bsize == BLOCK_64X64) | 419 if (cyclic_refresh_segment_id_boosted(segment_id) && bsize == BLOCK_64X64) |
| 420 return 0; | 420 return 0; |
| 421 | 421 |
| 422 // For bsize=bsize_min (16x16/8x8 for 8x8/4x4 downsampling), select if | 422 // For bsize=bsize_min (16x16/8x8 for 8x8/4x4 downsampling), select if |
| 423 // variance is below threshold, otherwise split will be selected. | 423 // variance is below threshold, otherwise split will be selected. |
| 424 // No check for vert/horiz split as too few samples for variance. | 424 // No check for vert/horiz split as too few samples for variance. |
| 425 if (bsize == bsize_min) { | 425 if (bsize == bsize_min) { |
| 426 get_variance(&vt.part_variances->none); | 426 get_variance(&vt.part_variances->none); |
| 427 if (mi_col + block_width / 2 < cm->mi_cols && | 427 if (mi_col + block_width / 2 < cm->mi_cols && |
| 428 mi_row + block_height / 2 < cm->mi_rows && | 428 mi_row + block_height / 2 < cm->mi_rows && |
| 429 vt.part_variances->none.variance < threshold) { | 429 vt.part_variances->none.variance < threshold) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 } | 474 } |
| 475 | 475 |
| 476 return 0; | 476 return 0; |
| 477 } | 477 } |
| 478 return 0; | 478 return 0; |
| 479 } | 479 } |
| 480 | 480 |
| 481 | 481 |
| 482 void vp9_set_vbp_thresholds(VP9_COMP *cpi, int q) { | 482 void vp9_set_vbp_thresholds(VP9_COMP *cpi, int q) { |
| 483 SPEED_FEATURES *const sf = &cpi->sf; | 483 SPEED_FEATURES *const sf = &cpi->sf; |
| 484 if (sf->partition_search_type != VAR_BASED_PARTITION) { | 484 if (sf->partition_search_type != VAR_BASED_PARTITION && |
| 485 sf->partition_search_type != REFERENCE_PARTITION) { |
| 485 return; | 486 return; |
| 486 } else { | 487 } else { |
| 487 VP9_COMMON *const cm = &cpi->common; | 488 VP9_COMMON *const cm = &cpi->common; |
| 488 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 489 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 489 const int is_key_frame = (cm->frame_type == KEY_FRAME); | 490 const int is_key_frame = (cm->frame_type == KEY_FRAME); |
| 490 const int use_4x4_partition = is_key_frame; | 491 const int use_4x4_partition = is_key_frame; |
| 491 const int low_res = (cm->width <= 352 && cm->height <= 288); | 492 const int low_res = (cm->width <= 352 && cm->height <= 288); |
| 492 const int threshold_multiplier = is_key_frame ? 80 : 4; | 493 const int threshold_multiplier = is_key_frame ? 80 : 4; |
| 493 const int64_t threshold_base = (int64_t)(threshold_multiplier * | 494 const int64_t threshold_base = (int64_t)(threshold_multiplier * |
| 494 vp9_convert_qindex_to_q(q, cm->bit_depth)); | 495 vp9_convert_qindex_to_q(q, cm->bit_depth)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 507 // use_4x4_partition = (variance4x4downsample[i2 + j] == 1); | 508 // use_4x4_partition = (variance4x4downsample[i2 + j] == 1); |
| 508 // If 4x4 partition is not used, then 8x8 partition will be selected | 509 // If 4x4 partition is not used, then 8x8 partition will be selected |
| 509 // if variance of 16x16 block is very high, so use larger threshold | 510 // if variance of 16x16 block is very high, so use larger threshold |
| 510 // for 16x16 (threshold_bsize_min) in that case. | 511 // for 16x16 (threshold_bsize_min) in that case. |
| 511 cpi->vbp_threshold_16x16 = (use_4x4_partition) ? | 512 cpi->vbp_threshold_16x16 = (use_4x4_partition) ? |
| 512 cpi->vbp_threshold : cpi->vbp_threshold_bsize_min; | 513 cpi->vbp_threshold : cpi->vbp_threshold_bsize_min; |
| 513 cpi->vbp_bsize_min = (use_4x4_partition) ? BLOCK_8X8 : BLOCK_16X16; | 514 cpi->vbp_bsize_min = (use_4x4_partition) ? BLOCK_8X8 : BLOCK_16X16; |
| 514 } | 515 } |
| 515 } | 516 } |
| 516 | 517 |
| 517 #if CONFIG_VP9_HIGHBITDEPTH | |
| 518 #define GLOBAL_MOTION 0 | |
| 519 #else | |
| 520 #define GLOBAL_MOTION 1 | |
| 521 #endif | |
| 522 | |
| 523 // This function chooses partitioning based on the variance between source and | 518 // This function chooses partitioning based on the variance between source and |
| 524 // reconstructed last, where variance is computed for down-sampled inputs. | 519 // reconstructed last, where variance is computed for down-sampled inputs. |
| 525 static void choose_partitioning(VP9_COMP *cpi, | 520 static void choose_partitioning(VP9_COMP *cpi, |
| 526 const TileInfo *const tile, | 521 const TileInfo *const tile, |
| 527 MACROBLOCK *x, | 522 MACROBLOCK *x, |
| 528 int mi_row, int mi_col) { | 523 int mi_row, int mi_col) { |
| 529 VP9_COMMON * const cm = &cpi->common; | 524 VP9_COMMON * const cm = &cpi->common; |
| 530 MACROBLOCKD *xd = &x->e_mbd; | 525 MACROBLOCKD *xd = &x->e_mbd; |
| 531 int i, j, k, m; | 526 int i, j, k, m; |
| 532 v64x64 vt; | 527 v64x64 vt; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 556 pixels_wide += (xd->mb_to_right_edge >> 3); | 551 pixels_wide += (xd->mb_to_right_edge >> 3); |
| 557 if (xd->mb_to_bottom_edge < 0) | 552 if (xd->mb_to_bottom_edge < 0) |
| 558 pixels_high += (xd->mb_to_bottom_edge >> 3); | 553 pixels_high += (xd->mb_to_bottom_edge >> 3); |
| 559 | 554 |
| 560 s = x->plane[0].src.buf; | 555 s = x->plane[0].src.buf; |
| 561 sp = x->plane[0].src.stride; | 556 sp = x->plane[0].src.stride; |
| 562 | 557 |
| 563 if (!is_key_frame) { | 558 if (!is_key_frame) { |
| 564 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; | 559 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; |
| 565 unsigned int uv_sad; | 560 unsigned int uv_sad; |
| 566 #if GLOBAL_MOTION | 561 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, LAST_FRAME); |
| 567 unsigned int y_sad; | 562 |
| 563 const YV12_BUFFER_CONFIG *yv12_g = get_ref_frame_buffer(cpi, GOLDEN_FRAME); |
| 564 unsigned int y_sad, y_sad_g; |
| 568 BLOCK_SIZE bsize; | 565 BLOCK_SIZE bsize; |
| 569 #endif | |
| 570 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, LAST_FRAME); | |
| 571 assert(yv12 != NULL); | |
| 572 vp9_setup_pre_planes(xd, 0, yv12, mi_row, mi_col, | |
| 573 &cm->frame_refs[LAST_FRAME - 1].sf); | |
| 574 mbmi->ref_frame[0] = LAST_FRAME; | |
| 575 mbmi->ref_frame[1] = NONE; | |
| 576 mbmi->sb_type = BLOCK_64X64; | |
| 577 mbmi->mv[0].as_int = 0; | |
| 578 mbmi->interp_filter = BILINEAR; | |
| 579 | |
| 580 #if GLOBAL_MOTION | |
| 581 if (mi_row + 4 < cm->mi_rows && mi_col + 4 < cm->mi_cols) | 566 if (mi_row + 4 < cm->mi_rows && mi_col + 4 < cm->mi_cols) |
| 582 bsize = BLOCK_64X64; | 567 bsize = BLOCK_64X64; |
| 583 else if (mi_row + 4 < cm->mi_rows && mi_col + 4 >= cm->mi_cols) | 568 else if (mi_row + 4 < cm->mi_rows && mi_col + 4 >= cm->mi_cols) |
| 584 bsize = BLOCK_32X64; | 569 bsize = BLOCK_32X64; |
| 585 else if (mi_row + 4 >= cm->mi_rows && mi_col + 4 < cm->mi_cols) | 570 else if (mi_row + 4 >= cm->mi_rows && mi_col + 4 < cm->mi_cols) |
| 586 bsize = BLOCK_64X32; | 571 bsize = BLOCK_64X32; |
| 587 else | 572 else |
| 588 bsize = BLOCK_32X32; | 573 bsize = BLOCK_32X32; |
| 589 | 574 |
| 575 assert(yv12 != NULL); |
| 576 |
| 577 if (yv12_g && yv12_g != yv12) { |
| 578 vp9_setup_pre_planes(xd, 0, yv12_g, mi_row, mi_col, |
| 579 &cm->frame_refs[GOLDEN_FRAME - 1].sf); |
| 580 y_sad_g = cpi->fn_ptr[bsize].sdf(x->plane[0].src.buf, |
| 581 x->plane[0].src.stride, |
| 582 xd->plane[0].pre[0].buf, |
| 583 xd->plane[0].pre[0].stride); |
| 584 } else { |
| 585 y_sad_g = UINT_MAX; |
| 586 } |
| 587 |
| 588 vp9_setup_pre_planes(xd, 0, yv12, mi_row, mi_col, |
| 589 &cm->frame_refs[LAST_FRAME - 1].sf); |
| 590 mbmi->ref_frame[0] = LAST_FRAME; |
| 591 mbmi->ref_frame[1] = NONE; |
| 592 mbmi->sb_type = BLOCK_64X64; |
| 593 mbmi->mv[0].as_int = 0; |
| 594 mbmi->interp_filter = BILINEAR; |
| 595 |
| 590 y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize); | 596 y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize); |
| 591 x->pred_mv[LAST_FRAME] = mbmi->mv[0].as_mv; | 597 if (y_sad_g < y_sad) { |
| 592 #endif | 598 vp9_setup_pre_planes(xd, 0, yv12_g, mi_row, mi_col, |
| 599 &cm->frame_refs[GOLDEN_FRAME - 1].sf); |
| 600 mbmi->ref_frame[0] = GOLDEN_FRAME; |
| 601 mbmi->mv[0].as_int = 0; |
| 602 y_sad = y_sad_g; |
| 603 } else { |
| 604 x->pred_mv[LAST_FRAME] = mbmi->mv[0].as_mv; |
| 605 } |
| 593 | 606 |
| 594 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64); | 607 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64); |
| 595 | 608 |
| 596 for (i = 1; i <= 2; ++i) { | 609 for (i = 1; i <= 2; ++i) { |
| 597 struct macroblock_plane *p = &x->plane[i]; | 610 struct macroblock_plane *p = &x->plane[i]; |
| 598 struct macroblockd_plane *pd = &xd->plane[i]; | 611 struct macroblockd_plane *pd = &xd->plane[i]; |
| 599 #if GLOBAL_MOTION | |
| 600 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); | 612 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); |
| 601 #else | 613 |
| 602 const BLOCK_SIZE bs = get_plane_block_size(BLOCK_64X64, pd); | |
| 603 #endif | |
| 604 if (bs == BLOCK_INVALID) | 614 if (bs == BLOCK_INVALID) |
| 605 uv_sad = INT_MAX; | 615 uv_sad = UINT_MAX; |
| 606 else | 616 else |
| 607 uv_sad = cpi->fn_ptr[bs].sdf(p->src.buf, p->src.stride, | 617 uv_sad = cpi->fn_ptr[bs].sdf(p->src.buf, p->src.stride, |
| 608 pd->dst.buf, pd->dst.stride); | 618 pd->dst.buf, pd->dst.stride); |
| 609 | 619 |
| 610 #if GLOBAL_MOTION | 620 x->color_sensitivity[i - 1] = uv_sad > (y_sad >> 2); |
| 611 x->color_sensitivity[i - 1] = uv_sad * 4 > y_sad; | |
| 612 #else | |
| 613 x->color_sensitivity[i - 1] = (uv_sad > 512); | |
| 614 #endif | |
| 615 } | 621 } |
| 616 | 622 |
| 617 d = xd->plane[0].dst.buf; | 623 d = xd->plane[0].dst.buf; |
| 618 dp = xd->plane[0].dst.stride; | 624 dp = xd->plane[0].dst.stride; |
| 619 } else { | 625 } else { |
| 620 d = VP9_VAR_OFFS; | 626 d = VP9_VAR_OFFS; |
| 621 dp = 0; | 627 dp = 0; |
| 622 #if CONFIG_VP9_HIGHBITDEPTH | 628 #if CONFIG_VP9_HIGHBITDEPTH |
| 623 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { | 629 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { |
| 624 switch (xd->bd) { | 630 switch (xd->bd) { |
| (...skipping 955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1580 static void encode_b_rt(VP9_COMP *cpi, ThreadData *td, | 1586 static void encode_b_rt(VP9_COMP *cpi, ThreadData *td, |
| 1581 const TileInfo *const tile, | 1587 const TileInfo *const tile, |
| 1582 TOKENEXTRA **tp, int mi_row, int mi_col, | 1588 TOKENEXTRA **tp, int mi_row, int mi_col, |
| 1583 int output_enabled, BLOCK_SIZE bsize, | 1589 int output_enabled, BLOCK_SIZE bsize, |
| 1584 PICK_MODE_CONTEXT *ctx) { | 1590 PICK_MODE_CONTEXT *ctx) { |
| 1585 MACROBLOCK *const x = &td->mb; | 1591 MACROBLOCK *const x = &td->mb; |
| 1586 set_offsets(cpi, tile, x, mi_row, mi_col, bsize); | 1592 set_offsets(cpi, tile, x, mi_row, mi_col, bsize); |
| 1587 update_state_rt(cpi, td, ctx, mi_row, mi_col, bsize); | 1593 update_state_rt(cpi, td, ctx, mi_row, mi_col, bsize); |
| 1588 | 1594 |
| 1589 #if CONFIG_VP9_TEMPORAL_DENOISING | 1595 #if CONFIG_VP9_TEMPORAL_DENOISING |
| 1590 if (cpi->oxcf.noise_sensitivity > 0 && output_enabled) { | 1596 if (cpi->oxcf.noise_sensitivity > 0 && output_enabled && |
| 1597 cpi->common.frame_type != KEY_FRAME) { |
| 1591 vp9_denoiser_denoise(&cpi->denoiser, x, mi_row, mi_col, | 1598 vp9_denoiser_denoise(&cpi->denoiser, x, mi_row, mi_col, |
| 1592 MAX(BLOCK_8X8, bsize), ctx); | 1599 MAX(BLOCK_8X8, bsize), ctx); |
| 1593 } | 1600 } |
| 1594 #endif | 1601 #endif |
| 1595 | 1602 |
| 1596 encode_superblock(cpi, td, tp, output_enabled, mi_row, mi_col, bsize, ctx); | 1603 encode_superblock(cpi, td, tp, output_enabled, mi_row, mi_col, bsize, ctx); |
| 1597 update_stats(&cpi->common, td); | 1604 update_stats(&cpi->common, td); |
| 1598 | 1605 |
| 1599 (*tp)->token = EOSB_TOKEN; | 1606 (*tp)->token = EOSB_TOKEN; |
| 1600 (*tp)++; | 1607 (*tp)++; |
| (...skipping 1901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3502 if (!seg_skip) | 3509 if (!seg_skip) |
| 3503 bsize = sf->always_this_block_size; | 3510 bsize = sf->always_this_block_size; |
| 3504 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); | 3511 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); |
| 3505 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 3512 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 3506 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); | 3513 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); |
| 3507 break; | 3514 break; |
| 3508 case REFERENCE_PARTITION: | 3515 case REFERENCE_PARTITION: |
| 3509 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); | 3516 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); |
| 3510 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled && | 3517 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled && |
| 3511 xd->mi[0].src_mi->mbmi.segment_id) { | 3518 xd->mi[0].src_mi->mbmi.segment_id) { |
| 3512 auto_partition_range(cpi, tile_info, xd, mi_row, mi_col, | 3519 x->max_partition_size = BLOCK_64X64; |
| 3513 &x->min_partition_size, | 3520 x->min_partition_size = BLOCK_8X8; |
| 3514 &x->max_partition_size); | |
| 3515 nonrd_pick_partition(cpi, td, tile_data, tp, mi_row, mi_col, | 3521 nonrd_pick_partition(cpi, td, tile_data, tp, mi_row, mi_col, |
| 3516 BLOCK_64X64, &dummy_rdc, 1, | 3522 BLOCK_64X64, &dummy_rdc, 1, |
| 3517 INT64_MAX, td->pc_root); | 3523 INT64_MAX, td->pc_root); |
| 3518 } else { | 3524 } else { |
| 3519 choose_partitioning(cpi, tile_info, x, mi_row, mi_col); | 3525 choose_partitioning(cpi, tile_info, x, mi_row, mi_col); |
| 3520 nonrd_select_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 3526 nonrd_select_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 3521 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); | 3527 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); |
| 3522 } | 3528 } |
| 3523 | 3529 |
| 3524 break; | 3530 break; |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4103 | 4109 |
| 4104 for (y = 0; y < mi_height; y++) | 4110 for (y = 0; y < mi_height; y++) |
| 4105 for (x = 0; x < mi_width; x++) | 4111 for (x = 0; x < mi_width; x++) |
| 4106 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) | 4112 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) |
| 4107 mi_8x8[mis * y + x].src_mi->mbmi.tx_size = tx_size; | 4113 mi_8x8[mis * y + x].src_mi->mbmi.tx_size = tx_size; |
| 4108 } | 4114 } |
| 4109 ++td->counts->tx.tx_totals[mbmi->tx_size]; | 4115 ++td->counts->tx.tx_totals[mbmi->tx_size]; |
| 4110 ++td->counts->tx.tx_totals[get_uv_tx_size(mbmi, &xd->plane[1])]; | 4116 ++td->counts->tx.tx_totals[get_uv_tx_size(mbmi, &xd->plane[1])]; |
| 4111 } | 4117 } |
| 4112 } | 4118 } |
| OLD | NEW |