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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_rdopt.c

Issue 484923003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 4 months 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
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.c ('k') | source/libvpx/vp9/encoder/vp9_speed_features.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698