11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h> 131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx/vpx_integer.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "blockd.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "reconinter.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_RUNTIME_CPU_DETECT 191b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxc_int.h" 201b362b15af34006e6a11974088a46d42b903418eJohann#endif 211b362b15af34006e6a11974088a46d42b903418eJohann 221b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem16x16_c( 231b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src, 241b362b15af34006e6a11974088a46d42b903418eJohann int src_stride, 251b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst, 261b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride) 271b362b15af34006e6a11974088a46d42b903418eJohann{ 281b362b15af34006e6a11974088a46d42b903418eJohann 291b362b15af34006e6a11974088a46d42b903418eJohann int r; 301b362b15af34006e6a11974088a46d42b903418eJohann 311b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 16; r++) 321b362b15af34006e6a11974088a46d42b903418eJohann { 331b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED) 341b362b15af34006e6a11974088a46d42b903418eJohann dst[0] = src[0]; 351b362b15af34006e6a11974088a46d42b903418eJohann dst[1] = src[1]; 361b362b15af34006e6a11974088a46d42b903418eJohann dst[2] = src[2]; 371b362b15af34006e6a11974088a46d42b903418eJohann dst[3] = src[3]; 381b362b15af34006e6a11974088a46d42b903418eJohann dst[4] = src[4]; 391b362b15af34006e6a11974088a46d42b903418eJohann dst[5] = src[5]; 401b362b15af34006e6a11974088a46d42b903418eJohann dst[6] = src[6]; 411b362b15af34006e6a11974088a46d42b903418eJohann dst[7] = src[7]; 421b362b15af34006e6a11974088a46d42b903418eJohann dst[8] = src[8]; 431b362b15af34006e6a11974088a46d42b903418eJohann dst[9] = src[9]; 441b362b15af34006e6a11974088a46d42b903418eJohann dst[10] = src[10]; 451b362b15af34006e6a11974088a46d42b903418eJohann dst[11] = src[11]; 461b362b15af34006e6a11974088a46d42b903418eJohann dst[12] = src[12]; 471b362b15af34006e6a11974088a46d42b903418eJohann dst[13] = src[13]; 481b362b15af34006e6a11974088a46d42b903418eJohann dst[14] = src[14]; 491b362b15af34006e6a11974088a46d42b903418eJohann dst[15] = src[15]; 501b362b15af34006e6a11974088a46d42b903418eJohann 511b362b15af34006e6a11974088a46d42b903418eJohann#else 521b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 531b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 541b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[2] = ((uint32_t *)src)[2] ; 551b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[3] = ((uint32_t *)src)[3] ; 561b362b15af34006e6a11974088a46d42b903418eJohann 571b362b15af34006e6a11974088a46d42b903418eJohann#endif 581b362b15af34006e6a11974088a46d42b903418eJohann src += src_stride; 591b362b15af34006e6a11974088a46d42b903418eJohann dst += dst_stride; 601b362b15af34006e6a11974088a46d42b903418eJohann 611b362b15af34006e6a11974088a46d42b903418eJohann } 621b362b15af34006e6a11974088a46d42b903418eJohann 631b362b15af34006e6a11974088a46d42b903418eJohann} 641b362b15af34006e6a11974088a46d42b903418eJohann 651b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem8x8_c( 661b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src, 671b362b15af34006e6a11974088a46d42b903418eJohann int src_stride, 681b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst, 691b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride) 701b362b15af34006e6a11974088a46d42b903418eJohann{ 711b362b15af34006e6a11974088a46d42b903418eJohann int r; 721b362b15af34006e6a11974088a46d42b903418eJohann 731b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 8; r++) 741b362b15af34006e6a11974088a46d42b903418eJohann { 751b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED) 761b362b15af34006e6a11974088a46d42b903418eJohann dst[0] = src[0]; 771b362b15af34006e6a11974088a46d42b903418eJohann dst[1] = src[1]; 781b362b15af34006e6a11974088a46d42b903418eJohann dst[2] = src[2]; 791b362b15af34006e6a11974088a46d42b903418eJohann dst[3] = src[3]; 801b362b15af34006e6a11974088a46d42b903418eJohann dst[4] = src[4]; 811b362b15af34006e6a11974088a46d42b903418eJohann dst[5] = src[5]; 821b362b15af34006e6a11974088a46d42b903418eJohann dst[6] = src[6]; 831b362b15af34006e6a11974088a46d42b903418eJohann dst[7] = src[7]; 841b362b15af34006e6a11974088a46d42b903418eJohann#else 851b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 861b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 871b362b15af34006e6a11974088a46d42b903418eJohann#endif 881b362b15af34006e6a11974088a46d42b903418eJohann src += src_stride; 891b362b15af34006e6a11974088a46d42b903418eJohann dst += dst_stride; 901b362b15af34006e6a11974088a46d42b903418eJohann 911b362b15af34006e6a11974088a46d42b903418eJohann } 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohann} 941b362b15af34006e6a11974088a46d42b903418eJohann 951b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem8x4_c( 961b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src, 971b362b15af34006e6a11974088a46d42b903418eJohann int src_stride, 981b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst, 991b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride) 1001b362b15af34006e6a11974088a46d42b903418eJohann{ 1011b362b15af34006e6a11974088a46d42b903418eJohann int r; 1021b362b15af34006e6a11974088a46d42b903418eJohann 1031b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 4; r++) 1041b362b15af34006e6a11974088a46d42b903418eJohann { 1051b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED) 1061b362b15af34006e6a11974088a46d42b903418eJohann dst[0] = src[0]; 1071b362b15af34006e6a11974088a46d42b903418eJohann dst[1] = src[1]; 1081b362b15af34006e6a11974088a46d42b903418eJohann dst[2] = src[2]; 1091b362b15af34006e6a11974088a46d42b903418eJohann dst[3] = src[3]; 1101b362b15af34006e6a11974088a46d42b903418eJohann dst[4] = src[4]; 1111b362b15af34006e6a11974088a46d42b903418eJohann dst[5] = src[5]; 1121b362b15af34006e6a11974088a46d42b903418eJohann dst[6] = src[6]; 1131b362b15af34006e6a11974088a46d42b903418eJohann dst[7] = src[7]; 1141b362b15af34006e6a11974088a46d42b903418eJohann#else 1151b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 1161b362b15af34006e6a11974088a46d42b903418eJohann ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 1171b362b15af34006e6a11974088a46d42b903418eJohann#endif 1181b362b15af34006e6a11974088a46d42b903418eJohann src += src_stride; 1191b362b15af34006e6a11974088a46d42b903418eJohann dst += dst_stride; 1201b362b15af34006e6a11974088a46d42b903418eJohann 1211b362b15af34006e6a11974088a46d42b903418eJohann } 1221b362b15af34006e6a11974088a46d42b903418eJohann 1231b362b15af34006e6a11974088a46d42b903418eJohann} 1241b362b15af34006e6a11974088a46d42b903418eJohann 1251b362b15af34006e6a11974088a46d42b903418eJohann 1261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter_predictors_b(BLOCKD *d, int pitch, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf) 1271b362b15af34006e6a11974088a46d42b903418eJohann{ 1281b362b15af34006e6a11974088a46d42b903418eJohann int r; 1291b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *pred_ptr = d->predictor; 1301b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1311b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1321b362b15af34006e6a11974088a46d42b903418eJohann 1331b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1341b362b15af34006e6a11974088a46d42b903418eJohann { 1351b362b15af34006e6a11974088a46d42b903418eJohann sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch); 1361b362b15af34006e6a11974088a46d42b903418eJohann } 1371b362b15af34006e6a11974088a46d42b903418eJohann else 1381b362b15af34006e6a11974088a46d42b903418eJohann { 1391b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 4; r++) 1401b362b15af34006e6a11974088a46d42b903418eJohann { 1411b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[0] = ptr[0]; 1421b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[1] = ptr[1]; 1431b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[2] = ptr[2]; 1441b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[3] = ptr[3]; 1451b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr += pitch; 1461b362b15af34006e6a11974088a46d42b903418eJohann ptr += pre_stride; 1471b362b15af34006e6a11974088a46d42b903418eJohann } 1481b362b15af34006e6a11974088a46d42b903418eJohann } 1491b362b15af34006e6a11974088a46d42b903418eJohann} 1501b362b15af34006e6a11974088a46d42b903418eJohann 1511b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 1521b362b15af34006e6a11974088a46d42b903418eJohann{ 1531b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1541b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1551b362b15af34006e6a11974088a46d42b903418eJohann 1561b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1571b362b15af34006e6a11974088a46d42b903418eJohann { 1581b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1591b362b15af34006e6a11974088a46d42b903418eJohann } 1601b362b15af34006e6a11974088a46d42b903418eJohann else 1611b362b15af34006e6a11974088a46d42b903418eJohann { 1621b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride); 1631b362b15af34006e6a11974088a46d42b903418eJohann } 1641b362b15af34006e6a11974088a46d42b903418eJohann} 1651b362b15af34006e6a11974088a46d42b903418eJohann 1661b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 1671b362b15af34006e6a11974088a46d42b903418eJohann{ 1681b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1691b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1701b362b15af34006e6a11974088a46d42b903418eJohann 1711b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1721b362b15af34006e6a11974088a46d42b903418eJohann { 1731b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1741b362b15af34006e6a11974088a46d42b903418eJohann } 1751b362b15af34006e6a11974088a46d42b903418eJohann else 1761b362b15af34006e6a11974088a46d42b903418eJohann { 1771b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride); 1781b362b15af34006e6a11974088a46d42b903418eJohann } 1791b362b15af34006e6a11974088a46d42b903418eJohann} 1801b362b15af34006e6a11974088a46d42b903418eJohann 1811b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors_b(BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf) 1821b362b15af34006e6a11974088a46d42b903418eJohann{ 1831b362b15af34006e6a11974088a46d42b903418eJohann int r; 1841b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1851b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1861b362b15af34006e6a11974088a46d42b903418eJohann 1871b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1881b362b15af34006e6a11974088a46d42b903418eJohann { 1891b362b15af34006e6a11974088a46d42b903418eJohann sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1901b362b15af34006e6a11974088a46d42b903418eJohann } 1911b362b15af34006e6a11974088a46d42b903418eJohann else 1921b362b15af34006e6a11974088a46d42b903418eJohann { 1931b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 4; r++) 1941b362b15af34006e6a11974088a46d42b903418eJohann { 1951b362b15af34006e6a11974088a46d42b903418eJohann dst[0] = ptr[0]; 1961b362b15af34006e6a11974088a46d42b903418eJohann dst[1] = ptr[1]; 1971b362b15af34006e6a11974088a46d42b903418eJohann dst[2] = ptr[2]; 1981b362b15af34006e6a11974088a46d42b903418eJohann dst[3] = ptr[3]; 1995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang dst += dst_stride; 2005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ptr += pre_stride; 2011b362b15af34006e6a11974088a46d42b903418eJohann } 2021b362b15af34006e6a11974088a46d42b903418eJohann } 2031b362b15af34006e6a11974088a46d42b903418eJohann} 2041b362b15af34006e6a11974088a46d42b903418eJohann 2051b362b15af34006e6a11974088a46d42b903418eJohann 2061b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 2071b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x) 2081b362b15af34006e6a11974088a46d42b903418eJohann{ 2091b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uptr, *vptr; 2101b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *upred_ptr = &x->predictor[256]; 2111b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *vpred_ptr = &x->predictor[320]; 2121b362b15af34006e6a11974088a46d42b903418eJohann 2131b362b15af34006e6a11974088a46d42b903418eJohann int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 2141b362b15af34006e6a11974088a46d42b903418eJohann int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 2151b362b15af34006e6a11974088a46d42b903418eJohann int offset; 2161b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.uv_stride; 2171b362b15af34006e6a11974088a46d42b903418eJohann 2181b362b15af34006e6a11974088a46d42b903418eJohann /* calc uv motion vectors */ 2191b362b15af34006e6a11974088a46d42b903418eJohann mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1)); 2201b362b15af34006e6a11974088a46d42b903418eJohann mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1)); 2211b362b15af34006e6a11974088a46d42b903418eJohann mv_row /= 2; 2221b362b15af34006e6a11974088a46d42b903418eJohann mv_col /= 2; 2231b362b15af34006e6a11974088a46d42b903418eJohann mv_row &= x->fullpixel_mask; 2241b362b15af34006e6a11974088a46d42b903418eJohann mv_col &= x->fullpixel_mask; 2251b362b15af34006e6a11974088a46d42b903418eJohann 2261b362b15af34006e6a11974088a46d42b903418eJohann offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); 2271b362b15af34006e6a11974088a46d42b903418eJohann uptr = x->pre.u_buffer + offset; 2281b362b15af34006e6a11974088a46d42b903418eJohann vptr = x->pre.v_buffer + offset; 2291b362b15af34006e6a11974088a46d42b903418eJohann 2301b362b15af34006e6a11974088a46d42b903418eJohann if ((mv_row | mv_col) & 7) 2311b362b15af34006e6a11974088a46d42b903418eJohann { 2321b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8); 2331b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8); 2341b362b15af34006e6a11974088a46d42b903418eJohann } 2351b362b15af34006e6a11974088a46d42b903418eJohann else 2361b362b15af34006e6a11974088a46d42b903418eJohann { 2371b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8); 2381b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8); 2391b362b15af34006e6a11974088a46d42b903418eJohann } 2401b362b15af34006e6a11974088a46d42b903418eJohann} 2411b362b15af34006e6a11974088a46d42b903418eJohann 2421b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 2431b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x) 2441b362b15af34006e6a11974088a46d42b903418eJohann{ 2451b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 2461b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.uv_stride; 2471b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_pre; 2481b362b15af34006e6a11974088a46d42b903418eJohann 2491b362b15af34006e6a11974088a46d42b903418eJohann /* build uv mvs */ 2501b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 2; i++) 2511b362b15af34006e6a11974088a46d42b903418eJohann { 2521b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < 2; j++) 2531b362b15af34006e6a11974088a46d42b903418eJohann { 2541b362b15af34006e6a11974088a46d42b903418eJohann int yoffset = i * 8 + j * 2; 2551b362b15af34006e6a11974088a46d42b903418eJohann int uoffset = 16 + i * 2 + j; 2561b362b15af34006e6a11974088a46d42b903418eJohann int voffset = 20 + i * 2 + j; 2571b362b15af34006e6a11974088a46d42b903418eJohann 2581b362b15af34006e6a11974088a46d42b903418eJohann int temp; 2591b362b15af34006e6a11974088a46d42b903418eJohann 2601b362b15af34006e6a11974088a46d42b903418eJohann temp = x->block[yoffset ].bmi.mv.as_mv.row 2611b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+1].bmi.mv.as_mv.row 2621b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+4].bmi.mv.as_mv.row 2631b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+5].bmi.mv.as_mv.row; 2641b362b15af34006e6a11974088a46d42b903418eJohann 2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 2661b362b15af34006e6a11974088a46d42b903418eJohann 2671b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 2681b362b15af34006e6a11974088a46d42b903418eJohann 2691b362b15af34006e6a11974088a46d42b903418eJohann temp = x->block[yoffset ].bmi.mv.as_mv.col 2701b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+1].bmi.mv.as_mv.col 2711b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+4].bmi.mv.as_mv.col 2721b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+5].bmi.mv.as_mv.col; 2731b362b15af34006e6a11974088a46d42b903418eJohann 2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 2751b362b15af34006e6a11974088a46d42b903418eJohann 2761b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 2771b362b15af34006e6a11974088a46d42b903418eJohann 2781b362b15af34006e6a11974088a46d42b903418eJohann x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 2791b362b15af34006e6a11974088a46d42b903418eJohann } 2801b362b15af34006e6a11974088a46d42b903418eJohann } 2811b362b15af34006e6a11974088a46d42b903418eJohann 2821b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.u_buffer; 2831b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 20; i += 2) 2841b362b15af34006e6a11974088a46d42b903418eJohann { 2851b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 2861b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 2871b362b15af34006e6a11974088a46d42b903418eJohann 2881b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 2891b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 2901b362b15af34006e6a11974088a46d42b903418eJohann else 2911b362b15af34006e6a11974088a46d42b903418eJohann { 2921b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 2931b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 2941b362b15af34006e6a11974088a46d42b903418eJohann } 2951b362b15af34006e6a11974088a46d42b903418eJohann } 2961b362b15af34006e6a11974088a46d42b903418eJohann 2971b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.v_buffer; 2981b362b15af34006e6a11974088a46d42b903418eJohann for (i = 20; i < 24; i += 2) 2991b362b15af34006e6a11974088a46d42b903418eJohann { 3001b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 3011b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 3021b362b15af34006e6a11974088a46d42b903418eJohann 3031b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 3041b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 3051b362b15af34006e6a11974088a46d42b903418eJohann else 3061b362b15af34006e6a11974088a46d42b903418eJohann { 3071b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 3081b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 3091b362b15af34006e6a11974088a46d42b903418eJohann } 3101b362b15af34006e6a11974088a46d42b903418eJohann } 3111b362b15af34006e6a11974088a46d42b903418eJohann} 3121b362b15af34006e6a11974088a46d42b903418eJohann 3131b362b15af34006e6a11974088a46d42b903418eJohann 3141b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 3151b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x, 3161b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_y, 3171b362b15af34006e6a11974088a46d42b903418eJohann int dst_ystride) 3181b362b15af34006e6a11974088a46d42b903418eJohann{ 3191b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr_base; 3201b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 3211b362b15af34006e6a11974088a46d42b903418eJohann int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 3221b362b15af34006e6a11974088a46d42b903418eJohann int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 3231b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.y_stride; 3241b362b15af34006e6a11974088a46d42b903418eJohann 3251b362b15af34006e6a11974088a46d42b903418eJohann ptr_base = x->pre.y_buffer; 3261b362b15af34006e6a11974088a46d42b903418eJohann ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3); 3271b362b15af34006e6a11974088a46d42b903418eJohann 3281b362b15af34006e6a11974088a46d42b903418eJohann if ((mv_row | mv_col) & 7) 3291b362b15af34006e6a11974088a46d42b903418eJohann { 3301b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, 3311b362b15af34006e6a11974088a46d42b903418eJohann dst_y, dst_ystride); 3321b362b15af34006e6a11974088a46d42b903418eJohann } 3331b362b15af34006e6a11974088a46d42b903418eJohann else 3341b362b15af34006e6a11974088a46d42b903418eJohann { 3351b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem16x16(ptr, pre_stride, dst_y, 3361b362b15af34006e6a11974088a46d42b903418eJohann dst_ystride); 3371b362b15af34006e6a11974088a46d42b903418eJohann } 3381b362b15af34006e6a11974088a46d42b903418eJohann} 3391b362b15af34006e6a11974088a46d42b903418eJohann 3401b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 3411b362b15af34006e6a11974088a46d42b903418eJohann{ 3421b362b15af34006e6a11974088a46d42b903418eJohann /* If the MV points so far into the UMV border that no visible pixels 3431b362b15af34006e6a11974088a46d42b903418eJohann * are used for reconstruction, the subpel part of the MV can be 3441b362b15af34006e6a11974088a46d42b903418eJohann * discarded and the MV limited to 16 pixels with equivalent results. 3451b362b15af34006e6a11974088a46d42b903418eJohann * 3461b362b15af34006e6a11974088a46d42b903418eJohann * This limit kicks in at 19 pixels for the top and left edges, for 3471b362b15af34006e6a11974088a46d42b903418eJohann * the 16 pixels plus 3 taps right of the central pixel when subpel 3481b362b15af34006e6a11974088a46d42b903418eJohann * filtering. The bottom and right edges use 16 pixels plus 2 pixels 3491b362b15af34006e6a11974088a46d42b903418eJohann * left of the central pixel when filtering. 3501b362b15af34006e6a11974088a46d42b903418eJohann */ 3511b362b15af34006e6a11974088a46d42b903418eJohann if (mv->col < (xd->mb_to_left_edge - (19 << 3))) 3521b362b15af34006e6a11974088a46d42b903418eJohann mv->col = xd->mb_to_left_edge - (16 << 3); 3531b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->col > xd->mb_to_right_edge + (18 << 3)) 3541b362b15af34006e6a11974088a46d42b903418eJohann mv->col = xd->mb_to_right_edge + (16 << 3); 3551b362b15af34006e6a11974088a46d42b903418eJohann 3561b362b15af34006e6a11974088a46d42b903418eJohann if (mv->row < (xd->mb_to_top_edge - (19 << 3))) 3571b362b15af34006e6a11974088a46d42b903418eJohann mv->row = xd->mb_to_top_edge - (16 << 3); 3581b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->row > xd->mb_to_bottom_edge + (18 << 3)) 3591b362b15af34006e6a11974088a46d42b903418eJohann mv->row = xd->mb_to_bottom_edge + (16 << 3); 3601b362b15af34006e6a11974088a46d42b903418eJohann} 3611b362b15af34006e6a11974088a46d42b903418eJohann 3621b362b15af34006e6a11974088a46d42b903418eJohann/* A version of the above function for chroma block MVs.*/ 3631b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 3641b362b15af34006e6a11974088a46d42b903418eJohann{ 3651b362b15af34006e6a11974088a46d42b903418eJohann mv->col = (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ? 3661b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_left_edge - (16 << 3)) >> 1 : mv->col; 3671b362b15af34006e6a11974088a46d42b903418eJohann mv->col = (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ? 3681b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_right_edge + (16 << 3)) >> 1 : mv->col; 3691b362b15af34006e6a11974088a46d42b903418eJohann 3701b362b15af34006e6a11974088a46d42b903418eJohann mv->row = (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ? 3711b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_top_edge - (16 << 3)) >> 1 : mv->row; 3721b362b15af34006e6a11974088a46d42b903418eJohann mv->row = (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ? 3731b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_bottom_edge + (16 << 3)) >> 1 : mv->row; 3741b362b15af34006e6a11974088a46d42b903418eJohann} 3751b362b15af34006e6a11974088a46d42b903418eJohann 3761b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x, 3771b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_y, 3781b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_u, 3791b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_v, 3801b362b15af34006e6a11974088a46d42b903418eJohann int dst_ystride, 3811b362b15af34006e6a11974088a46d42b903418eJohann int dst_uvstride) 3821b362b15af34006e6a11974088a46d42b903418eJohann{ 3831b362b15af34006e6a11974088a46d42b903418eJohann int offset; 3841b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 3851b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uptr, *vptr; 3861b362b15af34006e6a11974088a46d42b903418eJohann 3871b362b15af34006e6a11974088a46d42b903418eJohann int_mv _16x16mv; 3881b362b15af34006e6a11974088a46d42b903418eJohann 3891b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr_base = x->pre.y_buffer; 3901b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.y_stride; 3911b362b15af34006e6a11974088a46d42b903418eJohann 3921b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int; 3931b362b15af34006e6a11974088a46d42b903418eJohann 3941b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 3951b362b15af34006e6a11974088a46d42b903418eJohann { 3961b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&_16x16mv.as_mv, x); 3971b362b15af34006e6a11974088a46d42b903418eJohann } 3981b362b15af34006e6a11974088a46d42b903418eJohann 3991b362b15af34006e6a11974088a46d42b903418eJohann ptr = ptr_base + ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 4001b362b15af34006e6a11974088a46d42b903418eJohann 4011b362b15af34006e6a11974088a46d42b903418eJohann if ( _16x16mv.as_int & 0x00070007) 4021b362b15af34006e6a11974088a46d42b903418eJohann { 4031b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict16x16(ptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_y, dst_ystride); 4041b362b15af34006e6a11974088a46d42b903418eJohann } 4051b362b15af34006e6a11974088a46d42b903418eJohann else 4061b362b15af34006e6a11974088a46d42b903418eJohann { 4071b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride); 4081b362b15af34006e6a11974088a46d42b903418eJohann } 4091b362b15af34006e6a11974088a46d42b903418eJohann 4101b362b15af34006e6a11974088a46d42b903418eJohann /* calc uv motion vectors */ 4111b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1)); 4121b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1)); 4131b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row /= 2; 4141b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col /= 2; 4151b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row &= x->fullpixel_mask; 4161b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col &= x->fullpixel_mask; 4171b362b15af34006e6a11974088a46d42b903418eJohann 4181b362b15af34006e6a11974088a46d42b903418eJohann pre_stride >>= 1; 4191b362b15af34006e6a11974088a46d42b903418eJohann offset = ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 4201b362b15af34006e6a11974088a46d42b903418eJohann uptr = x->pre.u_buffer + offset; 4211b362b15af34006e6a11974088a46d42b903418eJohann vptr = x->pre.v_buffer + offset; 4221b362b15af34006e6a11974088a46d42b903418eJohann 4231b362b15af34006e6a11974088a46d42b903418eJohann if ( _16x16mv.as_int & 0x00070007) 4241b362b15af34006e6a11974088a46d42b903418eJohann { 4251b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(uptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_u, dst_uvstride); 4261b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(vptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_v, dst_uvstride); 4271b362b15af34006e6a11974088a46d42b903418eJohann } 4281b362b15af34006e6a11974088a46d42b903418eJohann else 4291b362b15af34006e6a11974088a46d42b903418eJohann { 4301b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride); 4311b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride); 4321b362b15af34006e6a11974088a46d42b903418eJohann } 4331b362b15af34006e6a11974088a46d42b903418eJohann} 4341b362b15af34006e6a11974088a46d42b903418eJohann 4351b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter4x4_predictors_mb(MACROBLOCKD *x) 4361b362b15af34006e6a11974088a46d42b903418eJohann{ 4371b362b15af34006e6a11974088a46d42b903418eJohann int i; 4381b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_dst = x->dst.y_buffer; 4391b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_pre = x->pre.y_buffer; 4401b362b15af34006e6a11974088a46d42b903418eJohann 4411b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.partitioning < 3) 4421b362b15af34006e6a11974088a46d42b903418eJohann { 4431b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b; 4441b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.y_stride; 4451b362b15af34006e6a11974088a46d42b903418eJohann 4461b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 0].bmi = x->mode_info_context->bmi[ 0]; 4471b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 2].bmi = x->mode_info_context->bmi[ 2]; 4481b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 8].bmi = x->mode_info_context->bmi[ 8]; 4491b362b15af34006e6a11974088a46d42b903418eJohann x->block[10].bmi = x->mode_info_context->bmi[10]; 4501b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 4511b362b15af34006e6a11974088a46d42b903418eJohann { 4521b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 0].bmi.mv.as_mv, x); 4531b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 2].bmi.mv.as_mv, x); 4541b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 8].bmi.mv.as_mv, x); 4551b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[10].bmi.mv.as_mv, x); 4561b362b15af34006e6a11974088a46d42b903418eJohann } 4571b362b15af34006e6a11974088a46d42b903418eJohann 4581b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 0]; 4591b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4601b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 2]; 4611b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4621b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 8]; 4631b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4641b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[10]; 4651b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4661b362b15af34006e6a11974088a46d42b903418eJohann } 4671b362b15af34006e6a11974088a46d42b903418eJohann else 4681b362b15af34006e6a11974088a46d42b903418eJohann { 4691b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i += 2) 4701b362b15af34006e6a11974088a46d42b903418eJohann { 4711b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 4721b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 4731b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.y_stride; 4741b362b15af34006e6a11974088a46d42b903418eJohann 4751b362b15af34006e6a11974088a46d42b903418eJohann x->block[i+0].bmi = x->mode_info_context->bmi[i+0]; 4761b362b15af34006e6a11974088a46d42b903418eJohann x->block[i+1].bmi = x->mode_info_context->bmi[i+1]; 4771b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 4781b362b15af34006e6a11974088a46d42b903418eJohann { 4791b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[i+0].bmi.mv.as_mv, x); 4801b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[i+1].bmi.mv.as_mv, x); 4811b362b15af34006e6a11974088a46d42b903418eJohann } 4821b362b15af34006e6a11974088a46d42b903418eJohann 4831b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 4841b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 4851b362b15af34006e6a11974088a46d42b903418eJohann else 4861b362b15af34006e6a11974088a46d42b903418eJohann { 4871b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 4881b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 4891b362b15af34006e6a11974088a46d42b903418eJohann } 4901b362b15af34006e6a11974088a46d42b903418eJohann 4911b362b15af34006e6a11974088a46d42b903418eJohann } 4921b362b15af34006e6a11974088a46d42b903418eJohann 4931b362b15af34006e6a11974088a46d42b903418eJohann } 4941b362b15af34006e6a11974088a46d42b903418eJohann base_dst = x->dst.u_buffer; 4951b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.u_buffer; 4961b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 20; i += 2) 4971b362b15af34006e6a11974088a46d42b903418eJohann { 4981b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 4991b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 5001b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.uv_stride; 5011b362b15af34006e6a11974088a46d42b903418eJohann 5021b362b15af34006e6a11974088a46d42b903418eJohann /* Note: uv mvs already clamped in build_4x4uvmvs() */ 5031b362b15af34006e6a11974088a46d42b903418eJohann 5041b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5051b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 5061b362b15af34006e6a11974088a46d42b903418eJohann else 5071b362b15af34006e6a11974088a46d42b903418eJohann { 5081b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5091b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5101b362b15af34006e6a11974088a46d42b903418eJohann } 5111b362b15af34006e6a11974088a46d42b903418eJohann } 5121b362b15af34006e6a11974088a46d42b903418eJohann 5131b362b15af34006e6a11974088a46d42b903418eJohann base_dst = x->dst.v_buffer; 5141b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.v_buffer; 5151b362b15af34006e6a11974088a46d42b903418eJohann for (i = 20; i < 24; i += 2) 5161b362b15af34006e6a11974088a46d42b903418eJohann { 5171b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 5181b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 5191b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.uv_stride; 5201b362b15af34006e6a11974088a46d42b903418eJohann 5211b362b15af34006e6a11974088a46d42b903418eJohann /* Note: uv mvs already clamped in build_4x4uvmvs() */ 5221b362b15af34006e6a11974088a46d42b903418eJohann 5231b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5241b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 5251b362b15af34006e6a11974088a46d42b903418eJohann else 5261b362b15af34006e6a11974088a46d42b903418eJohann { 5271b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5281b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5291b362b15af34006e6a11974088a46d42b903418eJohann } 5301b362b15af34006e6a11974088a46d42b903418eJohann } 5311b362b15af34006e6a11974088a46d42b903418eJohann} 5321b362b15af34006e6a11974088a46d42b903418eJohann 5331b362b15af34006e6a11974088a46d42b903418eJohannstatic 5341b362b15af34006e6a11974088a46d42b903418eJohannvoid build_4x4uvmvs(MACROBLOCKD *x) 5351b362b15af34006e6a11974088a46d42b903418eJohann{ 5361b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 5371b362b15af34006e6a11974088a46d42b903418eJohann 5381b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 2; i++) 5391b362b15af34006e6a11974088a46d42b903418eJohann { 5401b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < 2; j++) 5411b362b15af34006e6a11974088a46d42b903418eJohann { 5421b362b15af34006e6a11974088a46d42b903418eJohann int yoffset = i * 8 + j * 2; 5431b362b15af34006e6a11974088a46d42b903418eJohann int uoffset = 16 + i * 2 + j; 5441b362b15af34006e6a11974088a46d42b903418eJohann int voffset = 20 + i * 2 + j; 5451b362b15af34006e6a11974088a46d42b903418eJohann 5461b362b15af34006e6a11974088a46d42b903418eJohann int temp; 5471b362b15af34006e6a11974088a46d42b903418eJohann 5481b362b15af34006e6a11974088a46d42b903418eJohann temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.row 5491b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.row 5501b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row 5511b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row; 5521b362b15af34006e6a11974088a46d42b903418eJohann 5535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 5541b362b15af34006e6a11974088a46d42b903418eJohann 5551b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 5561b362b15af34006e6a11974088a46d42b903418eJohann 5571b362b15af34006e6a11974088a46d42b903418eJohann temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.col 5581b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.col 5591b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col 5601b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col; 5611b362b15af34006e6a11974088a46d42b903418eJohann 5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 5631b362b15af34006e6a11974088a46d42b903418eJohann 5641b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 5651b362b15af34006e6a11974088a46d42b903418eJohann 5661b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 5671b362b15af34006e6a11974088a46d42b903418eJohann clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x); 5681b362b15af34006e6a11974088a46d42b903418eJohann 5691b362b15af34006e6a11974088a46d42b903418eJohann x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 5701b362b15af34006e6a11974088a46d42b903418eJohann } 5711b362b15af34006e6a11974088a46d42b903418eJohann } 5721b362b15af34006e6a11974088a46d42b903418eJohann} 5731b362b15af34006e6a11974088a46d42b903418eJohann 5741b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter_predictors_mb(MACROBLOCKD *xd) 5751b362b15af34006e6a11974088a46d42b903418eJohann{ 5761b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.mode != SPLITMV) 5771b362b15af34006e6a11974088a46d42b903418eJohann { 5781b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, 5791b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 5801b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, xd->dst.uv_stride); 5811b362b15af34006e6a11974088a46d42b903418eJohann } 5821b362b15af34006e6a11974088a46d42b903418eJohann else 5831b362b15af34006e6a11974088a46d42b903418eJohann { 5841b362b15af34006e6a11974088a46d42b903418eJohann build_4x4uvmvs(xd); 5851b362b15af34006e6a11974088a46d42b903418eJohann build_inter4x4_predictors_mb(xd); 5861b362b15af34006e6a11974088a46d42b903418eJohann } 5871b362b15af34006e6a11974088a46d42b903418eJohann} 588