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