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