1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h> 13167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyx_int.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "modecosts.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodeintra.h" 17693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "vp8/common/common.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropymode.h" 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "pickinter.h" 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/findnearmv.h" 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemb.h" 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconinter.h" 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconintra4x4.h" 245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/common/variance.h" 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "mcomp.h" 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "rdopt.h" 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING 295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "denoising.h" 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgextern int VP8_UVSSE(MACROBLOCK *x); 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef SPEEDSTATS 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern unsigned int cnt_pm; 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 38167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgextern const int vp8_ref_frame_order[MAX_MODES]; 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]); 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv *bestmv, int_mv *ref_mv, 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int error_per_bit, 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_variance_fn_ptr_t *vfp, 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *mvcost[2], int *distortion, 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) b; 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) d; 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) ref_mv; 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) error_per_bit; 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) vfp; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) mvcost; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) distortion; 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) sse; 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bestmv->as_mv.row <<= 3; 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bestmv->as_mv.col <<= 3; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return 0; 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgint vp8_get_inter_mbpred_error(MACROBLOCK *mb, 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vp8_variance_fn_ptr_t *vfp, 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse, 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv this_mv) 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *b = &mb->block[0]; 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d = &mb->e_mbd.block[0]; 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *what = (*(b->base_src) + b->src); 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int what_stride = b->src_stride; 745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int pre_stride = mb->e_mbd.pre.y_stride; 755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *in_what = mb->e_mbd.pre.y_buffer + d->offset ; 765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int in_what_stride = pre_stride; 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset = this_mv.as_mv.col & 7; 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset = this_mv.as_mv.row & 7; 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org in_what += (this_mv.as_mv.row >> 3) * pre_stride + (this_mv.as_mv.col >> 3); 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xoffset | yoffset) 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what, what_stride, sse); 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vfp->vf(what, what_stride, in_what, in_what_stride, sse); 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_get4x4sse_cs_c 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int distortion = 0; 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r, c; 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 4; r++) 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (c = 0; c < 4; c++) 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int diff = src_ptr[c] - ref_ptr[c]; 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org distortion += diff * diff; 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr += source_stride; 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref_ptr += recon_stride; 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return distortion; 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic int get_prediction_error(BLOCK *be, BLOCKD *b) 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *sptr; 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dptr; 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sptr = (*(be->base_src) + be->src); 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dptr = b->predictor; 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org return vp8_get4x4sse_cs(sptr, be->src_stride, dptr, 16); 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int pick_intra4x4block( 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCK *x, 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int ib, 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org B_PREDICTION_MODE *best_mode, 135ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int *mode_costs, 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *bestrate, 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *bestdistortion) 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *b = &x->e_mbd.block[ib]; 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *be = &x->block[ib]; 1435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->e_mbd.dst.y_stride; 144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org B_PREDICTION_MODE mode; 146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int best_rd = INT_MAX; 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int rate; 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int distortion; 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *Above = dst - dst_stride; 151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *yleft = dst - 1; 152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char top_left = Above[-1]; 153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (mode = B_DC_PRED; mode <= B_HE_PRED; mode++) 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int this_rd; 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate = mode_costs[mode]; 159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_intra4x4_predict(Above, yleft, dst_stride, mode, 161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org b->predictor, 16, top_left); 1625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion = get_prediction_error(be, b); 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (this_rd < best_rd) 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *bestrate = rate; 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *bestdistortion = distortion; 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_rd = this_rd; 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *best_mode = mode; 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 174ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org b->bmi.as_mode = *best_mode; 1755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_encode_intra4x4block(x, ib); 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return best_rd; 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int pick_intra4x4mby_modes 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCK *mb, 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *Rate, 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *best_dist 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *const xd = &mb->e_mbd; 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int error; 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int distortion = 0; 192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int *bmode_costs; 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bmode_costs = mb->inter_bmode_costs; 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 16; i++) 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MODE_INFO *const mic = xd->mode_info_context; 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int mis = xd->mode_info_stride; 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d); 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb->e_mbd.frame_type == KEY_FRAME) 207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); 209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const B_PREDICTION_MODE L = left_block_mode(mic, i); 210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bmode_costs = mb->bmode_costs[A][L]; 212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pick_intra4x4block(mb, i, &best_mode, bmode_costs, &r, &d); 216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cost += r; 218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org distortion += d; 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mic->bmi[i].as_mode = best_mode; 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Break out case where we have already exceeded best so far value 222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * that was passed in 223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (distortion > *best_dist) 225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *Rate = cost; 229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (i == 16) 231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *best_dist = distortion; 233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion); 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *best_dist = INT_MAX; 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org error = INT_MAX; 239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return error; 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void pick_intra_mbuv_mode(MACROBLOCK *mb) 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *x = &mb->e_mbd; 248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride; 249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride; 250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src); 251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src); 252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int uvsrc_stride = mb->block[16].src_stride; 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char uleft_col[8]; 254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char vleft_col[8]; 255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char utop_left = uabove_row[-1]; 256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char vtop_left = vabove_row[-1]; 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j; 258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int expected_udc; 259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int expected_vdc; 260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int shift; 261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Uaverage = 0; 262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Vaverage = 0; 263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int diff; 264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int pred_error[4] = {0, 0, 0, 0}, best_error = INT_MAX; 265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); 266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 8; i++) 269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1]; 271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1]; 272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!x->up_available && !x->left_available) 275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org expected_udc = 128; 277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org expected_vdc = 128; 278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift = 2; 282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->up_available) 284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 8; i++) 287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Uaverage += uabove_row[i]; 289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Vaverage += vabove_row[i]; 290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift ++; 293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->left_available) 297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 8; i++) 299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Uaverage += uleft_col[i]; 301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Vaverage += vleft_col[i]; 302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org shift ++; 305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org expected_udc = (Uaverage + (1 << (shift - 1))) >> shift; 309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift; 310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 8; i++) 314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < 8; j++) 316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int predu = uleft_col[i] + uabove_row[j] - utop_left; 319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int predv = vleft_col[i] + vabove_row[j] - vtop_left; 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int u_p, v_p; 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org u_p = usrc_ptr[j]; 323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org v_p = vsrc_ptr[j]; 324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (predu < 0) 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org predu = 0; 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (predu > 255) 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org predu = 255; 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (predv < 0) 332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org predv = 0; 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (predv > 255) 335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org predv = 255; 336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = u_p - expected_udc; 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[DC_PRED] += diff * diff; 340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = v_p - expected_vdc; 341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[DC_PRED] += diff * diff; 342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = u_p - uabove_row[j]; 345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[V_PRED] += diff * diff; 346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = v_p - vabove_row[j]; 347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[V_PRED] += diff * diff; 348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = u_p - uleft_col[i]; 351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[H_PRED] += diff * diff; 352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = v_p - vleft_col[i]; 353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[H_PRED] += diff * diff; 354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = u_p - predu; 357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[TM_PRED] += diff * diff; 358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = v_p - predv; 359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_error[TM_PRED] += diff * diff; 360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org usrc_ptr += uvsrc_stride; 365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vsrc_ptr += uvsrc_stride; 366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (i == 3) 368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org usrc_ptr = (mb->block[18].src + *mb->block[18].base_src); 370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vsrc_ptr = (mb->block[22].src + *mb->block[22].base_src); 371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = DC_PRED; i <= TM_PRED; i++) 379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (best_error > pred_error[i]) 381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_error = pred_error[i]; 383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_mode = (MB_PREDICTION_MODE)i; 384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode; 389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 392d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgstatic void update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) 393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 394d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org MACROBLOCKD *xd = &x->e_mbd; 395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Split MV modes currently not supported when RD is nopt enabled, 396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * therefore, only need to modify MVcount in NEWMV mode. */ 397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_info_context->mbmi.mode == NEWMV) 398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 399d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row - 400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_ref_mv->as_mv.row) >> 1)]++; 401d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col - 402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_ref_mv->as_mv.col) >> 1)]++; 403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 406167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 407167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 408167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic 409167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid get_lower_res_motion_info(VP8_COMP *cpi, MACROBLOCKD *xd, int *dissim, 410167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int *parent_ref_frame, 411167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MB_PREDICTION_MODE *parent_mode, 412167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv *parent_ref_mv, int mb_row, int mb_col) 413167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org LOWER_RES_MB_INFO* store_mode_info 415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org = ((LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info)->mb_info; 416167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned int parent_mb_index; 417167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 418167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Consider different down_sampling_factor. */ 419167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 420167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* TODO: Removed the loop that supports special down_sampling_factor 421167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * such as 2, 4, 8. Will revisit it if needed. 422167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * Should also try using a look-up table to see if it helps 423167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * performance. */ 424167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int parent_mb_row, parent_mb_col; 425167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 4265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org parent_mb_row = mb_row*cpi->oxcf.mr_down_sampling_factor.den 427167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /cpi->oxcf.mr_down_sampling_factor.num; 4285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org parent_mb_col = mb_col*cpi->oxcf.mr_down_sampling_factor.den 429167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /cpi->oxcf.mr_down_sampling_factor.num; 430167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org parent_mb_index = parent_mb_row*cpi->mr_low_res_mb_cols + parent_mb_col; 431167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 432167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 433167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Read lower-resolution mode & motion result from memory.*/ 434167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *parent_ref_frame = store_mode_info[parent_mb_index].ref_frame; 435167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *parent_mode = store_mode_info[parent_mb_index].mode; 436167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *dissim = store_mode_info[parent_mb_index].dissim; 437167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 438167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* For highest-resolution encoder, adjust dissim value. Lower its quality 439167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * for good performance. */ 440167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (cpi->oxcf.mr_encoder_id == (cpi->oxcf.mr_total_resolutions - 1)) 441167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *dissim>>=1; 442167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 443167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(*parent_ref_frame != INTRA_FRAME) 444167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 445167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Consider different down_sampling_factor. 446167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * The result can be rounded to be more precise, but it takes more time. 447167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 448167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (*parent_ref_mv).as_mv.row = store_mode_info[parent_mb_index].mv.as_mv.row 449167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *cpi->oxcf.mr_down_sampling_factor.num 450167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /cpi->oxcf.mr_down_sampling_factor.den; 451167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (*parent_ref_mv).as_mv.col = store_mode_info[parent_mb_index].mv.as_mv.col 452167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *cpi->oxcf.mr_down_sampling_factor.num 453167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /cpi->oxcf.mr_down_sampling_factor.den; 454167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 455167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_clamp_mv2(parent_ref_mv, xd); 456167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 457167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 458167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 459167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 4605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void check_for_encode_breakout(unsigned int sse, MACROBLOCK* x) 4615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org MACROBLOCKD *xd = &x->e_mbd; 463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int threshold = (xd->block[0].dequant[1] 465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * xd->block[0].dequant[1] >>4); 466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(threshold < x->encode_breakout) 468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org threshold = x->encode_breakout; 469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (sse < threshold ) 4715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Check u and v to make sure skip is ok */ 4730f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com unsigned int sse2 = 0; 4745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sse2 = VP8_UVSSE(x); 4765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (sse2 * 2 < x->encode_breakout) 4785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->skip = 1; 4795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 4805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->skip = 0; 4815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 4835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic int evaluate_inter_mode(unsigned int* sse, int rate2, int* distortion2, 485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org VP8_COMP *cpi, MACROBLOCK *x, int rd_adj) 4865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 4875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 4885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int_mv mv = x->e_mbd.mode_info_context->mbmi.mv; 4895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int this_rd; 490d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org int denoise_aggressive = 0; 4915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Exit early and don't compute the distortion if this macroblock 4925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * is marked inactive. */ 4935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cpi->active_map_enabled && x->active_ptr[0] == 0) 4945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org *sse = 0; 4965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org *distortion2 = 0; 4975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->skip = 1; 4985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org return INT_MAX; 4995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if((this_mode != NEWMV) || 5025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org !(cpi->sf.half_pixel_search) || cpi->common.full_pixel==1) 5035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org *distortion2 = vp8_get_inter_mbpred_error(x, 5045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 5055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sse, mv); 5065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org this_rd = RDCOST(x->rdmult, x->rddiv, rate2, *distortion2); 5085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 509d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING 510d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (cpi->oxcf.noise_sensitivity > 0) { 511d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org denoise_aggressive = 512d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) ? 1 : 0; 513d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 514d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif 515d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 51641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Adjust rd for ZEROMV and LAST, if LAST is the closest reference frame. 51741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (this_mode == ZEROMV && 51841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame == LAST_FRAME && 519d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (denoise_aggressive || cpi->closest_reference_frame == LAST_FRAME)) 520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org this_rd = ((int64_t)this_rd) * rd_adj / 100; 522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 5245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org check_for_encode_breakout(*sse, x); 5255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org return this_rd; 5265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 527167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void calculate_zeromv_rd_adjustment(VP8_COMP *cpi, MACROBLOCK *x, 529ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int *rd_adjustment) 530ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 531ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org MODE_INFO *mic = x->e_mbd.mode_info_context; 532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int_mv mv_l, mv_a, mv_al; 533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int local_motion_check = 0; 534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 535ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (cpi->lf_zeromv_pct > 40) 536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 537ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* left mb */ 538ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mic -= 1; 539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mv_l = mic->mbmi.mv; 540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mic->mbmi.ref_frame != INTRA_FRAME) 542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if( abs(mv_l.as_mv.row) < 8 && abs(mv_l.as_mv.col) < 8) 543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org local_motion_check++; 544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* above-left mb */ 546ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mic -= x->e_mbd.mode_info_stride; 547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mv_al = mic->mbmi.mv; 548ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mic->mbmi.ref_frame != INTRA_FRAME) 550ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if( abs(mv_al.as_mv.row) < 8 && abs(mv_al.as_mv.col) < 8) 551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org local_motion_check++; 552ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 553ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* above mb */ 554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mic += 1; 555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mv_a = mic->mbmi.mv; 556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mic->mbmi.ref_frame != INTRA_FRAME) 558ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if( abs(mv_a.as_mv.row) < 8 && abs(mv_a.as_mv.col) < 8) 559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org local_motion_check++; 560ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 561ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (((!x->e_mbd.mb_to_top_edge || !x->e_mbd.mb_to_left_edge) 562ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org && local_motion_check >0) || local_motion_check >2 ) 563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *rd_adjustment = 80; 564ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else if (local_motion_check > 0) 565ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *rd_adjustment = 90; 566ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 567ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 568ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, 570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_uvoffset, int *returnrate, 571167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int *returndistortion, int *returnintra, int mb_row, 572167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int mb_col) 573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *b = &x->block[0]; 575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d = &x->e_mbd.block[0]; 576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *xd = &x->e_mbd; 577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_MODE_INFO best_mbmode; 578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 579167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv best_ref_mv_sb[2]; 580167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv mode_mv_sb[2][MB_MODE_COUNT]; 581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv best_ref_mv; 582167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv *mode_mv; 583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_PREDICTION_MODE this_mode; 584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int num00; 585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mdcounts[4]; 586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int best_rd = INT_MAX; 587ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int rd_adjustment = 100; 588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int best_intra_rd = INT_MAX; 589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mode_index; 590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int rate; 591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int rate2; 592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int distortion2; 593167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int bestsme = INT_MAX; 594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int best_mode_index = 0; 59588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org unsigned int sse = UINT_MAX, best_rd_sse = UINT_MAX; 5965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING 59788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX; 5985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6001cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org int sf_improved_mv_pred = cpi->sf.improved_mv_pred; 601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv mvp; 602167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int saddone=0; 605ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* search range got from mv_pred(). It uses step_param levels. (0-7) */ 606ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int sr=0; 607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 608167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *plane[4][3]; 609167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int ref_frame_map[4]; 610167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int sign_bias = 0; 611167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 612167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 613167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dissim = INT_MAX; 614167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int parent_ref_frame = 0; 615ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int parent_ref_valid = cpi->oxcf.mr_encoder_id && cpi->mr_low_res_mv_avail; 616167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv parent_ref_mv; 617167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MB_PREDICTION_MODE parent_mode = 0; 618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 619ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_valid) 620ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 621ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int parent_ref_flag; 622ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 623167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org get_lower_res_motion_info(cpi, xd, &dissim, &parent_ref_frame, 624167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &parent_mode, &parent_ref_mv, mb_row, mb_col); 625ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 626ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* TODO(jkoleszar): The references available (ref_frame_flags) to the 627ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * lower res encoder should match those available to this encoder, but 628ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * there seems to be a situation where this mismatch can happen in the 629ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * case of frame dropping and temporal layers. For example, 630ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * GOLD being disallowed in ref_frame_flags, but being returned as 631ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * parent_ref_frame. 632ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * 633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * In this event, take the conservative approach of disabling the 634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * lower res info for this MB. 635ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 636ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org parent_ref_flag = 0; 637ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_frame == LAST_FRAME) 638ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org parent_ref_flag = (cpi->ref_frame_flags & VP8_LAST_FRAME); 639ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else if (parent_ref_frame == GOLDEN_FRAME) 640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org parent_ref_flag = (cpi->ref_frame_flags & VP8_GOLD_FRAME); 641ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else if (parent_ref_frame == ALTREF_FRAME) 642ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org parent_ref_flag = (cpi->ref_frame_flags & VP8_ALTR_FRAME); 643ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org //assert(!parent_ref_frame || parent_ref_flag); 645ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_frame && !parent_ref_flag) 646ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org parent_ref_valid = 0; 647ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 648167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 650167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv = mode_mv_sb[sign_bias]; 651167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org best_ref_mv.as_int = 0; 652167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memset(mode_mv_sb, 0, sizeof(mode_mv_sb)); 653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 655167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Setup search priorities */ 656ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTI_RES_ENCODING 657ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_valid && parent_ref_frame && dissim < 8) 658ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 659ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_frame_map[0] = -1; 660ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_frame_map[1] = parent_ref_frame; 661ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_frame_map[2] = -1; 662ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_frame_map[3] = -1; 663ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } else 664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 665167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org get_reference_search_order(cpi, ref_frame_map); 666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 667167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Check to see if there is at least 1 valid reference frame that we need 668167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * to calculate near_mvs. 669167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 670167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (ref_frame_map[1] > 0) 671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 672167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sign_bias = vp8_find_near_mvs_bias(&x->e_mbd, 673167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.mode_info_context, 674167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv_sb, 675167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org best_ref_mv_sb, 676167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mdcounts, 677167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ref_frame_map[1], 678167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->common.ref_frame_sign_bias); 679167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 680167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv = mode_mv_sb[sign_bias]; 681167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 684167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); 685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 686ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Count of the number of MBs tested so far this frame */ 687d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->mbs_tested_so_far++; 688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *returnintra = INT_MAX; 690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->skip = 0; 691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 694ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* If the frame has big static background and current MB is in low 695ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * motion area, its mode decision is biased to ZEROMV mode. 696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org calculate_zeromv_rd_adjustment(cpi, x, &rd_adjustment); 698ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 69941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_TEMPORAL_DENOISING 70041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (cpi->oxcf.noise_sensitivity) { 70141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org rd_adjustment = (int)(rd_adjustment * 70241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org cpi->denoiser.denoise_pars.pickmode_mv_bias / 100); 70341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 70441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 70541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* if we encode a new mv this is important 707ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * find the best new motion vector 708ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mode_index = 0; mode_index < MAX_MODES; mode_index++) 710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int frame_cost; 712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int this_rd = INT_MAX; 713167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; 714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 715d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if (best_rd <= x->rd_threshes[mode_index]) 716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 718167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (this_ref_frame < 0) 719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 721167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 722167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 723ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* everything but intra */ 724167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->e_mbd.mode_info_context->mbmi.ref_frame) 725167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 726167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 727167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 728167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 729167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 730167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) 731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 732167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; 733167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv = mode_mv_sb[sign_bias]; 734167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 735167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 736167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 737167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 738ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_valid) 739167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 740167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (vp8_mode_order[mode_index] == NEARESTMV && 741167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEARESTMV].as_int ==0) 742167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org continue; 743167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (vp8_mode_order[mode_index] == NEARMV && 744167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEARMV].as_int ==0) 745167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org continue; 746167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 747167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (vp8_mode_order[mode_index] == NEWMV && parent_mode == ZEROMV 748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org && best_ref_mv.as_int==0) 749167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org continue; 750167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if(vp8_mode_order[mode_index] == NEWMV && dissim==0 751167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org && best_ref_mv.as_int==parent_ref_mv.as_int) 752167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org continue; 753167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 754167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 755167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 756167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 757167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Check to see if the testing frequency for this mode is at its max 758167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * If so then prevent it from being tested and increase the threshold 759167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * for its testing */ 760d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if (x->mode_test_hit_counts[mode_index] && 761167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->mode_check_freq[mode_index] > 1)) 762167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 763d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if (x->mbs_tested_so_far <= (cpi->mode_check_freq[mode_index] * 764d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->mode_test_hit_counts[mode_index])) 765167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 766167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Increase the threshold for coding this mode to make it less 767167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * likely to be chosen */ 768d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] += 4; 769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 770d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 771d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 773d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_threshes[mode_index] = 774167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->rd_baseline_thresh[mode_index] >> 7) * 775d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index]; 776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 780167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* We have now reached the point where we are going to test the current 781167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * mode so increment the counter for the number of times it has been 782167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * tested */ 783d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->mode_test_hit_counts[mode_index] ++; 784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate2 = 0; 786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org distortion2 = 0; 787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_mode = vp8_mode_order[mode_index]; 789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mode = this_mode; 791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 793167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Work out the cost assosciated with selecting the reference frame */ 794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org frame_cost = 7955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; 796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate2 += frame_cost; 797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 798167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame, 799167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * unless ARNR filtering is enabled in which case we want 800167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * an unfiltered alternative */ 801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) 802474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 803167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (this_mode != ZEROMV || 804167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) 805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org switch (this_mode) 809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case B_PRED: 811167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Pass best so far to pick_intra4x4mby_modes to use as breakout */ 8125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion2 = best_rd_sse; 8135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pick_intra4x4mby_modes(x, &rate, &distortion2); 814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (distortion2 == INT_MAX) 816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rd = INT_MAX; 818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate2 += rate; 8225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion2 = vp8_variance16x16( 823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *(b->base_src), b->src_stride, 824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.predictor, 16, &sse); 825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); 826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (this_rd < best_intra_rd) 828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_intra_rd = this_rd; 830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *returnintra = distortion2; 831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case SPLITMV: 837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 838ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Split MV modes currently not supported when RD is not enabled. */ 839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case DC_PRED: 842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case V_PRED: 843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case H_PRED: 844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case TM_PRED: 8455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mby_s(xd, 8465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - xd->dst.y_stride, 8475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - 1, 8485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride, 8495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->predictor, 8505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16); 8515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion2 = vp8_variance16x16 852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (*(b->base_src), b->src_stride, 853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.predictor, 16, &sse); 854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode]; 855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); 856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (this_rd < best_intra_rd) 858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_intra_rd = this_rd; 860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *returnintra = distortion2; 861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 864474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case NEWMV: 865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int thissme; 867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int step_param; 868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int further_steps; 869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int n = 0; 870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int sadpb = x->sadperbit16; 871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int_mv mvp_full; 872474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 873167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; 874167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; 875167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int col_max = (best_ref_mv.as_mv.col>>3) 876167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + MAX_FULL_PEL_VAL; 877167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int row_max = (best_ref_mv.as_mv.row>>3) 878167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + MAX_FULL_PEL_VAL; 879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int tmp_col_min = x->mv_col_min; 881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int tmp_col_max = x->mv_col_max; 882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int tmp_row_min = x->mv_row_min; 883474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int tmp_row_max = x->mv_row_max; 884474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1; 886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 887ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Further step/diamond searches as necessary */ 888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org step_param = cpi->sf.first_step + speed_adjust; 889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 890167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 891ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* If lower-res drops this frame, then higher-res encoder does 892ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org motion search without any previous knowledge. Also, since 893ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org last frame motion info is not stored, then we can not 894ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org use improved_mv_pred. */ 895ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (cpi->oxcf.mr_encoder_id && !parent_ref_valid) 8961cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org sf_improved_mv_pred = 0; 897ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 898ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_valid && parent_ref_frame) 899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 900ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Use parent MV as predictor. Adjust search range 901ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * accordingly. 902ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 903167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp.as_int = parent_ref_mv.as_int; 904167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.col = parent_ref_mv.as_mv.col>>3; 905167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.row = parent_ref_mv.as_mv.row>>3; 906167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 907167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(dissim <=32) step_param += 3; 908167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if(dissim <=128) step_param += 2; 909167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else step_param += 1; 910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }else 911167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 9131cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org if(sf_improved_mv_pred) 914167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 915167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(!saddone) 916167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 917167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); 918167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org saddone = 1; 919167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 921167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, 922167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &mvp,x->e_mbd.mode_info_context->mbmi.ref_frame, 923167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->common.ref_frame_sign_bias, &sr, 924167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &near_sadidx[0]); 925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 926167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sr += speed_adjust; 927ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* adjust search range according to sr from mv prediction */ 928167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(sr > step_param) 929167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org step_param = sr; 930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 931167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.col = mvp.as_mv.col>>3; 932167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.row = mvp.as_mv.row>>3; 933167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org }else 934167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 935167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp.as_int = best_ref_mv.as_int; 936167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3; 937167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3; 938167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 940167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 941167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 942ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (parent_ref_valid && parent_ref_frame && dissim <= 2 && 943167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MAX(abs(best_ref_mv.as_mv.row - parent_ref_mv.as_mv.row), 944167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org abs(best_ref_mv.as_mv.col - parent_ref_mv.as_mv.col)) <= 4) 945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 946167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org d->bmi.mv.as_int = mvp_full.as_int; 947167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEWMV].as_int = mvp_full.as_int; 948474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 949167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, 950167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->errorperbit, 951167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 952167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->mb.mvcost, 953167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &distortion2,&sse); 954167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org }else 955167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 956167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 957167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Get intersection of UMV window and valid MV window to 958167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * reduce # of checks in diamond search. */ 959167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mv_col_min < col_min ) 960167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_col_min = col_min; 961167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mv_col_max > col_max ) 962167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_col_max = col_max; 963167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mv_row_min < row_min ) 964167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_row_min = row_min; 965167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mv_row_max > row_max ) 966167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_row_max = row_max; 967167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 968167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org further_steps = (cpi->Speed >= 8)? 969167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 0: (cpi->sf.max_step_search_steps - 1 - step_param); 970167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 971167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (cpi->sf.search_method == HEX) 972167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 973167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_MULTI_RES_ENCODING 974167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* TODO: In higher-res pick_inter_mode, step_param is used to 975167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * modify hex search range. Here, set step_param to 0 not to 976167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * change the behavior in lowest-resolution encoder. 977167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * Will improve it later. 978167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 979ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Set step_param to 0 to ensure large-range motion search 980ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org when encoder drops this frame at lower-resolution. 981ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 982ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!parent_ref_valid) 983167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org step_param = 0; 984167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 985167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, 986167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org step_param, sadpb, 987167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 988167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mvsadcost, x->mvcost, &best_ref_mv); 989167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 990167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 991167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 992167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 993167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, 994167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &d->bmi.mv, step_param, sadpb, &num00, 995167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 996167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mvcost, &best_ref_mv); 997167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 999ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Further step/diamond searches as necessary */ 1000167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org n = num00; 1001167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org num00 = 0; 1002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1003167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org while (n < further_steps) 1004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1005167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org n++; 1006167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1007167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (num00) 1008167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org num00--; 1009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1011167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org thissme = 1012167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->diamond_search_sad(x, b, d, &mvp_full, 1013167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &d->bmi.mv, 1014167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org step_param + n, 1015167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sadpb, &num00, 1016167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 1017167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mvcost, &best_ref_mv); 1018167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (thissme < bestsme) 1019167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1020167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org bestsme = thissme; 1021167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 1022167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1023167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 1024167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1025167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org d->bmi.mv.as_int = mode_mv[NEWMV].as_int; 1026167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1031167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_col_min = tmp_col_min; 1032167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_col_max = tmp_col_max; 1033167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_row_min = tmp_row_min; 1034167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->mv_row_max = tmp_row_max; 1035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1036167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (bestsme < INT_MAX) 1037167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, 1038167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org &best_ref_mv, x->errorperbit, 1039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org &cpi->fn_ptr[BLOCK_16X16], 1040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cpi->mb.mvcost, 1041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org &distortion2,&sse); 1042167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1046ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* mv cost; */ 1047167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, 1048167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org cpi->mb.mvcost, 128); 1049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case NEARESTMV: 1052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case NEARMV: 1053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mode_mv[this_mode].as_int == 0) 1055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 1056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org case ZEROMV: 1058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1059167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Trap vectors that reach beyond the UMV borders 1060167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * Note that ALL New MV, Nearest MV Near MV and Zero MV code drops 1061167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * through to this point because of the lack of break statements 1062167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * in the previous two cases. 1063167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 1064167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || 1065167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || 1066167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || 1067167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) 1068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 1069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org rate2 += vp8_cost_mv_ref(this_mode, mdcounts); 1071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mv.as_int = 1072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_mv[this_mode].as_int; 1073ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x, 1074ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org rd_adjustment); 1075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 10765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org break; 10775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org default: 10785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org break; 10795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 1080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 10815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING 10825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cpi->oxcf.noise_sensitivity) 10835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 1084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1085ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Store for later use by denoiser. */ 10865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (this_mode == ZEROMV && sse < zero_mv_sse ) 1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 10885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org zero_mv_sse = sse; 10895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_zeromv_reference_frame = 10905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame; 1091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1093ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Store the best NEWMV in x for later use in the denoiser. */ 10945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && 10955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sse < best_sse) 10965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 10975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org best_sse = sse; 10985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_sse_inter_mode = NEWMV; 10995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv; 11005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->need_to_clamp_best_mvs = 11015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs; 11025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_reference_frame = 11035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame; 11045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 11065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (this_rd < best_rd || x->skip) 1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Note index of best mode */ 1111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_mode_index = mode_index; 1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *returnrate = rate2; 1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *returndistortion = distortion2; 11155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org best_rd_sse = sse; 1116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_rd = this_rd; 1117167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, 1118167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sizeof(MB_MODE_INFO)); 1119167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1120167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Testing this mode gave rise to an improvement in best error 1121167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * score. Lower threshold a bit for next time 1122167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 1123d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] = 1124d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? 1125d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; 1126d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_threshes[mode_index] = 1127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->rd_baseline_thresh[mode_index] >> 7) * 1128d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index]; 1129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1131167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* If the mode did not help improve the best error case then raise the 1132167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * threshold for testing that mode next time around. 1133167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 1134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1136d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] += 4; 1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1138d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 1139d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1141d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_threshes[mode_index] = 1142167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->rd_baseline_thresh[mode_index] >> 7) * 1143d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[mode_index]; 1144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->skip) 1147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 1148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Reduce the activation RD thresholds for the best choice mode */ 1151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) 1152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1153d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 3); 1154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1155d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[best_mode_index] = 1156d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org (x->rd_thresh_mult[best_mode_index] 1157167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org >= (MIN_THRESHMULT + best_adjustment)) ? 1158d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[best_mode_index] - best_adjustment : 1159167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MIN_THRESHMULT; 1160d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_threshes[best_mode_index] = 1161167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->rd_baseline_thresh[best_mode_index] >> 7) * 1162d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->rd_thresh_mult[best_mode_index]; 1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int this_rdbin = (*returndistortion >> 7); 1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (this_rdbin >= 1024) 1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rdbin = 1023; 1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1174d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org x->error_bins[this_rdbin] ++; 1175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING 11785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cpi->oxcf.noise_sensitivity) 11795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 118088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int block_index = mb_row * cpi->common.mb_cols + mb_col; 11815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (x->best_sse_inter_mode == DC_PRED) 11825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 1183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* No best MV found. */ 11845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_sse_inter_mode = best_mbmode.mode; 11855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_sse_mv = best_mbmode.mv; 11865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->need_to_clamp_best_mvs = best_mbmode.need_to_clamp_mvs; 11875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_reference_frame = best_mbmode.ref_frame; 11885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org best_sse = best_rd_sse; 11895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 1190118f379ec73bf762ee63784bc5f41ffd41107470johannkoenig@chromium.org x->increase_denoising = 0; 11915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, 119288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org recon_yoffset, recon_uvoffset, 119388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &cpi->common.lf_info, mb_row, mb_col, 119441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org block_index); 11955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Reevaluate ZEROMV after denoising. */ 11975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (best_mbmode.ref_frame == INTRA_FRAME && 11985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->best_zeromv_reference_frame != INTRA_FRAME) 11995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int this_rd = 0; 12015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int this_ref_frame = x->best_zeromv_reference_frame; 12025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org rate2 = x->ref_frame_cost[this_ref_frame] + 12035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_cost_mv_ref(ZEROMV, mdcounts); 12045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion2 = 0; 12055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* set up the proper prediction buffers for the frame */ 12075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 12085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 12095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 12105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 12115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 12135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 12145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 1215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x, 1216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org rd_adjustment); 12175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (this_rd < best_rd) 12195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 12205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, 12215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sizeof(MB_MODE_INFO)); 12225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 12255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 12265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 12275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cpi->is_src_frame_alt_ref && 1229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) 1230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 1232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; 1233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 1234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 1235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = 1236167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (cpi->common.mb_no_coeff_skip); 1237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.partitioning = 0; 1238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return; 1240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1242167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* set to the best mb mode, this copy can be skip if x->skip since it 1243167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * already has the right content */ 1244167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!x->skip) 1245167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, 1246167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org sizeof(MB_MODE_INFO)); 1247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (best_mbmode.mode <= B_PRED) 1249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* set mode_info_context->mbmi.uv_mode */ 1251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pick_intra_mbuv_mode(x); 1252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (sign_bias 1255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) 1256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; 1257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1258d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org update_mvcount(x, &best_ref_mv); 1259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1262d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgvoid vp8_pick_intra_mode(MACROBLOCK *x, int *rate_) 1263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 1264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int error4x4, error16x16 = INT_MAX; 1265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int rate, best_rate = 0, distortion, best_sse; 1266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_PREDICTION_MODE mode, best_mode = DC_PRED; 1267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int this_rd; 1268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int sse; 1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *b = &x->block[0]; 12705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MACROBLOCKD *xd = &x->e_mbd; 1271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.ref_frame = INTRA_FRAME; 1273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pick_intra_mbuv_mode(x); 1275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mode = DC_PRED; mode <= TM_PRED; mode ++) 1277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 12785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mode = mode; 12795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mby_s(xd, 12805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - xd->dst.y_stride, 12815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - 1, 12825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride, 12835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->predictor, 12845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 16); 12855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org distortion = vp8_variance16x16 12865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (*(b->base_src), b->src_stride, xd->predictor, 16, &sse); 12875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org rate = x->mbmode_cost[xd->frame_type][mode]; 1288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 1289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (error16x16 > this_rd) 1291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org error16x16 = this_rd; 1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_mode = mode; 1294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_sse = sse; 1295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_rate = rate; 1296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 12985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mode = best_mode; 1299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 13005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org error4x4 = pick_intra4x4mby_modes(x, &rate, 1301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org &best_sse); 1302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (error4x4 < error16x16) 1303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 13045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mode = B_PRED; 1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org best_rate = rate; 1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *rate_ = best_rate; 1309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1310