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