1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <assert.h> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp9_rtcd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_common.h" 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_mvref_common.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_reconinter.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_reconintra.h" 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_onyx_int.h" 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_ratectrl.h" 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_rdopt.h" 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void full_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TileInfo *const tile, 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE bsize, int mi_row, int mi_col, 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *tmp_mv) { 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd = &x->e_mbd; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan int step_param; 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sadpb = x->sadperbit16; 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV mvp_full; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref = mbmi->ref_frame[0]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MV ref_mv = mbmi->ref_mvs[ref][0].as_mv; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_col_min = x->mv_col_min; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_col_max = x->mv_col_max; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_row_min = x->mv_row_min; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp_row_max = x->mv_row_max; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref); 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_frame) { 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Swap out the reference frame for a version that's been scaled to 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan // match the resolution of the current frame, allowing the existing 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan // motion search code to be used without additional modifications. 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; i++) 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan backup_yv12[i] = xd->plane[i].pre[0]; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_set_mv_search_range(x, &ref_mv); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan // TODO(jingning) exploiting adaptive motion search control in non-RD 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan // mode decision too. 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan step_param = 6; 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = LAST_FRAME; i <= LAST_FRAME && cpi->common.show_frame; ++i) { 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[i]) { 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp_mv->as_int = INVALID_MV; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_frame) { 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; i++) 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[i].pre[0] = backup_yv12[i]; 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan return; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(x->mv_best_ref_index[ref] <= 2); 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mv_best_ref_index[ref] < 2) 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp_full = mbmi->ref_mvs[ref][x->mv_best_ref_index[ref]].as_mv; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp_full = x->pred_mv[ref].as_mv; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp_full.col >>= 3; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp_full.row >>= 3; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->sf.search_method == FAST_DIAMOND) { 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns SAD 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_fast_dia_search(x, &mvp_full, step_param, sadpb, 0, 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 1, 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->sf.search_method == FAST_HEX) { 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns SAD 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 1, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->sf.search_method == HEX) { 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns SAD 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_hex_search(x, &mvp_full, step_param, sadpb, 1, 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 1, 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->sf.search_method == SQUARE) { 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns SAD 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_square_search(x, &mvp_full, step_param, sadpb, 1, 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 1, 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else if (cpi->sf.search_method == BIGDIA) { 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns SAD 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1, 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 1, 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else { 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan int further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan // NOTE: this returns variance 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan sadpb, further_steps, 1, 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan &ref_mv, &tmp_mv->as_mv); 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_min = tmp_col_min; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_col_max = tmp_col_max; 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_min = tmp_row_min; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->mv_row_max = tmp_row_max; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_frame) { 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; i++) 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[i].pre[0] = backup_yv12[i]; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 133233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void sub_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TileInfo *const tile, 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE bsize, int mi_row, int mi_col, 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *tmp_mv, int *rate_mv) { 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd = &x->e_mbd; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref = mbmi->ref_frame[0]; 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV ref_mv = mbmi->ref_mvs[ref][0].as_mv; 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dis; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref); 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_frame) { 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Swap out the reference frame for a version that's been scaled to 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan // match the resolution of the current frame, allowing the existing 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan // motion search code to be used without additional modifications. 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; i++) 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan backup_yv12[i] = xd->plane[i].pre[0]; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->find_fractional_mv_step(x, tmp_mv, &ref_mv, 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->common.allow_high_precision_mv, 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->errorperbit, 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan &cpi->fn_ptr[bsize], 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->sf.subpel_force_stop, 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan cpi->sf.subpel_iters_per_step, 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->nmvjointcost, x->mvcost, 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan &dis, &x->pred_sse[ref]); 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan // calculate the bit cost on motion vector 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan *rate_mv = vp9_mv_bit_cost(tmp_mv, &ref_mv, 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (scaled_ref_frame) { 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < MAX_MB_PLANE; i++) 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[i].pre[0] = backup_yv12[i]; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->pred_mv[ref].as_mv = *tmp_mv; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan 179233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCK *x, MACROBLOCKD *xd, 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *out_rate_sum, int64_t *out_dist_sum) { 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Note our transform coeffs are 8 times an orthogonal transform. 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Hence quantizer step is also 8 times. To get effective quantizer 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan // we need to divide by 8 before sending to modeling function. 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int sse; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rate; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t dist; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblock_plane *const p = &x->plane[0]; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblockd_plane *const pd = &xd->plane[0]; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride, 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan pd->dst.buf, pd->dst.stride, &sse); 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_model_rd_from_var_lapndz(sse + var, 1 << num_pels_log2_lookup[bsize], 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan pd->dequant[1] >> 3, &rate, &dist); 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan *out_rate_sum = rate; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan *out_dist_sum = dist << 3; 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(jingning) placeholder for inter-frame non-RD mode decision. 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan// this needs various further optimizations. to be continued.. 203233d2500723e5594f3e7c70896ffeeef32b9c950ywanint64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan const TileInfo *const tile, 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mi_row, int mi_col, 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *returnrate, 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t *returndistortion, 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE bsize) { 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd = &x->e_mbd; 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblock_plane *const p = &x->plane[0]; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblockd_plane *const pd = &xd->plane[0]; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_PREDICTION_MODE this_mode, best_mode = ZEROMV; 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct buf_2d yv12_mb[4][MAX_MB_PLANE]; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_ALT_FLAG }; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t best_rd = INT64_MAX; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t this_rd = INT64_MAX; 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rate = INT_MAX; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t dist = INT64_MAX; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP9_COMMON *cm = &cpi->common; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv, 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan intra_cost_penalty, 0); 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int64_t intra_mode_cost = 50; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char segment_id = mbmi->segment_id; 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *const rd_threshes = cpi->rd_threshes[segment_id][bsize]; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *const rd_thresh_freq_fact = cpi->rd_thresh_freq_fact[bsize]; 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Mode index conversion form THR_MODES to MB_PREDICTION_MODE for a ref frame. 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mode_idx[MB_MODE_COUNT] = {0}; 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->skip = 0; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!x->in_active_map) 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->skip = 1; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan // initialize mode decisions 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returnrate = INT_MAX; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returndistortion = INT64_MAX; 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->sb_type = bsize; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->ref_frame[0] = NONE; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->ref_frame[1] = NONE; 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->tx_size = MIN(max_txsize_lookup[bsize], 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->interp_filter = cpi->common.interp_filter == SWITCHABLE ? 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan EIGHTTAP : cpi->common.interp_filter; 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->skip = 0; 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->segment_id = segment_id; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->pred_mv_sad[ref_frame] = INT_MAX; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->ref_frame_flags & flag_list[ref_frame]) { 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_setup_buffer_inter(cpi, x, tile, 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame, bsize, mi_row, mi_col, 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_mv[NEARESTMV], frame_mv[NEARMV], yv12_mb); 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_mv[ZEROMV][ref_frame].as_int = 0; 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(cpi->ref_frame_flags & flag_list[ref_frame])) 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Select prediction reference frames. 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->plane[0].pre[0] = yv12_mb[ref_frame][0]; 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->ref_frame[0] = ref_frame; 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Set conversion index for LAST_FRAME. 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ref_frame == LAST_FRAME) { 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_idx[NEARESTMV] = THR_NEARESTMV; // LAST_FRAME, NEARESTMV 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_idx[NEARMV] = THR_NEARMV; // LAST_FRAME, NEARMV 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_idx[ZEROMV] = THR_ZEROMV; // LAST_FRAME, ZEROMV 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_idx[NEWMV] = THR_NEWMV; // LAST_FRAME, NEWMV 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rate_mv = 0; 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cpi->sf.disable_inter_mode_mask[bsize] & 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan (1 << INTER_OFFSET(this_mode))) 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (best_rd < ((int64_t)rd_threshes[mode_idx[this_mode]] * 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan rd_thresh_freq_fact[this_mode] >> 5) || 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan rd_threshes[mode_idx[this_mode]] == INT_MAX) 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_mode == NEWMV) { 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize])) 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan &frame_mv[NEWMV][ref_frame]); 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV) 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan &frame_mv[NEWMV][ref_frame].as_mv, &rate_mv); 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_mode != NEARESTMV) 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (frame_mv[this_mode][ref_frame].as_int == 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan frame_mv[NEARESTMV][ref_frame].as_int) 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mode = this_mode; 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist); 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan rate += rate_mv; 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan rate += x->inter_mode_cost[mbmi->mode_context[ref_frame]] 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan [INTER_OFFSET(this_mode)]; 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_rd < best_rd) { 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_rd = this_rd; 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returnrate = rate; 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returndistortion = dist; 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mode = this_mode; 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_ref_frame = ref_frame; 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mode = best_mode; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->ref_frame[0] = best_ref_frame; 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Perform intra prediction search, if the best SAD is above a certain 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan // threshold. 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (best_rd > inter_mode_thresh) { 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_predict_intra_block(xd, 0, b_width_log2(bsize), 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->tx_size, this_mode, 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan &p->src.buf[0], p->src.stride, 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan &pd->dst.buf[0], pd->dst.stride, 0, 0, 0); 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist); 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan rate += x->mbmode_cost[this_mode]; 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan rate += intra_cost_penalty; 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_rd + intra_mode_cost < best_rd) { 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_rd = this_rd; 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returnrate = rate; 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan *returndistortion = dist; 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mode = this_mode; 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->ref_frame[0] = INTRA_FRAME; 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->uv_mode = this_mode; 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan mbmi->mv[0].as_int = INVALID_MV; 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan return INT64_MAX; 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 372