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
127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vp8_rtcd.h"
137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h"
141b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h"
151b362b15af34006e6a11974088a46d42b903418eJohann#include "mcomp.h"
161b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
181b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h>
191b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h>
201b362b15af34006e6a11974088a46d42b903418eJohann#include <math.h>
211b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/findnearmv.h"
22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp8/common/common.h"
231b362b15af34006e6a11974088a46d42b903418eJohann
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
251b362b15af34006e6a11974088a46d42b903418eJohannstatic int mv_ref_ct [31] [4] [2];
261b362b15af34006e6a11974088a46d42b903418eJohannstatic int mv_mode_cts [4] [2];
271b362b15af34006e6a11974088a46d42b903418eJohann#endif
281b362b15af34006e6a11974088a46d42b903418eJohann
291b362b15af34006e6a11974088a46d42b903418eJohannint vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight)
301b362b15af34006e6a11974088a46d42b903418eJohann{
311b362b15af34006e6a11974088a46d42b903418eJohann    /* MV costing is based on the distribution of vectors in the previous
321b362b15af34006e6a11974088a46d42b903418eJohann     * frame and as such will tend to over state the cost of vectors. In
331b362b15af34006e6a11974088a46d42b903418eJohann     * addition coding a new vector can have a knock on effect on the cost
341b362b15af34006e6a11974088a46d42b903418eJohann     * of subsequent vectors and the quality of prediction from NEAR and
351b362b15af34006e6a11974088a46d42b903418eJohann     * NEAREST for subsequent blocks. The "Weight" parameter allows, to a
361b362b15af34006e6a11974088a46d42b903418eJohann     * limited extent, for some account to be taken of these factors.
371b362b15af34006e6a11974088a46d42b903418eJohann     */
381b362b15af34006e6a11974088a46d42b903418eJohann    return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] + mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) * Weight) >> 7;
391b362b15af34006e6a11974088a46d42b903418eJohann}
401b362b15af34006e6a11974088a46d42b903418eJohann
411b362b15af34006e6a11974088a46d42b903418eJohannstatic int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int error_per_bit)
421b362b15af34006e6a11974088a46d42b903418eJohann{
431b362b15af34006e6a11974088a46d42b903418eJohann    /* Ignore mv costing if mvcost is NULL */
441b362b15af34006e6a11974088a46d42b903418eJohann    if (mvcost)
451b362b15af34006e6a11974088a46d42b903418eJohann        return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
461b362b15af34006e6a11974088a46d42b903418eJohann                 mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1])
471b362b15af34006e6a11974088a46d42b903418eJohann                 * error_per_bit + 128) >> 8;
481b362b15af34006e6a11974088a46d42b903418eJohann    return 0;
491b362b15af34006e6a11974088a46d42b903418eJohann}
501b362b15af34006e6a11974088a46d42b903418eJohann
511b362b15af34006e6a11974088a46d42b903418eJohannstatic int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvsadcost[2], int error_per_bit)
521b362b15af34006e6a11974088a46d42b903418eJohann{
531b362b15af34006e6a11974088a46d42b903418eJohann    /* Calculate sad error cost on full pixel basis. */
541b362b15af34006e6a11974088a46d42b903418eJohann    /* Ignore mv costing if mvsadcost is NULL */
551b362b15af34006e6a11974088a46d42b903418eJohann    if (mvsadcost)
561b362b15af34006e6a11974088a46d42b903418eJohann        return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] +
571b362b15af34006e6a11974088a46d42b903418eJohann                 mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)])
581b362b15af34006e6a11974088a46d42b903418eJohann                * error_per_bit + 128) >> 8;
591b362b15af34006e6a11974088a46d42b903418eJohann    return 0;
601b362b15af34006e6a11974088a46d42b903418eJohann}
611b362b15af34006e6a11974088a46d42b903418eJohann
621b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride)
631b362b15af34006e6a11974088a46d42b903418eJohann{
641b362b15af34006e6a11974088a46d42b903418eJohann    int Len;
651b362b15af34006e6a11974088a46d42b903418eJohann    int search_site_count = 0;
661b362b15af34006e6a11974088a46d42b903418eJohann
671b362b15af34006e6a11974088a46d42b903418eJohann
681b362b15af34006e6a11974088a46d42b903418eJohann    /* Generate offsets for 4 search sites per step. */
691b362b15af34006e6a11974088a46d42b903418eJohann    Len = MAX_FIRST_STEP;
701b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].mv.col = 0;
711b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].mv.row = 0;
721b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].offset = 0;
731b362b15af34006e6a11974088a46d42b903418eJohann    search_site_count++;
741b362b15af34006e6a11974088a46d42b903418eJohann
751b362b15af34006e6a11974088a46d42b903418eJohann    while (Len > 0)
761b362b15af34006e6a11974088a46d42b903418eJohann    {
771b362b15af34006e6a11974088a46d42b903418eJohann
781b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
791b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = 0;
801b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = -Len;
811b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len * stride;
821b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
831b362b15af34006e6a11974088a46d42b903418eJohann
841b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
851b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = 0;
861b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = Len;
871b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len * stride;
881b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
891b362b15af34006e6a11974088a46d42b903418eJohann
901b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
911b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = -Len;
921b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = 0;
931b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len;
941b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
951b362b15af34006e6a11974088a46d42b903418eJohann
961b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
971b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = Len;
981b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = 0;
991b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len;
1001b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1011b362b15af34006e6a11974088a46d42b903418eJohann
1021b362b15af34006e6a11974088a46d42b903418eJohann        /* Contract. */
1031b362b15af34006e6a11974088a46d42b903418eJohann        Len /= 2;
1041b362b15af34006e6a11974088a46d42b903418eJohann    }
1051b362b15af34006e6a11974088a46d42b903418eJohann
1061b362b15af34006e6a11974088a46d42b903418eJohann    x->ss_count = search_site_count;
1071b362b15af34006e6a11974088a46d42b903418eJohann    x->searches_per_step = 4;
1081b362b15af34006e6a11974088a46d42b903418eJohann}
1091b362b15af34006e6a11974088a46d42b903418eJohann
1101b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_init3smotion_compensation(MACROBLOCK *x, int stride)
1111b362b15af34006e6a11974088a46d42b903418eJohann{
1121b362b15af34006e6a11974088a46d42b903418eJohann    int Len;
1131b362b15af34006e6a11974088a46d42b903418eJohann    int search_site_count = 0;
1141b362b15af34006e6a11974088a46d42b903418eJohann
1151b362b15af34006e6a11974088a46d42b903418eJohann    /* Generate offsets for 8 search sites per step. */
1161b362b15af34006e6a11974088a46d42b903418eJohann    Len = MAX_FIRST_STEP;
1171b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].mv.col = 0;
1181b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].mv.row = 0;
1191b362b15af34006e6a11974088a46d42b903418eJohann    x->ss[search_site_count].offset = 0;
1201b362b15af34006e6a11974088a46d42b903418eJohann    search_site_count++;
1211b362b15af34006e6a11974088a46d42b903418eJohann
1221b362b15af34006e6a11974088a46d42b903418eJohann    while (Len > 0)
1231b362b15af34006e6a11974088a46d42b903418eJohann    {
1241b362b15af34006e6a11974088a46d42b903418eJohann
1251b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1261b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = 0;
1271b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = -Len;
1281b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len * stride;
1291b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1301b362b15af34006e6a11974088a46d42b903418eJohann
1311b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1321b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = 0;
1331b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = Len;
1341b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len * stride;
1351b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1361b362b15af34006e6a11974088a46d42b903418eJohann
1371b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1381b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = -Len;
1391b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = 0;
1401b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len;
1411b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1421b362b15af34006e6a11974088a46d42b903418eJohann
1431b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1441b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = Len;
1451b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = 0;
1461b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len;
1471b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1481b362b15af34006e6a11974088a46d42b903418eJohann
1491b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1501b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = -Len;
1511b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = -Len;
1521b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len * stride - Len;
1531b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1541b362b15af34006e6a11974088a46d42b903418eJohann
1551b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1561b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = Len;
1571b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = -Len;
1581b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = -Len * stride + Len;
1591b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1601b362b15af34006e6a11974088a46d42b903418eJohann
1611b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1621b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = -Len;
1631b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = Len;
1641b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len * stride - Len;
1651b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1661b362b15af34006e6a11974088a46d42b903418eJohann
1671b362b15af34006e6a11974088a46d42b903418eJohann        /* Compute offsets for search sites. */
1681b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.col = Len;
1691b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].mv.row = Len;
1701b362b15af34006e6a11974088a46d42b903418eJohann        x->ss[search_site_count].offset = Len * stride + Len;
1711b362b15af34006e6a11974088a46d42b903418eJohann        search_site_count++;
1721b362b15af34006e6a11974088a46d42b903418eJohann
1731b362b15af34006e6a11974088a46d42b903418eJohann
1741b362b15af34006e6a11974088a46d42b903418eJohann        /* Contract. */
1751b362b15af34006e6a11974088a46d42b903418eJohann        Len /= 2;
1761b362b15af34006e6a11974088a46d42b903418eJohann    }
1771b362b15af34006e6a11974088a46d42b903418eJohann
1781b362b15af34006e6a11974088a46d42b903418eJohann    x->ss_count = search_site_count;
1791b362b15af34006e6a11974088a46d42b903418eJohann    x->searches_per_step = 8;
1801b362b15af34006e6a11974088a46d42b903418eJohann}
1811b362b15af34006e6a11974088a46d42b903418eJohann
1821b362b15af34006e6a11974088a46d42b903418eJohann/*
1831b362b15af34006e6a11974088a46d42b903418eJohann * To avoid the penalty for crossing cache-line read, preload the reference
1841b362b15af34006e6a11974088a46d42b903418eJohann * area in a small buffer, which is aligned to make sure there won't be crossing
1851b362b15af34006e6a11974088a46d42b903418eJohann * cache-line read while reading from this buffer. This reduced the cpu
1861b362b15af34006e6a11974088a46d42b903418eJohann * cycles spent on reading ref data in sub-pixel filter functions.
1871b362b15af34006e6a11974088a46d42b903418eJohann * TODO: Currently, since sub-pixel search range here is -3 ~ 3, copy 22 rows x
1881b362b15af34006e6a11974088a46d42b903418eJohann * 32 cols area that is enough for 16x16 macroblock. Later, for SPLITMV, we
1891b362b15af34006e6a11974088a46d42b903418eJohann * could reduce the area.
1901b362b15af34006e6a11974088a46d42b903418eJohann */
1911b362b15af34006e6a11974088a46d42b903418eJohann
1921b362b15af34006e6a11974088a46d42b903418eJohann/* estimated cost of a motion vector (r,c) */
1931b362b15af34006e6a11974088a46d42b903418eJohann#define MVC(r,c) (mvcost ? ((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 : 0)
1941b362b15af34006e6a11974088a46d42b903418eJohann/* pointer to predictor base of a motionvector */
1951b362b15af34006e6a11974088a46d42b903418eJohann#define PRE(r,c) (y + (((r)>>2) * y_stride + ((c)>>2) -(offset)))
1961b362b15af34006e6a11974088a46d42b903418eJohann/* convert motion vector component to offset for svf calc */
1971b362b15af34006e6a11974088a46d42b903418eJohann#define SP(x) (((x)&3)<<1)
1981b362b15af34006e6a11974088a46d42b903418eJohann/* returns subpixel variance error function. */
1991b362b15af34006e6a11974088a46d42b903418eJohann#define DIST(r,c) vfp->svf( PRE(r,c), y_stride, SP(c),SP(r), z,b->src_stride,&sse)
2001b362b15af34006e6a11974088a46d42b903418eJohann#define IFMVCV(r,c,s,e) if ( c >= minc && c <= maxc && r >= minr && r <= maxr) s else e;
2011b362b15af34006e6a11974088a46d42b903418eJohann/* returns distortion + motion vector cost */
2021b362b15af34006e6a11974088a46d42b903418eJohann#define ERR(r,c) (MVC(r,c)+DIST(r,c))
2031b362b15af34006e6a11974088a46d42b903418eJohann/* checks if (r,c) has better score than previous best */
2041b362b15af34006e6a11974088a46d42b903418eJohann#define CHECK_BETTER(v,r,c) IFMVCV(r,c,{thismse = DIST(r,c); if((v = (MVC(r,c)+thismse)) < besterr) { besterr = v; br=r; bc=c; *distortion = thismse; *sse1 = sse; }}, v=UINT_MAX;)
2051b362b15af34006e6a11974088a46d42b903418eJohann
2061b362b15af34006e6a11974088a46d42b903418eJohannint vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
2071b362b15af34006e6a11974088a46d42b903418eJohann                                             int_mv *bestmv, int_mv *ref_mv,
2081b362b15af34006e6a11974088a46d42b903418eJohann                                             int error_per_bit,
2091b362b15af34006e6a11974088a46d42b903418eJohann                                             const vp8_variance_fn_ptr_t *vfp,
2101b362b15af34006e6a11974088a46d42b903418eJohann                                             int *mvcost[2], int *distortion,
2111b362b15af34006e6a11974088a46d42b903418eJohann                                             unsigned int *sse1)
2121b362b15af34006e6a11974088a46d42b903418eJohann{
2131b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *z = (*(b->base_src) + b->src);
2141b362b15af34006e6a11974088a46d42b903418eJohann
2151b362b15af34006e6a11974088a46d42b903418eJohann    int rr = ref_mv->as_mv.row >> 1, rc = ref_mv->as_mv.col >> 1;
2165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int br = bestmv->as_mv.row * 4, bc = bestmv->as_mv.col * 4;
2171b362b15af34006e6a11974088a46d42b903418eJohann    int tr = br, tc = bc;
2181b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int besterr;
2191b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int left, right, up, down, diag;
2201b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sse;
2211b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int whichdir;
2221b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int halfiters = 4;
2231b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int quarteriters = 4;
2241b362b15af34006e6a11974088a46d42b903418eJohann    int thismse;
2251b362b15af34006e6a11974088a46d42b903418eJohann
2265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int minc = MAX(x->mv_col_min * 4,
2275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   (ref_mv->as_mv.col >> 1) - ((1 << mvlong_width) - 1));
2285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int maxc = MIN(x->mv_col_max * 4,
2295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   (ref_mv->as_mv.col >> 1) + ((1 << mvlong_width) - 1));
2305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int minr = MAX(x->mv_row_min * 4,
2315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   (ref_mv->as_mv.row >> 1) - ((1 << mvlong_width) - 1));
2325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int maxr = MIN(x->mv_row_max * 4,
2335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   (ref_mv->as_mv.row >> 1) + ((1 << mvlong_width) - 1));
2341b362b15af34006e6a11974088a46d42b903418eJohann
2351b362b15af34006e6a11974088a46d42b903418eJohann    int y_stride;
2361b362b15af34006e6a11974088a46d42b903418eJohann    int offset;
2371b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
2381b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
2391b362b15af34006e6a11974088a46d42b903418eJohann
2401b362b15af34006e6a11974088a46d42b903418eJohann
2411b362b15af34006e6a11974088a46d42b903418eJohann#if ARCH_X86 || ARCH_X86_64
2421b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
2441b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *y;
245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int buf_r1, buf_r2, buf_c1;
2461b362b15af34006e6a11974088a46d42b903418eJohann
2471b362b15af34006e6a11974088a46d42b903418eJohann    /* Clamping to avoid out-of-range data access */
2481b362b15af34006e6a11974088a46d42b903418eJohann    buf_r1 = ((bestmv->as_mv.row - 3) < x->mv_row_min)?(bestmv->as_mv.row - x->mv_row_min):3;
2491b362b15af34006e6a11974088a46d42b903418eJohann    buf_r2 = ((bestmv->as_mv.row + 3) > x->mv_row_max)?(x->mv_row_max - bestmv->as_mv.row):3;
2501b362b15af34006e6a11974088a46d42b903418eJohann    buf_c1 = ((bestmv->as_mv.col - 3) < x->mv_col_min)?(bestmv->as_mv.col - x->mv_col_min):3;
2511b362b15af34006e6a11974088a46d42b903418eJohann    y_stride = 32;
2521b362b15af34006e6a11974088a46d42b903418eJohann
2531b362b15af34006e6a11974088a46d42b903418eJohann    /* Copy to intermediate buffer before searching. */
254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vfp->copymem(y_0 - buf_c1 - pre_stride*buf_r1, pre_stride, xd->y_buf, y_stride, 16+buf_r1+buf_r2);
2551b362b15af34006e6a11974088a46d42b903418eJohann    y = xd->y_buf + y_stride*buf_r1 +buf_c1;
2561b362b15af34006e6a11974088a46d42b903418eJohann#else
2571b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
2581b362b15af34006e6a11974088a46d42b903418eJohann    y_stride = pre_stride;
2591b362b15af34006e6a11974088a46d42b903418eJohann#endif
2601b362b15af34006e6a11974088a46d42b903418eJohann
2611b362b15af34006e6a11974088a46d42b903418eJohann    offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
2621b362b15af34006e6a11974088a46d42b903418eJohann
2631b362b15af34006e6a11974088a46d42b903418eJohann    /* central mv */
2645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.row *= 8;
2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.col *= 8;
2661b362b15af34006e6a11974088a46d42b903418eJohann
2671b362b15af34006e6a11974088a46d42b903418eJohann    /* calculate central point error */
2681b362b15af34006e6a11974088a46d42b903418eJohann    besterr = vfp->vf(y, y_stride, z, b->src_stride, sse1);
2691b362b15af34006e6a11974088a46d42b903418eJohann    *distortion = besterr;
2701b362b15af34006e6a11974088a46d42b903418eJohann    besterr += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
2711b362b15af34006e6a11974088a46d42b903418eJohann
2721b362b15af34006e6a11974088a46d42b903418eJohann    /* TODO: Each subsequent iteration checks at least one point in common
2731b362b15af34006e6a11974088a46d42b903418eJohann     * with the last iteration could be 2 ( if diag selected)
2741b362b15af34006e6a11974088a46d42b903418eJohann     */
2751b362b15af34006e6a11974088a46d42b903418eJohann    while (--halfiters)
2761b362b15af34006e6a11974088a46d42b903418eJohann    {
2771b362b15af34006e6a11974088a46d42b903418eJohann        /* 1/2 pel */
2781b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(left, tr, tc - 2);
2791b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(right, tr, tc + 2);
2801b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(up, tr - 2, tc);
2811b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(down, tr + 2, tc);
2821b362b15af34006e6a11974088a46d42b903418eJohann
2831b362b15af34006e6a11974088a46d42b903418eJohann        whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
2841b362b15af34006e6a11974088a46d42b903418eJohann
2851b362b15af34006e6a11974088a46d42b903418eJohann        switch (whichdir)
2861b362b15af34006e6a11974088a46d42b903418eJohann        {
2871b362b15af34006e6a11974088a46d42b903418eJohann        case 0:
2881b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr - 2, tc - 2);
2891b362b15af34006e6a11974088a46d42b903418eJohann            break;
2901b362b15af34006e6a11974088a46d42b903418eJohann        case 1:
2911b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr - 2, tc + 2);
2921b362b15af34006e6a11974088a46d42b903418eJohann            break;
2931b362b15af34006e6a11974088a46d42b903418eJohann        case 2:
2941b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr + 2, tc - 2);
2951b362b15af34006e6a11974088a46d42b903418eJohann            break;
2961b362b15af34006e6a11974088a46d42b903418eJohann        case 3:
2971b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr + 2, tc + 2);
2981b362b15af34006e6a11974088a46d42b903418eJohann            break;
2991b362b15af34006e6a11974088a46d42b903418eJohann        }
3001b362b15af34006e6a11974088a46d42b903418eJohann
3011b362b15af34006e6a11974088a46d42b903418eJohann        /* no reason to check the same one again. */
3021b362b15af34006e6a11974088a46d42b903418eJohann        if (tr == br && tc == bc)
3031b362b15af34006e6a11974088a46d42b903418eJohann            break;
3041b362b15af34006e6a11974088a46d42b903418eJohann
3051b362b15af34006e6a11974088a46d42b903418eJohann        tr = br;
3061b362b15af34006e6a11974088a46d42b903418eJohann        tc = bc;
3071b362b15af34006e6a11974088a46d42b903418eJohann    }
3081b362b15af34006e6a11974088a46d42b903418eJohann
3091b362b15af34006e6a11974088a46d42b903418eJohann    /* TODO: Each subsequent iteration checks at least one point in common
3101b362b15af34006e6a11974088a46d42b903418eJohann     * with the last iteration could be 2 ( if diag selected)
3111b362b15af34006e6a11974088a46d42b903418eJohann     */
3121b362b15af34006e6a11974088a46d42b903418eJohann
3131b362b15af34006e6a11974088a46d42b903418eJohann    /* 1/4 pel */
3141b362b15af34006e6a11974088a46d42b903418eJohann    while (--quarteriters)
3151b362b15af34006e6a11974088a46d42b903418eJohann    {
3161b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(left, tr, tc - 1);
3171b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(right, tr, tc + 1);
3181b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(up, tr - 1, tc);
3191b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BETTER(down, tr + 1, tc);
3201b362b15af34006e6a11974088a46d42b903418eJohann
3211b362b15af34006e6a11974088a46d42b903418eJohann        whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
3221b362b15af34006e6a11974088a46d42b903418eJohann
3231b362b15af34006e6a11974088a46d42b903418eJohann        switch (whichdir)
3241b362b15af34006e6a11974088a46d42b903418eJohann        {
3251b362b15af34006e6a11974088a46d42b903418eJohann        case 0:
3261b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr - 1, tc - 1);
3271b362b15af34006e6a11974088a46d42b903418eJohann            break;
3281b362b15af34006e6a11974088a46d42b903418eJohann        case 1:
3291b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr - 1, tc + 1);
3301b362b15af34006e6a11974088a46d42b903418eJohann            break;
3311b362b15af34006e6a11974088a46d42b903418eJohann        case 2:
3321b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr + 1, tc - 1);
3331b362b15af34006e6a11974088a46d42b903418eJohann            break;
3341b362b15af34006e6a11974088a46d42b903418eJohann        case 3:
3351b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER(diag, tr + 1, tc + 1);
3361b362b15af34006e6a11974088a46d42b903418eJohann            break;
3371b362b15af34006e6a11974088a46d42b903418eJohann        }
3381b362b15af34006e6a11974088a46d42b903418eJohann
3391b362b15af34006e6a11974088a46d42b903418eJohann        /* no reason to check the same one again. */
3401b362b15af34006e6a11974088a46d42b903418eJohann        if (tr == br && tc == bc)
3411b362b15af34006e6a11974088a46d42b903418eJohann            break;
3421b362b15af34006e6a11974088a46d42b903418eJohann
3431b362b15af34006e6a11974088a46d42b903418eJohann        tr = br;
3441b362b15af34006e6a11974088a46d42b903418eJohann        tc = bc;
3451b362b15af34006e6a11974088a46d42b903418eJohann    }
3461b362b15af34006e6a11974088a46d42b903418eJohann
3475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.row = br * 2;
3485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.col = bc * 2;
3491b362b15af34006e6a11974088a46d42b903418eJohann
3501b362b15af34006e6a11974088a46d42b903418eJohann    if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL<<3)) ||
3511b362b15af34006e6a11974088a46d42b903418eJohann        (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL<<3)))
3521b362b15af34006e6a11974088a46d42b903418eJohann        return INT_MAX;
3531b362b15af34006e6a11974088a46d42b903418eJohann
3541b362b15af34006e6a11974088a46d42b903418eJohann    return besterr;
3551b362b15af34006e6a11974088a46d42b903418eJohann}
3561b362b15af34006e6a11974088a46d42b903418eJohann#undef MVC
3571b362b15af34006e6a11974088a46d42b903418eJohann#undef PRE
3581b362b15af34006e6a11974088a46d42b903418eJohann#undef SP
3591b362b15af34006e6a11974088a46d42b903418eJohann#undef DIST
3601b362b15af34006e6a11974088a46d42b903418eJohann#undef IFMVCV
3611b362b15af34006e6a11974088a46d42b903418eJohann#undef ERR
3621b362b15af34006e6a11974088a46d42b903418eJohann#undef CHECK_BETTER
3631b362b15af34006e6a11974088a46d42b903418eJohann
3641b362b15af34006e6a11974088a46d42b903418eJohannint vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
3651b362b15af34006e6a11974088a46d42b903418eJohann                                 int_mv *bestmv, int_mv *ref_mv,
3661b362b15af34006e6a11974088a46d42b903418eJohann                                 int error_per_bit,
3671b362b15af34006e6a11974088a46d42b903418eJohann                                 const vp8_variance_fn_ptr_t *vfp,
3681b362b15af34006e6a11974088a46d42b903418eJohann                                 int *mvcost[2], int *distortion,
3691b362b15af34006e6a11974088a46d42b903418eJohann                                 unsigned int *sse1)
3701b362b15af34006e6a11974088a46d42b903418eJohann{
3711b362b15af34006e6a11974088a46d42b903418eJohann    int bestmse = INT_MAX;
3721b362b15af34006e6a11974088a46d42b903418eJohann    int_mv startmv;
3731b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
3741b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *z = (*(b->base_src) + b->src);
3751b362b15af34006e6a11974088a46d42b903418eJohann    int left, right, up, down, diag;
3761b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sse;
3771b362b15af34006e6a11974088a46d42b903418eJohann    int whichdir ;
3781b362b15af34006e6a11974088a46d42b903418eJohann    int thismse;
3791b362b15af34006e6a11974088a46d42b903418eJohann    int y_stride;
3801b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
3811b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
3821b362b15af34006e6a11974088a46d42b903418eJohann
3831b362b15af34006e6a11974088a46d42b903418eJohann#if ARCH_X86 || ARCH_X86_64
3841b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
3861b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *y;
3871b362b15af34006e6a11974088a46d42b903418eJohann
3881b362b15af34006e6a11974088a46d42b903418eJohann    y_stride = 32;
3891b362b15af34006e6a11974088a46d42b903418eJohann    /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */
390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     vfp->copymem(y_0 - 1 - pre_stride, pre_stride, xd->y_buf, y_stride, 18);
3911b362b15af34006e6a11974088a46d42b903418eJohann     y = xd->y_buf + y_stride + 1;
3921b362b15af34006e6a11974088a46d42b903418eJohann#else
3931b362b15af34006e6a11974088a46d42b903418eJohann     unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
3941b362b15af34006e6a11974088a46d42b903418eJohann     y_stride = pre_stride;
3951b362b15af34006e6a11974088a46d42b903418eJohann#endif
3961b362b15af34006e6a11974088a46d42b903418eJohann
3971b362b15af34006e6a11974088a46d42b903418eJohann    /* central mv */
3987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestmv->as_mv.row *= 8;
3997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestmv->as_mv.col *= 8;
4001b362b15af34006e6a11974088a46d42b903418eJohann    startmv = *bestmv;
4011b362b15af34006e6a11974088a46d42b903418eJohann
4021b362b15af34006e6a11974088a46d42b903418eJohann    /* calculate central point error */
4031b362b15af34006e6a11974088a46d42b903418eJohann    bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1);
4041b362b15af34006e6a11974088a46d42b903418eJohann    *distortion = bestmse;
4051b362b15af34006e6a11974088a46d42b903418eJohann    bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
4061b362b15af34006e6a11974088a46d42b903418eJohann
4071b362b15af34006e6a11974088a46d42b903418eJohann    /* go left then right and check error */
4081b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = startmv.as_mv.row;
4091b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
4101b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse);
4111b362b15af34006e6a11974088a46d42b903418eJohann    left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
4121b362b15af34006e6a11974088a46d42b903418eJohann
4131b362b15af34006e6a11974088a46d42b903418eJohann    if (left < bestmse)
4141b362b15af34006e6a11974088a46d42b903418eJohann    {
4151b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
4161b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = left;
4171b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
4181b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
4191b362b15af34006e6a11974088a46d42b903418eJohann    }
4201b362b15af34006e6a11974088a46d42b903418eJohann
4211b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col += 8;
4221b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse);
4231b362b15af34006e6a11974088a46d42b903418eJohann    right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
4241b362b15af34006e6a11974088a46d42b903418eJohann
4251b362b15af34006e6a11974088a46d42b903418eJohann    if (right < bestmse)
4261b362b15af34006e6a11974088a46d42b903418eJohann    {
4271b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
4281b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = right;
4291b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
4301b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
4311b362b15af34006e6a11974088a46d42b903418eJohann    }
4321b362b15af34006e6a11974088a46d42b903418eJohann
4331b362b15af34006e6a11974088a46d42b903418eJohann    /* go up then down and check error */
4341b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = startmv.as_mv.col;
4351b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
4361b362b15af34006e6a11974088a46d42b903418eJohann    thismse =  vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse);
4371b362b15af34006e6a11974088a46d42b903418eJohann    up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
4381b362b15af34006e6a11974088a46d42b903418eJohann
4391b362b15af34006e6a11974088a46d42b903418eJohann    if (up < bestmse)
4401b362b15af34006e6a11974088a46d42b903418eJohann    {
4411b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
4421b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = up;
4431b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
4441b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
4451b362b15af34006e6a11974088a46d42b903418eJohann    }
4461b362b15af34006e6a11974088a46d42b903418eJohann
4471b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row += 8;
4481b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse);
4491b362b15af34006e6a11974088a46d42b903418eJohann    down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
4501b362b15af34006e6a11974088a46d42b903418eJohann
4511b362b15af34006e6a11974088a46d42b903418eJohann    if (down < bestmse)
4521b362b15af34006e6a11974088a46d42b903418eJohann    {
4531b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
4541b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = down;
4551b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
4561b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
4571b362b15af34006e6a11974088a46d42b903418eJohann    }
4581b362b15af34006e6a11974088a46d42b903418eJohann
4591b362b15af34006e6a11974088a46d42b903418eJohann
4601b362b15af34006e6a11974088a46d42b903418eJohann    /* now check 1 more diagonal */
4611b362b15af34006e6a11974088a46d42b903418eJohann    whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
4621b362b15af34006e6a11974088a46d42b903418eJohann    this_mv = startmv;
4631b362b15af34006e6a11974088a46d42b903418eJohann
4641b362b15af34006e6a11974088a46d42b903418eJohann    switch (whichdir)
4651b362b15af34006e6a11974088a46d42b903418eJohann    {
4661b362b15af34006e6a11974088a46d42b903418eJohann    case 0:
4671b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
4681b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
4691b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse);
4701b362b15af34006e6a11974088a46d42b903418eJohann        break;
4711b362b15af34006e6a11974088a46d42b903418eJohann    case 1:
4721b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 4;
4731b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
4741b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse);
4751b362b15af34006e6a11974088a46d42b903418eJohann        break;
4761b362b15af34006e6a11974088a46d42b903418eJohann    case 2:
4771b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
4781b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 4;
4791b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse);
4801b362b15af34006e6a11974088a46d42b903418eJohann        break;
4811b362b15af34006e6a11974088a46d42b903418eJohann    case 3:
4821b362b15af34006e6a11974088a46d42b903418eJohann    default:
4831b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 4;
4841b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 4;
4851b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse);
4861b362b15af34006e6a11974088a46d42b903418eJohann        break;
4871b362b15af34006e6a11974088a46d42b903418eJohann    }
4881b362b15af34006e6a11974088a46d42b903418eJohann
4891b362b15af34006e6a11974088a46d42b903418eJohann    diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
4901b362b15af34006e6a11974088a46d42b903418eJohann
4911b362b15af34006e6a11974088a46d42b903418eJohann    if (diag < bestmse)
4921b362b15af34006e6a11974088a46d42b903418eJohann    {
4931b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
4941b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = diag;
4951b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
4961b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
4971b362b15af34006e6a11974088a46d42b903418eJohann    }
4981b362b15af34006e6a11974088a46d42b903418eJohann
4991b362b15af34006e6a11974088a46d42b903418eJohann
5001b362b15af34006e6a11974088a46d42b903418eJohann    /* time to check quarter pels. */
5011b362b15af34006e6a11974088a46d42b903418eJohann    if (bestmv->as_mv.row < startmv.as_mv.row)
5021b362b15af34006e6a11974088a46d42b903418eJohann        y -= y_stride;
5031b362b15af34006e6a11974088a46d42b903418eJohann
5041b362b15af34006e6a11974088a46d42b903418eJohann    if (bestmv->as_mv.col < startmv.as_mv.col)
5051b362b15af34006e6a11974088a46d42b903418eJohann        y--;
5061b362b15af34006e6a11974088a46d42b903418eJohann
5071b362b15af34006e6a11974088a46d42b903418eJohann    startmv = *bestmv;
5081b362b15af34006e6a11974088a46d42b903418eJohann
5091b362b15af34006e6a11974088a46d42b903418eJohann
5101b362b15af34006e6a11974088a46d42b903418eJohann
5111b362b15af34006e6a11974088a46d42b903418eJohann    /* go left then right and check error */
5121b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = startmv.as_mv.row;
5131b362b15af34006e6a11974088a46d42b903418eJohann
5141b362b15af34006e6a11974088a46d42b903418eJohann    if (startmv.as_mv.col & 7)
5151b362b15af34006e6a11974088a46d42b903418eJohann    {
5161b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = startmv.as_mv.col - 2;
5171b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
5181b362b15af34006e6a11974088a46d42b903418eJohann    }
5191b362b15af34006e6a11974088a46d42b903418eJohann    else
5201b362b15af34006e6a11974088a46d42b903418eJohann    {
5211b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
5221b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
5231b362b15af34006e6a11974088a46d42b903418eJohann    }
5241b362b15af34006e6a11974088a46d42b903418eJohann
5251b362b15af34006e6a11974088a46d42b903418eJohann    left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
5261b362b15af34006e6a11974088a46d42b903418eJohann
5271b362b15af34006e6a11974088a46d42b903418eJohann    if (left < bestmse)
5281b362b15af34006e6a11974088a46d42b903418eJohann    {
5291b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
5301b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = left;
5311b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
5321b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
5331b362b15af34006e6a11974088a46d42b903418eJohann    }
5341b362b15af34006e6a11974088a46d42b903418eJohann
5351b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col += 4;
5361b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
5371b362b15af34006e6a11974088a46d42b903418eJohann    right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
5381b362b15af34006e6a11974088a46d42b903418eJohann
5391b362b15af34006e6a11974088a46d42b903418eJohann    if (right < bestmse)
5401b362b15af34006e6a11974088a46d42b903418eJohann    {
5411b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
5421b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = right;
5431b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
5441b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
5451b362b15af34006e6a11974088a46d42b903418eJohann    }
5461b362b15af34006e6a11974088a46d42b903418eJohann
5471b362b15af34006e6a11974088a46d42b903418eJohann    /* go up then down and check error */
5481b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = startmv.as_mv.col;
5491b362b15af34006e6a11974088a46d42b903418eJohann
5501b362b15af34006e6a11974088a46d42b903418eJohann    if (startmv.as_mv.row & 7)
5511b362b15af34006e6a11974088a46d42b903418eJohann    {
5521b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = startmv.as_mv.row - 2;
5531b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
5541b362b15af34006e6a11974088a46d42b903418eJohann    }
5551b362b15af34006e6a11974088a46d42b903418eJohann    else
5561b362b15af34006e6a11974088a46d42b903418eJohann    {
5571b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
5581b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
5591b362b15af34006e6a11974088a46d42b903418eJohann    }
5601b362b15af34006e6a11974088a46d42b903418eJohann
5611b362b15af34006e6a11974088a46d42b903418eJohann    up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
5621b362b15af34006e6a11974088a46d42b903418eJohann
5631b362b15af34006e6a11974088a46d42b903418eJohann    if (up < bestmse)
5641b362b15af34006e6a11974088a46d42b903418eJohann    {
5651b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
5661b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = up;
5671b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
5681b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
5691b362b15af34006e6a11974088a46d42b903418eJohann    }
5701b362b15af34006e6a11974088a46d42b903418eJohann
5711b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row += 4;
5721b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
5731b362b15af34006e6a11974088a46d42b903418eJohann    down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
5741b362b15af34006e6a11974088a46d42b903418eJohann
5751b362b15af34006e6a11974088a46d42b903418eJohann    if (down < bestmse)
5761b362b15af34006e6a11974088a46d42b903418eJohann    {
5771b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
5781b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = down;
5791b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
5801b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
5811b362b15af34006e6a11974088a46d42b903418eJohann    }
5821b362b15af34006e6a11974088a46d42b903418eJohann
5831b362b15af34006e6a11974088a46d42b903418eJohann
5841b362b15af34006e6a11974088a46d42b903418eJohann    /* now check 1 more diagonal */
5851b362b15af34006e6a11974088a46d42b903418eJohann    whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
5861b362b15af34006e6a11974088a46d42b903418eJohann
5871b362b15af34006e6a11974088a46d42b903418eJohann    this_mv = startmv;
5881b362b15af34006e6a11974088a46d42b903418eJohann
5891b362b15af34006e6a11974088a46d42b903418eJohann    switch (whichdir)
5901b362b15af34006e6a11974088a46d42b903418eJohann    {
5911b362b15af34006e6a11974088a46d42b903418eJohann    case 0:
5921b362b15af34006e6a11974088a46d42b903418eJohann
5931b362b15af34006e6a11974088a46d42b903418eJohann        if (startmv.as_mv.row & 7)
5941b362b15af34006e6a11974088a46d42b903418eJohann        {
5951b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row -= 2;
5961b362b15af34006e6a11974088a46d42b903418eJohann
5971b362b15af34006e6a11974088a46d42b903418eJohann            if (startmv.as_mv.col & 7)
5981b362b15af34006e6a11974088a46d42b903418eJohann            {
5991b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col -= 2;
6001b362b15af34006e6a11974088a46d42b903418eJohann                thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
6011b362b15af34006e6a11974088a46d42b903418eJohann            }
6021b362b15af34006e6a11974088a46d42b903418eJohann            else
6031b362b15af34006e6a11974088a46d42b903418eJohann            {
6041b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
6051b362b15af34006e6a11974088a46d42b903418eJohann                thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);;
6061b362b15af34006e6a11974088a46d42b903418eJohann            }
6071b362b15af34006e6a11974088a46d42b903418eJohann        }
6081b362b15af34006e6a11974088a46d42b903418eJohann        else
6091b362b15af34006e6a11974088a46d42b903418eJohann        {
6101b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
6111b362b15af34006e6a11974088a46d42b903418eJohann
6121b362b15af34006e6a11974088a46d42b903418eJohann            if (startmv.as_mv.col & 7)
6131b362b15af34006e6a11974088a46d42b903418eJohann            {
6141b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col -= 2;
6151b362b15af34006e6a11974088a46d42b903418eJohann                thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
6161b362b15af34006e6a11974088a46d42b903418eJohann            }
6171b362b15af34006e6a11974088a46d42b903418eJohann            else
6181b362b15af34006e6a11974088a46d42b903418eJohann            {
6191b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
6201b362b15af34006e6a11974088a46d42b903418eJohann                thismse = vfp->svf(y - y_stride - 1, y_stride, 6, 6, z, b->src_stride, &sse);
6211b362b15af34006e6a11974088a46d42b903418eJohann            }
6221b362b15af34006e6a11974088a46d42b903418eJohann        }
6231b362b15af34006e6a11974088a46d42b903418eJohann
6241b362b15af34006e6a11974088a46d42b903418eJohann        break;
6251b362b15af34006e6a11974088a46d42b903418eJohann    case 1:
6261b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 2;
6271b362b15af34006e6a11974088a46d42b903418eJohann
6281b362b15af34006e6a11974088a46d42b903418eJohann        if (startmv.as_mv.row & 7)
6291b362b15af34006e6a11974088a46d42b903418eJohann        {
6301b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row -= 2;
6311b362b15af34006e6a11974088a46d42b903418eJohann            thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
6321b362b15af34006e6a11974088a46d42b903418eJohann        }
6331b362b15af34006e6a11974088a46d42b903418eJohann        else
6341b362b15af34006e6a11974088a46d42b903418eJohann        {
6351b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
6361b362b15af34006e6a11974088a46d42b903418eJohann            thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
6371b362b15af34006e6a11974088a46d42b903418eJohann        }
6381b362b15af34006e6a11974088a46d42b903418eJohann
6391b362b15af34006e6a11974088a46d42b903418eJohann        break;
6401b362b15af34006e6a11974088a46d42b903418eJohann    case 2:
6411b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 2;
6421b362b15af34006e6a11974088a46d42b903418eJohann
6431b362b15af34006e6a11974088a46d42b903418eJohann        if (startmv.as_mv.col & 7)
6441b362b15af34006e6a11974088a46d42b903418eJohann        {
6451b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.col -= 2;
6461b362b15af34006e6a11974088a46d42b903418eJohann            thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
6471b362b15af34006e6a11974088a46d42b903418eJohann        }
6481b362b15af34006e6a11974088a46d42b903418eJohann        else
6491b362b15af34006e6a11974088a46d42b903418eJohann        {
6501b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
6511b362b15af34006e6a11974088a46d42b903418eJohann            thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
6521b362b15af34006e6a11974088a46d42b903418eJohann        }
6531b362b15af34006e6a11974088a46d42b903418eJohann
6541b362b15af34006e6a11974088a46d42b903418eJohann        break;
6551b362b15af34006e6a11974088a46d42b903418eJohann    case 3:
6561b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 2;
6571b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 2;
6581b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf(y, y_stride,  this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
6591b362b15af34006e6a11974088a46d42b903418eJohann        break;
6601b362b15af34006e6a11974088a46d42b903418eJohann    }
6611b362b15af34006e6a11974088a46d42b903418eJohann
6621b362b15af34006e6a11974088a46d42b903418eJohann    diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
6631b362b15af34006e6a11974088a46d42b903418eJohann
6641b362b15af34006e6a11974088a46d42b903418eJohann    if (diag < bestmse)
6651b362b15af34006e6a11974088a46d42b903418eJohann    {
6661b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
6671b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = diag;
6681b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
6691b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
6701b362b15af34006e6a11974088a46d42b903418eJohann    }
6711b362b15af34006e6a11974088a46d42b903418eJohann
6721b362b15af34006e6a11974088a46d42b903418eJohann    return bestmse;
6731b362b15af34006e6a11974088a46d42b903418eJohann}
6741b362b15af34006e6a11974088a46d42b903418eJohann
6751b362b15af34006e6a11974088a46d42b903418eJohannint vp8_find_best_half_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
6761b362b15af34006e6a11974088a46d42b903418eJohann                                  int_mv *bestmv, int_mv *ref_mv,
6771b362b15af34006e6a11974088a46d42b903418eJohann                                  int error_per_bit,
6781b362b15af34006e6a11974088a46d42b903418eJohann                                  const vp8_variance_fn_ptr_t *vfp,
6791b362b15af34006e6a11974088a46d42b903418eJohann                                  int *mvcost[2], int *distortion,
6801b362b15af34006e6a11974088a46d42b903418eJohann                                  unsigned int *sse1)
6811b362b15af34006e6a11974088a46d42b903418eJohann{
6821b362b15af34006e6a11974088a46d42b903418eJohann    int bestmse = INT_MAX;
6831b362b15af34006e6a11974088a46d42b903418eJohann    int_mv startmv;
6841b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
6851b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *z = (*(b->base_src) + b->src);
6861b362b15af34006e6a11974088a46d42b903418eJohann    int left, right, up, down, diag;
6871b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sse;
6881b362b15af34006e6a11974088a46d42b903418eJohann    int whichdir ;
6891b362b15af34006e6a11974088a46d42b903418eJohann    int thismse;
6901b362b15af34006e6a11974088a46d42b903418eJohann    int y_stride;
6911b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
6921b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
6931b362b15af34006e6a11974088a46d42b903418eJohann
6941b362b15af34006e6a11974088a46d42b903418eJohann#if ARCH_X86 || ARCH_X86_64
6951b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd = &x->e_mbd;
696ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
6971b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *y;
6981b362b15af34006e6a11974088a46d42b903418eJohann
6991b362b15af34006e6a11974088a46d42b903418eJohann    y_stride = 32;
7001b362b15af34006e6a11974088a46d42b903418eJohann    /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */
701ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vfp->copymem(y_0 - 1 - pre_stride, pre_stride, xd->y_buf, y_stride, 18);
7021b362b15af34006e6a11974088a46d42b903418eJohann    y = xd->y_buf + y_stride + 1;
7031b362b15af34006e6a11974088a46d42b903418eJohann#else
7041b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
7051b362b15af34006e6a11974088a46d42b903418eJohann    y_stride = pre_stride;
7061b362b15af34006e6a11974088a46d42b903418eJohann#endif
7071b362b15af34006e6a11974088a46d42b903418eJohann
7081b362b15af34006e6a11974088a46d42b903418eJohann    /* central mv */
7095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.row *= 8;
7105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bestmv->as_mv.col *= 8;
7111b362b15af34006e6a11974088a46d42b903418eJohann    startmv = *bestmv;
7121b362b15af34006e6a11974088a46d42b903418eJohann
7131b362b15af34006e6a11974088a46d42b903418eJohann    /* calculate central point error */
7141b362b15af34006e6a11974088a46d42b903418eJohann    bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1);
7151b362b15af34006e6a11974088a46d42b903418eJohann    *distortion = bestmse;
7161b362b15af34006e6a11974088a46d42b903418eJohann    bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
7171b362b15af34006e6a11974088a46d42b903418eJohann
7181b362b15af34006e6a11974088a46d42b903418eJohann    /* go left then right and check error */
7191b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = startmv.as_mv.row;
7201b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
7211b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse);
7221b362b15af34006e6a11974088a46d42b903418eJohann    left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
7231b362b15af34006e6a11974088a46d42b903418eJohann
7241b362b15af34006e6a11974088a46d42b903418eJohann    if (left < bestmse)
7251b362b15af34006e6a11974088a46d42b903418eJohann    {
7261b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
7271b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = left;
7281b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
7291b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
7301b362b15af34006e6a11974088a46d42b903418eJohann    }
7311b362b15af34006e6a11974088a46d42b903418eJohann
7321b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col += 8;
7331b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse);
7341b362b15af34006e6a11974088a46d42b903418eJohann    right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
7351b362b15af34006e6a11974088a46d42b903418eJohann
7361b362b15af34006e6a11974088a46d42b903418eJohann    if (right < bestmse)
7371b362b15af34006e6a11974088a46d42b903418eJohann    {
7381b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
7391b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = right;
7401b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
7411b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
7421b362b15af34006e6a11974088a46d42b903418eJohann    }
7431b362b15af34006e6a11974088a46d42b903418eJohann
7441b362b15af34006e6a11974088a46d42b903418eJohann    /* go up then down and check error */
7451b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = startmv.as_mv.col;
7461b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
7471b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse);
7481b362b15af34006e6a11974088a46d42b903418eJohann    up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
7491b362b15af34006e6a11974088a46d42b903418eJohann
7501b362b15af34006e6a11974088a46d42b903418eJohann    if (up < bestmse)
7511b362b15af34006e6a11974088a46d42b903418eJohann    {
7521b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
7531b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = up;
7541b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
7551b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
7561b362b15af34006e6a11974088a46d42b903418eJohann    }
7571b362b15af34006e6a11974088a46d42b903418eJohann
7581b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row += 8;
7591b362b15af34006e6a11974088a46d42b903418eJohann    thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse);
7601b362b15af34006e6a11974088a46d42b903418eJohann    down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
7611b362b15af34006e6a11974088a46d42b903418eJohann
7621b362b15af34006e6a11974088a46d42b903418eJohann    if (down < bestmse)
7631b362b15af34006e6a11974088a46d42b903418eJohann    {
7641b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
7651b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = down;
7661b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
7671b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
7681b362b15af34006e6a11974088a46d42b903418eJohann    }
7691b362b15af34006e6a11974088a46d42b903418eJohann
7701b362b15af34006e6a11974088a46d42b903418eJohann    /* now check 1 more diagonal - */
7711b362b15af34006e6a11974088a46d42b903418eJohann    whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
7721b362b15af34006e6a11974088a46d42b903418eJohann    this_mv = startmv;
7731b362b15af34006e6a11974088a46d42b903418eJohann
7741b362b15af34006e6a11974088a46d42b903418eJohann    switch (whichdir)
7751b362b15af34006e6a11974088a46d42b903418eJohann    {
7761b362b15af34006e6a11974088a46d42b903418eJohann    case 0:
7771b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
7781b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
7791b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse);
7801b362b15af34006e6a11974088a46d42b903418eJohann        break;
7811b362b15af34006e6a11974088a46d42b903418eJohann    case 1:
7821b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 4;
7831b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
7841b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse);
7851b362b15af34006e6a11974088a46d42b903418eJohann        break;
7861b362b15af34006e6a11974088a46d42b903418eJohann    case 2:
7871b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
7881b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 4;
7891b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse);
7901b362b15af34006e6a11974088a46d42b903418eJohann        break;
7911b362b15af34006e6a11974088a46d42b903418eJohann    case 3:
7921b362b15af34006e6a11974088a46d42b903418eJohann    default:
7931b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.col += 4;
7941b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row += 4;
7951b362b15af34006e6a11974088a46d42b903418eJohann        thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse);
7961b362b15af34006e6a11974088a46d42b903418eJohann        break;
7971b362b15af34006e6a11974088a46d42b903418eJohann    }
7981b362b15af34006e6a11974088a46d42b903418eJohann
7991b362b15af34006e6a11974088a46d42b903418eJohann    diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
8001b362b15af34006e6a11974088a46d42b903418eJohann
8011b362b15af34006e6a11974088a46d42b903418eJohann    if (diag < bestmse)
8021b362b15af34006e6a11974088a46d42b903418eJohann    {
8031b362b15af34006e6a11974088a46d42b903418eJohann        *bestmv = this_mv;
8041b362b15af34006e6a11974088a46d42b903418eJohann        bestmse = diag;
8051b362b15af34006e6a11974088a46d42b903418eJohann        *distortion = thismse;
8061b362b15af34006e6a11974088a46d42b903418eJohann        *sse1 = sse;
8071b362b15af34006e6a11974088a46d42b903418eJohann    }
8081b362b15af34006e6a11974088a46d42b903418eJohann
8091b362b15af34006e6a11974088a46d42b903418eJohann    return bestmse;
8101b362b15af34006e6a11974088a46d42b903418eJohann}
8111b362b15af34006e6a11974088a46d42b903418eJohann
8121b362b15af34006e6a11974088a46d42b903418eJohann#define CHECK_BOUNDS(range) \
8131b362b15af34006e6a11974088a46d42b903418eJohann{\
8141b362b15af34006e6a11974088a46d42b903418eJohann    all_in = 1;\
8151b362b15af34006e6a11974088a46d42b903418eJohann    all_in &= ((br-range) >= x->mv_row_min);\
8161b362b15af34006e6a11974088a46d42b903418eJohann    all_in &= ((br+range) <= x->mv_row_max);\
8171b362b15af34006e6a11974088a46d42b903418eJohann    all_in &= ((bc-range) >= x->mv_col_min);\
8181b362b15af34006e6a11974088a46d42b903418eJohann    all_in &= ((bc+range) <= x->mv_col_max);\
8191b362b15af34006e6a11974088a46d42b903418eJohann}
8201b362b15af34006e6a11974088a46d42b903418eJohann
8211b362b15af34006e6a11974088a46d42b903418eJohann#define CHECK_POINT \
8221b362b15af34006e6a11974088a46d42b903418eJohann{\
8231b362b15af34006e6a11974088a46d42b903418eJohann    if (this_mv.as_mv.col < x->mv_col_min) continue;\
8241b362b15af34006e6a11974088a46d42b903418eJohann    if (this_mv.as_mv.col > x->mv_col_max) continue;\
8251b362b15af34006e6a11974088a46d42b903418eJohann    if (this_mv.as_mv.row < x->mv_row_min) continue;\
8261b362b15af34006e6a11974088a46d42b903418eJohann    if (this_mv.as_mv.row > x->mv_row_max) continue;\
8271b362b15af34006e6a11974088a46d42b903418eJohann}
8281b362b15af34006e6a11974088a46d42b903418eJohann
8291b362b15af34006e6a11974088a46d42b903418eJohann#define CHECK_BETTER \
8301b362b15af34006e6a11974088a46d42b903418eJohann{\
8311b362b15af34006e6a11974088a46d42b903418eJohann    if (thissad < bestsad)\
8321b362b15af34006e6a11974088a46d42b903418eJohann    {\
8331b362b15af34006e6a11974088a46d42b903418eJohann        thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);\
8341b362b15af34006e6a11974088a46d42b903418eJohann        if (thissad < bestsad)\
8351b362b15af34006e6a11974088a46d42b903418eJohann        {\
8361b362b15af34006e6a11974088a46d42b903418eJohann            bestsad = thissad;\
8371b362b15af34006e6a11974088a46d42b903418eJohann            best_site = i;\
8381b362b15af34006e6a11974088a46d42b903418eJohann        }\
8391b362b15af34006e6a11974088a46d42b903418eJohann    }\
8401b362b15af34006e6a11974088a46d42b903418eJohann}
8411b362b15af34006e6a11974088a46d42b903418eJohann
8421b362b15af34006e6a11974088a46d42b903418eJohannstatic const MV next_chkpts[6][3] =
8431b362b15af34006e6a11974088a46d42b903418eJohann{
8441b362b15af34006e6a11974088a46d42b903418eJohann    {{ -2, 0}, { -1, -2}, {1, -2}},
8451b362b15af34006e6a11974088a46d42b903418eJohann    {{ -1, -2}, {1, -2}, {2, 0}},
8461b362b15af34006e6a11974088a46d42b903418eJohann    {{1, -2}, {2, 0}, {1, 2}},
8471b362b15af34006e6a11974088a46d42b903418eJohann    {{2, 0}, {1, 2}, { -1, 2}},
8481b362b15af34006e6a11974088a46d42b903418eJohann    {{1, 2}, { -1, 2}, { -2, 0}},
8491b362b15af34006e6a11974088a46d42b903418eJohann    {{ -1, 2}, { -2, 0}, { -1, -2}}
8501b362b15af34006e6a11974088a46d42b903418eJohann};
8511b362b15af34006e6a11974088a46d42b903418eJohann
8521b362b15af34006e6a11974088a46d42b903418eJohannint vp8_hex_search
8531b362b15af34006e6a11974088a46d42b903418eJohann(
8541b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x,
8551b362b15af34006e6a11974088a46d42b903418eJohann    BLOCK *b,
8561b362b15af34006e6a11974088a46d42b903418eJohann    BLOCKD *d,
8571b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *ref_mv,
8581b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv,
8591b362b15af34006e6a11974088a46d42b903418eJohann    int search_param,
8601b362b15af34006e6a11974088a46d42b903418eJohann    int sad_per_bit,
8611b362b15af34006e6a11974088a46d42b903418eJohann    const vp8_variance_fn_ptr_t *vfp,
8621b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2],
8631b362b15af34006e6a11974088a46d42b903418eJohann    int *mvcost[2],
8641b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *center_mv
8651b362b15af34006e6a11974088a46d42b903418eJohann)
8661b362b15af34006e6a11974088a46d42b903418eJohann{
8671b362b15af34006e6a11974088a46d42b903418eJohann    MV hex[6] = { { -1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0} } ;
8681b362b15af34006e6a11974088a46d42b903418eJohann    MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}} ;
8691b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
8701b362b15af34006e6a11974088a46d42b903418eJohann
8711b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
8721b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
8731b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
8741b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
8751b362b15af34006e6a11974088a46d42b903418eJohann
8761b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
8771b362b15af34006e6a11974088a46d42b903418eJohann    int br, bc;
8781b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
8791b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
8801b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
8811b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_offset;
8821b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *this_offset;
8831b362b15af34006e6a11974088a46d42b903418eJohann    int k = -1;
8841b362b15af34006e6a11974088a46d42b903418eJohann    int all_in;
8851b362b15af34006e6a11974088a46d42b903418eJohann    int best_site = -1;
8861b362b15af34006e6a11974088a46d42b903418eJohann    int hex_range = 127;
8871b362b15af34006e6a11974088a46d42b903418eJohann    int dia_range = 8;
8881b362b15af34006e6a11974088a46d42b903418eJohann
8891b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
8901b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
8911b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
8921b362b15af34006e6a11974088a46d42b903418eJohann
8937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    (void)mvcost;
8947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
8951b362b15af34006e6a11974088a46d42b903418eJohann    /* adjust ref_mv to make sure it is within MV range */
8961b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
8971b362b15af34006e6a11974088a46d42b903418eJohann    br = ref_mv->as_mv.row;
8981b362b15af34006e6a11974088a46d42b903418eJohann    bc = ref_mv->as_mv.col;
8991b362b15af34006e6a11974088a46d42b903418eJohann
9001b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the start point for the search */
9011b362b15af34006e6a11974088a46d42b903418eJohann    base_offset = (unsigned char *)(base_pre + d->offset);
9021b362b15af34006e6a11974088a46d42b903418eJohann    this_offset = base_offset + (br * (pre_stride)) + bc;
9031b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = br;
9041b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = bc;
9057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride)
9061b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);
9071b362b15af34006e6a11974088a46d42b903418eJohann
9081b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTI_RES_ENCODING
9091b362b15af34006e6a11974088a46d42b903418eJohann    /* Lower search range based on prediction info */
9101b362b15af34006e6a11974088a46d42b903418eJohann    if (search_param >= 6) goto cal_neighbors;
9111b362b15af34006e6a11974088a46d42b903418eJohann    else if (search_param >= 5) hex_range = 4;
9121b362b15af34006e6a11974088a46d42b903418eJohann    else if (search_param >= 4) hex_range = 6;
9131b362b15af34006e6a11974088a46d42b903418eJohann    else if (search_param >= 3) hex_range = 15;
9141b362b15af34006e6a11974088a46d42b903418eJohann    else if (search_param >= 2) hex_range = 31;
9151b362b15af34006e6a11974088a46d42b903418eJohann    else if (search_param >= 1) hex_range = 63;
9161b362b15af34006e6a11974088a46d42b903418eJohann
9171b362b15af34006e6a11974088a46d42b903418eJohann    dia_range = 8;
9187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
9197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    (void)search_param;
9201b362b15af34006e6a11974088a46d42b903418eJohann#endif
9211b362b15af34006e6a11974088a46d42b903418eJohann
9221b362b15af34006e6a11974088a46d42b903418eJohann    /* hex search */
9231b362b15af34006e6a11974088a46d42b903418eJohann    CHECK_BOUNDS(2)
9241b362b15af34006e6a11974088a46d42b903418eJohann
9251b362b15af34006e6a11974088a46d42b903418eJohann    if(all_in)
9261b362b15af34006e6a11974088a46d42b903418eJohann    {
9271b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 6; i++)
9281b362b15af34006e6a11974088a46d42b903418eJohann        {
9291b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row = br + hex[i].row;
9301b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.col = bc + hex[i].col;
9311b362b15af34006e6a11974088a46d42b903418eJohann            this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col;
9327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
9331b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER
9341b362b15af34006e6a11974088a46d42b903418eJohann        }
9351b362b15af34006e6a11974088a46d42b903418eJohann    }else
9361b362b15af34006e6a11974088a46d42b903418eJohann    {
9371b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 6; i++)
9381b362b15af34006e6a11974088a46d42b903418eJohann        {
9391b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.row = br + hex[i].row;
9401b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.col = bc + hex[i].col;
9411b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_POINT
9421b362b15af34006e6a11974088a46d42b903418eJohann            this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col;
9437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
9441b362b15af34006e6a11974088a46d42b903418eJohann            CHECK_BETTER
9451b362b15af34006e6a11974088a46d42b903418eJohann        }
9461b362b15af34006e6a11974088a46d42b903418eJohann    }
9471b362b15af34006e6a11974088a46d42b903418eJohann
9481b362b15af34006e6a11974088a46d42b903418eJohann    if (best_site == -1)
9491b362b15af34006e6a11974088a46d42b903418eJohann        goto cal_neighbors;
9501b362b15af34006e6a11974088a46d42b903418eJohann    else
9511b362b15af34006e6a11974088a46d42b903418eJohann    {
9521b362b15af34006e6a11974088a46d42b903418eJohann        br += hex[best_site].row;
9531b362b15af34006e6a11974088a46d42b903418eJohann        bc += hex[best_site].col;
9541b362b15af34006e6a11974088a46d42b903418eJohann        k = best_site;
9551b362b15af34006e6a11974088a46d42b903418eJohann    }
9561b362b15af34006e6a11974088a46d42b903418eJohann
9571b362b15af34006e6a11974088a46d42b903418eJohann    for (j = 1; j < hex_range; j++)
9581b362b15af34006e6a11974088a46d42b903418eJohann    {
9591b362b15af34006e6a11974088a46d42b903418eJohann        best_site = -1;
9601b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BOUNDS(2)
9611b362b15af34006e6a11974088a46d42b903418eJohann
9621b362b15af34006e6a11974088a46d42b903418eJohann        if(all_in)
9631b362b15af34006e6a11974088a46d42b903418eJohann        {
9641b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 3; i++)
9651b362b15af34006e6a11974088a46d42b903418eJohann            {
9661b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.row = br + next_chkpts[k][i].row;
9671b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = bc + next_chkpts[k][i].col;
9681b362b15af34006e6a11974088a46d42b903418eJohann                this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
9697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
9701b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_BETTER
9711b362b15af34006e6a11974088a46d42b903418eJohann            }
9721b362b15af34006e6a11974088a46d42b903418eJohann        }else
9731b362b15af34006e6a11974088a46d42b903418eJohann        {
9741b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 3; i++)
9751b362b15af34006e6a11974088a46d42b903418eJohann            {
9761b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.row = br + next_chkpts[k][i].row;
9771b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = bc + next_chkpts[k][i].col;
9781b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_POINT
9791b362b15af34006e6a11974088a46d42b903418eJohann                this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
9807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
9811b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_BETTER
9821b362b15af34006e6a11974088a46d42b903418eJohann            }
9831b362b15af34006e6a11974088a46d42b903418eJohann        }
9841b362b15af34006e6a11974088a46d42b903418eJohann
9851b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site == -1)
9861b362b15af34006e6a11974088a46d42b903418eJohann            break;
9871b362b15af34006e6a11974088a46d42b903418eJohann        else
9881b362b15af34006e6a11974088a46d42b903418eJohann        {
9891b362b15af34006e6a11974088a46d42b903418eJohann            br += next_chkpts[k][best_site].row;
9901b362b15af34006e6a11974088a46d42b903418eJohann            bc += next_chkpts[k][best_site].col;
9911b362b15af34006e6a11974088a46d42b903418eJohann            k += 5 + best_site;
9921b362b15af34006e6a11974088a46d42b903418eJohann            if (k >= 12) k -= 12;
9931b362b15af34006e6a11974088a46d42b903418eJohann            else if (k >= 6) k -= 6;
9941b362b15af34006e6a11974088a46d42b903418eJohann        }
9951b362b15af34006e6a11974088a46d42b903418eJohann    }
9961b362b15af34006e6a11974088a46d42b903418eJohann
9971b362b15af34006e6a11974088a46d42b903418eJohann    /* check 4 1-away neighbors */
9981b362b15af34006e6a11974088a46d42b903418eJohanncal_neighbors:
9991b362b15af34006e6a11974088a46d42b903418eJohann    for (j = 0; j < dia_range; j++)
10001b362b15af34006e6a11974088a46d42b903418eJohann    {
10011b362b15af34006e6a11974088a46d42b903418eJohann        best_site = -1;
10021b362b15af34006e6a11974088a46d42b903418eJohann        CHECK_BOUNDS(1)
10031b362b15af34006e6a11974088a46d42b903418eJohann
10041b362b15af34006e6a11974088a46d42b903418eJohann        if(all_in)
10051b362b15af34006e6a11974088a46d42b903418eJohann        {
10061b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 4; i++)
10071b362b15af34006e6a11974088a46d42b903418eJohann            {
10081b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.row = br + neighbors[i].row;
10091b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = bc + neighbors[i].col;
10101b362b15af34006e6a11974088a46d42b903418eJohann                this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
10117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
10121b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_BETTER
10131b362b15af34006e6a11974088a46d42b903418eJohann            }
10141b362b15af34006e6a11974088a46d42b903418eJohann        }else
10151b362b15af34006e6a11974088a46d42b903418eJohann        {
10161b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 4; i++)
10171b362b15af34006e6a11974088a46d42b903418eJohann            {
10181b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.row = br + neighbors[i].row;
10191b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = bc + neighbors[i].col;
10201b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_POINT
10211b362b15af34006e6a11974088a46d42b903418eJohann                this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
10227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
10231b362b15af34006e6a11974088a46d42b903418eJohann                CHECK_BETTER
10241b362b15af34006e6a11974088a46d42b903418eJohann            }
10251b362b15af34006e6a11974088a46d42b903418eJohann        }
10261b362b15af34006e6a11974088a46d42b903418eJohann
10271b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site == -1)
10281b362b15af34006e6a11974088a46d42b903418eJohann            break;
10291b362b15af34006e6a11974088a46d42b903418eJohann        else
10301b362b15af34006e6a11974088a46d42b903418eJohann        {
10311b362b15af34006e6a11974088a46d42b903418eJohann            br += neighbors[best_site].row;
10321b362b15af34006e6a11974088a46d42b903418eJohann            bc += neighbors[best_site].col;
10331b362b15af34006e6a11974088a46d42b903418eJohann        }
10341b362b15af34006e6a11974088a46d42b903418eJohann    }
10351b362b15af34006e6a11974088a46d42b903418eJohann
10361b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = br;
10371b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = bc;
10381b362b15af34006e6a11974088a46d42b903418eJohann
10391b362b15af34006e6a11974088a46d42b903418eJohann    return bestsad;
10401b362b15af34006e6a11974088a46d42b903418eJohann}
10411b362b15af34006e6a11974088a46d42b903418eJohann#undef CHECK_BOUNDS
10421b362b15af34006e6a11974088a46d42b903418eJohann#undef CHECK_POINT
10431b362b15af34006e6a11974088a46d42b903418eJohann#undef CHECK_BETTER
10441b362b15af34006e6a11974088a46d42b903418eJohann
10451b362b15af34006e6a11974088a46d42b903418eJohannint vp8_diamond_search_sad_c
10461b362b15af34006e6a11974088a46d42b903418eJohann(
10471b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x,
10481b362b15af34006e6a11974088a46d42b903418eJohann    BLOCK *b,
10491b362b15af34006e6a11974088a46d42b903418eJohann    BLOCKD *d,
10501b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *ref_mv,
10511b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv,
10521b362b15af34006e6a11974088a46d42b903418eJohann    int search_param,
10531b362b15af34006e6a11974088a46d42b903418eJohann    int sad_per_bit,
10541b362b15af34006e6a11974088a46d42b903418eJohann    int *num00,
10551b362b15af34006e6a11974088a46d42b903418eJohann    vp8_variance_fn_ptr_t *fn_ptr,
10561b362b15af34006e6a11974088a46d42b903418eJohann    int *mvcost[2],
10571b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *center_mv
10581b362b15af34006e6a11974088a46d42b903418eJohann)
10591b362b15af34006e6a11974088a46d42b903418eJohann{
10601b362b15af34006e6a11974088a46d42b903418eJohann    int i, j, step;
10611b362b15af34006e6a11974088a46d42b903418eJohann
10621b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
10631b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
10641b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *in_what;
10651b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
10661b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
10671b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
10681b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *best_address;
10691b362b15af34006e6a11974088a46d42b903418eJohann
10701b362b15af34006e6a11974088a46d42b903418eJohann    int tot_steps;
10711b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
10721b362b15af34006e6a11974088a46d42b903418eJohann
10731b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
10741b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
10751b362b15af34006e6a11974088a46d42b903418eJohann    int best_site = 0;
10761b362b15af34006e6a11974088a46d42b903418eJohann    int last_site = 0;
10771b362b15af34006e6a11974088a46d42b903418eJohann
10781b362b15af34006e6a11974088a46d42b903418eJohann    int ref_row;
10791b362b15af34006e6a11974088a46d42b903418eJohann    int ref_col;
10801b362b15af34006e6a11974088a46d42b903418eJohann    int this_row_offset;
10811b362b15af34006e6a11974088a46d42b903418eJohann    int this_col_offset;
10821b362b15af34006e6a11974088a46d42b903418eJohann    search_site *ss;
10831b362b15af34006e6a11974088a46d42b903418eJohann
10841b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
10851b362b15af34006e6a11974088a46d42b903418eJohann
10861b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
10871b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
10881b362b15af34006e6a11974088a46d42b903418eJohann
10891b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
10901b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
10911b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
10921b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
10931b362b15af34006e6a11974088a46d42b903418eJohann
10941b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
10951b362b15af34006e6a11974088a46d42b903418eJohann    ref_row = ref_mv->as_mv.row;
10961b362b15af34006e6a11974088a46d42b903418eJohann    ref_col = ref_mv->as_mv.col;
10971b362b15af34006e6a11974088a46d42b903418eJohann    *num00 = 0;
10981b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = ref_row;
10991b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = ref_col;
11001b362b15af34006e6a11974088a46d42b903418eJohann
11011b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the start point for the search */
11021b362b15af34006e6a11974088a46d42b903418eJohann    in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
11031b362b15af34006e6a11974088a46d42b903418eJohann    best_address = in_what;
11041b362b15af34006e6a11974088a46d42b903418eJohann
11051b362b15af34006e6a11974088a46d42b903418eJohann    /* Check the starting position */
11067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
11071b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
11081b362b15af34006e6a11974088a46d42b903418eJohann
11091b362b15af34006e6a11974088a46d42b903418eJohann    /* search_param determines the length of the initial step and hence
11101b362b15af34006e6a11974088a46d42b903418eJohann     * the number of iterations 0 = initial step (MAX_FIRST_STEP) pel :
11111b362b15af34006e6a11974088a46d42b903418eJohann     * 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
11121b362b15af34006e6a11974088a46d42b903418eJohann     */
11131b362b15af34006e6a11974088a46d42b903418eJohann    ss = &x->ss[search_param * x->searches_per_step];
11141b362b15af34006e6a11974088a46d42b903418eJohann    tot_steps = (x->ss_count / x->searches_per_step) - search_param;
11151b362b15af34006e6a11974088a46d42b903418eJohann
11161b362b15af34006e6a11974088a46d42b903418eJohann    i = 1;
11171b362b15af34006e6a11974088a46d42b903418eJohann
11181b362b15af34006e6a11974088a46d42b903418eJohann    for (step = 0; step < tot_steps ; step++)
11191b362b15af34006e6a11974088a46d42b903418eJohann    {
11201b362b15af34006e6a11974088a46d42b903418eJohann        for (j = 0 ; j < x->searches_per_step ; j++)
11211b362b15af34006e6a11974088a46d42b903418eJohann        {
11221b362b15af34006e6a11974088a46d42b903418eJohann            /* Trap illegal vectors */
11231b362b15af34006e6a11974088a46d42b903418eJohann            this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
11241b362b15af34006e6a11974088a46d42b903418eJohann            this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
11251b362b15af34006e6a11974088a46d42b903418eJohann
11261b362b15af34006e6a11974088a46d42b903418eJohann            if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
11271b362b15af34006e6a11974088a46d42b903418eJohann            (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
11281b362b15af34006e6a11974088a46d42b903418eJohann
11291b362b15af34006e6a11974088a46d42b903418eJohann            {
11301b362b15af34006e6a11974088a46d42b903418eJohann                check_here = ss[i].offset + best_address;
11317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
11321b362b15af34006e6a11974088a46d42b903418eJohann
11331b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
11341b362b15af34006e6a11974088a46d42b903418eJohann                {
11351b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.row = this_row_offset;
11361b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = this_col_offset;
11371b362b15af34006e6a11974088a46d42b903418eJohann                    thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
11381b362b15af34006e6a11974088a46d42b903418eJohann                                              mvsadcost, sad_per_bit);
11391b362b15af34006e6a11974088a46d42b903418eJohann
11401b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
11411b362b15af34006e6a11974088a46d42b903418eJohann                    {
11421b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = thissad;
11431b362b15af34006e6a11974088a46d42b903418eJohann                        best_site = i;
11441b362b15af34006e6a11974088a46d42b903418eJohann                    }
11451b362b15af34006e6a11974088a46d42b903418eJohann                }
11461b362b15af34006e6a11974088a46d42b903418eJohann            }
11471b362b15af34006e6a11974088a46d42b903418eJohann
11481b362b15af34006e6a11974088a46d42b903418eJohann            i++;
11491b362b15af34006e6a11974088a46d42b903418eJohann        }
11501b362b15af34006e6a11974088a46d42b903418eJohann
11511b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site != last_site)
11521b362b15af34006e6a11974088a46d42b903418eJohann        {
11531b362b15af34006e6a11974088a46d42b903418eJohann            best_mv->as_mv.row += ss[best_site].mv.row;
11541b362b15af34006e6a11974088a46d42b903418eJohann            best_mv->as_mv.col += ss[best_site].mv.col;
11551b362b15af34006e6a11974088a46d42b903418eJohann            best_address += ss[best_site].offset;
11561b362b15af34006e6a11974088a46d42b903418eJohann            last_site = best_site;
11571b362b15af34006e6a11974088a46d42b903418eJohann        }
11581b362b15af34006e6a11974088a46d42b903418eJohann        else if (best_address == in_what)
11591b362b15af34006e6a11974088a46d42b903418eJohann            (*num00)++;
11601b362b15af34006e6a11974088a46d42b903418eJohann    }
11611b362b15af34006e6a11974088a46d42b903418eJohann
11621b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = best_mv->as_mv.row << 3;
11631b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = best_mv->as_mv.col << 3;
11641b362b15af34006e6a11974088a46d42b903418eJohann
11651b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
11661b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
11671b362b15af34006e6a11974088a46d42b903418eJohann}
11681b362b15af34006e6a11974088a46d42b903418eJohann
11691b362b15af34006e6a11974088a46d42b903418eJohannint vp8_diamond_search_sadx4
11701b362b15af34006e6a11974088a46d42b903418eJohann(
11711b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCK *x,
11721b362b15af34006e6a11974088a46d42b903418eJohann    BLOCK *b,
11731b362b15af34006e6a11974088a46d42b903418eJohann    BLOCKD *d,
11741b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *ref_mv,
11751b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv,
11761b362b15af34006e6a11974088a46d42b903418eJohann    int search_param,
11771b362b15af34006e6a11974088a46d42b903418eJohann    int sad_per_bit,
11781b362b15af34006e6a11974088a46d42b903418eJohann    int *num00,
11791b362b15af34006e6a11974088a46d42b903418eJohann    vp8_variance_fn_ptr_t *fn_ptr,
11801b362b15af34006e6a11974088a46d42b903418eJohann    int *mvcost[2],
11811b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *center_mv
11821b362b15af34006e6a11974088a46d42b903418eJohann)
11831b362b15af34006e6a11974088a46d42b903418eJohann{
11841b362b15af34006e6a11974088a46d42b903418eJohann    int i, j, step;
11851b362b15af34006e6a11974088a46d42b903418eJohann
11861b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
11871b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
11881b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *in_what;
11891b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
11901b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
11911b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
11921b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *best_address;
11931b362b15af34006e6a11974088a46d42b903418eJohann
11941b362b15af34006e6a11974088a46d42b903418eJohann    int tot_steps;
11951b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
11961b362b15af34006e6a11974088a46d42b903418eJohann
11971b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
11981b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
11991b362b15af34006e6a11974088a46d42b903418eJohann    int best_site = 0;
12001b362b15af34006e6a11974088a46d42b903418eJohann    int last_site = 0;
12011b362b15af34006e6a11974088a46d42b903418eJohann
12021b362b15af34006e6a11974088a46d42b903418eJohann    int ref_row;
12031b362b15af34006e6a11974088a46d42b903418eJohann    int ref_col;
12041b362b15af34006e6a11974088a46d42b903418eJohann    int this_row_offset;
12051b362b15af34006e6a11974088a46d42b903418eJohann    int this_col_offset;
12061b362b15af34006e6a11974088a46d42b903418eJohann    search_site *ss;
12071b362b15af34006e6a11974088a46d42b903418eJohann
12081b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
12091b362b15af34006e6a11974088a46d42b903418eJohann
12101b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
12111b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
12121b362b15af34006e6a11974088a46d42b903418eJohann
12131b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
12141b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
12151b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
12161b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
12171b362b15af34006e6a11974088a46d42b903418eJohann
12181b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
12191b362b15af34006e6a11974088a46d42b903418eJohann    ref_row = ref_mv->as_mv.row;
12201b362b15af34006e6a11974088a46d42b903418eJohann    ref_col = ref_mv->as_mv.col;
12211b362b15af34006e6a11974088a46d42b903418eJohann    *num00 = 0;
12221b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = ref_row;
12231b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = ref_col;
12241b362b15af34006e6a11974088a46d42b903418eJohann
12251b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the start point for the search */
12261b362b15af34006e6a11974088a46d42b903418eJohann    in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
12271b362b15af34006e6a11974088a46d42b903418eJohann    best_address = in_what;
12281b362b15af34006e6a11974088a46d42b903418eJohann
12291b362b15af34006e6a11974088a46d42b903418eJohann    /* Check the starting position */
12307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
12311b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
12321b362b15af34006e6a11974088a46d42b903418eJohann
12331b362b15af34006e6a11974088a46d42b903418eJohann    /* search_param determines the length of the initial step and hence the
12341b362b15af34006e6a11974088a46d42b903418eJohann     * number of iterations 0 = initial step (MAX_FIRST_STEP) pel : 1 =
12351b362b15af34006e6a11974088a46d42b903418eJohann     * (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
12361b362b15af34006e6a11974088a46d42b903418eJohann     */
12371b362b15af34006e6a11974088a46d42b903418eJohann    ss = &x->ss[search_param * x->searches_per_step];
12381b362b15af34006e6a11974088a46d42b903418eJohann    tot_steps = (x->ss_count / x->searches_per_step) - search_param;
12391b362b15af34006e6a11974088a46d42b903418eJohann
12401b362b15af34006e6a11974088a46d42b903418eJohann    i = 1;
12411b362b15af34006e6a11974088a46d42b903418eJohann
12421b362b15af34006e6a11974088a46d42b903418eJohann    for (step = 0; step < tot_steps ; step++)
12431b362b15af34006e6a11974088a46d42b903418eJohann    {
12441b362b15af34006e6a11974088a46d42b903418eJohann        int all_in = 1, t;
12451b362b15af34006e6a11974088a46d42b903418eJohann
12461b362b15af34006e6a11974088a46d42b903418eJohann        /* To know if all neighbor points are within the bounds, 4 bounds
12471b362b15af34006e6a11974088a46d42b903418eJohann         * checking are enough instead of checking 4 bounds for each
12481b362b15af34006e6a11974088a46d42b903418eJohann         * points.
12491b362b15af34006e6a11974088a46d42b903418eJohann         */
12501b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((best_mv->as_mv.row + ss[i].mv.row)> x->mv_row_min);
12511b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((best_mv->as_mv.row + ss[i+1].mv.row) < x->mv_row_max);
12521b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((best_mv->as_mv.col + ss[i+2].mv.col) > x->mv_col_min);
12531b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((best_mv->as_mv.col + ss[i+3].mv.col) < x->mv_col_max);
12541b362b15af34006e6a11974088a46d42b903418eJohann
12551b362b15af34006e6a11974088a46d42b903418eJohann        if (all_in)
12561b362b15af34006e6a11974088a46d42b903418eJohann        {
12571b362b15af34006e6a11974088a46d42b903418eJohann            unsigned int sad_array[4];
12581b362b15af34006e6a11974088a46d42b903418eJohann
12591b362b15af34006e6a11974088a46d42b903418eJohann            for (j = 0 ; j < x->searches_per_step ; j += 4)
12601b362b15af34006e6a11974088a46d42b903418eJohann            {
12611b362b15af34006e6a11974088a46d42b903418eJohann                const unsigned char *block_offset[4];
12621b362b15af34006e6a11974088a46d42b903418eJohann
12631b362b15af34006e6a11974088a46d42b903418eJohann                for (t = 0; t < 4; t++)
12641b362b15af34006e6a11974088a46d42b903418eJohann                    block_offset[t] = ss[i+t].offset + best_address;
12651b362b15af34006e6a11974088a46d42b903418eJohann
12661b362b15af34006e6a11974088a46d42b903418eJohann                fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
12671b362b15af34006e6a11974088a46d42b903418eJohann
12681b362b15af34006e6a11974088a46d42b903418eJohann                for (t = 0; t < 4; t++, i++)
12691b362b15af34006e6a11974088a46d42b903418eJohann                {
12701b362b15af34006e6a11974088a46d42b903418eJohann                    if (sad_array[t] < bestsad)
12711b362b15af34006e6a11974088a46d42b903418eJohann                    {
12721b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.row = best_mv->as_mv.row + ss[i].mv.row;
12731b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.col = best_mv->as_mv.col + ss[i].mv.col;
12741b362b15af34006e6a11974088a46d42b903418eJohann                        sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv,
12751b362b15af34006e6a11974088a46d42b903418eJohann                                                       mvsadcost, sad_per_bit);
12761b362b15af34006e6a11974088a46d42b903418eJohann
12771b362b15af34006e6a11974088a46d42b903418eJohann                        if (sad_array[t] < bestsad)
12781b362b15af34006e6a11974088a46d42b903418eJohann                        {
12791b362b15af34006e6a11974088a46d42b903418eJohann                            bestsad = sad_array[t];
12801b362b15af34006e6a11974088a46d42b903418eJohann                            best_site = i;
12811b362b15af34006e6a11974088a46d42b903418eJohann                        }
12821b362b15af34006e6a11974088a46d42b903418eJohann                    }
12831b362b15af34006e6a11974088a46d42b903418eJohann                }
12841b362b15af34006e6a11974088a46d42b903418eJohann            }
12851b362b15af34006e6a11974088a46d42b903418eJohann        }
12861b362b15af34006e6a11974088a46d42b903418eJohann        else
12871b362b15af34006e6a11974088a46d42b903418eJohann        {
12881b362b15af34006e6a11974088a46d42b903418eJohann            for (j = 0 ; j < x->searches_per_step ; j++)
12891b362b15af34006e6a11974088a46d42b903418eJohann            {
12901b362b15af34006e6a11974088a46d42b903418eJohann                /* Trap illegal vectors */
12911b362b15af34006e6a11974088a46d42b903418eJohann                this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
12921b362b15af34006e6a11974088a46d42b903418eJohann                this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
12931b362b15af34006e6a11974088a46d42b903418eJohann
12941b362b15af34006e6a11974088a46d42b903418eJohann                if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
12951b362b15af34006e6a11974088a46d42b903418eJohann                (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
12961b362b15af34006e6a11974088a46d42b903418eJohann                {
12971b362b15af34006e6a11974088a46d42b903418eJohann                    check_here = ss[i].offset + best_address;
12987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                    thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
12991b362b15af34006e6a11974088a46d42b903418eJohann
13001b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
13011b362b15af34006e6a11974088a46d42b903418eJohann                    {
13021b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.row = this_row_offset;
13031b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.col = this_col_offset;
13041b362b15af34006e6a11974088a46d42b903418eJohann                        thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
13051b362b15af34006e6a11974088a46d42b903418eJohann                                                  mvsadcost, sad_per_bit);
13061b362b15af34006e6a11974088a46d42b903418eJohann
13071b362b15af34006e6a11974088a46d42b903418eJohann                        if (thissad < bestsad)
13081b362b15af34006e6a11974088a46d42b903418eJohann                        {
13091b362b15af34006e6a11974088a46d42b903418eJohann                            bestsad = thissad;
13101b362b15af34006e6a11974088a46d42b903418eJohann                            best_site = i;
13111b362b15af34006e6a11974088a46d42b903418eJohann                        }
13121b362b15af34006e6a11974088a46d42b903418eJohann                    }
13131b362b15af34006e6a11974088a46d42b903418eJohann                }
13141b362b15af34006e6a11974088a46d42b903418eJohann                i++;
13151b362b15af34006e6a11974088a46d42b903418eJohann            }
13161b362b15af34006e6a11974088a46d42b903418eJohann        }
13171b362b15af34006e6a11974088a46d42b903418eJohann
13181b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site != last_site)
13191b362b15af34006e6a11974088a46d42b903418eJohann        {
13201b362b15af34006e6a11974088a46d42b903418eJohann            best_mv->as_mv.row += ss[best_site].mv.row;
13211b362b15af34006e6a11974088a46d42b903418eJohann            best_mv->as_mv.col += ss[best_site].mv.col;
13221b362b15af34006e6a11974088a46d42b903418eJohann            best_address += ss[best_site].offset;
13231b362b15af34006e6a11974088a46d42b903418eJohann            last_site = best_site;
13241b362b15af34006e6a11974088a46d42b903418eJohann        }
13251b362b15af34006e6a11974088a46d42b903418eJohann        else if (best_address == in_what)
13261b362b15af34006e6a11974088a46d42b903418eJohann            (*num00)++;
13271b362b15af34006e6a11974088a46d42b903418eJohann    }
13281b362b15af34006e6a11974088a46d42b903418eJohann
13295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.row = best_mv->as_mv.row * 8;
13305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.col = best_mv->as_mv.col * 8;
13311b362b15af34006e6a11974088a46d42b903418eJohann
13321b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
13331b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
13341b362b15af34006e6a11974088a46d42b903418eJohann}
13351b362b15af34006e6a11974088a46d42b903418eJohann
13361b362b15af34006e6a11974088a46d42b903418eJohannint vp8_full_search_sad_c(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
13371b362b15af34006e6a11974088a46d42b903418eJohann                        int sad_per_bit, int distance,
13381b362b15af34006e6a11974088a46d42b903418eJohann                        vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
13391b362b15af34006e6a11974088a46d42b903418eJohann                        int_mv *center_mv)
13401b362b15af34006e6a11974088a46d42b903418eJohann{
13411b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
13421b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
13431b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *in_what;
13441b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
13451b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
13461b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
13471b362b15af34006e6a11974088a46d42b903418eJohann    int mv_stride = pre_stride;
13481b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *bestaddress;
13491b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv = &d->bmi.mv;
13501b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
13511b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
13521b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
13531b362b15af34006e6a11974088a46d42b903418eJohann    int r, c;
13541b362b15af34006e6a11974088a46d42b903418eJohann
13551b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
13561b362b15af34006e6a11974088a46d42b903418eJohann
13571b362b15af34006e6a11974088a46d42b903418eJohann    int ref_row = ref_mv->as_mv.row;
13581b362b15af34006e6a11974088a46d42b903418eJohann    int ref_col = ref_mv->as_mv.col;
13591b362b15af34006e6a11974088a46d42b903418eJohann
13601b362b15af34006e6a11974088a46d42b903418eJohann    int row_min = ref_row - distance;
13611b362b15af34006e6a11974088a46d42b903418eJohann    int row_max = ref_row + distance;
13621b362b15af34006e6a11974088a46d42b903418eJohann    int col_min = ref_col - distance;
13631b362b15af34006e6a11974088a46d42b903418eJohann    int col_max = ref_col + distance;
13641b362b15af34006e6a11974088a46d42b903418eJohann
13651b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
13661b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
13671b362b15af34006e6a11974088a46d42b903418eJohann
13681b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
13691b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
13701b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
13711b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
13721b362b15af34006e6a11974088a46d42b903418eJohann
13731b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the mid point for the search */
13741b362b15af34006e6a11974088a46d42b903418eJohann    in_what = base_pre + d->offset;
13751b362b15af34006e6a11974088a46d42b903418eJohann    bestaddress = in_what + (ref_row * pre_stride) + ref_col;
13761b362b15af34006e6a11974088a46d42b903418eJohann
13771b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = ref_row;
13781b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = ref_col;
13791b362b15af34006e6a11974088a46d42b903418eJohann
13801b362b15af34006e6a11974088a46d42b903418eJohann    /* Baseline value at the centre */
13817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
13821b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
13831b362b15af34006e6a11974088a46d42b903418eJohann
13841b362b15af34006e6a11974088a46d42b903418eJohann    /* Apply further limits to prevent us looking using vectors that
13851b362b15af34006e6a11974088a46d42b903418eJohann     * stretch beyiond the UMV border
13861b362b15af34006e6a11974088a46d42b903418eJohann     */
13871b362b15af34006e6a11974088a46d42b903418eJohann    if (col_min < x->mv_col_min)
13881b362b15af34006e6a11974088a46d42b903418eJohann        col_min = x->mv_col_min;
13891b362b15af34006e6a11974088a46d42b903418eJohann
13901b362b15af34006e6a11974088a46d42b903418eJohann    if (col_max > x->mv_col_max)
13911b362b15af34006e6a11974088a46d42b903418eJohann        col_max = x->mv_col_max;
13921b362b15af34006e6a11974088a46d42b903418eJohann
13931b362b15af34006e6a11974088a46d42b903418eJohann    if (row_min < x->mv_row_min)
13941b362b15af34006e6a11974088a46d42b903418eJohann        row_min = x->mv_row_min;
13951b362b15af34006e6a11974088a46d42b903418eJohann
13961b362b15af34006e6a11974088a46d42b903418eJohann    if (row_max > x->mv_row_max)
13971b362b15af34006e6a11974088a46d42b903418eJohann        row_max = x->mv_row_max;
13981b362b15af34006e6a11974088a46d42b903418eJohann
13991b362b15af34006e6a11974088a46d42b903418eJohann    for (r = row_min; r < row_max ; r++)
14001b362b15af34006e6a11974088a46d42b903418eJohann    {
14011b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = r;
14021b362b15af34006e6a11974088a46d42b903418eJohann        check_here = r * mv_stride + in_what + col_min;
14031b362b15af34006e6a11974088a46d42b903418eJohann
14041b362b15af34006e6a11974088a46d42b903418eJohann        for (c = col_min; c < col_max; c++)
14051b362b15af34006e6a11974088a46d42b903418eJohann        {
14067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
14071b362b15af34006e6a11974088a46d42b903418eJohann
14081b362b15af34006e6a11974088a46d42b903418eJohann            this_mv.as_mv.col = c;
14091b362b15af34006e6a11974088a46d42b903418eJohann            thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
14101b362b15af34006e6a11974088a46d42b903418eJohann                                      mvsadcost, sad_per_bit);
14111b362b15af34006e6a11974088a46d42b903418eJohann
14121b362b15af34006e6a11974088a46d42b903418eJohann            if (thissad < bestsad)
14131b362b15af34006e6a11974088a46d42b903418eJohann            {
14141b362b15af34006e6a11974088a46d42b903418eJohann                bestsad = thissad;
14151b362b15af34006e6a11974088a46d42b903418eJohann                best_mv->as_mv.row = r;
14161b362b15af34006e6a11974088a46d42b903418eJohann                best_mv->as_mv.col = c;
14171b362b15af34006e6a11974088a46d42b903418eJohann                bestaddress = check_here;
14181b362b15af34006e6a11974088a46d42b903418eJohann            }
14191b362b15af34006e6a11974088a46d42b903418eJohann
14201b362b15af34006e6a11974088a46d42b903418eJohann            check_here++;
14211b362b15af34006e6a11974088a46d42b903418eJohann        }
14221b362b15af34006e6a11974088a46d42b903418eJohann    }
14231b362b15af34006e6a11974088a46d42b903418eJohann
14241b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = best_mv->as_mv.row << 3;
14251b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = best_mv->as_mv.col << 3;
14261b362b15af34006e6a11974088a46d42b903418eJohann
14271b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
14281b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
14291b362b15af34006e6a11974088a46d42b903418eJohann}
14301b362b15af34006e6a11974088a46d42b903418eJohann
14311b362b15af34006e6a11974088a46d42b903418eJohannint vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
14321b362b15af34006e6a11974088a46d42b903418eJohann                          int sad_per_bit, int distance,
14331b362b15af34006e6a11974088a46d42b903418eJohann                          vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
14341b362b15af34006e6a11974088a46d42b903418eJohann                          int_mv *center_mv)
14351b362b15af34006e6a11974088a46d42b903418eJohann{
14361b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
14371b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
14381b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *in_what;
14391b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
14401b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
14411b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
14421b362b15af34006e6a11974088a46d42b903418eJohann    int mv_stride = pre_stride;
14431b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *bestaddress;
14441b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv = &d->bmi.mv;
14451b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
14461b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
14471b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
14481b362b15af34006e6a11974088a46d42b903418eJohann    int r, c;
14491b362b15af34006e6a11974088a46d42b903418eJohann
14501b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
14511b362b15af34006e6a11974088a46d42b903418eJohann
14521b362b15af34006e6a11974088a46d42b903418eJohann    int ref_row = ref_mv->as_mv.row;
14531b362b15af34006e6a11974088a46d42b903418eJohann    int ref_col = ref_mv->as_mv.col;
14541b362b15af34006e6a11974088a46d42b903418eJohann
14551b362b15af34006e6a11974088a46d42b903418eJohann    int row_min = ref_row - distance;
14561b362b15af34006e6a11974088a46d42b903418eJohann    int row_max = ref_row + distance;
14571b362b15af34006e6a11974088a46d42b903418eJohann    int col_min = ref_col - distance;
14581b362b15af34006e6a11974088a46d42b903418eJohann    int col_max = ref_col + distance;
14591b362b15af34006e6a11974088a46d42b903418eJohann
14601b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sad_array[3];
14611b362b15af34006e6a11974088a46d42b903418eJohann
14621b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
14631b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
14641b362b15af34006e6a11974088a46d42b903418eJohann
14651b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
14661b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
14671b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
14681b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
14691b362b15af34006e6a11974088a46d42b903418eJohann
14701b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the mid point for the search */
14711b362b15af34006e6a11974088a46d42b903418eJohann    in_what = base_pre + d->offset;
14721b362b15af34006e6a11974088a46d42b903418eJohann    bestaddress = in_what + (ref_row * pre_stride) + ref_col;
14731b362b15af34006e6a11974088a46d42b903418eJohann
14741b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = ref_row;
14751b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = ref_col;
14761b362b15af34006e6a11974088a46d42b903418eJohann
14771b362b15af34006e6a11974088a46d42b903418eJohann    /* Baseline value at the centre */
14787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
14791b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
14801b362b15af34006e6a11974088a46d42b903418eJohann
14811b362b15af34006e6a11974088a46d42b903418eJohann    /* Apply further limits to prevent us looking using vectors that stretch
14821b362b15af34006e6a11974088a46d42b903418eJohann     * beyond the UMV border
14831b362b15af34006e6a11974088a46d42b903418eJohann     */
14841b362b15af34006e6a11974088a46d42b903418eJohann    if (col_min < x->mv_col_min)
14851b362b15af34006e6a11974088a46d42b903418eJohann        col_min = x->mv_col_min;
14861b362b15af34006e6a11974088a46d42b903418eJohann
14871b362b15af34006e6a11974088a46d42b903418eJohann    if (col_max > x->mv_col_max)
14881b362b15af34006e6a11974088a46d42b903418eJohann        col_max = x->mv_col_max;
14891b362b15af34006e6a11974088a46d42b903418eJohann
14901b362b15af34006e6a11974088a46d42b903418eJohann    if (row_min < x->mv_row_min)
14911b362b15af34006e6a11974088a46d42b903418eJohann        row_min = x->mv_row_min;
14921b362b15af34006e6a11974088a46d42b903418eJohann
14931b362b15af34006e6a11974088a46d42b903418eJohann    if (row_max > x->mv_row_max)
14941b362b15af34006e6a11974088a46d42b903418eJohann        row_max = x->mv_row_max;
14951b362b15af34006e6a11974088a46d42b903418eJohann
14961b362b15af34006e6a11974088a46d42b903418eJohann    for (r = row_min; r < row_max ; r++)
14971b362b15af34006e6a11974088a46d42b903418eJohann    {
14981b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = r;
14991b362b15af34006e6a11974088a46d42b903418eJohann        check_here = r * mv_stride + in_what + col_min;
15001b362b15af34006e6a11974088a46d42b903418eJohann        c = col_min;
15011b362b15af34006e6a11974088a46d42b903418eJohann
15021b362b15af34006e6a11974088a46d42b903418eJohann        while ((c + 2) < col_max)
15031b362b15af34006e6a11974088a46d42b903418eJohann        {
15041b362b15af34006e6a11974088a46d42b903418eJohann            int i;
15051b362b15af34006e6a11974088a46d42b903418eJohann
15061b362b15af34006e6a11974088a46d42b903418eJohann            fn_ptr->sdx3f(what, what_stride, check_here, in_what_stride, sad_array);
15071b362b15af34006e6a11974088a46d42b903418eJohann
15081b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 3; i++)
15091b362b15af34006e6a11974088a46d42b903418eJohann            {
15101b362b15af34006e6a11974088a46d42b903418eJohann                thissad = sad_array[i];
15111b362b15af34006e6a11974088a46d42b903418eJohann
15121b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
15131b362b15af34006e6a11974088a46d42b903418eJohann                {
15141b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = c;
15151b362b15af34006e6a11974088a46d42b903418eJohann                    thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
15161b362b15af34006e6a11974088a46d42b903418eJohann                                              mvsadcost, sad_per_bit);
15171b362b15af34006e6a11974088a46d42b903418eJohann
15181b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
15191b362b15af34006e6a11974088a46d42b903418eJohann                    {
15201b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = thissad;
15211b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.row = r;
15221b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.col = c;
15231b362b15af34006e6a11974088a46d42b903418eJohann                        bestaddress = check_here;
15241b362b15af34006e6a11974088a46d42b903418eJohann                    }
15251b362b15af34006e6a11974088a46d42b903418eJohann                }
15261b362b15af34006e6a11974088a46d42b903418eJohann
15271b362b15af34006e6a11974088a46d42b903418eJohann                check_here++;
15281b362b15af34006e6a11974088a46d42b903418eJohann                c++;
15291b362b15af34006e6a11974088a46d42b903418eJohann            }
15301b362b15af34006e6a11974088a46d42b903418eJohann        }
15311b362b15af34006e6a11974088a46d42b903418eJohann
15321b362b15af34006e6a11974088a46d42b903418eJohann        while (c < col_max)
15331b362b15af34006e6a11974088a46d42b903418eJohann        {
15347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
15351b362b15af34006e6a11974088a46d42b903418eJohann
15361b362b15af34006e6a11974088a46d42b903418eJohann            if (thissad < bestsad)
15371b362b15af34006e6a11974088a46d42b903418eJohann            {
15381b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = c;
15391b362b15af34006e6a11974088a46d42b903418eJohann                thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
15401b362b15af34006e6a11974088a46d42b903418eJohann                                          mvsadcost, sad_per_bit);
15411b362b15af34006e6a11974088a46d42b903418eJohann
15421b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
15431b362b15af34006e6a11974088a46d42b903418eJohann                {
15441b362b15af34006e6a11974088a46d42b903418eJohann                    bestsad = thissad;
15451b362b15af34006e6a11974088a46d42b903418eJohann                    best_mv->as_mv.row = r;
15461b362b15af34006e6a11974088a46d42b903418eJohann                    best_mv->as_mv.col = c;
15471b362b15af34006e6a11974088a46d42b903418eJohann                    bestaddress = check_here;
15481b362b15af34006e6a11974088a46d42b903418eJohann                }
15491b362b15af34006e6a11974088a46d42b903418eJohann            }
15501b362b15af34006e6a11974088a46d42b903418eJohann
15511b362b15af34006e6a11974088a46d42b903418eJohann            check_here ++;
15521b362b15af34006e6a11974088a46d42b903418eJohann            c ++;
15531b362b15af34006e6a11974088a46d42b903418eJohann        }
15541b362b15af34006e6a11974088a46d42b903418eJohann
15551b362b15af34006e6a11974088a46d42b903418eJohann    }
15561b362b15af34006e6a11974088a46d42b903418eJohann
15571b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = best_mv->as_mv.row << 3;
15581b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = best_mv->as_mv.col << 3;
15591b362b15af34006e6a11974088a46d42b903418eJohann
15601b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
15611b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
15621b362b15af34006e6a11974088a46d42b903418eJohann}
15631b362b15af34006e6a11974088a46d42b903418eJohann
15641b362b15af34006e6a11974088a46d42b903418eJohannint vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
15651b362b15af34006e6a11974088a46d42b903418eJohann                          int sad_per_bit, int distance,
15661b362b15af34006e6a11974088a46d42b903418eJohann                          vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
15671b362b15af34006e6a11974088a46d42b903418eJohann                          int_mv *center_mv)
15681b362b15af34006e6a11974088a46d42b903418eJohann{
15691b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
15701b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
15711b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
15721b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
15731b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *in_what;
15741b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
15751b362b15af34006e6a11974088a46d42b903418eJohann    int mv_stride = pre_stride;
15761b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *bestaddress;
15771b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *best_mv = &d->bmi.mv;
15781b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
15791b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
15801b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
15811b362b15af34006e6a11974088a46d42b903418eJohann    int r, c;
15821b362b15af34006e6a11974088a46d42b903418eJohann
15831b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
15841b362b15af34006e6a11974088a46d42b903418eJohann
15851b362b15af34006e6a11974088a46d42b903418eJohann    int ref_row = ref_mv->as_mv.row;
15861b362b15af34006e6a11974088a46d42b903418eJohann    int ref_col = ref_mv->as_mv.col;
15871b362b15af34006e6a11974088a46d42b903418eJohann
15881b362b15af34006e6a11974088a46d42b903418eJohann    int row_min = ref_row - distance;
15891b362b15af34006e6a11974088a46d42b903418eJohann    int row_max = ref_row + distance;
15901b362b15af34006e6a11974088a46d42b903418eJohann    int col_min = ref_col - distance;
15911b362b15af34006e6a11974088a46d42b903418eJohann    int col_max = ref_col + distance;
15921b362b15af34006e6a11974088a46d42b903418eJohann
15937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    // TODO(johannkoenig): check if this alignment is necessary.
15947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, unsigned int, sad_array8[8]);
15951b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sad_array[3];
15961b362b15af34006e6a11974088a46d42b903418eJohann
15971b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
15981b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
15991b362b15af34006e6a11974088a46d42b903418eJohann
16001b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
16011b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
16021b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
16031b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
16041b362b15af34006e6a11974088a46d42b903418eJohann
16051b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out the mid point for the search */
16061b362b15af34006e6a11974088a46d42b903418eJohann    in_what = base_pre + d->offset;
16071b362b15af34006e6a11974088a46d42b903418eJohann    bestaddress = in_what + (ref_row * pre_stride) + ref_col;
16081b362b15af34006e6a11974088a46d42b903418eJohann
16091b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.row = ref_row;
16101b362b15af34006e6a11974088a46d42b903418eJohann    best_mv->as_mv.col = ref_col;
16111b362b15af34006e6a11974088a46d42b903418eJohann
16121b362b15af34006e6a11974088a46d42b903418eJohann    /* Baseline value at the centre */
16137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
16141b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
16151b362b15af34006e6a11974088a46d42b903418eJohann
16161b362b15af34006e6a11974088a46d42b903418eJohann    /* Apply further limits to prevent us looking using vectors that stretch
16171b362b15af34006e6a11974088a46d42b903418eJohann     * beyond the UMV border
16181b362b15af34006e6a11974088a46d42b903418eJohann     */
16191b362b15af34006e6a11974088a46d42b903418eJohann    if (col_min < x->mv_col_min)
16201b362b15af34006e6a11974088a46d42b903418eJohann        col_min = x->mv_col_min;
16211b362b15af34006e6a11974088a46d42b903418eJohann
16221b362b15af34006e6a11974088a46d42b903418eJohann    if (col_max > x->mv_col_max)
16231b362b15af34006e6a11974088a46d42b903418eJohann        col_max = x->mv_col_max;
16241b362b15af34006e6a11974088a46d42b903418eJohann
16251b362b15af34006e6a11974088a46d42b903418eJohann    if (row_min < x->mv_row_min)
16261b362b15af34006e6a11974088a46d42b903418eJohann        row_min = x->mv_row_min;
16271b362b15af34006e6a11974088a46d42b903418eJohann
16281b362b15af34006e6a11974088a46d42b903418eJohann    if (row_max > x->mv_row_max)
16291b362b15af34006e6a11974088a46d42b903418eJohann        row_max = x->mv_row_max;
16301b362b15af34006e6a11974088a46d42b903418eJohann
16311b362b15af34006e6a11974088a46d42b903418eJohann    for (r = row_min; r < row_max ; r++)
16321b362b15af34006e6a11974088a46d42b903418eJohann    {
16331b362b15af34006e6a11974088a46d42b903418eJohann        this_mv.as_mv.row = r;
16341b362b15af34006e6a11974088a46d42b903418eJohann        check_here = r * mv_stride + in_what + col_min;
16351b362b15af34006e6a11974088a46d42b903418eJohann        c = col_min;
16361b362b15af34006e6a11974088a46d42b903418eJohann
16371b362b15af34006e6a11974088a46d42b903418eJohann        while ((c + 7) < col_max)
16381b362b15af34006e6a11974088a46d42b903418eJohann        {
16391b362b15af34006e6a11974088a46d42b903418eJohann            int i;
16401b362b15af34006e6a11974088a46d42b903418eJohann
16411b362b15af34006e6a11974088a46d42b903418eJohann            fn_ptr->sdx8f(what, what_stride, check_here, in_what_stride, sad_array8);
16421b362b15af34006e6a11974088a46d42b903418eJohann
16431b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 8; i++)
16441b362b15af34006e6a11974088a46d42b903418eJohann            {
16451b362b15af34006e6a11974088a46d42b903418eJohann                thissad = sad_array8[i];
16461b362b15af34006e6a11974088a46d42b903418eJohann
16471b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
16481b362b15af34006e6a11974088a46d42b903418eJohann                {
16491b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = c;
16501b362b15af34006e6a11974088a46d42b903418eJohann                    thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
16511b362b15af34006e6a11974088a46d42b903418eJohann                                              mvsadcost, sad_per_bit);
16521b362b15af34006e6a11974088a46d42b903418eJohann
16531b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
16541b362b15af34006e6a11974088a46d42b903418eJohann                    {
16551b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = thissad;
16561b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.row = r;
16571b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.col = c;
16581b362b15af34006e6a11974088a46d42b903418eJohann                        bestaddress = check_here;
16591b362b15af34006e6a11974088a46d42b903418eJohann                    }
16601b362b15af34006e6a11974088a46d42b903418eJohann                }
16611b362b15af34006e6a11974088a46d42b903418eJohann
16621b362b15af34006e6a11974088a46d42b903418eJohann                check_here++;
16631b362b15af34006e6a11974088a46d42b903418eJohann                c++;
16641b362b15af34006e6a11974088a46d42b903418eJohann            }
16651b362b15af34006e6a11974088a46d42b903418eJohann        }
16661b362b15af34006e6a11974088a46d42b903418eJohann
16671b362b15af34006e6a11974088a46d42b903418eJohann        while ((c + 2) < col_max)
16681b362b15af34006e6a11974088a46d42b903418eJohann        {
16691b362b15af34006e6a11974088a46d42b903418eJohann            int i;
16701b362b15af34006e6a11974088a46d42b903418eJohann
16711b362b15af34006e6a11974088a46d42b903418eJohann            fn_ptr->sdx3f(what, what_stride, check_here , in_what_stride, sad_array);
16721b362b15af34006e6a11974088a46d42b903418eJohann
16731b362b15af34006e6a11974088a46d42b903418eJohann            for (i = 0; i < 3; i++)
16741b362b15af34006e6a11974088a46d42b903418eJohann            {
16751b362b15af34006e6a11974088a46d42b903418eJohann                thissad = sad_array[i];
16761b362b15af34006e6a11974088a46d42b903418eJohann
16771b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
16781b362b15af34006e6a11974088a46d42b903418eJohann                {
16791b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = c;
16801b362b15af34006e6a11974088a46d42b903418eJohann                    thissad  += mvsad_err_cost(&this_mv, &fcenter_mv,
16811b362b15af34006e6a11974088a46d42b903418eJohann                        mvsadcost, sad_per_bit);
16821b362b15af34006e6a11974088a46d42b903418eJohann
16831b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
16841b362b15af34006e6a11974088a46d42b903418eJohann                    {
16851b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = thissad;
16861b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.row = r;
16871b362b15af34006e6a11974088a46d42b903418eJohann                        best_mv->as_mv.col = c;
16881b362b15af34006e6a11974088a46d42b903418eJohann                        bestaddress = check_here;
16891b362b15af34006e6a11974088a46d42b903418eJohann                    }
16901b362b15af34006e6a11974088a46d42b903418eJohann                }
16911b362b15af34006e6a11974088a46d42b903418eJohann
16921b362b15af34006e6a11974088a46d42b903418eJohann                check_here++;
16931b362b15af34006e6a11974088a46d42b903418eJohann                c++;
16941b362b15af34006e6a11974088a46d42b903418eJohann            }
16951b362b15af34006e6a11974088a46d42b903418eJohann        }
16961b362b15af34006e6a11974088a46d42b903418eJohann
16971b362b15af34006e6a11974088a46d42b903418eJohann        while (c < col_max)
16981b362b15af34006e6a11974088a46d42b903418eJohann        {
16997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
17001b362b15af34006e6a11974088a46d42b903418eJohann
17011b362b15af34006e6a11974088a46d42b903418eJohann            if (thissad < bestsad)
17021b362b15af34006e6a11974088a46d42b903418eJohann            {
17031b362b15af34006e6a11974088a46d42b903418eJohann                this_mv.as_mv.col = c;
17041b362b15af34006e6a11974088a46d42b903418eJohann                thissad  += mvsad_err_cost(&this_mv, &fcenter_mv,
17051b362b15af34006e6a11974088a46d42b903418eJohann                    mvsadcost, sad_per_bit);
17061b362b15af34006e6a11974088a46d42b903418eJohann
17071b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
17081b362b15af34006e6a11974088a46d42b903418eJohann                {
17091b362b15af34006e6a11974088a46d42b903418eJohann                    bestsad = thissad;
17101b362b15af34006e6a11974088a46d42b903418eJohann                    best_mv->as_mv.row = r;
17111b362b15af34006e6a11974088a46d42b903418eJohann                    best_mv->as_mv.col = c;
17121b362b15af34006e6a11974088a46d42b903418eJohann                    bestaddress = check_here;
17131b362b15af34006e6a11974088a46d42b903418eJohann                }
17141b362b15af34006e6a11974088a46d42b903418eJohann            }
17151b362b15af34006e6a11974088a46d42b903418eJohann
17161b362b15af34006e6a11974088a46d42b903418eJohann            check_here ++;
17171b362b15af34006e6a11974088a46d42b903418eJohann            c ++;
17181b362b15af34006e6a11974088a46d42b903418eJohann        }
17191b362b15af34006e6a11974088a46d42b903418eJohann    }
17201b362b15af34006e6a11974088a46d42b903418eJohann
17215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.row = best_mv->as_mv.row * 8;
17225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.col = best_mv->as_mv.col * 8;
17231b362b15af34006e6a11974088a46d42b903418eJohann
17241b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
17251b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
17261b362b15af34006e6a11974088a46d42b903418eJohann}
17271b362b15af34006e6a11974088a46d42b903418eJohann
17281b362b15af34006e6a11974088a46d42b903418eJohannint vp8_refining_search_sad_c(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
17291b362b15af34006e6a11974088a46d42b903418eJohann                            int error_per_bit, int search_range,
17301b362b15af34006e6a11974088a46d42b903418eJohann                            vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
17311b362b15af34006e6a11974088a46d42b903418eJohann                            int_mv *center_mv)
17321b362b15af34006e6a11974088a46d42b903418eJohann{
17331b362b15af34006e6a11974088a46d42b903418eJohann    MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
17341b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
17351b362b15af34006e6a11974088a46d42b903418eJohann    short this_row_offset, this_col_offset;
17361b362b15af34006e6a11974088a46d42b903418eJohann
17371b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
17381b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
17391b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
17401b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
17411b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
17421b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *best_address = (unsigned char *)(base_pre + d->offset +
17431b362b15af34006e6a11974088a46d42b903418eJohann        (ref_mv->as_mv.row * pre_stride) + ref_mv->as_mv.col);
17441b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
17451b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
17461b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
17471b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
17481b362b15af34006e6a11974088a46d42b903418eJohann
17491b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
17501b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
17511b362b15af34006e6a11974088a46d42b903418eJohann
17521b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
17531b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
17541b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
17551b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
17561b362b15af34006e6a11974088a46d42b903418eJohann
17577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
17581b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
17591b362b15af34006e6a11974088a46d42b903418eJohann
17601b362b15af34006e6a11974088a46d42b903418eJohann    for (i=0; i<search_range; i++)
17611b362b15af34006e6a11974088a46d42b903418eJohann    {
17621b362b15af34006e6a11974088a46d42b903418eJohann        int best_site = -1;
17631b362b15af34006e6a11974088a46d42b903418eJohann
17641b362b15af34006e6a11974088a46d42b903418eJohann        for (j = 0 ; j < 4 ; j++)
17651b362b15af34006e6a11974088a46d42b903418eJohann        {
17661b362b15af34006e6a11974088a46d42b903418eJohann            this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
17671b362b15af34006e6a11974088a46d42b903418eJohann            this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
17681b362b15af34006e6a11974088a46d42b903418eJohann
17691b362b15af34006e6a11974088a46d42b903418eJohann            if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
17701b362b15af34006e6a11974088a46d42b903418eJohann            (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
17711b362b15af34006e6a11974088a46d42b903418eJohann            {
17721b362b15af34006e6a11974088a46d42b903418eJohann                check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
17737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
17741b362b15af34006e6a11974088a46d42b903418eJohann
17751b362b15af34006e6a11974088a46d42b903418eJohann                if (thissad < bestsad)
17761b362b15af34006e6a11974088a46d42b903418eJohann                {
17771b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.row = this_row_offset;
17781b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = this_col_offset;
17791b362b15af34006e6a11974088a46d42b903418eJohann                    thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
17801b362b15af34006e6a11974088a46d42b903418eJohann
17811b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
17821b362b15af34006e6a11974088a46d42b903418eJohann                    {
17831b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = thissad;
17841b362b15af34006e6a11974088a46d42b903418eJohann                        best_site = j;
17851b362b15af34006e6a11974088a46d42b903418eJohann                    }
17861b362b15af34006e6a11974088a46d42b903418eJohann                }
17871b362b15af34006e6a11974088a46d42b903418eJohann            }
17881b362b15af34006e6a11974088a46d42b903418eJohann        }
17891b362b15af34006e6a11974088a46d42b903418eJohann
17901b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site == -1)
17911b362b15af34006e6a11974088a46d42b903418eJohann            break;
17921b362b15af34006e6a11974088a46d42b903418eJohann        else
17931b362b15af34006e6a11974088a46d42b903418eJohann        {
17941b362b15af34006e6a11974088a46d42b903418eJohann            ref_mv->as_mv.row += neighbors[best_site].row;
17951b362b15af34006e6a11974088a46d42b903418eJohann            ref_mv->as_mv.col += neighbors[best_site].col;
17961b362b15af34006e6a11974088a46d42b903418eJohann            best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
17971b362b15af34006e6a11974088a46d42b903418eJohann        }
17981b362b15af34006e6a11974088a46d42b903418eJohann    }
17991b362b15af34006e6a11974088a46d42b903418eJohann
18001b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.row = ref_mv->as_mv.row << 3;
18011b362b15af34006e6a11974088a46d42b903418eJohann    this_mv.as_mv.col = ref_mv->as_mv.col << 3;
18021b362b15af34006e6a11974088a46d42b903418eJohann
18031b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
18041b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
18051b362b15af34006e6a11974088a46d42b903418eJohann}
18061b362b15af34006e6a11974088a46d42b903418eJohann
18071b362b15af34006e6a11974088a46d42b903418eJohannint vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
18081b362b15af34006e6a11974088a46d42b903418eJohann                              int_mv *ref_mv, int error_per_bit,
18091b362b15af34006e6a11974088a46d42b903418eJohann                              int search_range, vp8_variance_fn_ptr_t *fn_ptr,
18101b362b15af34006e6a11974088a46d42b903418eJohann                              int *mvcost[2], int_mv *center_mv)
18111b362b15af34006e6a11974088a46d42b903418eJohann{
18121b362b15af34006e6a11974088a46d42b903418eJohann    MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
18131b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
18141b362b15af34006e6a11974088a46d42b903418eJohann    short this_row_offset, this_col_offset;
18151b362b15af34006e6a11974088a46d42b903418eJohann
18161b362b15af34006e6a11974088a46d42b903418eJohann    int what_stride = b->src_stride;
18171b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->e_mbd.pre.y_stride;
18181b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->e_mbd.pre.y_buffer;
18191b362b15af34006e6a11974088a46d42b903418eJohann    int in_what_stride = pre_stride;
18201b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *what = (*(b->base_src) + b->src);
18211b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *best_address = (unsigned char *)(base_pre + d->offset +
18221b362b15af34006e6a11974088a46d42b903418eJohann        (ref_mv->as_mv.row * pre_stride) + ref_mv->as_mv.col);
18231b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *check_here;
18241b362b15af34006e6a11974088a46d42b903418eJohann    int_mv this_mv;
18251b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int bestsad;
18261b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int thissad;
18271b362b15af34006e6a11974088a46d42b903418eJohann
18281b362b15af34006e6a11974088a46d42b903418eJohann    int *mvsadcost[2];
18291b362b15af34006e6a11974088a46d42b903418eJohann    int_mv fcenter_mv;
18301b362b15af34006e6a11974088a46d42b903418eJohann
18311b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[0] = x->mvsadcost[0];
18321b362b15af34006e6a11974088a46d42b903418eJohann    mvsadcost[1] = x->mvsadcost[1];
18331b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
18341b362b15af34006e6a11974088a46d42b903418eJohann    fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
18351b362b15af34006e6a11974088a46d42b903418eJohann
18367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
18371b362b15af34006e6a11974088a46d42b903418eJohann            + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
18381b362b15af34006e6a11974088a46d42b903418eJohann
18391b362b15af34006e6a11974088a46d42b903418eJohann    for (i=0; i<search_range; i++)
18401b362b15af34006e6a11974088a46d42b903418eJohann    {
18411b362b15af34006e6a11974088a46d42b903418eJohann        int best_site = -1;
18421b362b15af34006e6a11974088a46d42b903418eJohann        int all_in = 1;
18431b362b15af34006e6a11974088a46d42b903418eJohann
18441b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min);
18451b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max);
18461b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min);
18471b362b15af34006e6a11974088a46d42b903418eJohann        all_in &= ((ref_mv->as_mv.col + 1) < x->mv_col_max);
18481b362b15af34006e6a11974088a46d42b903418eJohann
18491b362b15af34006e6a11974088a46d42b903418eJohann        if(all_in)
18501b362b15af34006e6a11974088a46d42b903418eJohann        {
18511b362b15af34006e6a11974088a46d42b903418eJohann            unsigned int sad_array[4];
18521b362b15af34006e6a11974088a46d42b903418eJohann            const unsigned char *block_offset[4];
18531b362b15af34006e6a11974088a46d42b903418eJohann            block_offset[0] = best_address - in_what_stride;
18541b362b15af34006e6a11974088a46d42b903418eJohann            block_offset[1] = best_address - 1;
18551b362b15af34006e6a11974088a46d42b903418eJohann            block_offset[2] = best_address + 1;
18561b362b15af34006e6a11974088a46d42b903418eJohann            block_offset[3] = best_address + in_what_stride;
18571b362b15af34006e6a11974088a46d42b903418eJohann
18581b362b15af34006e6a11974088a46d42b903418eJohann            fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
18591b362b15af34006e6a11974088a46d42b903418eJohann
18601b362b15af34006e6a11974088a46d42b903418eJohann            for (j = 0; j < 4; j++)
18611b362b15af34006e6a11974088a46d42b903418eJohann            {
18621b362b15af34006e6a11974088a46d42b903418eJohann                if (sad_array[j] < bestsad)
18631b362b15af34006e6a11974088a46d42b903418eJohann                {
18641b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.row = ref_mv->as_mv.row + neighbors[j].row;
18651b362b15af34006e6a11974088a46d42b903418eJohann                    this_mv.as_mv.col = ref_mv->as_mv.col + neighbors[j].col;
18661b362b15af34006e6a11974088a46d42b903418eJohann                    sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
18671b362b15af34006e6a11974088a46d42b903418eJohann
18681b362b15af34006e6a11974088a46d42b903418eJohann                    if (sad_array[j] < bestsad)
18691b362b15af34006e6a11974088a46d42b903418eJohann                    {
18701b362b15af34006e6a11974088a46d42b903418eJohann                        bestsad = sad_array[j];
18711b362b15af34006e6a11974088a46d42b903418eJohann                        best_site = j;
18721b362b15af34006e6a11974088a46d42b903418eJohann                    }
18731b362b15af34006e6a11974088a46d42b903418eJohann                }
18741b362b15af34006e6a11974088a46d42b903418eJohann            }
18751b362b15af34006e6a11974088a46d42b903418eJohann        }
18761b362b15af34006e6a11974088a46d42b903418eJohann        else
18771b362b15af34006e6a11974088a46d42b903418eJohann        {
18781b362b15af34006e6a11974088a46d42b903418eJohann            for (j = 0 ; j < 4 ; j++)
18791b362b15af34006e6a11974088a46d42b903418eJohann            {
18801b362b15af34006e6a11974088a46d42b903418eJohann                this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
18811b362b15af34006e6a11974088a46d42b903418eJohann                this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
18821b362b15af34006e6a11974088a46d42b903418eJohann
18831b362b15af34006e6a11974088a46d42b903418eJohann                if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
18841b362b15af34006e6a11974088a46d42b903418eJohann                (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
18851b362b15af34006e6a11974088a46d42b903418eJohann                {
18861b362b15af34006e6a11974088a46d42b903418eJohann                    check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
18877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                    thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
18881b362b15af34006e6a11974088a46d42b903418eJohann
18891b362b15af34006e6a11974088a46d42b903418eJohann                    if (thissad < bestsad)
18901b362b15af34006e6a11974088a46d42b903418eJohann                    {
18911b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.row = this_row_offset;
18921b362b15af34006e6a11974088a46d42b903418eJohann                        this_mv.as_mv.col = this_col_offset;
18931b362b15af34006e6a11974088a46d42b903418eJohann                        thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
18941b362b15af34006e6a11974088a46d42b903418eJohann
18951b362b15af34006e6a11974088a46d42b903418eJohann                        if (thissad < bestsad)
18961b362b15af34006e6a11974088a46d42b903418eJohann                        {
18971b362b15af34006e6a11974088a46d42b903418eJohann                            bestsad = thissad;
18981b362b15af34006e6a11974088a46d42b903418eJohann                            best_site = j;
18991b362b15af34006e6a11974088a46d42b903418eJohann                        }
19001b362b15af34006e6a11974088a46d42b903418eJohann                    }
19011b362b15af34006e6a11974088a46d42b903418eJohann                }
19021b362b15af34006e6a11974088a46d42b903418eJohann            }
19031b362b15af34006e6a11974088a46d42b903418eJohann        }
19041b362b15af34006e6a11974088a46d42b903418eJohann
19051b362b15af34006e6a11974088a46d42b903418eJohann        if (best_site == -1)
19061b362b15af34006e6a11974088a46d42b903418eJohann            break;
19071b362b15af34006e6a11974088a46d42b903418eJohann        else
19081b362b15af34006e6a11974088a46d42b903418eJohann        {
19091b362b15af34006e6a11974088a46d42b903418eJohann            ref_mv->as_mv.row += neighbors[best_site].row;
19101b362b15af34006e6a11974088a46d42b903418eJohann            ref_mv->as_mv.col += neighbors[best_site].col;
19111b362b15af34006e6a11974088a46d42b903418eJohann            best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
19121b362b15af34006e6a11974088a46d42b903418eJohann        }
19131b362b15af34006e6a11974088a46d42b903418eJohann    }
19141b362b15af34006e6a11974088a46d42b903418eJohann
19155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.row = ref_mv->as_mv.row * 8;
19165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    this_mv.as_mv.col = ref_mv->as_mv.col * 8;
19171b362b15af34006e6a11974088a46d42b903418eJohann
19181b362b15af34006e6a11974088a46d42b903418eJohann    return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
19191b362b15af34006e6a11974088a46d42b903418eJohann           + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
19201b362b15af34006e6a11974088a46d42b903418eJohann}
19211b362b15af34006e6a11974088a46d42b903418eJohann
1922ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
19231b362b15af34006e6a11974088a46d42b903418eJohannvoid print_mode_context(void)
19241b362b15af34006e6a11974088a46d42b903418eJohann{
19251b362b15af34006e6a11974088a46d42b903418eJohann    FILE *f = fopen("modecont.c", "w");
19261b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
19271b362b15af34006e6a11974088a46d42b903418eJohann
19281b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "#include \"entropy.h\"\n");
19291b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "const int vp8_mode_contexts[6][4] =\n");
19301b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "{\n");
19311b362b15af34006e6a11974088a46d42b903418eJohann
19321b362b15af34006e6a11974088a46d42b903418eJohann    for (j = 0; j < 6; j++)
19331b362b15af34006e6a11974088a46d42b903418eJohann    {
19341b362b15af34006e6a11974088a46d42b903418eJohann        fprintf(f, "  { /* %d */\n", j);
19351b362b15af34006e6a11974088a46d42b903418eJohann        fprintf(f, "    ");
19361b362b15af34006e6a11974088a46d42b903418eJohann
19371b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 4; i++)
19381b362b15af34006e6a11974088a46d42b903418eJohann        {
19391b362b15af34006e6a11974088a46d42b903418eJohann            int overal_prob;
19401b362b15af34006e6a11974088a46d42b903418eJohann            int this_prob;
19411b362b15af34006e6a11974088a46d42b903418eJohann            int count;
19421b362b15af34006e6a11974088a46d42b903418eJohann
19431b362b15af34006e6a11974088a46d42b903418eJohann            /* Overall probs */
19441b362b15af34006e6a11974088a46d42b903418eJohann            count = mv_mode_cts[i][0] + mv_mode_cts[i][1];
19451b362b15af34006e6a11974088a46d42b903418eJohann
19461b362b15af34006e6a11974088a46d42b903418eJohann            if (count)
19471b362b15af34006e6a11974088a46d42b903418eJohann                overal_prob = 256 * mv_mode_cts[i][0] / count;
19481b362b15af34006e6a11974088a46d42b903418eJohann            else
19491b362b15af34006e6a11974088a46d42b903418eJohann                overal_prob = 128;
19501b362b15af34006e6a11974088a46d42b903418eJohann
19511b362b15af34006e6a11974088a46d42b903418eJohann            if (overal_prob == 0)
19521b362b15af34006e6a11974088a46d42b903418eJohann                overal_prob = 1;
19531b362b15af34006e6a11974088a46d42b903418eJohann
19541b362b15af34006e6a11974088a46d42b903418eJohann            /* context probs */
19551b362b15af34006e6a11974088a46d42b903418eJohann            count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
19561b362b15af34006e6a11974088a46d42b903418eJohann
19571b362b15af34006e6a11974088a46d42b903418eJohann            if (count)
19581b362b15af34006e6a11974088a46d42b903418eJohann                this_prob = 256 * mv_ref_ct[j][i][0] / count;
19591b362b15af34006e6a11974088a46d42b903418eJohann            else
19601b362b15af34006e6a11974088a46d42b903418eJohann                this_prob = 128;
19611b362b15af34006e6a11974088a46d42b903418eJohann
19621b362b15af34006e6a11974088a46d42b903418eJohann            if (this_prob == 0)
19631b362b15af34006e6a11974088a46d42b903418eJohann                this_prob = 1;
19641b362b15af34006e6a11974088a46d42b903418eJohann
19651b362b15af34006e6a11974088a46d42b903418eJohann            fprintf(f, "%5d, ", this_prob);
19661b362b15af34006e6a11974088a46d42b903418eJohann        }
19671b362b15af34006e6a11974088a46d42b903418eJohann
19681b362b15af34006e6a11974088a46d42b903418eJohann        fprintf(f, "  },\n");
19691b362b15af34006e6a11974088a46d42b903418eJohann    }
19701b362b15af34006e6a11974088a46d42b903418eJohann
19711b362b15af34006e6a11974088a46d42b903418eJohann    fprintf(f, "};\n");
19721b362b15af34006e6a11974088a46d42b903418eJohann    fclose(f);
19731b362b15af34006e6a11974088a46d42b903418eJohann}
19741b362b15af34006e6a11974088a46d42b903418eJohann
1975ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* MV ref count VP8_ENTROPY_STATS stats code */
1976ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS
19771b362b15af34006e6a11974088a46d42b903418eJohannvoid init_mv_ref_counts()
19781b362b15af34006e6a11974088a46d42b903418eJohann{
19797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(mv_ref_ct, 0, sizeof(mv_ref_ct));
19807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    memset(mv_mode_cts, 0, sizeof(mv_mode_cts));
19811b362b15af34006e6a11974088a46d42b903418eJohann}
19821b362b15af34006e6a11974088a46d42b903418eJohann
19831b362b15af34006e6a11974088a46d42b903418eJohannvoid accum_mv_refs(MB_PREDICTION_MODE m, const int ct[4])
19841b362b15af34006e6a11974088a46d42b903418eJohann{
19851b362b15af34006e6a11974088a46d42b903418eJohann    if (m == ZEROMV)
19861b362b15af34006e6a11974088a46d42b903418eJohann    {
19871b362b15af34006e6a11974088a46d42b903418eJohann        ++mv_ref_ct [ct[0]] [0] [0];
19881b362b15af34006e6a11974088a46d42b903418eJohann        ++mv_mode_cts[0][0];
19891b362b15af34006e6a11974088a46d42b903418eJohann    }
19901b362b15af34006e6a11974088a46d42b903418eJohann    else
19911b362b15af34006e6a11974088a46d42b903418eJohann    {
19921b362b15af34006e6a11974088a46d42b903418eJohann        ++mv_ref_ct [ct[0]] [0] [1];
19931b362b15af34006e6a11974088a46d42b903418eJohann        ++mv_mode_cts[0][1];
19941b362b15af34006e6a11974088a46d42b903418eJohann
19951b362b15af34006e6a11974088a46d42b903418eJohann        if (m == NEARESTMV)
19961b362b15af34006e6a11974088a46d42b903418eJohann        {
19971b362b15af34006e6a11974088a46d42b903418eJohann            ++mv_ref_ct [ct[1]] [1] [0];
19981b362b15af34006e6a11974088a46d42b903418eJohann            ++mv_mode_cts[1][0];
19991b362b15af34006e6a11974088a46d42b903418eJohann        }
20001b362b15af34006e6a11974088a46d42b903418eJohann        else
20011b362b15af34006e6a11974088a46d42b903418eJohann        {
20021b362b15af34006e6a11974088a46d42b903418eJohann            ++mv_ref_ct [ct[1]] [1] [1];
20031b362b15af34006e6a11974088a46d42b903418eJohann            ++mv_mode_cts[1][1];
20041b362b15af34006e6a11974088a46d42b903418eJohann
20051b362b15af34006e6a11974088a46d42b903418eJohann            if (m == NEARMV)
20061b362b15af34006e6a11974088a46d42b903418eJohann            {
20071b362b15af34006e6a11974088a46d42b903418eJohann                ++mv_ref_ct [ct[2]] [2] [0];
20081b362b15af34006e6a11974088a46d42b903418eJohann                ++mv_mode_cts[2][0];
20091b362b15af34006e6a11974088a46d42b903418eJohann            }
20101b362b15af34006e6a11974088a46d42b903418eJohann            else
20111b362b15af34006e6a11974088a46d42b903418eJohann            {
20121b362b15af34006e6a11974088a46d42b903418eJohann                ++mv_ref_ct [ct[2]] [2] [1];
20131b362b15af34006e6a11974088a46d42b903418eJohann                ++mv_mode_cts[2][1];
20141b362b15af34006e6a11974088a46d42b903418eJohann
20151b362b15af34006e6a11974088a46d42b903418eJohann                if (m == NEWMV)
20161b362b15af34006e6a11974088a46d42b903418eJohann                {
20171b362b15af34006e6a11974088a46d42b903418eJohann                    ++mv_ref_ct [ct[3]] [3] [0];
20181b362b15af34006e6a11974088a46d42b903418eJohann                    ++mv_mode_cts[3][0];
20191b362b15af34006e6a11974088a46d42b903418eJohann                }
20201b362b15af34006e6a11974088a46d42b903418eJohann                else
20211b362b15af34006e6a11974088a46d42b903418eJohann                {
20221b362b15af34006e6a11974088a46d42b903418eJohann                    ++mv_ref_ct [ct[3]] [3] [1];
20231b362b15af34006e6a11974088a46d42b903418eJohann                    ++mv_mode_cts[3][1];
20241b362b15af34006e6a11974088a46d42b903418eJohann                }
20251b362b15af34006e6a11974088a46d42b903418eJohann            }
20261b362b15af34006e6a11974088a46d42b903418eJohann        }
20271b362b15af34006e6a11974088a46d42b903418eJohann    }
20281b362b15af34006e6a11974088a46d42b903418eJohann}
20291b362b15af34006e6a11974088a46d42b903418eJohann
2030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif/* END MV ref count VP8_ENTROPY_STATS stats code */
20311b362b15af34006e6a11974088a46d42b903418eJohann
20321b362b15af34006e6a11974088a46d42b903418eJohann#endif
2033