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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 const POSITION *const mv_ref = &mv_ref_search[i]; | 58 const POSITION *const mv_ref = &mv_ref_search[i]; |
59 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { | 59 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { |
60 const MODE_INFO *const candidate_mi = xd->mi[mv_ref->col + mv_ref->row * | 60 const MODE_INFO *const candidate_mi = xd->mi[mv_ref->col + mv_ref->row * |
61 xd->mi_stride].src_mi; | 61 xd->mi_stride].src_mi; |
62 const MB_MODE_INFO *const candidate = &candidate_mi->mbmi; | 62 const MB_MODE_INFO *const candidate = &candidate_mi->mbmi; |
63 // Keep counts for entropy encoding. | 63 // Keep counts for entropy encoding. |
64 context_counter += mode_2_counter[candidate->mode]; | 64 context_counter += mode_2_counter[candidate->mode]; |
65 different_ref_found = 1; | 65 different_ref_found = 1; |
66 | 66 |
67 if (candidate->ref_frame[0] == ref_frame) | 67 if (candidate->ref_frame[0] == ref_frame) |
68 ADD_MV_REF_LIST(get_sub_block_mv(candidate_mi, 0, mv_ref->col, -1)); | 68 ADD_MV_REF_LIST(get_sub_block_mv(candidate_mi, 0, mv_ref->col, -1), |
| 69 refmv_count, mv_ref_list, Done); |
69 } | 70 } |
70 } | 71 } |
71 | 72 |
72 const_motion = 1; | 73 const_motion = 1; |
73 | 74 |
74 // Check the rest of the neighbors in much the same way | 75 // Check the rest of the neighbors in much the same way |
75 // as before except we don't need to keep track of sub blocks or | 76 // as before except we don't need to keep track of sub blocks or |
76 // mode counts. | 77 // mode counts. |
77 for (; i < MVREF_NEIGHBOURS && !refmv_count; ++i) { | 78 for (; i < MVREF_NEIGHBOURS && !refmv_count; ++i) { |
78 const POSITION *const mv_ref = &mv_ref_search[i]; | 79 const POSITION *const mv_ref = &mv_ref_search[i]; |
79 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { | 80 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { |
80 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row * | 81 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row * |
81 xd->mi_stride].src_mi->mbmi; | 82 xd->mi_stride].src_mi->mbmi; |
82 different_ref_found = 1; | 83 different_ref_found = 1; |
83 | 84 |
84 if (candidate->ref_frame[0] == ref_frame) | 85 if (candidate->ref_frame[0] == ref_frame) |
85 ADD_MV_REF_LIST(candidate->mv[0]); | 86 ADD_MV_REF_LIST(candidate->mv[0], refmv_count, mv_ref_list, Done); |
86 } | 87 } |
87 } | 88 } |
88 | 89 |
89 // Since we couldn't find 2 mvs from the same reference frame | 90 // Since we couldn't find 2 mvs from the same reference frame |
90 // go back through the neighbors and find motion vectors from | 91 // go back through the neighbors and find motion vectors from |
91 // different reference frames. | 92 // different reference frames. |
92 if (different_ref_found && !refmv_count) { | 93 if (different_ref_found && !refmv_count) { |
93 for (i = 0; i < MVREF_NEIGHBOURS; ++i) { | 94 for (i = 0; i < MVREF_NEIGHBOURS; ++i) { |
94 const POSITION *mv_ref = &mv_ref_search[i]; | 95 const POSITION *mv_ref = &mv_ref_search[i]; |
95 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { | 96 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { |
96 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row | 97 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row |
97 * xd->mi_stride].src_mi->mbmi; | 98 * xd->mi_stride].src_mi->mbmi; |
98 | 99 |
99 // If the candidate is INTRA we don't want to consider its mv. | 100 // If the candidate is INTRA we don't want to consider its mv. |
100 IF_DIFF_REF_FRAME_ADD_MV(candidate); | 101 IF_DIFF_REF_FRAME_ADD_MV(candidate, ref_frame, ref_sign_bias, |
| 102 refmv_count, mv_ref_list, Done); |
101 } | 103 } |
102 } | 104 } |
103 } | 105 } |
104 | 106 |
105 Done: | 107 Done: |
106 | 108 |
107 mi->mbmi.mode_context[ref_frame] = counter_to_context[context_counter]; | 109 mi->mbmi.mode_context[ref_frame] = counter_to_context[context_counter]; |
108 | 110 |
109 // Clamp vectors | 111 // Clamp vectors |
110 for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) | 112 for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); | 434 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); |
433 assert(plane == 0); | 435 assert(plane == 0); |
434 (void) plane; | 436 (void) plane; |
435 | 437 |
436 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; | 438 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; |
437 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; | 439 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; |
438 // Use source buffer as an approximation for the fully reconstructed buffer. | 440 // Use source buffer as an approximation for the fully reconstructed buffer. |
439 vp9_predict_intra_block(xd, block >> (2 * tx_size), | 441 vp9_predict_intra_block(xd, block >> (2 * tx_size), |
440 b_width_log2_lookup[plane_bsize], | 442 b_width_log2_lookup[plane_bsize], |
441 tx_size, args->mode, | 443 tx_size, args->mode, |
442 p->src.buf, src_stride, | 444 x->skip_encode ? p->src.buf : pd->dst.buf, |
| 445 x->skip_encode ? src_stride : dst_stride, |
443 pd->dst.buf, dst_stride, | 446 pd->dst.buf, dst_stride, |
444 i, j, 0); | 447 i, j, 0); |
445 // This procedure assumes zero offset from p->src.buf and pd->dst.buf. | 448 // This procedure assumes zero offset from p->src.buf and pd->dst.buf. |
446 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y); | 449 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y); |
447 p->src.buf = src_buf_base; | 450 p->src.buf = src_buf_base; |
448 pd->dst.buf = dst_buf_base; | 451 pd->dst.buf = dst_buf_base; |
449 args->rate += rate; | 452 args->rate += rate; |
450 args->dist += dist; | 453 args->dist += dist; |
451 } | 454 } |
452 | 455 |
453 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][INTER_MODES] = { | 456 static const THR_MODES mode_idx[MAX_REF_FRAMES][4] = { |
| 457 {THR_DC, THR_H_PRED, THR_V_PRED, THR_TM}, |
454 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, | 458 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, |
455 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG}, | 459 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG}, |
456 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA}, | 460 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA}, |
457 }; | 461 }; |
458 | 462 |
| 463 static const PREDICTION_MODE intra_mode_list[] = { |
| 464 DC_PRED, V_PRED, H_PRED, TM_PRED |
| 465 }; |
| 466 |
459 // TODO(jingning) placeholder for inter-frame non-RD mode decision. | 467 // TODO(jingning) placeholder for inter-frame non-RD mode decision. |
460 // this needs various further optimizations. to be continued.. | 468 // this needs various further optimizations. to be continued.. |
461 void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, | 469 void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, |
462 const TileInfo *const tile, | 470 TileDataEnc *tile_data, |
463 int mi_row, int mi_col, | 471 int mi_row, int mi_col, RD_COST *rd_cost, |
464 int *returnrate, | 472 BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) { |
465 int64_t *returndistortion, | |
466 BLOCK_SIZE bsize, | |
467 PICK_MODE_CONTEXT *ctx) { | |
468 VP9_COMMON *const cm = &cpi->common; | 473 VP9_COMMON *const cm = &cpi->common; |
| 474 TileInfo *const tile_info = &tile_data->tile_info; |
469 MACROBLOCKD *const xd = &x->e_mbd; | 475 MACROBLOCKD *const xd = &x->e_mbd; |
470 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; | 476 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; |
471 struct macroblockd_plane *const pd = &xd->plane[0]; | 477 struct macroblockd_plane *const pd = &xd->plane[0]; |
472 PREDICTION_MODE best_mode = ZEROMV; | 478 PREDICTION_MODE best_mode = ZEROMV; |
473 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; | 479 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; |
474 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize], | 480 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize], |
475 tx_mode_to_biggest_tx_size[cm->tx_mode]); | 481 tx_mode_to_biggest_tx_size[cm->tx_mode]); |
476 INTERP_FILTER best_pred_filter = EIGHTTAP; | 482 INTERP_FILTER best_pred_filter = EIGHTTAP; |
477 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; | 483 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; |
478 struct buf_2d yv12_mb[4][MAX_MB_PLANE]; | 484 struct buf_2d yv12_mb[4][MAX_MB_PLANE]; |
479 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, | 485 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, |
480 VP9_ALT_FLAG }; | 486 VP9_ALT_FLAG }; |
481 int64_t best_rd = INT64_MAX; | 487 RD_COST this_rdc, best_rdc; |
482 int64_t this_rd = INT64_MAX; | |
483 uint8_t skip_txfm = 0; | 488 uint8_t skip_txfm = 0; |
484 int rate = INT_MAX; | |
485 int64_t dist = INT64_MAX; | |
486 // var_y and sse_y are saved to be used in skipping checking | 489 // var_y and sse_y are saved to be used in skipping checking |
487 unsigned int var_y = UINT_MAX; | 490 unsigned int var_y = UINT_MAX; |
488 unsigned int sse_y = UINT_MAX; | 491 unsigned int sse_y = UINT_MAX; |
489 // Reduce the intra cost penalty for small blocks (<=16x16). | 492 // Reduce the intra cost penalty for small blocks (<=16x16). |
490 const int reduction_fac = | 493 const int reduction_fac = |
491 (cpi->sf.partition_search_type == VAR_BASED_PARTITION && | 494 (cpi->sf.partition_search_type == VAR_BASED_PARTITION && |
492 bsize <= BLOCK_16X16) ? 4 : 1; | 495 bsize <= BLOCK_16X16) ? 4 : 1; |
493 const int intra_cost_penalty = vp9_get_intra_cost_penalty( | 496 const int intra_cost_penalty = vp9_get_intra_cost_penalty( |
494 cm->base_qindex, cm->y_dc_delta_q, cm->bit_depth) / reduction_fac; | 497 cm->base_qindex, cm->y_dc_delta_q, cm->bit_depth) / reduction_fac; |
495 const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv, | 498 const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv, |
496 intra_cost_penalty, 0); | 499 intra_cost_penalty, 0); |
497 const int intra_mode_cost = 50; | 500 const int intra_mode_cost = 50; |
498 | 501 |
499 const int8_t segment_id = mbmi->segment_id; | 502 const int8_t segment_id = mbmi->segment_id; |
500 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; | 503 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; |
501 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize]; | 504 const int *const rd_thresh_freq_fact = tile_data->thresh_freq_fact[bsize]; |
502 INTERP_FILTER filter_ref = cm->interp_filter; | 505 INTERP_FILTER filter_ref; |
503 const int bsl = mi_width_log2_lookup[bsize]; | 506 const int bsl = mi_width_log2_lookup[bsize]; |
504 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? | 507 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? |
505 (((mi_row + mi_col) >> bsl) + | 508 (((mi_row + mi_col) >> bsl) + |
506 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; | 509 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; |
507 int const_motion[MAX_REF_FRAMES] = { 0 }; | 510 int const_motion[MAX_REF_FRAMES] = { 0 }; |
508 const int bh = num_4x4_blocks_high_lookup[bsize] << 2; | 511 const int bh = num_4x4_blocks_high_lookup[bsize] << 2; |
509 const int bw = num_4x4_blocks_wide_lookup[bsize] << 2; | 512 const int bw = num_4x4_blocks_wide_lookup[bsize] << 2; |
510 // For speed 6, the result of interp filter is reused later in actual encoding | 513 // For speed 6, the result of interp filter is reused later in actual encoding |
511 // process. | 514 // process. |
512 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. | 515 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. |
513 PRED_BUFFER tmp[4]; | 516 PRED_BUFFER tmp[4]; |
514 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); | 517 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); |
515 #if CONFIG_VP9_HIGHBITDEPTH | 518 #if CONFIG_VP9_HIGHBITDEPTH |
516 DECLARE_ALIGNED_ARRAY(16, uint16_t, pred_buf_16, 3 * 64 * 64); | 519 DECLARE_ALIGNED_ARRAY(16, uint16_t, pred_buf_16, 3 * 64 * 64); |
517 #endif | 520 #endif |
518 struct buf_2d orig_dst = pd->dst; | 521 struct buf_2d orig_dst = pd->dst; |
519 PRED_BUFFER *best_pred = NULL; | 522 PRED_BUFFER *best_pred = NULL; |
520 PRED_BUFFER *this_mode_pred = NULL; | 523 PRED_BUFFER *this_mode_pred = NULL; |
521 const int pixels_in_block = bh * bw; | 524 const int pixels_in_block = bh * bw; |
| 525 int reuse_inter_pred = cpi->sf.reuse_inter_pred_sby && ctx->pred_pixel_ready; |
| 526 int ref_frame_skip_mask = 0; |
522 | 527 |
523 if (cpi->sf.reuse_inter_pred_sby) { | 528 if (reuse_inter_pred) { |
524 int i; | 529 int i; |
525 for (i = 0; i < 3; i++) { | 530 for (i = 0; i < 3; i++) { |
526 #if CONFIG_VP9_HIGHBITDEPTH | 531 #if CONFIG_VP9_HIGHBITDEPTH |
527 if (cm->use_highbitdepth) | 532 if (cm->use_highbitdepth) |
528 tmp[i].data = CONVERT_TO_BYTEPTR(&pred_buf_16[pixels_in_block * i]); | 533 tmp[i].data = CONVERT_TO_BYTEPTR(&pred_buf_16[pixels_in_block * i]); |
529 else | 534 else |
530 tmp[i].data = &pred_buf[pixels_in_block * i]; | 535 tmp[i].data = &pred_buf[pixels_in_block * i]; |
531 #else | 536 #else |
532 tmp[i].data = &pred_buf[pixels_in_block * i]; | 537 tmp[i].data = &pred_buf[pixels_in_block * i]; |
533 #endif // CONFIG_VP9_HIGHBITDEPTH | 538 #endif // CONFIG_VP9_HIGHBITDEPTH |
534 tmp[i].stride = bw; | 539 tmp[i].stride = bw; |
535 tmp[i].in_use = 0; | 540 tmp[i].in_use = 0; |
536 } | 541 } |
537 tmp[3].data = pd->dst.buf; | 542 tmp[3].data = pd->dst.buf; |
538 tmp[3].stride = pd->dst.stride; | 543 tmp[3].stride = pd->dst.stride; |
539 tmp[3].in_use = 0; | 544 tmp[3].in_use = 0; |
540 } | 545 } |
541 | 546 |
542 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; | 547 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; |
543 x->skip = 0; | 548 x->skip = 0; |
544 | 549 |
| 550 if (xd->up_available) |
| 551 filter_ref = xd->mi[-xd->mi_stride].src_mi->mbmi.interp_filter; |
| 552 else if (xd->left_available) |
| 553 filter_ref = xd->mi[-1].src_mi->mbmi.interp_filter; |
| 554 else |
| 555 filter_ref = cm->interp_filter; |
| 556 |
545 // initialize mode decisions | 557 // initialize mode decisions |
546 *returnrate = INT_MAX; | 558 vp9_rd_cost_reset(&best_rdc); |
547 *returndistortion = INT64_MAX; | 559 vp9_rd_cost_reset(&this_rdc); |
| 560 vp9_rd_cost_reset(rd_cost); |
548 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); | 561 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); |
549 mbmi->sb_type = bsize; | 562 mbmi->sb_type = bsize; |
550 mbmi->ref_frame[0] = NONE; | 563 mbmi->ref_frame[0] = NONE; |
551 mbmi->ref_frame[1] = NONE; | 564 mbmi->ref_frame[1] = NONE; |
552 mbmi->tx_size = MIN(max_txsize_lookup[bsize], | 565 mbmi->tx_size = MIN(max_txsize_lookup[bsize], |
553 tx_mode_to_biggest_tx_size[cm->tx_mode]); | 566 tx_mode_to_biggest_tx_size[cm->tx_mode]); |
554 mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? | 567 mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? |
555 EIGHTTAP : cm->interp_filter; | 568 EIGHTTAP : cm->interp_filter; |
556 mbmi->segment_id = segment_id; | 569 mbmi->segment_id = segment_id; |
557 | 570 |
558 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { | 571 for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { |
559 PREDICTION_MODE this_mode; | |
560 x->pred_mv_sad[ref_frame] = INT_MAX; | 572 x->pred_mv_sad[ref_frame] = INT_MAX; |
561 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; | 573 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; |
562 frame_mv[ZEROMV][ref_frame].as_int = 0; | 574 frame_mv[ZEROMV][ref_frame].as_int = 0; |
563 | 575 |
564 if (xd->up_available) | |
565 filter_ref = xd->mi[-xd->mi_stride].src_mi->mbmi.interp_filter; | |
566 else if (xd->left_available) | |
567 filter_ref = xd->mi[-1].src_mi->mbmi.interp_filter; | |
568 | |
569 if (cpi->ref_frame_flags & flag_list[ref_frame]) { | 576 if (cpi->ref_frame_flags & flag_list[ref_frame]) { |
570 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); | 577 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); |
571 int_mv *const candidates = mbmi->ref_mvs[ref_frame]; | 578 int_mv *const candidates = mbmi->ref_mvs[ref_frame]; |
572 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf; | 579 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf; |
| 580 |
573 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, | 581 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, |
574 sf, sf); | 582 sf, sf); |
575 | 583 |
576 if (!cm->error_resilient_mode) | 584 if (!cm->error_resilient_mode) |
577 vp9_find_mv_refs(cm, xd, tile, xd->mi[0].src_mi, ref_frame, | 585 vp9_find_mv_refs(cm, xd, tile_info, xd->mi[0].src_mi, ref_frame, |
578 candidates, mi_row, mi_col); | 586 candidates, mi_row, mi_col); |
579 else | 587 else |
580 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0].src_mi, | 588 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile_info, |
| 589 xd->mi[0].src_mi, |
581 ref_frame, candidates, | 590 ref_frame, candidates, |
582 mi_row, mi_col); | 591 mi_row, mi_col); |
583 | 592 |
584 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, | 593 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, |
585 &frame_mv[NEARESTMV][ref_frame], | 594 &frame_mv[NEARESTMV][ref_frame], |
586 &frame_mv[NEARMV][ref_frame]); | 595 &frame_mv[NEARMV][ref_frame]); |
587 | 596 |
588 if (!vp9_is_scaled(sf) && bsize >= BLOCK_8X8) | 597 if (!vp9_is_scaled(sf) && bsize >= BLOCK_8X8) |
589 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride, | 598 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride, |
590 ref_frame, bsize); | 599 ref_frame, bsize); |
591 } else { | 600 } else { |
| 601 ref_frame_skip_mask |= (1 << ref_frame); |
| 602 } |
| 603 } |
| 604 |
| 605 for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { |
| 606 PREDICTION_MODE this_mode; |
| 607 int i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME; |
| 608 |
| 609 if (!(cpi->ref_frame_flags & flag_list[ref_frame])) |
592 continue; | 610 continue; |
593 } | 611 |
| 612 if (cpi->ref_frame_flags & flag_list[i]) |
| 613 if (x->pred_mv_sad[ref_frame] > (x->pred_mv_sad[i] << 1)) |
| 614 ref_frame_skip_mask |= (1 << ref_frame); |
| 615 |
| 616 if (ref_frame_skip_mask & (1 << ref_frame)) |
| 617 continue; |
594 | 618 |
595 // Select prediction reference frames. | 619 // Select prediction reference frames. |
596 xd->plane[0].pre[0] = yv12_mb[ref_frame][0]; | 620 xd->plane[0].pre[0] = yv12_mb[ref_frame][0]; |
597 | 621 |
598 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); | 622 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); |
599 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); | 623 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); |
600 | 624 |
601 mbmi->ref_frame[0] = ref_frame; | 625 mbmi->ref_frame[0] = ref_frame; |
602 | 626 |
603 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { | 627 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { |
604 int rate_mv = 0; | 628 int rate_mv = 0; |
605 int mode_rd_thresh; | 629 int mode_rd_thresh; |
| 630 int mode_index = mode_idx[ref_frame][INTER_OFFSET(this_mode)]; |
606 | 631 |
607 if (const_motion[ref_frame] && | 632 if (const_motion[ref_frame] && this_mode == NEARMV) |
608 (this_mode == NEARMV || this_mode == ZEROMV)) | |
609 continue; | 633 continue; |
610 | 634 |
611 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) | 635 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) |
612 continue; | 636 continue; |
613 | 637 |
614 mode_rd_thresh = | 638 mode_rd_thresh = rd_threshes[mode_index]; |
615 rd_threshes[mode_idx[ref_frame - | 639 if (rd_less_than_thresh(best_rdc.rdcost, mode_rd_thresh, |
616 LAST_FRAME][INTER_OFFSET(this_mode)]]; | 640 rd_thresh_freq_fact[mode_index])) |
617 if (rd_less_than_thresh(best_rd, mode_rd_thresh, | |
618 rd_thresh_freq_fact[this_mode])) | |
619 continue; | 641 continue; |
620 | 642 |
621 if (this_mode == NEWMV) { | 643 if (this_mode == NEWMV) { |
| 644 if (ref_frame > LAST_FRAME) |
| 645 continue; |
622 if (cpi->sf.partition_search_type != VAR_BASED_PARTITION && | 646 if (cpi->sf.partition_search_type != VAR_BASED_PARTITION && |
623 this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize])) | 647 this_rdc.rdcost < (int64_t)(1 << num_pels_log2_lookup[bsize])) |
624 continue; | 648 continue; |
625 if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col, | 649 if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col, |
626 &frame_mv[NEWMV][ref_frame], | 650 &frame_mv[NEWMV][ref_frame], |
627 &rate_mv, best_rd)) | 651 &rate_mv, best_rdc.rdcost)) |
628 continue; | 652 continue; |
629 } | 653 } |
630 | 654 |
631 if (this_mode != NEARESTMV && | 655 if (this_mode != NEARESTMV && |
632 frame_mv[this_mode][ref_frame].as_int == | 656 frame_mv[this_mode][ref_frame].as_int == |
633 frame_mv[NEARESTMV][ref_frame].as_int) | 657 frame_mv[NEARESTMV][ref_frame].as_int) |
634 continue; | 658 continue; |
635 | 659 |
636 mbmi->mode = this_mode; | 660 mbmi->mode = this_mode; |
637 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; | 661 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; |
638 | 662 |
639 // Search for the best prediction filter type, when the resulting | 663 // Search for the best prediction filter type, when the resulting |
640 // motion vector is at sub-pixel accuracy level for luma component, i.e., | 664 // motion vector is at sub-pixel accuracy level for luma component, i.e., |
641 // the last three bits are all zeros. | 665 // the last three bits are all zeros. |
642 if (cpi->sf.reuse_inter_pred_sby) { | 666 if (reuse_inter_pred) { |
643 if (this_mode == NEARESTMV) { | 667 if (!this_mode_pred) { |
644 this_mode_pred = &tmp[3]; | 668 this_mode_pred = &tmp[3]; |
645 } else { | 669 } else { |
646 this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; | 670 this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; |
647 pd->dst.buf = this_mode_pred->data; | 671 pd->dst.buf = this_mode_pred->data; |
648 pd->dst.stride = bw; | 672 pd->dst.stride = bw; |
649 } | 673 } |
650 } | 674 } |
651 | 675 |
652 if ((this_mode == NEWMV || filter_ref == SWITCHABLE) && | 676 if ((this_mode == NEWMV || filter_ref == SWITCHABLE) && |
653 pred_filter_search && | 677 pred_filter_search && |
(...skipping 16 matching lines...) Expand all Loading... |
670 &pf_dist[filter], &pf_var[filter], &pf_sse[filter]); | 694 &pf_dist[filter], &pf_var[filter], &pf_sse[filter]); |
671 cost = RDCOST(x->rdmult, x->rddiv, | 695 cost = RDCOST(x->rdmult, x->rddiv, |
672 vp9_get_switchable_rate(cpi) + pf_rate[filter], | 696 vp9_get_switchable_rate(cpi) + pf_rate[filter], |
673 pf_dist[filter]); | 697 pf_dist[filter]); |
674 pf_tx_size[filter] = mbmi->tx_size; | 698 pf_tx_size[filter] = mbmi->tx_size; |
675 if (cost < best_cost) { | 699 if (cost < best_cost) { |
676 best_filter = filter; | 700 best_filter = filter; |
677 best_cost = cost; | 701 best_cost = cost; |
678 skip_txfm = x->skip_txfm[0]; | 702 skip_txfm = x->skip_txfm[0]; |
679 | 703 |
680 if (cpi->sf.reuse_inter_pred_sby) { | 704 if (reuse_inter_pred) { |
681 if (this_mode_pred != current_pred) { | 705 if (this_mode_pred != current_pred) { |
682 free_pred_buffer(this_mode_pred); | 706 free_pred_buffer(this_mode_pred); |
683 this_mode_pred = current_pred; | 707 this_mode_pred = current_pred; |
684 } | 708 } |
685 | 709 |
686 if (filter < EIGHTTAP_SHARP) { | 710 if (filter < EIGHTTAP_SHARP) { |
687 current_pred = &tmp[get_pred_buffer(tmp, 3)]; | 711 current_pred = &tmp[get_pred_buffer(tmp, 3)]; |
688 pd->dst.buf = current_pred->data; | 712 pd->dst.buf = current_pred->data; |
689 pd->dst.stride = bw; | 713 pd->dst.stride = bw; |
690 } | 714 } |
691 } | 715 } |
692 } | 716 } |
693 } | 717 } |
694 | 718 |
695 if (cpi->sf.reuse_inter_pred_sby && this_mode_pred != current_pred) | 719 if (reuse_inter_pred && this_mode_pred != current_pred) |
696 free_pred_buffer(current_pred); | 720 free_pred_buffer(current_pred); |
697 | 721 |
698 mbmi->interp_filter = best_filter; | 722 mbmi->interp_filter = best_filter; |
699 mbmi->tx_size = pf_tx_size[mbmi->interp_filter]; | 723 mbmi->tx_size = pf_tx_size[mbmi->interp_filter]; |
700 rate = pf_rate[mbmi->interp_filter]; | 724 this_rdc.rate = pf_rate[mbmi->interp_filter]; |
701 dist = pf_dist[mbmi->interp_filter]; | 725 this_rdc.dist = pf_dist[mbmi->interp_filter]; |
702 var_y = pf_var[mbmi->interp_filter]; | 726 var_y = pf_var[mbmi->interp_filter]; |
703 sse_y = pf_sse[mbmi->interp_filter]; | 727 sse_y = pf_sse[mbmi->interp_filter]; |
704 x->skip_txfm[0] = skip_txfm; | 728 x->skip_txfm[0] = skip_txfm; |
705 } else { | 729 } else { |
706 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; | 730 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; |
707 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); | 731 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); |
708 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist, &var_y, &sse_y); | 732 model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc.rate, &this_rdc.dist, |
| 733 &var_y, &sse_y); |
709 } | 734 } |
710 | 735 |
711 rate += rate_mv; | 736 this_rdc.rate += rate_mv; |
712 rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] | 737 this_rdc.rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] |
713 [INTER_OFFSET(this_mode)]; | 738 [INTER_OFFSET(this_mode)]; |
714 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 739 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, |
| 740 this_rdc.rate, this_rdc.dist); |
715 | 741 |
716 // Skipping checking: test to see if this block can be reconstructed by | 742 // Skipping checking: test to see if this block can be reconstructed by |
717 // prediction only. | 743 // prediction only. |
718 if (cpi->allow_encode_breakout) { | 744 if (cpi->allow_encode_breakout) { |
719 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, | 745 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, |
720 this_mode, var_y, sse_y, yv12_mb, &rate, &dist); | 746 this_mode, var_y, sse_y, yv12_mb, |
| 747 &this_rdc.rate, &this_rdc.dist); |
721 if (x->skip) { | 748 if (x->skip) { |
722 rate += rate_mv; | 749 this_rdc.rate += rate_mv; |
723 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 750 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, |
| 751 this_rdc.rate, this_rdc.dist); |
724 } | 752 } |
725 } | 753 } |
726 | 754 |
727 #if CONFIG_VP9_TEMPORAL_DENOISING | 755 #if CONFIG_VP9_TEMPORAL_DENOISING |
728 if (cpi->oxcf.noise_sensitivity > 0) { | 756 if (cpi->oxcf.noise_sensitivity > 0) { |
729 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx); | 757 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx); |
730 } | 758 } |
731 #else | 759 #else |
732 (void)ctx; | 760 (void)ctx; |
733 #endif | 761 #endif |
734 | 762 |
735 if (this_rd < best_rd || x->skip) { | 763 if (this_rdc.rdcost < best_rdc.rdcost || x->skip) { |
736 best_rd = this_rd; | 764 best_rdc = this_rdc; |
737 *returnrate = rate; | |
738 *returndistortion = dist; | |
739 best_mode = this_mode; | 765 best_mode = this_mode; |
740 best_pred_filter = mbmi->interp_filter; | 766 best_pred_filter = mbmi->interp_filter; |
741 best_tx_size = mbmi->tx_size; | 767 best_tx_size = mbmi->tx_size; |
742 best_ref_frame = ref_frame; | 768 best_ref_frame = ref_frame; |
743 skip_txfm = x->skip_txfm[0]; | 769 skip_txfm = x->skip_txfm[0]; |
744 | 770 |
745 if (cpi->sf.reuse_inter_pred_sby) { | 771 if (reuse_inter_pred) { |
746 free_pred_buffer(best_pred); | 772 free_pred_buffer(best_pred); |
747 | |
748 best_pred = this_mode_pred; | 773 best_pred = this_mode_pred; |
749 } | 774 } |
750 } else { | 775 } else { |
751 if (cpi->sf.reuse_inter_pred_sby) | 776 if (reuse_inter_pred) |
752 free_pred_buffer(this_mode_pred); | 777 free_pred_buffer(this_mode_pred); |
753 } | 778 } |
754 | 779 |
755 if (x->skip) | 780 if (x->skip) |
756 break; | 781 break; |
757 } | 782 } |
758 // If the current reference frame is valid and we found a usable mode, | 783 |
759 // we are done. | 784 // Check that a prediction mode has been selected. |
760 if (best_rd < INT64_MAX) | 785 assert(best_rdc.rdcost < INT64_MAX); |
| 786 |
| 787 if (x->skip) |
761 break; | 788 break; |
762 } | 789 } |
763 | 790 |
764 // If best prediction is not in dst buf, then copy the prediction block from | |
765 // temp buf to dst buf. | |
766 if (best_pred != NULL && cpi->sf.reuse_inter_pred_sby && | |
767 best_pred->data != orig_dst.buf) { | |
768 pd->dst = orig_dst; | |
769 #if CONFIG_VP9_HIGHBITDEPTH | |
770 if (cm->use_highbitdepth) { | |
771 vp9_highbd_convolve_copy(best_pred->data, bw, pd->dst.buf, pd->dst.stride, | |
772 NULL, 0, NULL, 0, bw, bh, xd->bd); | |
773 } else { | |
774 vp9_convolve_copy(best_pred->data, bw, pd->dst.buf, pd->dst.stride, | |
775 NULL, 0, NULL, 0, bw, bh); | |
776 } | |
777 #else | |
778 vp9_convolve_copy(best_pred->data, bw, pd->dst.buf, pd->dst.stride, NULL, 0, | |
779 NULL, 0, bw, bh); | |
780 #endif // CONFIG_VP9_HIGHBITDEPTH | |
781 } | |
782 | |
783 mbmi->mode = best_mode; | 791 mbmi->mode = best_mode; |
784 mbmi->interp_filter = best_pred_filter; | 792 mbmi->interp_filter = best_pred_filter; |
785 mbmi->tx_size = best_tx_size; | 793 mbmi->tx_size = best_tx_size; |
786 mbmi->ref_frame[0] = best_ref_frame; | 794 mbmi->ref_frame[0] = best_ref_frame; |
787 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; | 795 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; |
788 xd->mi[0].src_mi->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; | 796 xd->mi[0].src_mi->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; |
789 x->skip_txfm[0] = skip_txfm; | 797 x->skip_txfm[0] = skip_txfm; |
790 | 798 |
791 // Perform intra prediction search, if the best SAD is above a certain | 799 // Perform intra prediction search, if the best SAD is above a certain |
792 // threshold. | 800 // threshold. |
793 if (!x->skip && best_rd > inter_mode_thresh && | 801 if (!x->skip && best_rdc.rdcost > inter_mode_thresh && |
794 bsize <= cpi->sf.max_intra_bsize) { | 802 bsize <= cpi->sf.max_intra_bsize) { |
795 PREDICTION_MODE this_mode; | |
796 struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; | 803 struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; |
797 const TX_SIZE intra_tx_size = | 804 const TX_SIZE intra_tx_size = |
798 MIN(max_txsize_lookup[bsize], | 805 MIN(max_txsize_lookup[bsize], |
799 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); | 806 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
| 807 int i; |
800 | 808 |
801 if (cpi->sf.reuse_inter_pred_sby) { | 809 if (reuse_inter_pred && best_pred != NULL) { |
802 pd->dst.buf = tmp[0].data; | 810 if (best_pred->data == orig_dst.buf) { |
803 pd->dst.stride = bw; | 811 this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; |
| 812 vp9_convolve_copy(best_pred->data, best_pred->stride, |
| 813 this_mode_pred->data, this_mode_pred->stride, |
| 814 NULL, 0, NULL, 0, bw, bh); |
| 815 best_pred = this_mode_pred; |
| 816 } |
804 } | 817 } |
| 818 pd->dst = orig_dst; |
805 | 819 |
806 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { | 820 for (i = 0; i < 4; ++i) { |
807 const TX_SIZE saved_tx_size = mbmi->tx_size; | 821 const TX_SIZE saved_tx_size = mbmi->tx_size; |
| 822 const PREDICTION_MODE this_mode = intra_mode_list[i]; |
| 823 if (!((1 << this_mode) & cpi->sf.intra_y_mode_mask[intra_tx_size])) |
| 824 continue; |
| 825 skip_txfm = x->skip_txfm[0]; |
808 args.mode = this_mode; | 826 args.mode = this_mode; |
809 args.rate = 0; | 827 args.rate = 0; |
810 args.dist = 0; | 828 args.dist = 0; |
811 mbmi->tx_size = intra_tx_size; | 829 mbmi->tx_size = intra_tx_size; |
812 vp9_foreach_transformed_block_in_plane(xd, bsize, 0, | 830 vp9_foreach_transformed_block_in_plane(xd, bsize, 0, |
813 estimate_block_intra, &args); | 831 estimate_block_intra, &args); |
814 mbmi->tx_size = saved_tx_size; | 832 this_rdc.rate = args.rate; |
815 rate = args.rate; | 833 this_rdc.dist = args.dist; |
816 dist = args.dist; | 834 this_rdc.rate += cpi->mbmode_cost[this_mode]; |
817 rate += cpi->mbmode_cost[this_mode]; | 835 this_rdc.rate += intra_cost_penalty; |
818 rate += intra_cost_penalty; | 836 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, |
819 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); | 837 this_rdc.rate, this_rdc.dist); |
820 | 838 |
821 if (this_rd + intra_mode_cost < best_rd) { | 839 if (this_rdc.rdcost + intra_mode_cost < best_rdc.rdcost) { |
822 best_rd = this_rd; | 840 best_rdc = this_rdc; |
823 *returnrate = rate; | |
824 *returndistortion = dist; | |
825 mbmi->mode = this_mode; | 841 mbmi->mode = this_mode; |
826 mbmi->tx_size = intra_tx_size; | 842 mbmi->tx_size = intra_tx_size; |
827 mbmi->ref_frame[0] = INTRA_FRAME; | 843 mbmi->ref_frame[0] = INTRA_FRAME; |
828 mbmi->uv_mode = this_mode; | 844 mbmi->uv_mode = this_mode; |
829 mbmi->mv[0].as_int = INVALID_MV; | 845 mbmi->mv[0].as_int = INVALID_MV; |
830 } else { | 846 } else { |
831 x->skip_txfm[0] = skip_txfm; | 847 x->skip_txfm[0] = skip_txfm; |
| 848 mbmi->tx_size = saved_tx_size; |
832 } | 849 } |
833 } | 850 } |
834 if (cpi->sf.reuse_inter_pred_sby) | |
835 pd->dst = orig_dst; | |
836 } | 851 } |
| 852 |
| 853 pd->dst = orig_dst; |
| 854 |
| 855 if (reuse_inter_pred && best_pred != NULL) { |
| 856 if (best_pred->data != orig_dst.buf && is_inter_mode(mbmi->mode)) { |
| 857 #if CONFIG_VP9_HIGHBITDEPTH |
| 858 if (cm->use_highbitdepth) |
| 859 vp9_highbd_convolve_copy(best_pred->data, best_pred->stride, |
| 860 pd->dst.buf, pd->dst.stride, NULL, 0, |
| 861 NULL, 0, bw, bh, xd->bd); |
| 862 else |
| 863 vp9_convolve_copy(best_pred->data, best_pred->stride, |
| 864 pd->dst.buf, pd->dst.stride, NULL, 0, |
| 865 NULL, 0, bw, bh); |
| 866 #else |
| 867 vp9_convolve_copy(best_pred->data, best_pred->stride, |
| 868 pd->dst.buf, pd->dst.stride, NULL, 0, |
| 869 NULL, 0, bw, bh); |
| 870 #endif |
| 871 } |
| 872 } |
| 873 |
| 874 if (is_inter_block(mbmi)) |
| 875 vp9_update_rd_thresh_fact(tile_data->thresh_freq_fact, |
| 876 cpi->sf.adaptive_rd_thresh, bsize, |
| 877 mode_idx[best_ref_frame][INTER_OFFSET(mbmi->mode)]); |
| 878 else |
| 879 vp9_update_rd_thresh_fact(tile_data->thresh_freq_fact, |
| 880 cpi->sf.adaptive_rd_thresh, bsize, |
| 881 mode_idx[INTRA_FRAME][mbmi->mode]); |
| 882 |
| 883 *rd_cost = best_rdc; |
837 } | 884 } |
OLD | NEW |