11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h> 131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "modecosts.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "encodeintra.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/entropymode.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "pickinter.h" 191b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/findnearmv.h" 201b362b15af34006e6a11974088a46d42b903418eJohann#include "encodemb.h" 211b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconinter.h" 221b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/variance.h" 241b362b15af34006e6a11974088a46d42b903418eJohann#include "mcomp.h" 251b362b15af34006e6a11974088a46d42b903418eJohann#include "rdopt.h" 261b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 271b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 281b362b15af34006e6a11974088a46d42b903418eJohann#include "denoising.h" 291b362b15af34006e6a11974088a46d42b903418eJohann#endif 301b362b15af34006e6a11974088a46d42b903418eJohann 311b362b15af34006e6a11974088a46d42b903418eJohannextern int VP8_UVSSE(MACROBLOCK *x); 321b362b15af34006e6a11974088a46d42b903418eJohann 331b362b15af34006e6a11974088a46d42b903418eJohann#ifdef SPEEDSTATS 341b362b15af34006e6a11974088a46d42b903418eJohannextern unsigned int cnt_pm; 351b362b15af34006e6a11974088a46d42b903418eJohann#endif 361b362b15af34006e6a11974088a46d42b903418eJohann 371b362b15af34006e6a11974088a46d42b903418eJohannextern const int vp8_ref_frame_order[MAX_MODES]; 381b362b15af34006e6a11974088a46d42b903418eJohannextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; 391b362b15af34006e6a11974088a46d42b903418eJohann 401b362b15af34006e6a11974088a46d42b903418eJohannextern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]); 411b362b15af34006e6a11974088a46d42b903418eJohann 421b362b15af34006e6a11974088a46d42b903418eJohann 431b362b15af34006e6a11974088a46d42b903418eJohannint vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, 441b362b15af34006e6a11974088a46d42b903418eJohann int_mv *bestmv, int_mv *ref_mv, 451b362b15af34006e6a11974088a46d42b903418eJohann int error_per_bit, 461b362b15af34006e6a11974088a46d42b903418eJohann const vp8_variance_fn_ptr_t *vfp, 471b362b15af34006e6a11974088a46d42b903418eJohann int *mvcost[2], int *distortion, 481b362b15af34006e6a11974088a46d42b903418eJohann unsigned int *sse) 491b362b15af34006e6a11974088a46d42b903418eJohann{ 501b362b15af34006e6a11974088a46d42b903418eJohann (void) b; 511b362b15af34006e6a11974088a46d42b903418eJohann (void) d; 521b362b15af34006e6a11974088a46d42b903418eJohann (void) ref_mv; 531b362b15af34006e6a11974088a46d42b903418eJohann (void) error_per_bit; 541b362b15af34006e6a11974088a46d42b903418eJohann (void) vfp; 551b362b15af34006e6a11974088a46d42b903418eJohann (void) mvcost; 561b362b15af34006e6a11974088a46d42b903418eJohann (void) distortion; 571b362b15af34006e6a11974088a46d42b903418eJohann (void) sse; 581b362b15af34006e6a11974088a46d42b903418eJohann bestmv->as_mv.row <<= 3; 591b362b15af34006e6a11974088a46d42b903418eJohann bestmv->as_mv.col <<= 3; 601b362b15af34006e6a11974088a46d42b903418eJohann return 0; 611b362b15af34006e6a11974088a46d42b903418eJohann} 621b362b15af34006e6a11974088a46d42b903418eJohann 631b362b15af34006e6a11974088a46d42b903418eJohann 641b362b15af34006e6a11974088a46d42b903418eJohannint vp8_get_inter_mbpred_error(MACROBLOCK *mb, 651b362b15af34006e6a11974088a46d42b903418eJohann const vp8_variance_fn_ptr_t *vfp, 661b362b15af34006e6a11974088a46d42b903418eJohann unsigned int *sse, 671b362b15af34006e6a11974088a46d42b903418eJohann int_mv this_mv) 681b362b15af34006e6a11974088a46d42b903418eJohann{ 691b362b15af34006e6a11974088a46d42b903418eJohann 701b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &mb->block[0]; 711b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d = &mb->e_mbd.block[0]; 721b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *what = (*(b->base_src) + b->src); 731b362b15af34006e6a11974088a46d42b903418eJohann int what_stride = b->src_stride; 741b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = mb->e_mbd.pre.y_stride; 751b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *in_what = mb->e_mbd.pre.y_buffer + d->offset ; 761b362b15af34006e6a11974088a46d42b903418eJohann int in_what_stride = pre_stride; 771b362b15af34006e6a11974088a46d42b903418eJohann int xoffset = this_mv.as_mv.col & 7; 781b362b15af34006e6a11974088a46d42b903418eJohann int yoffset = this_mv.as_mv.row & 7; 791b362b15af34006e6a11974088a46d42b903418eJohann 801b362b15af34006e6a11974088a46d42b903418eJohann in_what += (this_mv.as_mv.row >> 3) * pre_stride + (this_mv.as_mv.col >> 3); 811b362b15af34006e6a11974088a46d42b903418eJohann 821b362b15af34006e6a11974088a46d42b903418eJohann if (xoffset | yoffset) 831b362b15af34006e6a11974088a46d42b903418eJohann { 841b362b15af34006e6a11974088a46d42b903418eJohann return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what, what_stride, sse); 851b362b15af34006e6a11974088a46d42b903418eJohann } 861b362b15af34006e6a11974088a46d42b903418eJohann else 871b362b15af34006e6a11974088a46d42b903418eJohann { 881b362b15af34006e6a11974088a46d42b903418eJohann return vfp->vf(what, what_stride, in_what, in_what_stride, sse); 891b362b15af34006e6a11974088a46d42b903418eJohann } 901b362b15af34006e6a11974088a46d42b903418eJohann 911b362b15af34006e6a11974088a46d42b903418eJohann} 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohann 941b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_get4x4sse_cs_c 951b362b15af34006e6a11974088a46d42b903418eJohann( 961b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *src_ptr, 971b362b15af34006e6a11974088a46d42b903418eJohann int source_stride, 981b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *ref_ptr, 991b362b15af34006e6a11974088a46d42b903418eJohann int recon_stride 1001b362b15af34006e6a11974088a46d42b903418eJohann) 1011b362b15af34006e6a11974088a46d42b903418eJohann{ 1021b362b15af34006e6a11974088a46d42b903418eJohann int distortion = 0; 1031b362b15af34006e6a11974088a46d42b903418eJohann int r, c; 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 4; r++) 1061b362b15af34006e6a11974088a46d42b903418eJohann { 1071b362b15af34006e6a11974088a46d42b903418eJohann for (c = 0; c < 4; c++) 1081b362b15af34006e6a11974088a46d42b903418eJohann { 1091b362b15af34006e6a11974088a46d42b903418eJohann int diff = src_ptr[c] - ref_ptr[c]; 1101b362b15af34006e6a11974088a46d42b903418eJohann distortion += diff * diff; 1111b362b15af34006e6a11974088a46d42b903418eJohann } 1121b362b15af34006e6a11974088a46d42b903418eJohann 1131b362b15af34006e6a11974088a46d42b903418eJohann src_ptr += source_stride; 1141b362b15af34006e6a11974088a46d42b903418eJohann ref_ptr += recon_stride; 1151b362b15af34006e6a11974088a46d42b903418eJohann } 1161b362b15af34006e6a11974088a46d42b903418eJohann 1171b362b15af34006e6a11974088a46d42b903418eJohann return distortion; 1181b362b15af34006e6a11974088a46d42b903418eJohann} 1191b362b15af34006e6a11974088a46d42b903418eJohann 1201b362b15af34006e6a11974088a46d42b903418eJohannstatic int get_prediction_error(BLOCK *be, BLOCKD *b) 1211b362b15af34006e6a11974088a46d42b903418eJohann{ 1221b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *sptr; 1231b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dptr; 1241b362b15af34006e6a11974088a46d42b903418eJohann sptr = (*(be->base_src) + be->src); 1251b362b15af34006e6a11974088a46d42b903418eJohann dptr = b->predictor; 1261b362b15af34006e6a11974088a46d42b903418eJohann 1271b362b15af34006e6a11974088a46d42b903418eJohann return vp8_get4x4sse_cs(sptr, be->src_stride, dptr, 16); 1281b362b15af34006e6a11974088a46d42b903418eJohann 1291b362b15af34006e6a11974088a46d42b903418eJohann} 1301b362b15af34006e6a11974088a46d42b903418eJohann 1311b362b15af34006e6a11974088a46d42b903418eJohannstatic int pick_intra4x4block( 1321b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x, 1331b362b15af34006e6a11974088a46d42b903418eJohann int ib, 1341b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE *best_mode, 1351b362b15af34006e6a11974088a46d42b903418eJohann const int *mode_costs, 1361b362b15af34006e6a11974088a46d42b903418eJohann 1371b362b15af34006e6a11974088a46d42b903418eJohann int *bestrate, 1381b362b15af34006e6a11974088a46d42b903418eJohann int *bestdistortion) 1391b362b15af34006e6a11974088a46d42b903418eJohann{ 1401b362b15af34006e6a11974088a46d42b903418eJohann 1411b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b = &x->e_mbd.block[ib]; 1421b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be = &x->block[ib]; 1431b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->e_mbd.dst.y_stride; 1441b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 1451b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE mode; 1461b362b15af34006e6a11974088a46d42b903418eJohann int best_rd = INT_MAX; 1471b362b15af34006e6a11974088a46d42b903418eJohann int rate; 1481b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 1491b362b15af34006e6a11974088a46d42b903418eJohann 1501b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *Above = dst - dst_stride; 1511b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *yleft = dst - 1; 1521b362b15af34006e6a11974088a46d42b903418eJohann unsigned char top_left = Above[-1]; 1531b362b15af34006e6a11974088a46d42b903418eJohann 1541b362b15af34006e6a11974088a46d42b903418eJohann for (mode = B_DC_PRED; mode <= B_HE_PRED; mode++) 1551b362b15af34006e6a11974088a46d42b903418eJohann { 1561b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 1571b362b15af34006e6a11974088a46d42b903418eJohann 1581b362b15af34006e6a11974088a46d42b903418eJohann rate = mode_costs[mode]; 1591b362b15af34006e6a11974088a46d42b903418eJohann 1601b362b15af34006e6a11974088a46d42b903418eJohann vp8_intra4x4_predict(Above, yleft, dst_stride, mode, 1611b362b15af34006e6a11974088a46d42b903418eJohann b->predictor, 16, top_left); 1621b362b15af34006e6a11974088a46d42b903418eJohann distortion = get_prediction_error(be, b); 1631b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 1641b362b15af34006e6a11974088a46d42b903418eJohann 1651b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd) 1661b362b15af34006e6a11974088a46d42b903418eJohann { 1671b362b15af34006e6a11974088a46d42b903418eJohann *bestrate = rate; 1681b362b15af34006e6a11974088a46d42b903418eJohann *bestdistortion = distortion; 1691b362b15af34006e6a11974088a46d42b903418eJohann best_rd = this_rd; 1701b362b15af34006e6a11974088a46d42b903418eJohann *best_mode = mode; 1711b362b15af34006e6a11974088a46d42b903418eJohann } 1721b362b15af34006e6a11974088a46d42b903418eJohann } 1731b362b15af34006e6a11974088a46d42b903418eJohann 1741b362b15af34006e6a11974088a46d42b903418eJohann b->bmi.as_mode = *best_mode; 1751b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra4x4block(x, ib); 1761b362b15af34006e6a11974088a46d42b903418eJohann return best_rd; 1771b362b15af34006e6a11974088a46d42b903418eJohann} 1781b362b15af34006e6a11974088a46d42b903418eJohann 1791b362b15af34006e6a11974088a46d42b903418eJohann 1801b362b15af34006e6a11974088a46d42b903418eJohannstatic int pick_intra4x4mby_modes 1811b362b15af34006e6a11974088a46d42b903418eJohann( 1821b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *mb, 1831b362b15af34006e6a11974088a46d42b903418eJohann int *Rate, 1841b362b15af34006e6a11974088a46d42b903418eJohann int *best_dist 1851b362b15af34006e6a11974088a46d42b903418eJohann) 1861b362b15af34006e6a11974088a46d42b903418eJohann{ 1871b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = &mb->e_mbd; 1881b362b15af34006e6a11974088a46d42b903418eJohann int i; 1891b362b15af34006e6a11974088a46d42b903418eJohann int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; 1901b362b15af34006e6a11974088a46d42b903418eJohann int error; 1911b362b15af34006e6a11974088a46d42b903418eJohann int distortion = 0; 1921b362b15af34006e6a11974088a46d42b903418eJohann const int *bmode_costs; 1931b362b15af34006e6a11974088a46d42b903418eJohann 1941b362b15af34006e6a11974088a46d42b903418eJohann intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 1951b362b15af34006e6a11974088a46d42b903418eJohann 1961b362b15af34006e6a11974088a46d42b903418eJohann bmode_costs = mb->inter_bmode_costs; 1971b362b15af34006e6a11974088a46d42b903418eJohann 1981b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 1991b362b15af34006e6a11974088a46d42b903418eJohann { 2001b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *const mic = xd->mode_info_context; 2011b362b15af34006e6a11974088a46d42b903418eJohann const int mis = xd->mode_info_stride; 2021b362b15af34006e6a11974088a46d42b903418eJohann 2031b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); 2041b362b15af34006e6a11974088a46d42b903418eJohann int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d); 2051b362b15af34006e6a11974088a46d42b903418eJohann 2061b362b15af34006e6a11974088a46d42b903418eJohann if (mb->e_mbd.frame_type == KEY_FRAME) 2071b362b15af34006e6a11974088a46d42b903418eJohann { 2081b362b15af34006e6a11974088a46d42b903418eJohann const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); 2091b362b15af34006e6a11974088a46d42b903418eJohann const B_PREDICTION_MODE L = left_block_mode(mic, i); 2101b362b15af34006e6a11974088a46d42b903418eJohann 2111b362b15af34006e6a11974088a46d42b903418eJohann bmode_costs = mb->bmode_costs[A][L]; 2121b362b15af34006e6a11974088a46d42b903418eJohann } 2131b362b15af34006e6a11974088a46d42b903418eJohann 2141b362b15af34006e6a11974088a46d42b903418eJohann 2151b362b15af34006e6a11974088a46d42b903418eJohann pick_intra4x4block(mb, i, &best_mode, bmode_costs, &r, &d); 2161b362b15af34006e6a11974088a46d42b903418eJohann 2171b362b15af34006e6a11974088a46d42b903418eJohann cost += r; 2181b362b15af34006e6a11974088a46d42b903418eJohann distortion += d; 2191b362b15af34006e6a11974088a46d42b903418eJohann mic->bmi[i].as_mode = best_mode; 2201b362b15af34006e6a11974088a46d42b903418eJohann 2211b362b15af34006e6a11974088a46d42b903418eJohann /* Break out case where we have already exceeded best so far value 2221b362b15af34006e6a11974088a46d42b903418eJohann * that was passed in 2231b362b15af34006e6a11974088a46d42b903418eJohann */ 2241b362b15af34006e6a11974088a46d42b903418eJohann if (distortion > *best_dist) 2251b362b15af34006e6a11974088a46d42b903418eJohann break; 2261b362b15af34006e6a11974088a46d42b903418eJohann } 2271b362b15af34006e6a11974088a46d42b903418eJohann 2281b362b15af34006e6a11974088a46d42b903418eJohann *Rate = cost; 2291b362b15af34006e6a11974088a46d42b903418eJohann 2301b362b15af34006e6a11974088a46d42b903418eJohann if (i == 16) 2311b362b15af34006e6a11974088a46d42b903418eJohann { 2321b362b15af34006e6a11974088a46d42b903418eJohann *best_dist = distortion; 2331b362b15af34006e6a11974088a46d42b903418eJohann error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion); 2341b362b15af34006e6a11974088a46d42b903418eJohann } 2351b362b15af34006e6a11974088a46d42b903418eJohann else 2361b362b15af34006e6a11974088a46d42b903418eJohann { 2371b362b15af34006e6a11974088a46d42b903418eJohann *best_dist = INT_MAX; 2381b362b15af34006e6a11974088a46d42b903418eJohann error = INT_MAX; 2391b362b15af34006e6a11974088a46d42b903418eJohann } 2401b362b15af34006e6a11974088a46d42b903418eJohann 2411b362b15af34006e6a11974088a46d42b903418eJohann return error; 2421b362b15af34006e6a11974088a46d42b903418eJohann} 2431b362b15af34006e6a11974088a46d42b903418eJohann 2441b362b15af34006e6a11974088a46d42b903418eJohannstatic void pick_intra_mbuv_mode(MACROBLOCK *mb) 2451b362b15af34006e6a11974088a46d42b903418eJohann{ 2461b362b15af34006e6a11974088a46d42b903418eJohann 2471b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *x = &mb->e_mbd; 2481b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride; 2491b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride; 2501b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src); 2511b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src); 2521b362b15af34006e6a11974088a46d42b903418eJohann int uvsrc_stride = mb->block[16].src_stride; 2531b362b15af34006e6a11974088a46d42b903418eJohann unsigned char uleft_col[8]; 2541b362b15af34006e6a11974088a46d42b903418eJohann unsigned char vleft_col[8]; 2551b362b15af34006e6a11974088a46d42b903418eJohann unsigned char utop_left = uabove_row[-1]; 2561b362b15af34006e6a11974088a46d42b903418eJohann unsigned char vtop_left = vabove_row[-1]; 2571b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 2581b362b15af34006e6a11974088a46d42b903418eJohann int expected_udc; 2591b362b15af34006e6a11974088a46d42b903418eJohann int expected_vdc; 2601b362b15af34006e6a11974088a46d42b903418eJohann int shift; 2611b362b15af34006e6a11974088a46d42b903418eJohann int Uaverage = 0; 2621b362b15af34006e6a11974088a46d42b903418eJohann int Vaverage = 0; 2631b362b15af34006e6a11974088a46d42b903418eJohann int diff; 2641b362b15af34006e6a11974088a46d42b903418eJohann int pred_error[4] = {0, 0, 0, 0}, best_error = INT_MAX; 2651b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); 2661b362b15af34006e6a11974088a46d42b903418eJohann 2671b362b15af34006e6a11974088a46d42b903418eJohann 2681b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 8; i++) 2691b362b15af34006e6a11974088a46d42b903418eJohann { 2701b362b15af34006e6a11974088a46d42b903418eJohann uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1]; 2711b362b15af34006e6a11974088a46d42b903418eJohann vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1]; 2721b362b15af34006e6a11974088a46d42b903418eJohann } 2731b362b15af34006e6a11974088a46d42b903418eJohann 2741b362b15af34006e6a11974088a46d42b903418eJohann if (!x->up_available && !x->left_available) 2751b362b15af34006e6a11974088a46d42b903418eJohann { 2761b362b15af34006e6a11974088a46d42b903418eJohann expected_udc = 128; 2771b362b15af34006e6a11974088a46d42b903418eJohann expected_vdc = 128; 2781b362b15af34006e6a11974088a46d42b903418eJohann } 2791b362b15af34006e6a11974088a46d42b903418eJohann else 2801b362b15af34006e6a11974088a46d42b903418eJohann { 2811b362b15af34006e6a11974088a46d42b903418eJohann shift = 2; 2821b362b15af34006e6a11974088a46d42b903418eJohann 2831b362b15af34006e6a11974088a46d42b903418eJohann if (x->up_available) 2841b362b15af34006e6a11974088a46d42b903418eJohann { 2851b362b15af34006e6a11974088a46d42b903418eJohann 2861b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 8; i++) 2871b362b15af34006e6a11974088a46d42b903418eJohann { 2881b362b15af34006e6a11974088a46d42b903418eJohann Uaverage += uabove_row[i]; 2891b362b15af34006e6a11974088a46d42b903418eJohann Vaverage += vabove_row[i]; 2901b362b15af34006e6a11974088a46d42b903418eJohann } 2911b362b15af34006e6a11974088a46d42b903418eJohann 2921b362b15af34006e6a11974088a46d42b903418eJohann shift ++; 2931b362b15af34006e6a11974088a46d42b903418eJohann 2941b362b15af34006e6a11974088a46d42b903418eJohann } 2951b362b15af34006e6a11974088a46d42b903418eJohann 2961b362b15af34006e6a11974088a46d42b903418eJohann if (x->left_available) 2971b362b15af34006e6a11974088a46d42b903418eJohann { 2981b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 8; i++) 2991b362b15af34006e6a11974088a46d42b903418eJohann { 3001b362b15af34006e6a11974088a46d42b903418eJohann Uaverage += uleft_col[i]; 3011b362b15af34006e6a11974088a46d42b903418eJohann Vaverage += vleft_col[i]; 3021b362b15af34006e6a11974088a46d42b903418eJohann } 3031b362b15af34006e6a11974088a46d42b903418eJohann 3041b362b15af34006e6a11974088a46d42b903418eJohann shift ++; 3051b362b15af34006e6a11974088a46d42b903418eJohann 3061b362b15af34006e6a11974088a46d42b903418eJohann } 3071b362b15af34006e6a11974088a46d42b903418eJohann 3081b362b15af34006e6a11974088a46d42b903418eJohann expected_udc = (Uaverage + (1 << (shift - 1))) >> shift; 3091b362b15af34006e6a11974088a46d42b903418eJohann expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift; 3101b362b15af34006e6a11974088a46d42b903418eJohann } 3111b362b15af34006e6a11974088a46d42b903418eJohann 3121b362b15af34006e6a11974088a46d42b903418eJohann 3131b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 8; i++) 3141b362b15af34006e6a11974088a46d42b903418eJohann { 3151b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < 8; j++) 3161b362b15af34006e6a11974088a46d42b903418eJohann { 3171b362b15af34006e6a11974088a46d42b903418eJohann 3181b362b15af34006e6a11974088a46d42b903418eJohann int predu = uleft_col[i] + uabove_row[j] - utop_left; 3191b362b15af34006e6a11974088a46d42b903418eJohann int predv = vleft_col[i] + vabove_row[j] - vtop_left; 3201b362b15af34006e6a11974088a46d42b903418eJohann int u_p, v_p; 3211b362b15af34006e6a11974088a46d42b903418eJohann 3221b362b15af34006e6a11974088a46d42b903418eJohann u_p = usrc_ptr[j]; 3231b362b15af34006e6a11974088a46d42b903418eJohann v_p = vsrc_ptr[j]; 3241b362b15af34006e6a11974088a46d42b903418eJohann 3251b362b15af34006e6a11974088a46d42b903418eJohann if (predu < 0) 3261b362b15af34006e6a11974088a46d42b903418eJohann predu = 0; 3271b362b15af34006e6a11974088a46d42b903418eJohann 3281b362b15af34006e6a11974088a46d42b903418eJohann if (predu > 255) 3291b362b15af34006e6a11974088a46d42b903418eJohann predu = 255; 3301b362b15af34006e6a11974088a46d42b903418eJohann 3311b362b15af34006e6a11974088a46d42b903418eJohann if (predv < 0) 3321b362b15af34006e6a11974088a46d42b903418eJohann predv = 0; 3331b362b15af34006e6a11974088a46d42b903418eJohann 3341b362b15af34006e6a11974088a46d42b903418eJohann if (predv > 255) 3351b362b15af34006e6a11974088a46d42b903418eJohann predv = 255; 3361b362b15af34006e6a11974088a46d42b903418eJohann 3371b362b15af34006e6a11974088a46d42b903418eJohann 3381b362b15af34006e6a11974088a46d42b903418eJohann diff = u_p - expected_udc; 3391b362b15af34006e6a11974088a46d42b903418eJohann pred_error[DC_PRED] += diff * diff; 3401b362b15af34006e6a11974088a46d42b903418eJohann diff = v_p - expected_vdc; 3411b362b15af34006e6a11974088a46d42b903418eJohann pred_error[DC_PRED] += diff * diff; 3421b362b15af34006e6a11974088a46d42b903418eJohann 3431b362b15af34006e6a11974088a46d42b903418eJohann 3441b362b15af34006e6a11974088a46d42b903418eJohann diff = u_p - uabove_row[j]; 3451b362b15af34006e6a11974088a46d42b903418eJohann pred_error[V_PRED] += diff * diff; 3461b362b15af34006e6a11974088a46d42b903418eJohann diff = v_p - vabove_row[j]; 3471b362b15af34006e6a11974088a46d42b903418eJohann pred_error[V_PRED] += diff * diff; 3481b362b15af34006e6a11974088a46d42b903418eJohann 3491b362b15af34006e6a11974088a46d42b903418eJohann 3501b362b15af34006e6a11974088a46d42b903418eJohann diff = u_p - uleft_col[i]; 3511b362b15af34006e6a11974088a46d42b903418eJohann pred_error[H_PRED] += diff * diff; 3521b362b15af34006e6a11974088a46d42b903418eJohann diff = v_p - vleft_col[i]; 3531b362b15af34006e6a11974088a46d42b903418eJohann pred_error[H_PRED] += diff * diff; 3541b362b15af34006e6a11974088a46d42b903418eJohann 3551b362b15af34006e6a11974088a46d42b903418eJohann 3561b362b15af34006e6a11974088a46d42b903418eJohann diff = u_p - predu; 3571b362b15af34006e6a11974088a46d42b903418eJohann pred_error[TM_PRED] += diff * diff; 3581b362b15af34006e6a11974088a46d42b903418eJohann diff = v_p - predv; 3591b362b15af34006e6a11974088a46d42b903418eJohann pred_error[TM_PRED] += diff * diff; 3601b362b15af34006e6a11974088a46d42b903418eJohann 3611b362b15af34006e6a11974088a46d42b903418eJohann 3621b362b15af34006e6a11974088a46d42b903418eJohann } 3631b362b15af34006e6a11974088a46d42b903418eJohann 3641b362b15af34006e6a11974088a46d42b903418eJohann usrc_ptr += uvsrc_stride; 3651b362b15af34006e6a11974088a46d42b903418eJohann vsrc_ptr += uvsrc_stride; 3661b362b15af34006e6a11974088a46d42b903418eJohann 3671b362b15af34006e6a11974088a46d42b903418eJohann if (i == 3) 3681b362b15af34006e6a11974088a46d42b903418eJohann { 3691b362b15af34006e6a11974088a46d42b903418eJohann usrc_ptr = (mb->block[18].src + *mb->block[18].base_src); 3701b362b15af34006e6a11974088a46d42b903418eJohann vsrc_ptr = (mb->block[22].src + *mb->block[22].base_src); 3711b362b15af34006e6a11974088a46d42b903418eJohann } 3721b362b15af34006e6a11974088a46d42b903418eJohann 3731b362b15af34006e6a11974088a46d42b903418eJohann 3741b362b15af34006e6a11974088a46d42b903418eJohann 3751b362b15af34006e6a11974088a46d42b903418eJohann } 3761b362b15af34006e6a11974088a46d42b903418eJohann 3771b362b15af34006e6a11974088a46d42b903418eJohann 3781b362b15af34006e6a11974088a46d42b903418eJohann for (i = DC_PRED; i <= TM_PRED; i++) 3791b362b15af34006e6a11974088a46d42b903418eJohann { 3801b362b15af34006e6a11974088a46d42b903418eJohann if (best_error > pred_error[i]) 3811b362b15af34006e6a11974088a46d42b903418eJohann { 3821b362b15af34006e6a11974088a46d42b903418eJohann best_error = pred_error[i]; 3831b362b15af34006e6a11974088a46d42b903418eJohann best_mode = (MB_PREDICTION_MODE)i; 3841b362b15af34006e6a11974088a46d42b903418eJohann } 3851b362b15af34006e6a11974088a46d42b903418eJohann } 3861b362b15af34006e6a11974088a46d42b903418eJohann 3871b362b15af34006e6a11974088a46d42b903418eJohann 3881b362b15af34006e6a11974088a46d42b903418eJohann mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode; 3891b362b15af34006e6a11974088a46d42b903418eJohann 3901b362b15af34006e6a11974088a46d42b903418eJohann} 3911b362b15af34006e6a11974088a46d42b903418eJohann 392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) 3931b362b15af34006e6a11974088a46d42b903418eJohann{ 3941b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 3951b362b15af34006e6a11974088a46d42b903418eJohann /* Split MV modes currently not supported when RD is nopt enabled, 3961b362b15af34006e6a11974088a46d42b903418eJohann * therefore, only need to modify MVcount in NEWMV mode. */ 3971b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.mode == NEWMV) 3981b362b15af34006e6a11974088a46d42b903418eJohann { 3991b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row - 4001b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv->as_mv.row) >> 1)]++; 4011b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col - 4021b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv->as_mv.col) >> 1)]++; 4031b362b15af34006e6a11974088a46d42b903418eJohann } 4041b362b15af34006e6a11974088a46d42b903418eJohann} 4051b362b15af34006e6a11974088a46d42b903418eJohann 4061b362b15af34006e6a11974088a46d42b903418eJohann 4071b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 4081b362b15af34006e6a11974088a46d42b903418eJohannstatic 4091b362b15af34006e6a11974088a46d42b903418eJohannvoid get_lower_res_motion_info(VP8_COMP *cpi, MACROBLOCKD *xd, int *dissim, 4101b362b15af34006e6a11974088a46d42b903418eJohann int *parent_ref_frame, 4111b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE *parent_mode, 4121b362b15af34006e6a11974088a46d42b903418eJohann int_mv *parent_ref_mv, int mb_row, int mb_col) 4131b362b15af34006e6a11974088a46d42b903418eJohann{ 4141b362b15af34006e6a11974088a46d42b903418eJohann LOWER_RES_MB_INFO* store_mode_info 4151b362b15af34006e6a11974088a46d42b903418eJohann = ((LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info)->mb_info; 4161b362b15af34006e6a11974088a46d42b903418eJohann unsigned int parent_mb_index; 4171b362b15af34006e6a11974088a46d42b903418eJohann 4181b362b15af34006e6a11974088a46d42b903418eJohann /* Consider different down_sampling_factor. */ 4191b362b15af34006e6a11974088a46d42b903418eJohann { 4201b362b15af34006e6a11974088a46d42b903418eJohann /* TODO: Removed the loop that supports special down_sampling_factor 4211b362b15af34006e6a11974088a46d42b903418eJohann * such as 2, 4, 8. Will revisit it if needed. 4221b362b15af34006e6a11974088a46d42b903418eJohann * Should also try using a look-up table to see if it helps 4231b362b15af34006e6a11974088a46d42b903418eJohann * performance. */ 4241b362b15af34006e6a11974088a46d42b903418eJohann int parent_mb_row, parent_mb_col; 4251b362b15af34006e6a11974088a46d42b903418eJohann 4261b362b15af34006e6a11974088a46d42b903418eJohann parent_mb_row = mb_row*cpi->oxcf.mr_down_sampling_factor.den 4271b362b15af34006e6a11974088a46d42b903418eJohann /cpi->oxcf.mr_down_sampling_factor.num; 4281b362b15af34006e6a11974088a46d42b903418eJohann parent_mb_col = mb_col*cpi->oxcf.mr_down_sampling_factor.den 4291b362b15af34006e6a11974088a46d42b903418eJohann /cpi->oxcf.mr_down_sampling_factor.num; 4301b362b15af34006e6a11974088a46d42b903418eJohann parent_mb_index = parent_mb_row*cpi->mr_low_res_mb_cols + parent_mb_col; 4311b362b15af34006e6a11974088a46d42b903418eJohann } 4321b362b15af34006e6a11974088a46d42b903418eJohann 4331b362b15af34006e6a11974088a46d42b903418eJohann /* Read lower-resolution mode & motion result from memory.*/ 4341b362b15af34006e6a11974088a46d42b903418eJohann *parent_ref_frame = store_mode_info[parent_mb_index].ref_frame; 4351b362b15af34006e6a11974088a46d42b903418eJohann *parent_mode = store_mode_info[parent_mb_index].mode; 4361b362b15af34006e6a11974088a46d42b903418eJohann *dissim = store_mode_info[parent_mb_index].dissim; 4371b362b15af34006e6a11974088a46d42b903418eJohann 4381b362b15af34006e6a11974088a46d42b903418eJohann /* For highest-resolution encoder, adjust dissim value. Lower its quality 4391b362b15af34006e6a11974088a46d42b903418eJohann * for good performance. */ 4401b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.mr_encoder_id == (cpi->oxcf.mr_total_resolutions - 1)) 4411b362b15af34006e6a11974088a46d42b903418eJohann *dissim>>=1; 4421b362b15af34006e6a11974088a46d42b903418eJohann 4431b362b15af34006e6a11974088a46d42b903418eJohann if(*parent_ref_frame != INTRA_FRAME) 4441b362b15af34006e6a11974088a46d42b903418eJohann { 4451b362b15af34006e6a11974088a46d42b903418eJohann /* Consider different down_sampling_factor. 4461b362b15af34006e6a11974088a46d42b903418eJohann * The result can be rounded to be more precise, but it takes more time. 4471b362b15af34006e6a11974088a46d42b903418eJohann */ 4481b362b15af34006e6a11974088a46d42b903418eJohann (*parent_ref_mv).as_mv.row = store_mode_info[parent_mb_index].mv.as_mv.row 4491b362b15af34006e6a11974088a46d42b903418eJohann *cpi->oxcf.mr_down_sampling_factor.num 4501b362b15af34006e6a11974088a46d42b903418eJohann /cpi->oxcf.mr_down_sampling_factor.den; 4511b362b15af34006e6a11974088a46d42b903418eJohann (*parent_ref_mv).as_mv.col = store_mode_info[parent_mb_index].mv.as_mv.col 4521b362b15af34006e6a11974088a46d42b903418eJohann *cpi->oxcf.mr_down_sampling_factor.num 4531b362b15af34006e6a11974088a46d42b903418eJohann /cpi->oxcf.mr_down_sampling_factor.den; 4541b362b15af34006e6a11974088a46d42b903418eJohann 4551b362b15af34006e6a11974088a46d42b903418eJohann vp8_clamp_mv2(parent_ref_mv, xd); 4561b362b15af34006e6a11974088a46d42b903418eJohann } 4571b362b15af34006e6a11974088a46d42b903418eJohann} 4581b362b15af34006e6a11974088a46d42b903418eJohann#endif 4591b362b15af34006e6a11974088a46d42b903418eJohann 4601b362b15af34006e6a11974088a46d42b903418eJohannstatic void check_for_encode_breakout(unsigned int sse, MACROBLOCK* x) 4611b362b15af34006e6a11974088a46d42b903418eJohann{ 4621b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 4631b362b15af34006e6a11974088a46d42b903418eJohann 4641b362b15af34006e6a11974088a46d42b903418eJohann unsigned int threshold = (xd->block[0].dequant[1] 4651b362b15af34006e6a11974088a46d42b903418eJohann * xd->block[0].dequant[1] >>4); 4661b362b15af34006e6a11974088a46d42b903418eJohann 4671b362b15af34006e6a11974088a46d42b903418eJohann if(threshold < x->encode_breakout) 4681b362b15af34006e6a11974088a46d42b903418eJohann threshold = x->encode_breakout; 4691b362b15af34006e6a11974088a46d42b903418eJohann 4701b362b15af34006e6a11974088a46d42b903418eJohann if (sse < threshold ) 4711b362b15af34006e6a11974088a46d42b903418eJohann { 4721b362b15af34006e6a11974088a46d42b903418eJohann /* Check u and v to make sure skip is ok */ 4731b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse2 = 0; 4741b362b15af34006e6a11974088a46d42b903418eJohann 4751b362b15af34006e6a11974088a46d42b903418eJohann sse2 = VP8_UVSSE(x); 4761b362b15af34006e6a11974088a46d42b903418eJohann 4771b362b15af34006e6a11974088a46d42b903418eJohann if (sse2 * 2 < x->encode_breakout) 4781b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 1; 4791b362b15af34006e6a11974088a46d42b903418eJohann else 4801b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 0; 4811b362b15af34006e6a11974088a46d42b903418eJohann } 4821b362b15af34006e6a11974088a46d42b903418eJohann} 4831b362b15af34006e6a11974088a46d42b903418eJohann 4841b362b15af34006e6a11974088a46d42b903418eJohannstatic int evaluate_inter_mode(unsigned int* sse, int rate2, int* distortion2, 4851b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, MACROBLOCK *x, int rd_adj) 4861b362b15af34006e6a11974088a46d42b903418eJohann{ 4871b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 4881b362b15af34006e6a11974088a46d42b903418eJohann int_mv mv = x->e_mbd.mode_info_context->mbmi.mv; 4891b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 4901b362b15af34006e6a11974088a46d42b903418eJohann /* Exit early and don't compute the distortion if this macroblock 4911b362b15af34006e6a11974088a46d42b903418eJohann * is marked inactive. */ 4921b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->active_map_enabled && x->active_ptr[0] == 0) 4931b362b15af34006e6a11974088a46d42b903418eJohann { 4941b362b15af34006e6a11974088a46d42b903418eJohann *sse = 0; 4951b362b15af34006e6a11974088a46d42b903418eJohann *distortion2 = 0; 4961b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 1; 4971b362b15af34006e6a11974088a46d42b903418eJohann return INT_MAX; 4981b362b15af34006e6a11974088a46d42b903418eJohann } 4991b362b15af34006e6a11974088a46d42b903418eJohann 5001b362b15af34006e6a11974088a46d42b903418eJohann if((this_mode != NEWMV) || 5011b362b15af34006e6a11974088a46d42b903418eJohann !(cpi->sf.half_pixel_search) || cpi->common.full_pixel==1) 5021b362b15af34006e6a11974088a46d42b903418eJohann *distortion2 = vp8_get_inter_mbpred_error(x, 5031b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 5041b362b15af34006e6a11974088a46d42b903418eJohann sse, mv); 5051b362b15af34006e6a11974088a46d42b903418eJohann 5061b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate2, *distortion2); 5071b362b15af34006e6a11974088a46d42b903418eJohann 5081b362b15af34006e6a11974088a46d42b903418eJohann /* Adjust rd to bias to ZEROMV */ 5091b362b15af34006e6a11974088a46d42b903418eJohann if(this_mode == ZEROMV) 5101b362b15af34006e6a11974088a46d42b903418eJohann { 5111b362b15af34006e6a11974088a46d42b903418eJohann /* Bias to ZEROMV on LAST_FRAME reference when it is available. */ 5121b362b15af34006e6a11974088a46d42b903418eJohann if ((cpi->ref_frame_flags & VP8_LAST_FRAME & 5131b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.refresh_last_frame) 5141b362b15af34006e6a11974088a46d42b903418eJohann && x->e_mbd.mode_info_context->mbmi.ref_frame != LAST_FRAME) 5151b362b15af34006e6a11974088a46d42b903418eJohann rd_adj = 100; 5161b362b15af34006e6a11974088a46d42b903418eJohann 5171b362b15af34006e6a11974088a46d42b903418eJohann // rd_adj <= 100 5181b362b15af34006e6a11974088a46d42b903418eJohann this_rd = ((int64_t)this_rd) * rd_adj / 100; 5191b362b15af34006e6a11974088a46d42b903418eJohann } 5201b362b15af34006e6a11974088a46d42b903418eJohann 5211b362b15af34006e6a11974088a46d42b903418eJohann check_for_encode_breakout(*sse, x); 5221b362b15af34006e6a11974088a46d42b903418eJohann return this_rd; 5231b362b15af34006e6a11974088a46d42b903418eJohann} 5241b362b15af34006e6a11974088a46d42b903418eJohann 5251b362b15af34006e6a11974088a46d42b903418eJohannstatic void calculate_zeromv_rd_adjustment(VP8_COMP *cpi, MACROBLOCK *x, 5261b362b15af34006e6a11974088a46d42b903418eJohann int *rd_adjustment) 5271b362b15af34006e6a11974088a46d42b903418eJohann{ 5281b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *mic = x->e_mbd.mode_info_context; 5291b362b15af34006e6a11974088a46d42b903418eJohann int_mv mv_l, mv_a, mv_al; 5301b362b15af34006e6a11974088a46d42b903418eJohann int local_motion_check = 0; 5311b362b15af34006e6a11974088a46d42b903418eJohann 5321b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_zeromv_pct > 40) 5331b362b15af34006e6a11974088a46d42b903418eJohann { 5341b362b15af34006e6a11974088a46d42b903418eJohann /* left mb */ 5351b362b15af34006e6a11974088a46d42b903418eJohann mic -= 1; 5361b362b15af34006e6a11974088a46d42b903418eJohann mv_l = mic->mbmi.mv; 5371b362b15af34006e6a11974088a46d42b903418eJohann 5381b362b15af34006e6a11974088a46d42b903418eJohann if (mic->mbmi.ref_frame != INTRA_FRAME) 5391b362b15af34006e6a11974088a46d42b903418eJohann if( abs(mv_l.as_mv.row) < 8 && abs(mv_l.as_mv.col) < 8) 5401b362b15af34006e6a11974088a46d42b903418eJohann local_motion_check++; 5411b362b15af34006e6a11974088a46d42b903418eJohann 5421b362b15af34006e6a11974088a46d42b903418eJohann /* above-left mb */ 5431b362b15af34006e6a11974088a46d42b903418eJohann mic -= x->e_mbd.mode_info_stride; 5441b362b15af34006e6a11974088a46d42b903418eJohann mv_al = mic->mbmi.mv; 5451b362b15af34006e6a11974088a46d42b903418eJohann 5461b362b15af34006e6a11974088a46d42b903418eJohann if (mic->mbmi.ref_frame != INTRA_FRAME) 5471b362b15af34006e6a11974088a46d42b903418eJohann if( abs(mv_al.as_mv.row) < 8 && abs(mv_al.as_mv.col) < 8) 5481b362b15af34006e6a11974088a46d42b903418eJohann local_motion_check++; 5491b362b15af34006e6a11974088a46d42b903418eJohann 5501b362b15af34006e6a11974088a46d42b903418eJohann /* above mb */ 5511b362b15af34006e6a11974088a46d42b903418eJohann mic += 1; 5521b362b15af34006e6a11974088a46d42b903418eJohann mv_a = mic->mbmi.mv; 5531b362b15af34006e6a11974088a46d42b903418eJohann 5541b362b15af34006e6a11974088a46d42b903418eJohann if (mic->mbmi.ref_frame != INTRA_FRAME) 5551b362b15af34006e6a11974088a46d42b903418eJohann if( abs(mv_a.as_mv.row) < 8 && abs(mv_a.as_mv.col) < 8) 5561b362b15af34006e6a11974088a46d42b903418eJohann local_motion_check++; 5571b362b15af34006e6a11974088a46d42b903418eJohann 5581b362b15af34006e6a11974088a46d42b903418eJohann if (((!x->e_mbd.mb_to_top_edge || !x->e_mbd.mb_to_left_edge) 5591b362b15af34006e6a11974088a46d42b903418eJohann && local_motion_check >0) || local_motion_check >2 ) 5601b362b15af34006e6a11974088a46d42b903418eJohann *rd_adjustment = 80; 5611b362b15af34006e6a11974088a46d42b903418eJohann else if (local_motion_check > 0) 5621b362b15af34006e6a11974088a46d42b903418eJohann *rd_adjustment = 90; 5631b362b15af34006e6a11974088a46d42b903418eJohann } 5641b362b15af34006e6a11974088a46d42b903418eJohann} 5651b362b15af34006e6a11974088a46d42b903418eJohann 5661b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, 5671b362b15af34006e6a11974088a46d42b903418eJohann int recon_uvoffset, int *returnrate, 5681b362b15af34006e6a11974088a46d42b903418eJohann int *returndistortion, int *returnintra, int mb_row, 5691b362b15af34006e6a11974088a46d42b903418eJohann int mb_col) 5701b362b15af34006e6a11974088a46d42b903418eJohann{ 5711b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 5721b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d = &x->e_mbd.block[0]; 5731b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 5741b362b15af34006e6a11974088a46d42b903418eJohann MB_MODE_INFO best_mbmode; 5751b362b15af34006e6a11974088a46d42b903418eJohann 5761b362b15af34006e6a11974088a46d42b903418eJohann int_mv best_ref_mv_sb[2]; 5771b362b15af34006e6a11974088a46d42b903418eJohann int_mv mode_mv_sb[2][MB_MODE_COUNT]; 5781b362b15af34006e6a11974088a46d42b903418eJohann int_mv best_ref_mv; 5791b362b15af34006e6a11974088a46d42b903418eJohann int_mv *mode_mv; 5801b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode; 5811b362b15af34006e6a11974088a46d42b903418eJohann int num00; 5821b362b15af34006e6a11974088a46d42b903418eJohann int mdcounts[4]; 5831b362b15af34006e6a11974088a46d42b903418eJohann int best_rd = INT_MAX; 5841b362b15af34006e6a11974088a46d42b903418eJohann int rd_adjustment = 100; 5851b362b15af34006e6a11974088a46d42b903418eJohann int best_intra_rd = INT_MAX; 5861b362b15af34006e6a11974088a46d42b903418eJohann int mode_index; 5871b362b15af34006e6a11974088a46d42b903418eJohann int rate; 5881b362b15af34006e6a11974088a46d42b903418eJohann int rate2; 5891b362b15af34006e6a11974088a46d42b903418eJohann int distortion2; 5901b362b15af34006e6a11974088a46d42b903418eJohann int bestsme = INT_MAX; 5911b362b15af34006e6a11974088a46d42b903418eJohann int best_mode_index = 0; 5921b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse = INT_MAX, best_rd_sse = INT_MAX; 5931b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 5941b362b15af34006e6a11974088a46d42b903418eJohann unsigned int zero_mv_sse = INT_MAX, best_sse = INT_MAX; 5951b362b15af34006e6a11974088a46d42b903418eJohann#endif 5961b362b15af34006e6a11974088a46d42b903418eJohann 597ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int sf_improved_mv_pred = cpi->sf.improved_mv_pred; 5981b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp; 5991b362b15af34006e6a11974088a46d42b903418eJohann 6001b362b15af34006e6a11974088a46d42b903418eJohann int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 6011b362b15af34006e6a11974088a46d42b903418eJohann int saddone=0; 6021b362b15af34006e6a11974088a46d42b903418eJohann /* search range got from mv_pred(). It uses step_param levels. (0-7) */ 6031b362b15af34006e6a11974088a46d42b903418eJohann int sr=0; 6041b362b15af34006e6a11974088a46d42b903418eJohann 6051b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *plane[4][3]; 6061b362b15af34006e6a11974088a46d42b903418eJohann int ref_frame_map[4]; 6071b362b15af34006e6a11974088a46d42b903418eJohann int sign_bias = 0; 6081b362b15af34006e6a11974088a46d42b903418eJohann 6091b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 6101b362b15af34006e6a11974088a46d42b903418eJohann int dissim = INT_MAX; 6111b362b15af34006e6a11974088a46d42b903418eJohann int parent_ref_frame = 0; 6121b362b15af34006e6a11974088a46d42b903418eJohann int parent_ref_valid = cpi->oxcf.mr_encoder_id && cpi->mr_low_res_mv_avail; 6131b362b15af34006e6a11974088a46d42b903418eJohann int_mv parent_ref_mv; 6141b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE parent_mode = 0; 6151b362b15af34006e6a11974088a46d42b903418eJohann 6161b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_valid) 6171b362b15af34006e6a11974088a46d42b903418eJohann { 6181b362b15af34006e6a11974088a46d42b903418eJohann int parent_ref_flag; 6191b362b15af34006e6a11974088a46d42b903418eJohann 6201b362b15af34006e6a11974088a46d42b903418eJohann get_lower_res_motion_info(cpi, xd, &dissim, &parent_ref_frame, 6211b362b15af34006e6a11974088a46d42b903418eJohann &parent_mode, &parent_ref_mv, mb_row, mb_col); 6221b362b15af34006e6a11974088a46d42b903418eJohann 6231b362b15af34006e6a11974088a46d42b903418eJohann /* TODO(jkoleszar): The references available (ref_frame_flags) to the 6241b362b15af34006e6a11974088a46d42b903418eJohann * lower res encoder should match those available to this encoder, but 6251b362b15af34006e6a11974088a46d42b903418eJohann * there seems to be a situation where this mismatch can happen in the 6261b362b15af34006e6a11974088a46d42b903418eJohann * case of frame dropping and temporal layers. For example, 6271b362b15af34006e6a11974088a46d42b903418eJohann * GOLD being disallowed in ref_frame_flags, but being returned as 6281b362b15af34006e6a11974088a46d42b903418eJohann * parent_ref_frame. 6291b362b15af34006e6a11974088a46d42b903418eJohann * 6301b362b15af34006e6a11974088a46d42b903418eJohann * In this event, take the conservative approach of disabling the 6311b362b15af34006e6a11974088a46d42b903418eJohann * lower res info for this MB. 6321b362b15af34006e6a11974088a46d42b903418eJohann */ 6331b362b15af34006e6a11974088a46d42b903418eJohann parent_ref_flag = 0; 6341b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_frame == LAST_FRAME) 6351b362b15af34006e6a11974088a46d42b903418eJohann parent_ref_flag = (cpi->ref_frame_flags & VP8_LAST_FRAME); 6361b362b15af34006e6a11974088a46d42b903418eJohann else if (parent_ref_frame == GOLDEN_FRAME) 6371b362b15af34006e6a11974088a46d42b903418eJohann parent_ref_flag = (cpi->ref_frame_flags & VP8_GOLD_FRAME); 6381b362b15af34006e6a11974088a46d42b903418eJohann else if (parent_ref_frame == ALTREF_FRAME) 6391b362b15af34006e6a11974088a46d42b903418eJohann parent_ref_flag = (cpi->ref_frame_flags & VP8_ALTR_FRAME); 6401b362b15af34006e6a11974088a46d42b903418eJohann 6411b362b15af34006e6a11974088a46d42b903418eJohann //assert(!parent_ref_frame || parent_ref_flag); 6421b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_frame && !parent_ref_flag) 6431b362b15af34006e6a11974088a46d42b903418eJohann parent_ref_valid = 0; 6441b362b15af34006e6a11974088a46d42b903418eJohann } 6451b362b15af34006e6a11974088a46d42b903418eJohann#endif 6461b362b15af34006e6a11974088a46d42b903418eJohann 6471b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 6481b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = 0; 6491b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(mode_mv_sb, 0, sizeof(mode_mv_sb)); 6501b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); 6511b362b15af34006e6a11974088a46d42b903418eJohann 6521b362b15af34006e6a11974088a46d42b903418eJohann /* Setup search priorities */ 6531b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 6541b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_valid && parent_ref_frame && dissim < 8) 6551b362b15af34006e6a11974088a46d42b903418eJohann { 6561b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[0] = -1; 6571b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[1] = parent_ref_frame; 6581b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[2] = -1; 6591b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[3] = -1; 6601b362b15af34006e6a11974088a46d42b903418eJohann } else 6611b362b15af34006e6a11974088a46d42b903418eJohann#endif 6621b362b15af34006e6a11974088a46d42b903418eJohann get_reference_search_order(cpi, ref_frame_map); 6631b362b15af34006e6a11974088a46d42b903418eJohann 6641b362b15af34006e6a11974088a46d42b903418eJohann /* Check to see if there is at least 1 valid reference frame that we need 6651b362b15af34006e6a11974088a46d42b903418eJohann * to calculate near_mvs. 6661b362b15af34006e6a11974088a46d42b903418eJohann */ 6671b362b15af34006e6a11974088a46d42b903418eJohann if (ref_frame_map[1] > 0) 6681b362b15af34006e6a11974088a46d42b903418eJohann { 6691b362b15af34006e6a11974088a46d42b903418eJohann sign_bias = vp8_find_near_mvs_bias(&x->e_mbd, 6701b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context, 6711b362b15af34006e6a11974088a46d42b903418eJohann mode_mv_sb, 6721b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv_sb, 6731b362b15af34006e6a11974088a46d42b903418eJohann mdcounts, 6741b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[1], 6751b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.ref_frame_sign_bias); 6761b362b15af34006e6a11974088a46d42b903418eJohann 6771b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 6781b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 6791b362b15af34006e6a11974088a46d42b903418eJohann } 6801b362b15af34006e6a11974088a46d42b903418eJohann 6811b362b15af34006e6a11974088a46d42b903418eJohann get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); 6821b362b15af34006e6a11974088a46d42b903418eJohann 6831b362b15af34006e6a11974088a46d42b903418eJohann /* Count of the number of MBs tested so far this frame */ 684ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->mbs_tested_so_far++; 6851b362b15af34006e6a11974088a46d42b903418eJohann 6861b362b15af34006e6a11974088a46d42b903418eJohann *returnintra = INT_MAX; 6871b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 0; 6881b362b15af34006e6a11974088a46d42b903418eJohann 6891b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 6901b362b15af34006e6a11974088a46d42b903418eJohann 6911b362b15af34006e6a11974088a46d42b903418eJohann /* If the frame has big static background and current MB is in low 6921b362b15af34006e6a11974088a46d42b903418eJohann * motion area, its mode decision is biased to ZEROMV mode. 6931b362b15af34006e6a11974088a46d42b903418eJohann */ 6941b362b15af34006e6a11974088a46d42b903418eJohann calculate_zeromv_rd_adjustment(cpi, x, &rd_adjustment); 6951b362b15af34006e6a11974088a46d42b903418eJohann 6961b362b15af34006e6a11974088a46d42b903418eJohann /* if we encode a new mv this is important 6971b362b15af34006e6a11974088a46d42b903418eJohann * find the best new motion vector 6981b362b15af34006e6a11974088a46d42b903418eJohann */ 6991b362b15af34006e6a11974088a46d42b903418eJohann for (mode_index = 0; mode_index < MAX_MODES; mode_index++) 7001b362b15af34006e6a11974088a46d42b903418eJohann { 7011b362b15af34006e6a11974088a46d42b903418eJohann int frame_cost; 7021b362b15af34006e6a11974088a46d42b903418eJohann int this_rd = INT_MAX; 7031b362b15af34006e6a11974088a46d42b903418eJohann int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; 7041b362b15af34006e6a11974088a46d42b903418eJohann 705ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (best_rd <= x->rd_threshes[mode_index]) 7061b362b15af34006e6a11974088a46d42b903418eJohann continue; 7071b362b15af34006e6a11974088a46d42b903418eJohann 7081b362b15af34006e6a11974088a46d42b903418eJohann if (this_ref_frame < 0) 7091b362b15af34006e6a11974088a46d42b903418eJohann continue; 7101b362b15af34006e6a11974088a46d42b903418eJohann 7111b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 7121b362b15af34006e6a11974088a46d42b903418eJohann 7131b362b15af34006e6a11974088a46d42b903418eJohann /* everything but intra */ 7141b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.ref_frame) 7151b362b15af34006e6a11974088a46d42b903418eJohann { 7161b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 7171b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 7181b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 7191b362b15af34006e6a11974088a46d42b903418eJohann 7201b362b15af34006e6a11974088a46d42b903418eJohann if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) 7211b362b15af34006e6a11974088a46d42b903418eJohann { 7221b362b15af34006e6a11974088a46d42b903418eJohann sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; 7231b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 7241b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 7251b362b15af34006e6a11974088a46d42b903418eJohann } 7261b362b15af34006e6a11974088a46d42b903418eJohann 7271b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 7281b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_valid) 7291b362b15af34006e6a11974088a46d42b903418eJohann { 7301b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_mode_order[mode_index] == NEARESTMV && 7311b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEARESTMV].as_int ==0) 7321b362b15af34006e6a11974088a46d42b903418eJohann continue; 7331b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_mode_order[mode_index] == NEARMV && 7341b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEARMV].as_int ==0) 7351b362b15af34006e6a11974088a46d42b903418eJohann continue; 7361b362b15af34006e6a11974088a46d42b903418eJohann 7371b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_mode_order[mode_index] == NEWMV && parent_mode == ZEROMV 7381b362b15af34006e6a11974088a46d42b903418eJohann && best_ref_mv.as_int==0) 7391b362b15af34006e6a11974088a46d42b903418eJohann continue; 7401b362b15af34006e6a11974088a46d42b903418eJohann else if(vp8_mode_order[mode_index] == NEWMV && dissim==0 7411b362b15af34006e6a11974088a46d42b903418eJohann && best_ref_mv.as_int==parent_ref_mv.as_int) 7421b362b15af34006e6a11974088a46d42b903418eJohann continue; 7431b362b15af34006e6a11974088a46d42b903418eJohann } 7441b362b15af34006e6a11974088a46d42b903418eJohann#endif 7451b362b15af34006e6a11974088a46d42b903418eJohann } 7461b362b15af34006e6a11974088a46d42b903418eJohann 7471b362b15af34006e6a11974088a46d42b903418eJohann /* Check to see if the testing frequency for this mode is at its max 7481b362b15af34006e6a11974088a46d42b903418eJohann * If so then prevent it from being tested and increase the threshold 7491b362b15af34006e6a11974088a46d42b903418eJohann * for its testing */ 750ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x->mode_test_hit_counts[mode_index] && 7511b362b15af34006e6a11974088a46d42b903418eJohann (cpi->mode_check_freq[mode_index] > 1)) 7521b362b15af34006e6a11974088a46d42b903418eJohann { 753ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x->mbs_tested_so_far <= (cpi->mode_check_freq[mode_index] * 754ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->mode_test_hit_counts[mode_index])) 7551b362b15af34006e6a11974088a46d42b903418eJohann { 7561b362b15af34006e6a11974088a46d42b903418eJohann /* Increase the threshold for coding this mode to make it less 7571b362b15af34006e6a11974088a46d42b903418eJohann * likely to be chosen */ 758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] += 4; 7591b362b15af34006e6a11974088a46d42b903418eJohann 760ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 7621b362b15af34006e6a11974088a46d42b903418eJohann 763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_threshes[mode_index] = 7641b362b15af34006e6a11974088a46d42b903418eJohann (cpi->rd_baseline_thresh[mode_index] >> 7) * 765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index]; 7661b362b15af34006e6a11974088a46d42b903418eJohann continue; 7671b362b15af34006e6a11974088a46d42b903418eJohann } 7681b362b15af34006e6a11974088a46d42b903418eJohann } 7691b362b15af34006e6a11974088a46d42b903418eJohann 7701b362b15af34006e6a11974088a46d42b903418eJohann /* We have now reached the point where we are going to test the current 7711b362b15af34006e6a11974088a46d42b903418eJohann * mode so increment the counter for the number of times it has been 7721b362b15af34006e6a11974088a46d42b903418eJohann * tested */ 773ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->mode_test_hit_counts[mode_index] ++; 7741b362b15af34006e6a11974088a46d42b903418eJohann 7751b362b15af34006e6a11974088a46d42b903418eJohann rate2 = 0; 7761b362b15af34006e6a11974088a46d42b903418eJohann distortion2 = 0; 7771b362b15af34006e6a11974088a46d42b903418eJohann 7781b362b15af34006e6a11974088a46d42b903418eJohann this_mode = vp8_mode_order[mode_index]; 7791b362b15af34006e6a11974088a46d42b903418eJohann 7801b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = this_mode; 7811b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 7821b362b15af34006e6a11974088a46d42b903418eJohann 7831b362b15af34006e6a11974088a46d42b903418eJohann /* Work out the cost assosciated with selecting the reference frame */ 7841b362b15af34006e6a11974088a46d42b903418eJohann frame_cost = 7851b362b15af34006e6a11974088a46d42b903418eJohann x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; 7861b362b15af34006e6a11974088a46d42b903418eJohann rate2 += frame_cost; 7871b362b15af34006e6a11974088a46d42b903418eJohann 7881b362b15af34006e6a11974088a46d42b903418eJohann /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame, 7891b362b15af34006e6a11974088a46d42b903418eJohann * unless ARNR filtering is enabled in which case we want 7901b362b15af34006e6a11974088a46d42b903418eJohann * an unfiltered alternative */ 7911b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) 7921b362b15af34006e6a11974088a46d42b903418eJohann { 7931b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode != ZEROMV || 7941b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) 7951b362b15af34006e6a11974088a46d42b903418eJohann continue; 7961b362b15af34006e6a11974088a46d42b903418eJohann } 7971b362b15af34006e6a11974088a46d42b903418eJohann 7981b362b15af34006e6a11974088a46d42b903418eJohann switch (this_mode) 7991b362b15af34006e6a11974088a46d42b903418eJohann { 8001b362b15af34006e6a11974088a46d42b903418eJohann case B_PRED: 8011b362b15af34006e6a11974088a46d42b903418eJohann /* Pass best so far to pick_intra4x4mby_modes to use as breakout */ 8021b362b15af34006e6a11974088a46d42b903418eJohann distortion2 = best_rd_sse; 8031b362b15af34006e6a11974088a46d42b903418eJohann pick_intra4x4mby_modes(x, &rate, &distortion2); 8041b362b15af34006e6a11974088a46d42b903418eJohann 8051b362b15af34006e6a11974088a46d42b903418eJohann if (distortion2 == INT_MAX) 8061b362b15af34006e6a11974088a46d42b903418eJohann { 8071b362b15af34006e6a11974088a46d42b903418eJohann this_rd = INT_MAX; 8081b362b15af34006e6a11974088a46d42b903418eJohann } 8091b362b15af34006e6a11974088a46d42b903418eJohann else 8101b362b15af34006e6a11974088a46d42b903418eJohann { 8111b362b15af34006e6a11974088a46d42b903418eJohann rate2 += rate; 8121b362b15af34006e6a11974088a46d42b903418eJohann distortion2 = vp8_variance16x16( 8131b362b15af34006e6a11974088a46d42b903418eJohann *(b->base_src), b->src_stride, 8141b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.predictor, 16, &sse); 8151b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); 8161b362b15af34006e6a11974088a46d42b903418eJohann 8171b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_intra_rd) 8181b362b15af34006e6a11974088a46d42b903418eJohann { 8191b362b15af34006e6a11974088a46d42b903418eJohann best_intra_rd = this_rd; 8201b362b15af34006e6a11974088a46d42b903418eJohann *returnintra = distortion2; 8211b362b15af34006e6a11974088a46d42b903418eJohann } 8221b362b15af34006e6a11974088a46d42b903418eJohann } 8231b362b15af34006e6a11974088a46d42b903418eJohann 8241b362b15af34006e6a11974088a46d42b903418eJohann break; 8251b362b15af34006e6a11974088a46d42b903418eJohann 8261b362b15af34006e6a11974088a46d42b903418eJohann case SPLITMV: 8271b362b15af34006e6a11974088a46d42b903418eJohann 8281b362b15af34006e6a11974088a46d42b903418eJohann /* Split MV modes currently not supported when RD is not enabled. */ 8291b362b15af34006e6a11974088a46d42b903418eJohann break; 8301b362b15af34006e6a11974088a46d42b903418eJohann 8311b362b15af34006e6a11974088a46d42b903418eJohann case DC_PRED: 8321b362b15af34006e6a11974088a46d42b903418eJohann case V_PRED: 8331b362b15af34006e6a11974088a46d42b903418eJohann case H_PRED: 8341b362b15af34006e6a11974088a46d42b903418eJohann case TM_PRED: 8351b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 8361b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 8371b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 8381b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 8391b362b15af34006e6a11974088a46d42b903418eJohann xd->predictor, 8401b362b15af34006e6a11974088a46d42b903418eJohann 16); 8411b362b15af34006e6a11974088a46d42b903418eJohann distortion2 = vp8_variance16x16 8421b362b15af34006e6a11974088a46d42b903418eJohann (*(b->base_src), b->src_stride, 8431b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.predictor, 16, &sse); 8441b362b15af34006e6a11974088a46d42b903418eJohann rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode]; 8451b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); 8461b362b15af34006e6a11974088a46d42b903418eJohann 8471b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_intra_rd) 8481b362b15af34006e6a11974088a46d42b903418eJohann { 8491b362b15af34006e6a11974088a46d42b903418eJohann best_intra_rd = this_rd; 8501b362b15af34006e6a11974088a46d42b903418eJohann *returnintra = distortion2; 8511b362b15af34006e6a11974088a46d42b903418eJohann } 8521b362b15af34006e6a11974088a46d42b903418eJohann break; 8531b362b15af34006e6a11974088a46d42b903418eJohann 8541b362b15af34006e6a11974088a46d42b903418eJohann case NEWMV: 8551b362b15af34006e6a11974088a46d42b903418eJohann { 8561b362b15af34006e6a11974088a46d42b903418eJohann int thissme; 8571b362b15af34006e6a11974088a46d42b903418eJohann int step_param; 8581b362b15af34006e6a11974088a46d42b903418eJohann int further_steps; 8591b362b15af34006e6a11974088a46d42b903418eJohann int n = 0; 8601b362b15af34006e6a11974088a46d42b903418eJohann int sadpb = x->sadperbit16; 8611b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp_full; 8621b362b15af34006e6a11974088a46d42b903418eJohann 8631b362b15af34006e6a11974088a46d42b903418eJohann int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; 8641b362b15af34006e6a11974088a46d42b903418eJohann int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; 8651b362b15af34006e6a11974088a46d42b903418eJohann int col_max = (best_ref_mv.as_mv.col>>3) 8661b362b15af34006e6a11974088a46d42b903418eJohann + MAX_FULL_PEL_VAL; 8671b362b15af34006e6a11974088a46d42b903418eJohann int row_max = (best_ref_mv.as_mv.row>>3) 8681b362b15af34006e6a11974088a46d42b903418eJohann + MAX_FULL_PEL_VAL; 8691b362b15af34006e6a11974088a46d42b903418eJohann 8701b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_min = x->mv_col_min; 8711b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_max = x->mv_col_max; 8721b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_min = x->mv_row_min; 8731b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_max = x->mv_row_max; 8741b362b15af34006e6a11974088a46d42b903418eJohann 8751b362b15af34006e6a11974088a46d42b903418eJohann int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1; 8761b362b15af34006e6a11974088a46d42b903418eJohann 8771b362b15af34006e6a11974088a46d42b903418eJohann /* Further step/diamond searches as necessary */ 8781b362b15af34006e6a11974088a46d42b903418eJohann step_param = cpi->sf.first_step + speed_adjust; 8791b362b15af34006e6a11974088a46d42b903418eJohann 8801b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 8811b362b15af34006e6a11974088a46d42b903418eJohann /* If lower-res drops this frame, then higher-res encoder does 8821b362b15af34006e6a11974088a46d42b903418eJohann motion search without any previous knowledge. Also, since 8831b362b15af34006e6a11974088a46d42b903418eJohann last frame motion info is not stored, then we can not 8841b362b15af34006e6a11974088a46d42b903418eJohann use improved_mv_pred. */ 8851b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.mr_encoder_id && !parent_ref_valid) 886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sf_improved_mv_pred = 0; 8871b362b15af34006e6a11974088a46d42b903418eJohann 8881b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_valid && parent_ref_frame) 8891b362b15af34006e6a11974088a46d42b903418eJohann { 8901b362b15af34006e6a11974088a46d42b903418eJohann /* Use parent MV as predictor. Adjust search range 8911b362b15af34006e6a11974088a46d42b903418eJohann * accordingly. 8921b362b15af34006e6a11974088a46d42b903418eJohann */ 8931b362b15af34006e6a11974088a46d42b903418eJohann mvp.as_int = parent_ref_mv.as_int; 8941b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.col = parent_ref_mv.as_mv.col>>3; 8951b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.row = parent_ref_mv.as_mv.row>>3; 8961b362b15af34006e6a11974088a46d42b903418eJohann 8971b362b15af34006e6a11974088a46d42b903418eJohann if(dissim <=32) step_param += 3; 8981b362b15af34006e6a11974088a46d42b903418eJohann else if(dissim <=128) step_param += 2; 8991b362b15af34006e6a11974088a46d42b903418eJohann else step_param += 1; 9001b362b15af34006e6a11974088a46d42b903418eJohann }else 9011b362b15af34006e6a11974088a46d42b903418eJohann#endif 9021b362b15af34006e6a11974088a46d42b903418eJohann { 903ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if(sf_improved_mv_pred) 9041b362b15af34006e6a11974088a46d42b903418eJohann { 9051b362b15af34006e6a11974088a46d42b903418eJohann if(!saddone) 9061b362b15af34006e6a11974088a46d42b903418eJohann { 9071b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); 9081b362b15af34006e6a11974088a46d42b903418eJohann saddone = 1; 9091b362b15af34006e6a11974088a46d42b903418eJohann } 9101b362b15af34006e6a11974088a46d42b903418eJohann 9111b362b15af34006e6a11974088a46d42b903418eJohann vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, 9121b362b15af34006e6a11974088a46d42b903418eJohann &mvp,x->e_mbd.mode_info_context->mbmi.ref_frame, 9131b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.ref_frame_sign_bias, &sr, 9141b362b15af34006e6a11974088a46d42b903418eJohann &near_sadidx[0]); 9151b362b15af34006e6a11974088a46d42b903418eJohann 9161b362b15af34006e6a11974088a46d42b903418eJohann sr += speed_adjust; 9171b362b15af34006e6a11974088a46d42b903418eJohann /* adjust search range according to sr from mv prediction */ 9181b362b15af34006e6a11974088a46d42b903418eJohann if(sr > step_param) 9191b362b15af34006e6a11974088a46d42b903418eJohann step_param = sr; 9201b362b15af34006e6a11974088a46d42b903418eJohann 9211b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.col = mvp.as_mv.col>>3; 9221b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.row = mvp.as_mv.row>>3; 9231b362b15af34006e6a11974088a46d42b903418eJohann }else 9241b362b15af34006e6a11974088a46d42b903418eJohann { 9251b362b15af34006e6a11974088a46d42b903418eJohann mvp.as_int = best_ref_mv.as_int; 9261b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3; 9271b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3; 9281b362b15af34006e6a11974088a46d42b903418eJohann } 9291b362b15af34006e6a11974088a46d42b903418eJohann } 9301b362b15af34006e6a11974088a46d42b903418eJohann 9311b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 9321b362b15af34006e6a11974088a46d42b903418eJohann if (parent_ref_valid && parent_ref_frame && dissim <= 2 && 9331b362b15af34006e6a11974088a46d42b903418eJohann MAX(abs(best_ref_mv.as_mv.row - parent_ref_mv.as_mv.row), 9341b362b15af34006e6a11974088a46d42b903418eJohann abs(best_ref_mv.as_mv.col - parent_ref_mv.as_mv.col)) <= 4) 9351b362b15af34006e6a11974088a46d42b903418eJohann { 9361b362b15af34006e6a11974088a46d42b903418eJohann d->bmi.mv.as_int = mvp_full.as_int; 9371b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = mvp_full.as_int; 9381b362b15af34006e6a11974088a46d42b903418eJohann 9391b362b15af34006e6a11974088a46d42b903418eJohann cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, 9401b362b15af34006e6a11974088a46d42b903418eJohann x->errorperbit, 9411b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 9421b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.mvcost, 9431b362b15af34006e6a11974088a46d42b903418eJohann &distortion2,&sse); 9441b362b15af34006e6a11974088a46d42b903418eJohann }else 9451b362b15af34006e6a11974088a46d42b903418eJohann#endif 9461b362b15af34006e6a11974088a46d42b903418eJohann { 9471b362b15af34006e6a11974088a46d42b903418eJohann /* Get intersection of UMV window and valid MV window to 9481b362b15af34006e6a11974088a46d42b903418eJohann * reduce # of checks in diamond search. */ 9491b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_min < col_min ) 9501b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = col_min; 9511b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_max > col_max ) 9521b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = col_max; 9531b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_min < row_min ) 9541b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = row_min; 9551b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_max > row_max ) 9561b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = row_max; 9571b362b15af34006e6a11974088a46d42b903418eJohann 9581b362b15af34006e6a11974088a46d42b903418eJohann further_steps = (cpi->Speed >= 8)? 9591b362b15af34006e6a11974088a46d42b903418eJohann 0: (cpi->sf.max_step_search_steps - 1 - step_param); 9601b362b15af34006e6a11974088a46d42b903418eJohann 9611b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->sf.search_method == HEX) 9621b362b15af34006e6a11974088a46d42b903418eJohann { 9631b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING 9641b362b15af34006e6a11974088a46d42b903418eJohann /* TODO: In higher-res pick_inter_mode, step_param is used to 9651b362b15af34006e6a11974088a46d42b903418eJohann * modify hex search range. Here, set step_param to 0 not to 9661b362b15af34006e6a11974088a46d42b903418eJohann * change the behavior in lowest-resolution encoder. 9671b362b15af34006e6a11974088a46d42b903418eJohann * Will improve it later. 9681b362b15af34006e6a11974088a46d42b903418eJohann */ 9691b362b15af34006e6a11974088a46d42b903418eJohann /* Set step_param to 0 to ensure large-range motion search 9701b362b15af34006e6a11974088a46d42b903418eJohann when encoder drops this frame at lower-resolution. 9711b362b15af34006e6a11974088a46d42b903418eJohann */ 9721b362b15af34006e6a11974088a46d42b903418eJohann if (!parent_ref_valid) 9731b362b15af34006e6a11974088a46d42b903418eJohann step_param = 0; 9741b362b15af34006e6a11974088a46d42b903418eJohann#endif 9751b362b15af34006e6a11974088a46d42b903418eJohann bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, 9761b362b15af34006e6a11974088a46d42b903418eJohann step_param, sadpb, 9771b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 9781b362b15af34006e6a11974088a46d42b903418eJohann x->mvsadcost, x->mvcost, &best_ref_mv); 9791b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 9801b362b15af34006e6a11974088a46d42b903418eJohann } 9811b362b15af34006e6a11974088a46d42b903418eJohann else 9821b362b15af34006e6a11974088a46d42b903418eJohann { 9831b362b15af34006e6a11974088a46d42b903418eJohann bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, 9841b362b15af34006e6a11974088a46d42b903418eJohann &d->bmi.mv, step_param, sadpb, &num00, 9851b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 9861b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, &best_ref_mv); 9871b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 9881b362b15af34006e6a11974088a46d42b903418eJohann 9891b362b15af34006e6a11974088a46d42b903418eJohann /* Further step/diamond searches as necessary */ 9901b362b15af34006e6a11974088a46d42b903418eJohann n = num00; 9911b362b15af34006e6a11974088a46d42b903418eJohann num00 = 0; 9921b362b15af34006e6a11974088a46d42b903418eJohann 9931b362b15af34006e6a11974088a46d42b903418eJohann while (n < further_steps) 9941b362b15af34006e6a11974088a46d42b903418eJohann { 9951b362b15af34006e6a11974088a46d42b903418eJohann n++; 9961b362b15af34006e6a11974088a46d42b903418eJohann 9971b362b15af34006e6a11974088a46d42b903418eJohann if (num00) 9981b362b15af34006e6a11974088a46d42b903418eJohann num00--; 9991b362b15af34006e6a11974088a46d42b903418eJohann else 10001b362b15af34006e6a11974088a46d42b903418eJohann { 10011b362b15af34006e6a11974088a46d42b903418eJohann thissme = 10021b362b15af34006e6a11974088a46d42b903418eJohann cpi->diamond_search_sad(x, b, d, &mvp_full, 10031b362b15af34006e6a11974088a46d42b903418eJohann &d->bmi.mv, 10041b362b15af34006e6a11974088a46d42b903418eJohann step_param + n, 10051b362b15af34006e6a11974088a46d42b903418eJohann sadpb, &num00, 10061b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 10071b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, &best_ref_mv); 10081b362b15af34006e6a11974088a46d42b903418eJohann if (thissme < bestsme) 10091b362b15af34006e6a11974088a46d42b903418eJohann { 10101b362b15af34006e6a11974088a46d42b903418eJohann bestsme = thissme; 10111b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 10121b362b15af34006e6a11974088a46d42b903418eJohann } 10131b362b15af34006e6a11974088a46d42b903418eJohann else 10141b362b15af34006e6a11974088a46d42b903418eJohann { 10151b362b15af34006e6a11974088a46d42b903418eJohann d->bmi.mv.as_int = mode_mv[NEWMV].as_int; 10161b362b15af34006e6a11974088a46d42b903418eJohann } 10171b362b15af34006e6a11974088a46d42b903418eJohann } 10181b362b15af34006e6a11974088a46d42b903418eJohann } 10191b362b15af34006e6a11974088a46d42b903418eJohann } 10201b362b15af34006e6a11974088a46d42b903418eJohann 10211b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = tmp_col_min; 10221b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = tmp_col_max; 10231b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = tmp_row_min; 10241b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = tmp_row_max; 10251b362b15af34006e6a11974088a46d42b903418eJohann 10261b362b15af34006e6a11974088a46d42b903418eJohann if (bestsme < INT_MAX) 10271b362b15af34006e6a11974088a46d42b903418eJohann cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, 10281b362b15af34006e6a11974088a46d42b903418eJohann &best_ref_mv, x->errorperbit, 10291b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 10301b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.mvcost, 10311b362b15af34006e6a11974088a46d42b903418eJohann &distortion2,&sse); 10321b362b15af34006e6a11974088a46d42b903418eJohann } 10331b362b15af34006e6a11974088a46d42b903418eJohann 10341b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 10351b362b15af34006e6a11974088a46d42b903418eJohann 10361b362b15af34006e6a11974088a46d42b903418eJohann /* mv cost; */ 10371b362b15af34006e6a11974088a46d42b903418eJohann rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, 10381b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.mvcost, 128); 10391b362b15af34006e6a11974088a46d42b903418eJohann } 10401b362b15af34006e6a11974088a46d42b903418eJohann 10411b362b15af34006e6a11974088a46d42b903418eJohann case NEARESTMV: 10421b362b15af34006e6a11974088a46d42b903418eJohann case NEARMV: 10431b362b15af34006e6a11974088a46d42b903418eJohann 10441b362b15af34006e6a11974088a46d42b903418eJohann if (mode_mv[this_mode].as_int == 0) 10451b362b15af34006e6a11974088a46d42b903418eJohann continue; 10461b362b15af34006e6a11974088a46d42b903418eJohann 10471b362b15af34006e6a11974088a46d42b903418eJohann case ZEROMV: 10481b362b15af34006e6a11974088a46d42b903418eJohann 10491b362b15af34006e6a11974088a46d42b903418eJohann /* Trap vectors that reach beyond the UMV borders 10501b362b15af34006e6a11974088a46d42b903418eJohann * Note that ALL New MV, Nearest MV Near MV and Zero MV code drops 10511b362b15af34006e6a11974088a46d42b903418eJohann * through to this point because of the lack of break statements 10521b362b15af34006e6a11974088a46d42b903418eJohann * in the previous two cases. 10531b362b15af34006e6a11974088a46d42b903418eJohann */ 10541b362b15af34006e6a11974088a46d42b903418eJohann if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || 10551b362b15af34006e6a11974088a46d42b903418eJohann ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || 10561b362b15af34006e6a11974088a46d42b903418eJohann ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || 10571b362b15af34006e6a11974088a46d42b903418eJohann ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) 10581b362b15af34006e6a11974088a46d42b903418eJohann continue; 10591b362b15af34006e6a11974088a46d42b903418eJohann 10601b362b15af34006e6a11974088a46d42b903418eJohann rate2 += vp8_cost_mv_ref(this_mode, mdcounts); 10611b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 10621b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[this_mode].as_int; 10631b362b15af34006e6a11974088a46d42b903418eJohann this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x, 10641b362b15af34006e6a11974088a46d42b903418eJohann rd_adjustment); 10651b362b15af34006e6a11974088a46d42b903418eJohann 10661b362b15af34006e6a11974088a46d42b903418eJohann break; 10671b362b15af34006e6a11974088a46d42b903418eJohann default: 10681b362b15af34006e6a11974088a46d42b903418eJohann break; 10691b362b15af34006e6a11974088a46d42b903418eJohann } 10701b362b15af34006e6a11974088a46d42b903418eJohann 10711b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 10721b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.noise_sensitivity) 10731b362b15af34006e6a11974088a46d42b903418eJohann { 10741b362b15af34006e6a11974088a46d42b903418eJohann 10751b362b15af34006e6a11974088a46d42b903418eJohann /* Store for later use by denoiser. */ 10761b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode == ZEROMV && sse < zero_mv_sse ) 10771b362b15af34006e6a11974088a46d42b903418eJohann { 10781b362b15af34006e6a11974088a46d42b903418eJohann zero_mv_sse = sse; 10791b362b15af34006e6a11974088a46d42b903418eJohann x->best_zeromv_reference_frame = 10801b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame; 10811b362b15af34006e6a11974088a46d42b903418eJohann } 10821b362b15af34006e6a11974088a46d42b903418eJohann 10831b362b15af34006e6a11974088a46d42b903418eJohann /* Store the best NEWMV in x for later use in the denoiser. */ 10841b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && 10851b362b15af34006e6a11974088a46d42b903418eJohann sse < best_sse) 10861b362b15af34006e6a11974088a46d42b903418eJohann { 10871b362b15af34006e6a11974088a46d42b903418eJohann best_sse = sse; 10881b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_inter_mode = NEWMV; 10891b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv; 10901b362b15af34006e6a11974088a46d42b903418eJohann x->need_to_clamp_best_mvs = 10911b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs; 10921b362b15af34006e6a11974088a46d42b903418eJohann x->best_reference_frame = 10931b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame; 10941b362b15af34006e6a11974088a46d42b903418eJohann } 10951b362b15af34006e6a11974088a46d42b903418eJohann } 10961b362b15af34006e6a11974088a46d42b903418eJohann#endif 10971b362b15af34006e6a11974088a46d42b903418eJohann 10981b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd || x->skip) 10991b362b15af34006e6a11974088a46d42b903418eJohann { 11001b362b15af34006e6a11974088a46d42b903418eJohann /* Note index of best mode */ 11011b362b15af34006e6a11974088a46d42b903418eJohann best_mode_index = mode_index; 11021b362b15af34006e6a11974088a46d42b903418eJohann 11031b362b15af34006e6a11974088a46d42b903418eJohann *returnrate = rate2; 11041b362b15af34006e6a11974088a46d42b903418eJohann *returndistortion = distortion2; 11051b362b15af34006e6a11974088a46d42b903418eJohann best_rd_sse = sse; 11061b362b15af34006e6a11974088a46d42b903418eJohann best_rd = this_rd; 11071b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, 11081b362b15af34006e6a11974088a46d42b903418eJohann sizeof(MB_MODE_INFO)); 11091b362b15af34006e6a11974088a46d42b903418eJohann 11101b362b15af34006e6a11974088a46d42b903418eJohann /* Testing this mode gave rise to an improvement in best error 11111b362b15af34006e6a11974088a46d42b903418eJohann * score. Lower threshold a bit for next time 11121b362b15af34006e6a11974088a46d42b903418eJohann */ 1113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] = 1114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? 1115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; 1116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_threshes[mode_index] = 11171b362b15af34006e6a11974088a46d42b903418eJohann (cpi->rd_baseline_thresh[mode_index] >> 7) * 1118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index]; 11191b362b15af34006e6a11974088a46d42b903418eJohann } 11201b362b15af34006e6a11974088a46d42b903418eJohann 11211b362b15af34006e6a11974088a46d42b903418eJohann /* If the mode did not help improve the best error case then raise the 11221b362b15af34006e6a11974088a46d42b903418eJohann * threshold for testing that mode next time around. 11231b362b15af34006e6a11974088a46d42b903418eJohann */ 11241b362b15af34006e6a11974088a46d42b903418eJohann else 11251b362b15af34006e6a11974088a46d42b903418eJohann { 1126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] += 4; 11271b362b15af34006e6a11974088a46d42b903418eJohann 1128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 1129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 11301b362b15af34006e6a11974088a46d42b903418eJohann 1131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_threshes[mode_index] = 11321b362b15af34006e6a11974088a46d42b903418eJohann (cpi->rd_baseline_thresh[mode_index] >> 7) * 1133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[mode_index]; 11341b362b15af34006e6a11974088a46d42b903418eJohann } 11351b362b15af34006e6a11974088a46d42b903418eJohann 11361b362b15af34006e6a11974088a46d42b903418eJohann if (x->skip) 11371b362b15af34006e6a11974088a46d42b903418eJohann break; 11381b362b15af34006e6a11974088a46d42b903418eJohann } 11391b362b15af34006e6a11974088a46d42b903418eJohann 11401b362b15af34006e6a11974088a46d42b903418eJohann /* Reduce the activation RD thresholds for the best choice mode */ 11411b362b15af34006e6a11974088a46d42b903418eJohann if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) 11421b362b15af34006e6a11974088a46d42b903418eJohann { 1143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 3); 11441b362b15af34006e6a11974088a46d42b903418eJohann 1145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[best_mode_index] = 1146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (x->rd_thresh_mult[best_mode_index] 11471b362b15af34006e6a11974088a46d42b903418eJohann >= (MIN_THRESHMULT + best_adjustment)) ? 1148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[best_mode_index] - best_adjustment : 11491b362b15af34006e6a11974088a46d42b903418eJohann MIN_THRESHMULT; 1150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_threshes[best_mode_index] = 11511b362b15af34006e6a11974088a46d42b903418eJohann (cpi->rd_baseline_thresh[best_mode_index] >> 7) * 1152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->rd_thresh_mult[best_mode_index]; 11531b362b15af34006e6a11974088a46d42b903418eJohann } 11541b362b15af34006e6a11974088a46d42b903418eJohann 11551b362b15af34006e6a11974088a46d42b903418eJohann 11561b362b15af34006e6a11974088a46d42b903418eJohann { 11571b362b15af34006e6a11974088a46d42b903418eJohann int this_rdbin = (*returndistortion >> 7); 11581b362b15af34006e6a11974088a46d42b903418eJohann 11591b362b15af34006e6a11974088a46d42b903418eJohann if (this_rdbin >= 1024) 11601b362b15af34006e6a11974088a46d42b903418eJohann { 11611b362b15af34006e6a11974088a46d42b903418eJohann this_rdbin = 1023; 11621b362b15af34006e6a11974088a46d42b903418eJohann } 11631b362b15af34006e6a11974088a46d42b903418eJohann 1164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang x->error_bins[this_rdbin] ++; 11651b362b15af34006e6a11974088a46d42b903418eJohann } 11661b362b15af34006e6a11974088a46d42b903418eJohann 11671b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 11681b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.noise_sensitivity) 11691b362b15af34006e6a11974088a46d42b903418eJohann { 11701b362b15af34006e6a11974088a46d42b903418eJohann if (x->best_sse_inter_mode == DC_PRED) 11711b362b15af34006e6a11974088a46d42b903418eJohann { 11721b362b15af34006e6a11974088a46d42b903418eJohann /* No best MV found. */ 11731b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_inter_mode = best_mbmode.mode; 11741b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_mv = best_mbmode.mv; 11751b362b15af34006e6a11974088a46d42b903418eJohann x->need_to_clamp_best_mvs = best_mbmode.need_to_clamp_mvs; 11761b362b15af34006e6a11974088a46d42b903418eJohann x->best_reference_frame = best_mbmode.ref_frame; 11771b362b15af34006e6a11974088a46d42b903418eJohann best_sse = best_rd_sse; 11781b362b15af34006e6a11974088a46d42b903418eJohann } 11791b362b15af34006e6a11974088a46d42b903418eJohann vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, 11801b362b15af34006e6a11974088a46d42b903418eJohann recon_yoffset, recon_uvoffset); 11811b362b15af34006e6a11974088a46d42b903418eJohann 11821b362b15af34006e6a11974088a46d42b903418eJohann 11831b362b15af34006e6a11974088a46d42b903418eJohann /* Reevaluate ZEROMV after denoising. */ 11841b362b15af34006e6a11974088a46d42b903418eJohann if (best_mbmode.ref_frame == INTRA_FRAME && 11851b362b15af34006e6a11974088a46d42b903418eJohann x->best_zeromv_reference_frame != INTRA_FRAME) 11861b362b15af34006e6a11974088a46d42b903418eJohann { 11871b362b15af34006e6a11974088a46d42b903418eJohann int this_rd = 0; 11881b362b15af34006e6a11974088a46d42b903418eJohann int this_ref_frame = x->best_zeromv_reference_frame; 11891b362b15af34006e6a11974088a46d42b903418eJohann rate2 = x->ref_frame_cost[this_ref_frame] + 11901b362b15af34006e6a11974088a46d42b903418eJohann vp8_cost_mv_ref(ZEROMV, mdcounts); 11911b362b15af34006e6a11974088a46d42b903418eJohann distortion2 = 0; 11921b362b15af34006e6a11974088a46d42b903418eJohann 11931b362b15af34006e6a11974088a46d42b903418eJohann /* set up the proper prediction buffers for the frame */ 11941b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 11951b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 11961b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 11971b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 11981b362b15af34006e6a11974088a46d42b903418eJohann 11991b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 12001b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 12011b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 12021b362b15af34006e6a11974088a46d42b903418eJohann this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x, 12031b362b15af34006e6a11974088a46d42b903418eJohann rd_adjustment); 12041b362b15af34006e6a11974088a46d42b903418eJohann 12051b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd) 12061b362b15af34006e6a11974088a46d42b903418eJohann { 12071b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, 12081b362b15af34006e6a11974088a46d42b903418eJohann sizeof(MB_MODE_INFO)); 12091b362b15af34006e6a11974088a46d42b903418eJohann } 12101b362b15af34006e6a11974088a46d42b903418eJohann } 12111b362b15af34006e6a11974088a46d42b903418eJohann 12121b362b15af34006e6a11974088a46d42b903418eJohann } 12131b362b15af34006e6a11974088a46d42b903418eJohann#endif 12141b362b15af34006e6a11974088a46d42b903418eJohann 12151b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->is_src_frame_alt_ref && 12161b362b15af34006e6a11974088a46d42b903418eJohann (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) 12171b362b15af34006e6a11974088a46d42b903418eJohann { 12181b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 12191b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; 12201b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 12211b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 12221b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = 12231b362b15af34006e6a11974088a46d42b903418eJohann (cpi->common.mb_no_coeff_skip); 12241b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.partitioning = 0; 12251b362b15af34006e6a11974088a46d42b903418eJohann 12261b362b15af34006e6a11974088a46d42b903418eJohann return; 12271b362b15af34006e6a11974088a46d42b903418eJohann } 12281b362b15af34006e6a11974088a46d42b903418eJohann 12291b362b15af34006e6a11974088a46d42b903418eJohann /* set to the best mb mode, this copy can be skip if x->skip since it 12301b362b15af34006e6a11974088a46d42b903418eJohann * already has the right content */ 12311b362b15af34006e6a11974088a46d42b903418eJohann if (!x->skip) 12321b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, 12331b362b15af34006e6a11974088a46d42b903418eJohann sizeof(MB_MODE_INFO)); 12341b362b15af34006e6a11974088a46d42b903418eJohann 12351b362b15af34006e6a11974088a46d42b903418eJohann if (best_mbmode.mode <= B_PRED) 12361b362b15af34006e6a11974088a46d42b903418eJohann { 12371b362b15af34006e6a11974088a46d42b903418eJohann /* set mode_info_context->mbmi.uv_mode */ 12381b362b15af34006e6a11974088a46d42b903418eJohann pick_intra_mbuv_mode(x); 12391b362b15af34006e6a11974088a46d42b903418eJohann } 12401b362b15af34006e6a11974088a46d42b903418eJohann 12411b362b15af34006e6a11974088a46d42b903418eJohann if (sign_bias 12421b362b15af34006e6a11974088a46d42b903418eJohann != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) 12431b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; 12441b362b15af34006e6a11974088a46d42b903418eJohann 1245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang update_mvcount(x, &best_ref_mv); 12461b362b15af34006e6a11974088a46d42b903418eJohann} 12471b362b15af34006e6a11974088a46d42b903418eJohann 12481b362b15af34006e6a11974088a46d42b903418eJohann 12491b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_pick_intra_mode(MACROBLOCK *x, int *rate_) 12501b362b15af34006e6a11974088a46d42b903418eJohann{ 12511b362b15af34006e6a11974088a46d42b903418eJohann int error4x4, error16x16 = INT_MAX; 12521b362b15af34006e6a11974088a46d42b903418eJohann int rate, best_rate = 0, distortion, best_sse; 12531b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE mode, best_mode = DC_PRED; 12541b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 12551b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse; 12561b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 12571b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 12581b362b15af34006e6a11974088a46d42b903418eJohann 12591b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.ref_frame = INTRA_FRAME; 12601b362b15af34006e6a11974088a46d42b903418eJohann 12611b362b15af34006e6a11974088a46d42b903418eJohann pick_intra_mbuv_mode(x); 12621b362b15af34006e6a11974088a46d42b903418eJohann 12631b362b15af34006e6a11974088a46d42b903418eJohann for (mode = DC_PRED; mode <= TM_PRED; mode ++) 12641b362b15af34006e6a11974088a46d42b903418eJohann { 12651b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = mode; 12661b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 12671b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 12681b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 12691b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 12701b362b15af34006e6a11974088a46d42b903418eJohann xd->predictor, 12711b362b15af34006e6a11974088a46d42b903418eJohann 16); 12721b362b15af34006e6a11974088a46d42b903418eJohann distortion = vp8_variance16x16 12731b362b15af34006e6a11974088a46d42b903418eJohann (*(b->base_src), b->src_stride, xd->predictor, 16, &sse); 12741b362b15af34006e6a11974088a46d42b903418eJohann rate = x->mbmode_cost[xd->frame_type][mode]; 12751b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 12761b362b15af34006e6a11974088a46d42b903418eJohann 12771b362b15af34006e6a11974088a46d42b903418eJohann if (error16x16 > this_rd) 12781b362b15af34006e6a11974088a46d42b903418eJohann { 12791b362b15af34006e6a11974088a46d42b903418eJohann error16x16 = this_rd; 12801b362b15af34006e6a11974088a46d42b903418eJohann best_mode = mode; 12811b362b15af34006e6a11974088a46d42b903418eJohann best_sse = sse; 12821b362b15af34006e6a11974088a46d42b903418eJohann best_rate = rate; 12831b362b15af34006e6a11974088a46d42b903418eJohann } 12841b362b15af34006e6a11974088a46d42b903418eJohann } 12851b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = best_mode; 12861b362b15af34006e6a11974088a46d42b903418eJohann 12871b362b15af34006e6a11974088a46d42b903418eJohann error4x4 = pick_intra4x4mby_modes(x, &rate, 12881b362b15af34006e6a11974088a46d42b903418eJohann &best_sse); 12891b362b15af34006e6a11974088a46d42b903418eJohann if (error4x4 < error16x16) 12901b362b15af34006e6a11974088a46d42b903418eJohann { 12911b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = B_PRED; 12921b362b15af34006e6a11974088a46d42b903418eJohann best_rate = rate; 12931b362b15af34006e6a11974088a46d42b903418eJohann } 12941b362b15af34006e6a11974088a46d42b903418eJohann 12951b362b15af34006e6a11974088a46d42b903418eJohann *rate_ = best_rate; 12961b362b15af34006e6a11974088a46d42b903418eJohann} 1297