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