| 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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 if (mi_row + 4 < cm->mi_rows && mi_col + 4 < cm->mi_cols) | 581 if (mi_row + 4 < cm->mi_rows && mi_col + 4 < cm->mi_cols) |
| 582 bsize = BLOCK_64X64; | 582 bsize = BLOCK_64X64; |
| 583 else if (mi_row + 4 < cm->mi_rows && mi_col + 4 >= cm->mi_cols) | 583 else if (mi_row + 4 < cm->mi_rows && mi_col + 4 >= cm->mi_cols) |
| 584 bsize = BLOCK_32X64; | 584 bsize = BLOCK_32X64; |
| 585 else if (mi_row + 4 >= cm->mi_rows && mi_col + 4 < cm->mi_cols) | 585 else if (mi_row + 4 >= cm->mi_rows && mi_col + 4 < cm->mi_cols) |
| 586 bsize = BLOCK_64X32; | 586 bsize = BLOCK_64X32; |
| 587 else | 587 else |
| 588 bsize = BLOCK_32X32; | 588 bsize = BLOCK_32X32; |
| 589 | 589 |
| 590 y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize); | 590 y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize); |
| 591 x->pred_mv[LAST_FRAME] = mbmi->mv[0].as_mv; |
| 591 #endif | 592 #endif |
| 592 | 593 |
| 593 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64); | 594 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64); |
| 594 | 595 |
| 595 for (i = 1; i <= 2; ++i) { | 596 for (i = 1; i <= 2; ++i) { |
| 596 struct macroblock_plane *p = &x->plane[i]; | 597 struct macroblock_plane *p = &x->plane[i]; |
| 597 struct macroblockd_plane *pd = &xd->plane[i]; | 598 struct macroblockd_plane *pd = &xd->plane[i]; |
| 598 #if GLOBAL_MOTION | 599 #if GLOBAL_MOTION |
| 599 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); | 600 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); |
| 600 #else | 601 #else |
| (...skipping 2088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2689 SPEED_FEATURES *const sf = &cpi->sf; | 2690 SPEED_FEATURES *const sf = &cpi->sf; |
| 2690 int mi_col; | 2691 int mi_col; |
| 2691 | 2692 |
| 2692 // Initialize the left context for the new SB row | 2693 // Initialize the left context for the new SB row |
| 2693 vpx_memset(&xd->left_context, 0, sizeof(xd->left_context)); | 2694 vpx_memset(&xd->left_context, 0, sizeof(xd->left_context)); |
| 2694 vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context)); | 2695 vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context)); |
| 2695 | 2696 |
| 2696 // Code each SB in the row | 2697 // Code each SB in the row |
| 2697 for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end; | 2698 for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end; |
| 2698 mi_col += MI_BLOCK_SIZE) { | 2699 mi_col += MI_BLOCK_SIZE) { |
| 2700 const struct segmentation *const seg = &cm->seg; |
| 2699 int dummy_rate; | 2701 int dummy_rate; |
| 2700 int64_t dummy_dist; | 2702 int64_t dummy_dist; |
| 2701 RD_COST dummy_rdc; | 2703 RD_COST dummy_rdc; |
| 2702 int i; | 2704 int i; |
| 2705 int seg_skip = 0; |
| 2703 | 2706 |
| 2704 const int idx_str = cm->mi_stride * mi_row + mi_col; | 2707 const int idx_str = cm->mi_stride * mi_row + mi_col; |
| 2705 MODE_INFO *mi = cm->mi + idx_str; | 2708 MODE_INFO *mi = cm->mi + idx_str; |
| 2706 | 2709 |
| 2707 if (sf->adaptive_pred_interp_filter) { | 2710 if (sf->adaptive_pred_interp_filter) { |
| 2708 for (i = 0; i < 64; ++i) | 2711 for (i = 0; i < 64; ++i) |
| 2709 td->leaf_tree[i].pred_interp_filter = SWITCHABLE; | 2712 td->leaf_tree[i].pred_interp_filter = SWITCHABLE; |
| 2710 | 2713 |
| 2711 for (i = 0; i < 64; ++i) { | 2714 for (i = 0; i < 64; ++i) { |
| 2712 td->pc_tree[i].vertical[0].pred_interp_filter = SWITCHABLE; | 2715 td->pc_tree[i].vertical[0].pred_interp_filter = SWITCHABLE; |
| 2713 td->pc_tree[i].vertical[1].pred_interp_filter = SWITCHABLE; | 2716 td->pc_tree[i].vertical[1].pred_interp_filter = SWITCHABLE; |
| 2714 td->pc_tree[i].horizontal[0].pred_interp_filter = SWITCHABLE; | 2717 td->pc_tree[i].horizontal[0].pred_interp_filter = SWITCHABLE; |
| 2715 td->pc_tree[i].horizontal[1].pred_interp_filter = SWITCHABLE; | 2718 td->pc_tree[i].horizontal[1].pred_interp_filter = SWITCHABLE; |
| 2716 } | 2719 } |
| 2717 } | 2720 } |
| 2718 | 2721 |
| 2719 vp9_zero(x->pred_mv); | 2722 vp9_zero(x->pred_mv); |
| 2720 td->pc_root->index = 0; | 2723 td->pc_root->index = 0; |
| 2721 | 2724 |
| 2725 if (seg->enabled) { |
| 2726 const uint8_t *const map = seg->update_map ? cpi->segmentation_map |
| 2727 : cm->last_frame_seg_map; |
| 2728 int segment_id = vp9_get_segment_id(cm, map, BLOCK_64X64, mi_row, mi_col); |
| 2729 seg_skip = vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP); |
| 2730 } |
| 2731 |
| 2722 x->source_variance = UINT_MAX; | 2732 x->source_variance = UINT_MAX; |
| 2723 if (sf->partition_search_type == FIXED_PARTITION) { | 2733 if (sf->partition_search_type == FIXED_PARTITION || seg_skip) { |
| 2734 const BLOCK_SIZE bsize = |
| 2735 seg_skip ? BLOCK_64X64 : sf->always_this_block_size; |
| 2724 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); | 2736 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); |
| 2725 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, | 2737 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); |
| 2726 sf->always_this_block_size); | |
| 2727 rd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 2738 rd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 2728 BLOCK_64X64, &dummy_rate, &dummy_dist, 1, td->pc_root); | 2739 BLOCK_64X64, &dummy_rate, &dummy_dist, 1, td->pc_root); |
| 2729 } else if (cpi->partition_search_skippable_frame) { | 2740 } else if (cpi->partition_search_skippable_frame) { |
| 2730 BLOCK_SIZE bsize; | 2741 BLOCK_SIZE bsize; |
| 2731 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); | 2742 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); |
| 2732 bsize = get_rd_var_based_fixed_partition(cpi, x, mi_row, mi_col); | 2743 bsize = get_rd_var_based_fixed_partition(cpi, x, mi_row, mi_col); |
| 2733 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); | 2744 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); |
| 2734 rd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 2745 rd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 2735 BLOCK_64X64, &dummy_rate, &dummy_dist, 1, td->pc_root); | 2746 BLOCK_64X64, &dummy_rate, &dummy_dist, 1, td->pc_root); |
| 2736 } else if (sf->partition_search_type == VAR_BASED_PARTITION && | 2747 } else if (sf->partition_search_type == VAR_BASED_PARTITION && |
| (...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3441 MACROBLOCKD *const xd = &x->e_mbd; | 3452 MACROBLOCKD *const xd = &x->e_mbd; |
| 3442 int mi_col; | 3453 int mi_col; |
| 3443 | 3454 |
| 3444 // Initialize the left context for the new SB row | 3455 // Initialize the left context for the new SB row |
| 3445 vpx_memset(&xd->left_context, 0, sizeof(xd->left_context)); | 3456 vpx_memset(&xd->left_context, 0, sizeof(xd->left_context)); |
| 3446 vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context)); | 3457 vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context)); |
| 3447 | 3458 |
| 3448 // Code each SB in the row | 3459 // Code each SB in the row |
| 3449 for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end; | 3460 for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end; |
| 3450 mi_col += MI_BLOCK_SIZE) { | 3461 mi_col += MI_BLOCK_SIZE) { |
| 3462 const struct segmentation *const seg = &cm->seg; |
| 3451 RD_COST dummy_rdc; | 3463 RD_COST dummy_rdc; |
| 3452 const int idx_str = cm->mi_stride * mi_row + mi_col; | 3464 const int idx_str = cm->mi_stride * mi_row + mi_col; |
| 3453 MODE_INFO *mi = cm->mi + idx_str; | 3465 MODE_INFO *mi = cm->mi + idx_str; |
| 3454 BLOCK_SIZE bsize; | 3466 PARTITION_SEARCH_TYPE partition_search_type = sf->partition_search_type; |
| 3467 BLOCK_SIZE bsize = BLOCK_64X64; |
| 3468 int seg_skip = 0; |
| 3455 x->source_variance = UINT_MAX; | 3469 x->source_variance = UINT_MAX; |
| 3456 vp9_zero(x->pred_mv); | 3470 vp9_zero(x->pred_mv); |
| 3457 vp9_rd_cost_init(&dummy_rdc); | 3471 vp9_rd_cost_init(&dummy_rdc); |
| 3458 x->color_sensitivity[0] = 0; | 3472 x->color_sensitivity[0] = 0; |
| 3459 x->color_sensitivity[1] = 0; | 3473 x->color_sensitivity[1] = 0; |
| 3460 | 3474 |
| 3475 if (seg->enabled) { |
| 3476 const uint8_t *const map = seg->update_map ? cpi->segmentation_map |
| 3477 : cm->last_frame_seg_map; |
| 3478 int segment_id = vp9_get_segment_id(cm, map, BLOCK_64X64, mi_row, mi_col); |
| 3479 seg_skip = vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP); |
| 3480 if (seg_skip) { |
| 3481 partition_search_type = FIXED_PARTITION; |
| 3482 } |
| 3483 } |
| 3484 |
| 3461 // Set the partition type of the 64X64 block | 3485 // Set the partition type of the 64X64 block |
| 3462 switch (sf->partition_search_type) { | 3486 switch (partition_search_type) { |
| 3463 case VAR_BASED_PARTITION: | 3487 case VAR_BASED_PARTITION: |
| 3464 // TODO(jingning, marpan): The mode decision and encoding process | 3488 // TODO(jingning, marpan): The mode decision and encoding process |
| 3465 // support both intra and inter sub8x8 block coding for RTC mode. | 3489 // support both intra and inter sub8x8 block coding for RTC mode. |
| 3466 // Tune the thresholds accordingly to use sub8x8 block coding for | 3490 // Tune the thresholds accordingly to use sub8x8 block coding for |
| 3467 // coding performance improvement. | 3491 // coding performance improvement. |
| 3468 choose_partitioning(cpi, tile_info, x, mi_row, mi_col); | 3492 choose_partitioning(cpi, tile_info, x, mi_row, mi_col); |
| 3469 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 3493 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 3470 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); | 3494 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); |
| 3471 break; | 3495 break; |
| 3472 case SOURCE_VAR_BASED_PARTITION: | 3496 case SOURCE_VAR_BASED_PARTITION: |
| 3473 set_source_var_based_partition(cpi, tile_info, x, mi, mi_row, mi_col); | 3497 set_source_var_based_partition(cpi, tile_info, x, mi, mi_row, mi_col); |
| 3474 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 3498 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 3475 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); | 3499 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); |
| 3476 break; | 3500 break; |
| 3477 case FIXED_PARTITION: | 3501 case FIXED_PARTITION: |
| 3478 bsize = sf->partition_search_type == FIXED_PARTITION ? | 3502 if (!seg_skip) |
| 3479 sf->always_this_block_size : | 3503 bsize = sf->always_this_block_size; |
| 3480 get_nonrd_var_based_fixed_partition(cpi, x, mi_row, mi_col); | |
| 3481 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); | 3504 set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize); |
| 3482 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, | 3505 nonrd_use_partition(cpi, td, tile_data, mi, tp, mi_row, mi_col, |
| 3483 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); | 3506 BLOCK_64X64, 1, &dummy_rdc, td->pc_root); |
| 3484 break; | 3507 break; |
| 3485 case REFERENCE_PARTITION: | 3508 case REFERENCE_PARTITION: |
| 3486 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); | 3509 set_offsets(cpi, tile_info, x, mi_row, mi_col, BLOCK_64X64); |
| 3487 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled && | 3510 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled && |
| 3488 xd->mi[0].src_mi->mbmi.segment_id) { | 3511 xd->mi[0].src_mi->mbmi.segment_id) { |
| 3489 auto_partition_range(cpi, tile_info, xd, mi_row, mi_col, | 3512 auto_partition_range(cpi, tile_info, xd, mi_row, mi_col, |
| 3490 &x->min_partition_size, | 3513 &x->min_partition_size, |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3759 x->itxm_add = xd->lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; | 3782 x->itxm_add = xd->lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; |
| 3760 | 3783 |
| 3761 if (xd->lossless) | 3784 if (xd->lossless) |
| 3762 x->optimize = 0; | 3785 x->optimize = 0; |
| 3763 | 3786 |
| 3764 cm->tx_mode = select_tx_mode(cpi, xd); | 3787 cm->tx_mode = select_tx_mode(cpi, xd); |
| 3765 | 3788 |
| 3766 vp9_frame_init_quantizer(cpi); | 3789 vp9_frame_init_quantizer(cpi); |
| 3767 | 3790 |
| 3768 vp9_initialize_rd_consts(cpi); | 3791 vp9_initialize_rd_consts(cpi); |
| 3769 vp9_initialize_me_consts(cpi, cm->base_qindex); | 3792 vp9_initialize_me_consts(cpi, x, cm->base_qindex); |
| 3770 init_encode_frame_mb_context(cpi); | 3793 init_encode_frame_mb_context(cpi); |
| 3771 cm->use_prev_frame_mvs = !cm->error_resilient_mode && | 3794 cm->use_prev_frame_mvs = !cm->error_resilient_mode && |
| 3772 cm->width == cm->last_width && | 3795 cm->width == cm->last_width && |
| 3773 cm->height == cm->last_height && | 3796 cm->height == cm->last_height && |
| 3774 !cm->intra_only && | 3797 !cm->intra_only && |
| 3775 cm->last_show_frame; | 3798 cm->last_show_frame; |
| 3776 // Special case: set prev_mi to NULL when the previous mode info | 3799 // Special case: set prev_mi to NULL when the previous mode info |
| 3777 // context cannot be used. | 3800 // context cannot be used. |
| 3778 cm->prev_mi = cm->use_prev_frame_mvs ? | 3801 cm->prev_mi = cm->use_prev_frame_mvs ? |
| 3779 cm->prev_mip + cm->mi_stride + 1 : NULL; | 3802 cm->prev_mip + cm->mi_stride + 1 : NULL; |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4080 | 4103 |
| 4081 for (y = 0; y < mi_height; y++) | 4104 for (y = 0; y < mi_height; y++) |
| 4082 for (x = 0; x < mi_width; x++) | 4105 for (x = 0; x < mi_width; x++) |
| 4083 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) | 4106 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) |
| 4084 mi_8x8[mis * y + x].src_mi->mbmi.tx_size = tx_size; | 4107 mi_8x8[mis * y + x].src_mi->mbmi.tx_size = tx_size; |
| 4085 } | 4108 } |
| 4086 ++td->counts->tx.tx_totals[mbmi->tx_size]; | 4109 ++td->counts->tx.tx_totals[mbmi->tx_size]; |
| 4087 ++td->counts->tx.tx_totals[get_uv_tx_size(mbmi, &xd->plane[1])]; | 4110 ++td->counts->tx.tx_totals[get_uv_tx_size(mbmi, &xd->plane[1])]; |
| 4088 } | 4111 } |
| 4089 } | 4112 } |
| OLD | NEW |