| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 struct macroblock_plane *const p = &x->plane[0]; | 205 struct macroblock_plane *const p = &x->plane[0]; |
| 206 struct macroblockd_plane *const pd = &xd->plane[0]; | 206 struct macroblockd_plane *const pd = &xd->plane[0]; |
| 207 const uint32_t dc_quant = pd->dequant[0]; | 207 const uint32_t dc_quant = pd->dequant[0]; |
| 208 const uint32_t ac_quant = pd->dequant[1]; | 208 const uint32_t ac_quant = pd->dequant[1]; |
| 209 unsigned int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride, | 209 unsigned int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride, |
| 210 pd->dst.buf, pd->dst.stride, &sse); | 210 pd->dst.buf, pd->dst.stride, &sse); |
| 211 *var_y = var; | 211 *var_y = var; |
| 212 *sse_y = sse; | 212 *sse_y = sse; |
| 213 | 213 |
| 214 if (sse < dc_quant * dc_quant >> 6) | 214 if (sse < dc_quant * dc_quant >> 6) |
| 215 x->skip_txfm = 1; | 215 x->skip_txfm[0] = 1; |
| 216 else if (var < ac_quant * ac_quant >> 6) | 216 else if (var < ac_quant * ac_quant >> 6) |
| 217 x->skip_txfm = 2; | 217 x->skip_txfm[0] = 2; |
| 218 else | 218 else |
| 219 x->skip_txfm = 0; | 219 x->skip_txfm[0] = 0; |
| 220 | 220 |
| 221 if (cpi->common.tx_mode == TX_MODE_SELECT) { | 221 if (cpi->common.tx_mode == TX_MODE_SELECT) { |
| 222 if (sse > (var << 2)) | 222 if (sse > (var << 2)) |
| 223 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], | 223 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], |
| 224 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); | 224 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
| 225 else | 225 else |
| 226 xd->mi[0]->mbmi.tx_size = TX_8X8; | 226 xd->mi[0]->mbmi.tx_size = TX_8X8; |
| 227 } else { | 227 } else { |
| 228 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], | 228 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], |
| 229 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); | 229 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 intra_cost_penalty, 0); | 387 intra_cost_penalty, 0); |
| 388 const int64_t intra_mode_cost = 50; | 388 const int64_t intra_mode_cost = 50; |
| 389 | 389 |
| 390 unsigned char segment_id = mbmi->segment_id; | 390 unsigned char segment_id = mbmi->segment_id; |
| 391 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; | 391 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; |
| 392 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize]; | 392 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize]; |
| 393 // Mode index conversion form THR_MODES to PREDICTION_MODE for a ref frame. | 393 // Mode index conversion form THR_MODES to PREDICTION_MODE for a ref frame. |
| 394 INTERP_FILTER filter_ref = cm->interp_filter; | 394 INTERP_FILTER filter_ref = cm->interp_filter; |
| 395 int bsl = mi_width_log2(bsize); | 395 int bsl = mi_width_log2(bsize); |
| 396 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? | 396 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? |
| 397 (((mi_row + mi_col) >> bsl) + get_chessboard_index(cm)) % 2 : 0; | 397 (((mi_row + mi_col) >> bsl) + |
| 398 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; |
| 398 int const_motion[MAX_REF_FRAMES] = { 0 }; | 399 int const_motion[MAX_REF_FRAMES] = { 0 }; |
| 399 int bh = num_4x4_blocks_high_lookup[bsize] << 2; | 400 int bh = num_4x4_blocks_high_lookup[bsize] << 2; |
| 400 int bw = num_4x4_blocks_wide_lookup[bsize] << 2; | 401 int bw = num_4x4_blocks_wide_lookup[bsize] << 2; |
| 401 int pixels_in_block = bh * bw; | 402 int pixels_in_block = bh * bw; |
| 402 // For speed 6, the result of interp filter is reused later in actual encoding | 403 // For speed 6, the result of interp filter is reused later in actual encoding |
| 403 // process. | 404 // process. |
| 404 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. | 405 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. |
| 405 PRED_BUFFER tmp[4]; | 406 PRED_BUFFER tmp[4]; |
| 406 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); | 407 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); |
| 407 struct buf_2d orig_dst = pd->dst; | 408 struct buf_2d orig_dst = pd->dst; |
| 408 PRED_BUFFER *best_pred = NULL; | 409 PRED_BUFFER *best_pred = NULL; |
| 409 PRED_BUFFER *this_mode_pred = NULL; | 410 PRED_BUFFER *this_mode_pred = NULL; |
| 410 int i; | 411 int i; |
| 411 | 412 |
| 413 // CTX is used by the temporal denoiser which is currently being developed. |
| 414 // TODO(jbb): when temporal denoiser is finished and in the default build |
| 415 // remove the following line; |
| 416 (void) ctx; |
| 412 if (cpi->sf.reuse_inter_pred_sby) { | 417 if (cpi->sf.reuse_inter_pred_sby) { |
| 413 for (i = 0; i < 3; i++) { | 418 for (i = 0; i < 3; i++) { |
| 414 tmp[i].data = &pred_buf[pixels_in_block * i]; | 419 tmp[i].data = &pred_buf[pixels_in_block * i]; |
| 415 tmp[i].stride = bw; | 420 tmp[i].stride = bw; |
| 416 tmp[i].in_use = 0; | 421 tmp[i].in_use = 0; |
| 417 } | 422 } |
| 418 tmp[3].data = pd->dst.buf; | 423 tmp[3].data = pd->dst.buf; |
| 419 tmp[3].stride = pd->dst.stride; | 424 tmp[3].stride = pd->dst.stride; |
| 420 tmp[3].in_use = 0; | 425 tmp[3].in_use = 0; |
| 421 } | 426 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 446 else if (xd->left_available) | 451 else if (xd->left_available) |
| 447 filter_ref = xd->mi[-1]->mbmi.interp_filter; | 452 filter_ref = xd->mi[-1]->mbmi.interp_filter; |
| 448 | 453 |
| 449 if (cpi->ref_frame_flags & flag_list[ref_frame]) { | 454 if (cpi->ref_frame_flags & flag_list[ref_frame]) { |
| 450 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); | 455 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); |
| 451 int_mv *const candidates = mbmi->ref_mvs[ref_frame]; | 456 int_mv *const candidates = mbmi->ref_mvs[ref_frame]; |
| 452 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf; | 457 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf; |
| 453 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, | 458 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, |
| 454 sf, sf); | 459 sf, sf); |
| 455 | 460 |
| 456 if (cm->coding_use_prev_mi) | 461 if (!cm->error_resilient_mode) |
| 457 vp9_find_mv_refs(cm, xd, tile, xd->mi[0], ref_frame, | 462 vp9_find_mv_refs(cm, xd, tile, xd->mi[0], ref_frame, |
| 458 candidates, mi_row, mi_col); | 463 candidates, mi_row, mi_col); |
| 459 else | 464 else |
| 460 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0], | 465 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0], |
| 461 ref_frame, candidates, | 466 ref_frame, candidates, |
| 462 mi_row, mi_col); | 467 mi_row, mi_col); |
| 463 | 468 |
| 464 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, | 469 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, |
| 465 &frame_mv[NEARESTMV][ref_frame], | 470 &frame_mv[NEARESTMV][ref_frame], |
| 466 &frame_mv[NEARMV][ref_frame]); | 471 &frame_mv[NEARMV][ref_frame]); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); | 551 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); |
| 547 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[filter], | 552 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[filter], |
| 548 &pf_dist[filter], &pf_var[filter], &pf_sse[filter]); | 553 &pf_dist[filter], &pf_var[filter], &pf_sse[filter]); |
| 549 cost = RDCOST(x->rdmult, x->rddiv, | 554 cost = RDCOST(x->rdmult, x->rddiv, |
| 550 vp9_get_switchable_rate(cpi) + pf_rate[filter], | 555 vp9_get_switchable_rate(cpi) + pf_rate[filter], |
| 551 pf_dist[filter]); | 556 pf_dist[filter]); |
| 552 pf_tx_size[filter] = mbmi->tx_size; | 557 pf_tx_size[filter] = mbmi->tx_size; |
| 553 if (cost < best_cost) { | 558 if (cost < best_cost) { |
| 554 best_filter = filter; | 559 best_filter = filter; |
| 555 best_cost = cost; | 560 best_cost = cost; |
| 556 skip_txfm = x->skip_txfm; | 561 skip_txfm = x->skip_txfm[0]; |
| 557 | 562 |
| 558 if (cpi->sf.reuse_inter_pred_sby) { | 563 if (cpi->sf.reuse_inter_pred_sby) { |
| 559 if (this_mode_pred != current_pred) { | 564 if (this_mode_pred != current_pred) { |
| 560 free_pred_buffer(this_mode_pred); | 565 free_pred_buffer(this_mode_pred); |
| 561 this_mode_pred = current_pred; | 566 this_mode_pred = current_pred; |
| 562 } | 567 } |
| 563 | 568 |
| 564 if (filter < EIGHTTAP_SHARP) { | 569 if (filter < EIGHTTAP_SHARP) { |
| 565 current_pred = &tmp[get_pred_buffer(tmp, 3)]; | 570 current_pred = &tmp[get_pred_buffer(tmp, 3)]; |
| 566 pd->dst.buf = current_pred->data; | 571 pd->dst.buf = current_pred->data; |
| 567 pd->dst.stride = bw; | 572 pd->dst.stride = bw; |
| 568 } | 573 } |
| 569 } | 574 } |
| 570 } | 575 } |
| 571 } | 576 } |
| 572 | 577 |
| 573 if (cpi->sf.reuse_inter_pred_sby && this_mode_pred != current_pred) | 578 if (cpi->sf.reuse_inter_pred_sby && this_mode_pred != current_pred) |
| 574 free_pred_buffer(current_pred); | 579 free_pred_buffer(current_pred); |
| 575 | 580 |
| 576 mbmi->interp_filter = best_filter; | 581 mbmi->interp_filter = best_filter; |
| 577 mbmi->tx_size = pf_tx_size[mbmi->interp_filter]; | 582 mbmi->tx_size = pf_tx_size[mbmi->interp_filter]; |
| 578 rate = pf_rate[mbmi->interp_filter]; | 583 rate = pf_rate[mbmi->interp_filter]; |
| 579 dist = pf_dist[mbmi->interp_filter]; | 584 dist = pf_dist[mbmi->interp_filter]; |
| 580 var_y = pf_var[mbmi->interp_filter]; | 585 var_y = pf_var[mbmi->interp_filter]; |
| 581 sse_y = pf_sse[mbmi->interp_filter]; | 586 sse_y = pf_sse[mbmi->interp_filter]; |
| 582 x->skip_txfm = skip_txfm; | 587 x->skip_txfm[0] = skip_txfm; |
| 583 } else { | 588 } else { |
| 584 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; | 589 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; |
| 585 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); | 590 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); |
| 586 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist, &var_y, &sse_y); | 591 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist, &var_y, &sse_y); |
| 587 } | 592 } |
| 588 | 593 |
| 589 rate += rate_mv; | 594 rate += rate_mv; |
| 590 rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] | 595 rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] |
| 591 [INTER_OFFSET(this_mode)]; | 596 [INTER_OFFSET(this_mode)]; |
| 592 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 597 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); |
| 593 | 598 |
| 594 // Skipping checking: test to see if this block can be reconstructed by | 599 // Skipping checking: test to see if this block can be reconstructed by |
| 595 // prediction only. | 600 // prediction only. |
| 596 if (cpi->allow_encode_breakout) { | 601 if (cpi->allow_encode_breakout) { |
| 597 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, | 602 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, |
| 598 this_mode, var_y, sse_y, yv12_mb, &rate, &dist); | 603 this_mode, var_y, sse_y, yv12_mb, &rate, &dist); |
| 599 if (x->skip) { | 604 if (x->skip) { |
| 600 rate += rate_mv; | 605 rate += rate_mv; |
| 601 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 606 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); |
| 602 } | 607 } |
| 603 } | 608 } |
| 604 | 609 |
| 605 #if CONFIG_DENOISING | 610 #if CONFIG_VP9_TEMPORAL_DENOISING |
| 606 if (cpi->oxcf.noise_sensitivity > 0) { | 611 if (cpi->oxcf.noise_sensitivity > 0) { |
| 607 vp9_denoiser_update_frame_stats(&cpi->denoiser, mbmi, sse_y, | 612 vp9_denoiser_update_frame_stats(&cpi->denoiser, mbmi, sse_y, |
| 608 this_mode, ctx); | 613 this_mode, ctx); |
| 609 } | 614 } |
| 610 #endif | 615 #endif |
| 611 | 616 |
| 612 if (this_rd < best_rd || x->skip) { | 617 if (this_rd < best_rd || x->skip) { |
| 613 best_rd = this_rd; | 618 best_rd = this_rd; |
| 614 *returnrate = rate; | 619 *returnrate = rate; |
| 615 *returndistortion = dist; | 620 *returndistortion = dist; |
| 616 best_mode = this_mode; | 621 best_mode = this_mode; |
| 617 best_pred_filter = mbmi->interp_filter; | 622 best_pred_filter = mbmi->interp_filter; |
| 618 best_tx_size = mbmi->tx_size; | 623 best_tx_size = mbmi->tx_size; |
| 619 best_ref_frame = ref_frame; | 624 best_ref_frame = ref_frame; |
| 620 skip_txfm = x->skip_txfm; | 625 skip_txfm = x->skip_txfm[0]; |
| 621 | 626 |
| 622 if (cpi->sf.reuse_inter_pred_sby) { | 627 if (cpi->sf.reuse_inter_pred_sby) { |
| 623 if (best_pred != NULL) | 628 if (best_pred != NULL) |
| 624 free_pred_buffer(best_pred); | 629 free_pred_buffer(best_pred); |
| 625 | 630 |
| 626 best_pred = this_mode_pred; | 631 best_pred = this_mode_pred; |
| 627 } | 632 } |
| 628 } else { | 633 } else { |
| 629 if (cpi->sf.reuse_inter_pred_sby) | 634 if (cpi->sf.reuse_inter_pred_sby) |
| 630 free_pred_buffer(this_mode_pred); | 635 free_pred_buffer(this_mode_pred); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 652 vp9_convolve_copy(copy_from, bw, copy_to, pd->dst.stride, NULL, 0, NULL, 0, | 657 vp9_convolve_copy(copy_from, bw, copy_to, pd->dst.stride, NULL, 0, NULL, 0, |
| 653 bw, bh); | 658 bw, bh); |
| 654 } | 659 } |
| 655 | 660 |
| 656 mbmi->mode = best_mode; | 661 mbmi->mode = best_mode; |
| 657 mbmi->interp_filter = best_pred_filter; | 662 mbmi->interp_filter = best_pred_filter; |
| 658 mbmi->tx_size = best_tx_size; | 663 mbmi->tx_size = best_tx_size; |
| 659 mbmi->ref_frame[0] = best_ref_frame; | 664 mbmi->ref_frame[0] = best_ref_frame; |
| 660 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; | 665 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; |
| 661 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; | 666 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; |
| 662 x->skip_txfm = skip_txfm; | 667 x->skip_txfm[0] = skip_txfm; |
| 663 | 668 |
| 664 // Perform intra prediction search, if the best SAD is above a certain | 669 // Perform intra prediction search, if the best SAD is above a certain |
| 665 // threshold. | 670 // threshold. |
| 666 if (!x->skip && best_rd > inter_mode_thresh && | 671 if (!x->skip && best_rd > inter_mode_thresh && |
| 667 bsize <= cpi->sf.max_intra_bsize) { | 672 bsize <= cpi->sf.max_intra_bsize) { |
| 668 int i, j; | 673 int i, j; |
| 669 const int width = num_4x4_blocks_wide_lookup[bsize]; | 674 const int width = num_4x4_blocks_wide_lookup[bsize]; |
| 670 const int height = num_4x4_blocks_high_lookup[bsize]; | 675 const int height = num_4x4_blocks_high_lookup[bsize]; |
| 671 const BLOCK_SIZE bsize_tx = txsize_to_bsize[mbmi->tx_size]; | |
| 672 | 676 |
| 673 int rate2 = 0; | 677 int rate2 = 0; |
| 674 int64_t dist2 = 0; | 678 int64_t dist2 = 0; |
| 675 const int dst_stride = cpi->sf.reuse_inter_pred_sby ? bw : pd->dst.stride; | 679 const int dst_stride = cpi->sf.reuse_inter_pred_sby ? bw : pd->dst.stride; |
| 676 const int src_stride = p->src.stride; | 680 const int src_stride = p->src.stride; |
| 677 int block_idx = 0; | 681 int block_idx = 0; |
| 678 | 682 |
| 679 TX_SIZE tmp_tx_size = MIN(max_txsize_lookup[bsize], | 683 TX_SIZE tmp_tx_size = MIN(max_txsize_lookup[bsize], |
| 680 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); | 684 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
| 685 const BLOCK_SIZE bsize_tx = txsize_to_bsize[tmp_tx_size]; |
| 681 const int step = 1 << tmp_tx_size; | 686 const int step = 1 << tmp_tx_size; |
| 682 | 687 |
| 688 if (cpi->sf.reuse_inter_pred_sby) { |
| 689 pd->dst.buf = tmp[0].data; |
| 690 pd->dst.stride = bw; |
| 691 } |
| 692 |
| 683 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { | 693 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { |
| 684 if (cpi->sf.reuse_inter_pred_sby) { | 694 uint8_t *const src_buf_base = p->src.buf; |
| 685 pd->dst.buf = tmp[0].data; | 695 uint8_t *const dst_buf_base = pd->dst.buf; |
| 686 pd->dst.stride = bw; | |
| 687 } | |
| 688 | |
| 689 for (j = 0; j < height; j += step) { | 696 for (j = 0; j < height; j += step) { |
| 690 for (i = 0; i < width; i += step) { | 697 for (i = 0; i < width; i += step) { |
| 698 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; |
| 699 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; |
| 700 // Use source buffer as an approximation for the fully reconstructed |
| 701 // buffer |
| 691 vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize), | 702 vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize), |
| 692 tmp_tx_size, this_mode, | 703 tmp_tx_size, this_mode, |
| 693 &p->src.buf[4 * (j * dst_stride + i)], | 704 p->src.buf, src_stride, |
| 694 src_stride, | 705 pd->dst.buf, dst_stride, |
| 695 &pd->dst.buf[4 * (j * dst_stride + i)], | 706 i, j, 0); |
| 696 dst_stride, i, j, 0); | |
| 697 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y); | 707 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y); |
| 698 rate2 += rate; | 708 rate2 += rate; |
| 699 dist2 += dist; | 709 dist2 += dist; |
| 700 ++block_idx; | 710 ++block_idx; |
| 701 } | 711 } |
| 702 } | 712 } |
| 713 p->src.buf = src_buf_base; |
| 714 pd->dst.buf = dst_buf_base; |
| 703 | 715 |
| 704 rate = rate2; | 716 rate = rate2; |
| 705 dist = dist2; | 717 dist = dist2; |
| 706 | 718 |
| 707 rate += cpi->mbmode_cost[this_mode]; | 719 rate += cpi->mbmode_cost[this_mode]; |
| 708 rate += intra_cost_penalty; | 720 rate += intra_cost_penalty; |
| 709 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 721 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); |
| 710 | 722 |
| 711 if (cpi->sf.reuse_inter_pred_sby) | 723 if (cpi->sf.reuse_inter_pred_sby) |
| 712 pd->dst = orig_dst; | 724 pd->dst = orig_dst; |
| 713 | 725 |
| 714 if (this_rd + intra_mode_cost < best_rd) { | 726 if (this_rd + intra_mode_cost < best_rd) { |
| 715 best_rd = this_rd; | 727 best_rd = this_rd; |
| 716 *returnrate = rate; | 728 *returnrate = rate; |
| 717 *returndistortion = dist; | 729 *returndistortion = dist; |
| 718 mbmi->mode = this_mode; | 730 mbmi->mode = this_mode; |
| 719 mbmi->tx_size = tmp_tx_size; | 731 mbmi->tx_size = tmp_tx_size; |
| 720 mbmi->ref_frame[0] = INTRA_FRAME; | 732 mbmi->ref_frame[0] = INTRA_FRAME; |
| 721 mbmi->uv_mode = this_mode; | 733 mbmi->uv_mode = this_mode; |
| 722 mbmi->mv[0].as_int = INVALID_MV; | 734 mbmi->mv[0].as_int = INVALID_MV; |
| 723 } else { | 735 } else { |
| 724 x->skip_txfm = skip_txfm; | 736 x->skip_txfm[0] = skip_txfm; |
| 725 } | 737 } |
| 726 } | 738 } |
| 727 } | 739 } |
| 728 | 740 |
| 729 return INT64_MAX; | 741 return INT64_MAX; |
| 730 } | 742 } |
| OLD | NEW |