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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 VP9_COMMON *const cm = &cpi->common; | 483 VP9_COMMON *const cm = &cpi->common; |
484 MACROBLOCKD *const xd = &x->e_mbd; | 484 MACROBLOCKD *const xd = &x->e_mbd; |
485 MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; | 485 MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; |
486 vp9_prob skip_prob = vp9_get_skip_prob(cm, xd); | 486 vp9_prob skip_prob = vp9_get_skip_prob(cm, xd); |
487 int r[TX_SIZES][2], s[TX_SIZES]; | 487 int r[TX_SIZES][2], s[TX_SIZES]; |
488 int64_t d[TX_SIZES], sse[TX_SIZES]; | 488 int64_t d[TX_SIZES], sse[TX_SIZES]; |
489 int64_t rd[TX_SIZES][2] = {{INT64_MAX, INT64_MAX}, | 489 int64_t rd[TX_SIZES][2] = {{INT64_MAX, INT64_MAX}, |
490 {INT64_MAX, INT64_MAX}, | 490 {INT64_MAX, INT64_MAX}, |
491 {INT64_MAX, INT64_MAX}, | 491 {INT64_MAX, INT64_MAX}, |
492 {INT64_MAX, INT64_MAX}}; | 492 {INT64_MAX, INT64_MAX}}; |
493 TX_SIZE n, m; | 493 int n, m; |
494 int s0, s1; | 494 int s0, s1; |
495 const TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode]; | 495 const TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode]; |
496 int64_t best_rd = INT64_MAX; | 496 int64_t best_rd = INT64_MAX; |
497 TX_SIZE best_tx = TX_4X4; | 497 TX_SIZE best_tx = max_tx_size; |
498 | 498 |
499 const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs); | 499 const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs); |
500 assert(skip_prob > 0); | 500 assert(skip_prob > 0); |
501 s0 = vp9_cost_bit(skip_prob, 0); | 501 s0 = vp9_cost_bit(skip_prob, 0); |
502 s1 = vp9_cost_bit(skip_prob, 1); | 502 s1 = vp9_cost_bit(skip_prob, 1); |
503 | 503 |
504 for (n = TX_4X4; n <= max_tx_size; n++) { | 504 for (n = max_tx_size; n >= 0; n--) { |
505 txfm_rd_in_plane(x, &r[n][0], &d[n], &s[n], | 505 txfm_rd_in_plane(x, &r[n][0], &d[n], &s[n], |
506 &sse[n], ref_best_rd, 0, bs, n, | 506 &sse[n], ref_best_rd, 0, bs, n, |
507 cpi->sf.use_fast_coef_costing); | 507 cpi->sf.use_fast_coef_costing); |
508 r[n][1] = r[n][0]; | 508 r[n][1] = r[n][0]; |
509 if (r[n][0] < INT_MAX) { | 509 if (r[n][0] < INT_MAX) { |
510 for (m = 0; m <= n - (n == max_tx_size); m++) { | 510 for (m = 0; m <= n - (n == (int) max_tx_size); m++) { |
511 if (m == n) | 511 if (m == n) |
512 r[n][1] += vp9_cost_zero(tx_probs[m]); | 512 r[n][1] += vp9_cost_zero(tx_probs[m]); |
513 else | 513 else |
514 r[n][1] += vp9_cost_one(tx_probs[m]); | 514 r[n][1] += vp9_cost_one(tx_probs[m]); |
515 } | 515 } |
516 } | 516 } |
517 if (d[n] == INT64_MAX) { | 517 if (d[n] == INT64_MAX) { |
518 rd[n][0] = rd[n][1] = INT64_MAX; | 518 rd[n][0] = rd[n][1] = INT64_MAX; |
519 } else if (s[n]) { | 519 } else if (s[n]) { |
520 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]); | 520 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]); |
521 } else { | 521 } else { |
522 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]); | 522 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]); |
523 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]); | 523 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]); |
524 } | 524 } |
525 | 525 |
| 526 // Early termination in transform size search. |
| 527 if (cpi->sf.tx_size_search_breakout && |
| 528 (rd[n][1] == INT64_MAX || |
| 529 (n < (int) max_tx_size && rd[n][1] > rd[n + 1][1]) || |
| 530 s[n] == 1)) |
| 531 break; |
| 532 |
526 if (rd[n][1] < best_rd) { | 533 if (rd[n][1] < best_rd) { |
527 best_tx = n; | 534 best_tx = n; |
528 best_rd = rd[n][1]; | 535 best_rd = rd[n][1]; |
529 } | 536 } |
530 } | 537 } |
531 mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ? | 538 mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ? |
532 best_tx : MIN(max_tx_size, max_mode_tx_size); | 539 best_tx : MIN(max_tx_size, max_mode_tx_size); |
533 | 540 |
534 | 541 |
535 *distortion = d[mbmi->tx_size]; | 542 *distortion = d[mbmi->tx_size]; |
(...skipping 1980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2516 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; | 2523 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; |
2517 vp9_prob comp_mode_p; | 2524 vp9_prob comp_mode_p; |
2518 int64_t best_intra_rd = INT64_MAX; | 2525 int64_t best_intra_rd = INT64_MAX; |
2519 int64_t best_inter_rd = INT64_MAX; | 2526 int64_t best_inter_rd = INT64_MAX; |
2520 PREDICTION_MODE best_intra_mode = DC_PRED; | 2527 PREDICTION_MODE best_intra_mode = DC_PRED; |
2521 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; | 2528 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; |
2522 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; | 2529 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; |
2523 int64_t dist_uv[TX_SIZES]; | 2530 int64_t dist_uv[TX_SIZES]; |
2524 int skip_uv[TX_SIZES]; | 2531 int skip_uv[TX_SIZES]; |
2525 PREDICTION_MODE mode_uv[TX_SIZES]; | 2532 PREDICTION_MODE mode_uv[TX_SIZES]; |
2526 int64_t mode_distortions[MB_MODE_COUNT] = {-1}; | |
2527 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); | 2533 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); |
2528 const int bws = num_8x8_blocks_wide_lookup[bsize] / 2; | |
2529 const int bhs = num_8x8_blocks_high_lookup[bsize] / 2; | |
2530 int best_skip2 = 0; | 2534 int best_skip2 = 0; |
2531 int mode_skip_mask = 0; | 2535 int mode_skip_mask = 0; |
2532 int mode_skip_start = cpi->sf.mode_skip_start + 1; | 2536 int mode_skip_start = cpi->sf.mode_skip_start + 1; |
2533 const int *const rd_threshes = rd_opt->threshes[segment_id][bsize]; | 2537 const int *const rd_threshes = rd_opt->threshes[segment_id][bsize]; |
2534 const int *const rd_thresh_freq_fact = rd_opt->thresh_freq_fact[bsize]; | 2538 const int *const rd_thresh_freq_fact = rd_opt->thresh_freq_fact[bsize]; |
2535 const int mode_search_skip_flags = cpi->sf.mode_search_skip_flags; | 2539 const int mode_search_skip_flags = cpi->sf.mode_search_skip_flags; |
2536 const int intra_y_mode_mask = | 2540 const int intra_y_mode_mask = |
2537 cpi->sf.intra_y_mode_mask[max_txsize_lookup[bsize]]; | 2541 cpi->sf.intra_y_mode_mask[max_txsize_lookup[bsize]]; |
2538 int inter_mode_mask = cpi->sf.inter_mode_mask[bsize]; | 2542 int inter_mode_mask = cpi->sf.inter_mode_mask[bsize]; |
2539 vp9_zero(best_mbmode); | 2543 vp9_zero(best_mbmode); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2606 if (cpi->rc.is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) { | 2610 if (cpi->rc.is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) { |
2607 mode_skip_mask = | 2611 mode_skip_mask = |
2608 ~((1 << THR_NEARESTA) | (1 << THR_NEARA) | (1 << THR_ZEROA)); | 2612 ~((1 << THR_NEARESTA) | (1 << THR_NEARA) | (1 << THR_ZEROA)); |
2609 if (frame_mv[NEARMV][ALTREF_FRAME].as_int != 0) | 2613 if (frame_mv[NEARMV][ALTREF_FRAME].as_int != 0) |
2610 mode_skip_mask |= (1 << THR_NEARA); | 2614 mode_skip_mask |= (1 << THR_NEARA); |
2611 if (frame_mv[NEARESTMV][ALTREF_FRAME].as_int != 0) | 2615 if (frame_mv[NEARESTMV][ALTREF_FRAME].as_int != 0) |
2612 mode_skip_mask |= (1 << THR_NEARESTA); | 2616 mode_skip_mask |= (1 << THR_NEARESTA); |
2613 } | 2617 } |
2614 } | 2618 } |
2615 | 2619 |
2616 // TODO(JBB): This is to make up for the fact that we don't have sad | |
2617 // functions that work when the block size reads outside the umv. We | |
2618 // should fix this either by making the motion search just work on | |
2619 // a representative block in the boundary ( first ) and then implement a | |
2620 // function that does sads when inside the border.. | |
2621 if ((mi_row + bhs) > cm->mi_rows || (mi_col + bws) > cm->mi_cols) { | |
2622 const int new_modes_mask = | |
2623 (1 << THR_NEWMV) | (1 << THR_NEWG) | (1 << THR_NEWA) | | |
2624 (1 << THR_COMP_NEWLA) | (1 << THR_COMP_NEWGA); | |
2625 mode_skip_mask |= new_modes_mask; | |
2626 } | |
2627 | |
2628 if (bsize > cpi->sf.max_intra_bsize) { | 2620 if (bsize > cpi->sf.max_intra_bsize) { |
2629 const int all_intra_modes = (1 << THR_DC) | (1 << THR_TM) | | 2621 const int all_intra_modes = (1 << THR_DC) | (1 << THR_TM) | |
2630 (1 << THR_H_PRED) | (1 << THR_V_PRED) | (1 << THR_D135_PRED) | | 2622 (1 << THR_H_PRED) | (1 << THR_V_PRED) | (1 << THR_D135_PRED) | |
2631 (1 << THR_D207_PRED) | (1 << THR_D153_PRED) | (1 << THR_D63_PRED) | | 2623 (1 << THR_D207_PRED) | (1 << THR_D153_PRED) | (1 << THR_D63_PRED) | |
2632 (1 << THR_D117_PRED) | (1 << THR_D45_PRED); | 2624 (1 << THR_D117_PRED) | (1 << THR_D45_PRED); |
2633 mode_skip_mask |= all_intra_modes; | 2625 mode_skip_mask |= all_intra_modes; |
2634 } | 2626 } |
2635 | 2627 |
2636 for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) { | 2628 for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) { |
2637 int mode_excluded = 0; | 2629 int mode_excluded = 0; |
2638 int64_t this_rd = INT64_MAX; | 2630 int64_t this_rd = INT64_MAX; |
2639 int disable_skip = 0; | 2631 int disable_skip = 0; |
2640 int compmode_cost = 0; | 2632 int compmode_cost = 0; |
2641 int rate2 = 0, rate_y = 0, rate_uv = 0; | 2633 int rate2 = 0, rate_y = 0, rate_uv = 0; |
2642 int64_t distortion2 = 0, distortion_y = 0, distortion_uv = 0; | 2634 int64_t distortion2 = 0, distortion_y = 0, distortion_uv = 0; |
2643 int skippable = 0; | 2635 int skippable = 0; |
2644 int64_t tx_cache[TX_MODES]; | 2636 int64_t tx_cache[TX_MODES]; |
2645 int i; | 2637 int i; |
2646 int this_skip2 = 0; | 2638 int this_skip2 = 0; |
2647 int64_t total_sse = INT64_MAX; | 2639 int64_t total_sse = INT64_MAX; |
2648 int early_term = 0; | 2640 int early_term = 0; |
2649 | 2641 |
| 2642 this_mode = vp9_mode_order[mode_index].mode; |
| 2643 ref_frame = vp9_mode_order[mode_index].ref_frame[0]; |
| 2644 if (ref_frame != INTRA_FRAME && !(inter_mode_mask & (1 << this_mode))) |
| 2645 continue; |
| 2646 second_ref_frame = vp9_mode_order[mode_index].ref_frame[1]; |
| 2647 |
2650 // Look at the reference frame of the best mode so far and set the | 2648 // Look at the reference frame of the best mode so far and set the |
2651 // skip mask to look at a subset of the remaining modes. | 2649 // skip mask to look at a subset of the remaining modes. |
2652 if (mode_index == mode_skip_start && best_mode_index >= 0) { | 2650 if (mode_index == mode_skip_start && best_mode_index >= 0) { |
2653 switch (vp9_mode_order[best_mode_index].ref_frame[0]) { | 2651 switch (vp9_mode_order[best_mode_index].ref_frame[0]) { |
2654 case INTRA_FRAME: | 2652 case INTRA_FRAME: |
2655 break; | 2653 break; |
2656 case LAST_FRAME: | 2654 case LAST_FRAME: |
2657 mode_skip_mask |= LAST_FRAME_MODE_MASK; | 2655 mode_skip_mask |= LAST_FRAME_MODE_MASK; |
2658 break; | 2656 break; |
2659 case GOLDEN_FRAME: | 2657 case GOLDEN_FRAME: |
2660 mode_skip_mask |= GOLDEN_FRAME_MODE_MASK; | 2658 mode_skip_mask |= GOLDEN_FRAME_MODE_MASK; |
2661 break; | 2659 break; |
2662 case ALTREF_FRAME: | 2660 case ALTREF_FRAME: |
2663 mode_skip_mask |= ALT_REF_MODE_MASK; | 2661 mode_skip_mask |= ALT_REF_MODE_MASK; |
2664 break; | 2662 break; |
2665 case NONE: | 2663 case NONE: |
2666 case MAX_REF_FRAMES: | 2664 case MAX_REF_FRAMES: |
2667 assert(0 && "Invalid Reference frame"); | 2665 assert(0 && "Invalid Reference frame"); |
2668 break; | 2666 break; |
2669 } | 2667 } |
2670 } | 2668 } |
| 2669 |
| 2670 if (cpi->sf.alt_ref_search_fp && cpi->rc.is_src_frame_alt_ref) { |
| 2671 mode_skip_mask = 0; |
| 2672 if (!(ref_frame == ALTREF_FRAME && second_ref_frame == NONE)) |
| 2673 continue; |
| 2674 } |
| 2675 |
2671 if (mode_skip_mask & (1 << mode_index)) | 2676 if (mode_skip_mask & (1 << mode_index)) |
2672 continue; | 2677 continue; |
2673 | 2678 |
2674 // Test best rd so far against threshold for trying this mode. | 2679 // Test best rd so far against threshold for trying this mode. |
2675 if (rd_less_than_thresh(best_rd, rd_threshes[mode_index], | 2680 if (rd_less_than_thresh(best_rd, rd_threshes[mode_index], |
2676 rd_thresh_freq_fact[mode_index])) | 2681 rd_thresh_freq_fact[mode_index])) |
2677 continue; | 2682 continue; |
2678 | 2683 |
2679 this_mode = vp9_mode_order[mode_index].mode; | |
2680 ref_frame = vp9_mode_order[mode_index].ref_frame[0]; | |
2681 if (ref_frame != INTRA_FRAME && !(inter_mode_mask & (1 << this_mode))) | |
2682 continue; | |
2683 second_ref_frame = vp9_mode_order[mode_index].ref_frame[1]; | |
2684 | |
2685 if (cpi->sf.motion_field_mode_search) { | 2684 if (cpi->sf.motion_field_mode_search) { |
2686 const int mi_width = MIN(num_8x8_blocks_wide_lookup[bsize], | 2685 const int mi_width = MIN(num_8x8_blocks_wide_lookup[bsize], |
2687 tile->mi_col_end - mi_col); | 2686 tile->mi_col_end - mi_col); |
2688 const int mi_height = MIN(num_8x8_blocks_high_lookup[bsize], | 2687 const int mi_height = MIN(num_8x8_blocks_high_lookup[bsize], |
2689 tile->mi_row_end - mi_row); | 2688 tile->mi_row_end - mi_row); |
2690 const int bsl = mi_width_log2(bsize); | 2689 const int bsl = mi_width_log2(bsize); |
2691 int cb_partition_search_ctrl = (((mi_row + mi_col) >> bsl) | 2690 int cb_partition_search_ctrl = (((mi_row + mi_col) >> bsl) |
2692 + get_chessboard_index(cm->current_video_frame)) & 0x1; | 2691 + get_chessboard_index(cm->current_video_frame)) & 0x1; |
2693 MB_MODE_INFO *ref_mbmi; | 2692 MB_MODE_INFO *ref_mbmi; |
2694 int const_motion = 1; | 2693 int const_motion = 1; |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2902 } | 2901 } |
2903 } | 2902 } |
2904 | 2903 |
2905 if (!disable_skip && ref_frame == INTRA_FRAME) { | 2904 if (!disable_skip && ref_frame == INTRA_FRAME) { |
2906 for (i = 0; i < REFERENCE_MODES; ++i) | 2905 for (i = 0; i < REFERENCE_MODES; ++i) |
2907 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); | 2906 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); |
2908 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) | 2907 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) |
2909 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); | 2908 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); |
2910 } | 2909 } |
2911 | 2910 |
2912 // Store the respective mode distortions for later use. | |
2913 if (mode_distortions[this_mode] == -1 | |
2914 || distortion2 < mode_distortions[this_mode]) { | |
2915 mode_distortions[this_mode] = distortion2; | |
2916 } | |
2917 | |
2918 // Did this mode help.. i.e. is it the new best mode | 2911 // Did this mode help.. i.e. is it the new best mode |
2919 if (this_rd < best_rd || x->skip) { | 2912 if (this_rd < best_rd || x->skip) { |
2920 int max_plane = MAX_MB_PLANE; | 2913 int max_plane = MAX_MB_PLANE; |
2921 if (!mode_excluded) { | 2914 if (!mode_excluded) { |
2922 // Note index of best mode so far | 2915 // Note index of best mode so far |
2923 best_mode_index = mode_index; | 2916 best_mode_index = mode_index; |
2924 | 2917 |
2925 if (ref_frame == INTRA_FRAME) { | 2918 if (ref_frame == INTRA_FRAME) { |
2926 /* required for left and above block mv */ | 2919 /* required for left and above block mv */ |
2927 mbmi->mv[0].as_int = 0; | 2920 mbmi->mv[0].as_int = 0; |
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3797 } else { | 3790 } else { |
3798 vp9_zero(best_filter_diff); | 3791 vp9_zero(best_filter_diff); |
3799 } | 3792 } |
3800 | 3793 |
3801 set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]); | 3794 set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]); |
3802 store_coding_context(x, ctx, best_ref_index, | 3795 store_coding_context(x, ctx, best_ref_index, |
3803 best_pred_diff, best_tx_diff, best_filter_diff); | 3796 best_pred_diff, best_tx_diff, best_filter_diff); |
3804 | 3797 |
3805 return best_rd; | 3798 return best_rd; |
3806 } | 3799 } |
OLD | NEW |