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 |