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