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" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_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#if !(CONFIG_FAST_UNALIGNED) 1421b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[0] = ptr[0]; 1431b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[1] = ptr[1]; 1441b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[2] = ptr[2]; 1451b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr[3] = ptr[3]; 1461b362b15af34006e6a11974088a46d42b903418eJohann#else 1471b362b15af34006e6a11974088a46d42b903418eJohann *(uint32_t *)pred_ptr = *(uint32_t *)ptr ; 1481b362b15af34006e6a11974088a46d42b903418eJohann#endif 1491b362b15af34006e6a11974088a46d42b903418eJohann pred_ptr += pitch; 1501b362b15af34006e6a11974088a46d42b903418eJohann ptr += pre_stride; 1511b362b15af34006e6a11974088a46d42b903418eJohann } 1521b362b15af34006e6a11974088a46d42b903418eJohann } 1531b362b15af34006e6a11974088a46d42b903418eJohann} 1541b362b15af34006e6a11974088a46d42b903418eJohann 1551b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 1561b362b15af34006e6a11974088a46d42b903418eJohann{ 1571b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1581b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1591b362b15af34006e6a11974088a46d42b903418eJohann 1601b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1611b362b15af34006e6a11974088a46d42b903418eJohann { 1621b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1631b362b15af34006e6a11974088a46d42b903418eJohann } 1641b362b15af34006e6a11974088a46d42b903418eJohann else 1651b362b15af34006e6a11974088a46d42b903418eJohann { 1661b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride); 1671b362b15af34006e6a11974088a46d42b903418eJohann } 1681b362b15af34006e6a11974088a46d42b903418eJohann} 1691b362b15af34006e6a11974088a46d42b903418eJohann 1701b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 1711b362b15af34006e6a11974088a46d42b903418eJohann{ 1721b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1731b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1741b362b15af34006e6a11974088a46d42b903418eJohann 1751b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1761b362b15af34006e6a11974088a46d42b903418eJohann { 1771b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1781b362b15af34006e6a11974088a46d42b903418eJohann } 1791b362b15af34006e6a11974088a46d42b903418eJohann else 1801b362b15af34006e6a11974088a46d42b903418eJohann { 1811b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride); 1821b362b15af34006e6a11974088a46d42b903418eJohann } 1831b362b15af34006e6a11974088a46d42b903418eJohann} 1841b362b15af34006e6a11974088a46d42b903418eJohann 1851b362b15af34006e6a11974088a46d42b903418eJohannstatic 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) 1861b362b15af34006e6a11974088a46d42b903418eJohann{ 1871b362b15af34006e6a11974088a46d42b903418eJohann int r; 1881b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 1891b362b15af34006e6a11974088a46d42b903418eJohann ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 1901b362b15af34006e6a11974088a46d42b903418eJohann 1911b362b15af34006e6a11974088a46d42b903418eJohann if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 1921b362b15af34006e6a11974088a46d42b903418eJohann { 1931b362b15af34006e6a11974088a46d42b903418eJohann sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 1941b362b15af34006e6a11974088a46d42b903418eJohann } 1951b362b15af34006e6a11974088a46d42b903418eJohann else 1961b362b15af34006e6a11974088a46d42b903418eJohann { 1971b362b15af34006e6a11974088a46d42b903418eJohann for (r = 0; r < 4; r++) 1981b362b15af34006e6a11974088a46d42b903418eJohann { 1991b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED) 2001b362b15af34006e6a11974088a46d42b903418eJohann dst[0] = ptr[0]; 2011b362b15af34006e6a11974088a46d42b903418eJohann dst[1] = ptr[1]; 2021b362b15af34006e6a11974088a46d42b903418eJohann dst[2] = ptr[2]; 2031b362b15af34006e6a11974088a46d42b903418eJohann dst[3] = ptr[3]; 2041b362b15af34006e6a11974088a46d42b903418eJohann#else 2051b362b15af34006e6a11974088a46d42b903418eJohann *(uint32_t *)dst = *(uint32_t *)ptr ; 2061b362b15af34006e6a11974088a46d42b903418eJohann#endif 2071b362b15af34006e6a11974088a46d42b903418eJohann dst += dst_stride; 2081b362b15af34006e6a11974088a46d42b903418eJohann ptr += pre_stride; 2091b362b15af34006e6a11974088a46d42b903418eJohann } 2101b362b15af34006e6a11974088a46d42b903418eJohann } 2111b362b15af34006e6a11974088a46d42b903418eJohann} 2121b362b15af34006e6a11974088a46d42b903418eJohann 2131b362b15af34006e6a11974088a46d42b903418eJohann 2141b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 2151b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x) 2161b362b15af34006e6a11974088a46d42b903418eJohann{ 2171b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uptr, *vptr; 2181b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *upred_ptr = &x->predictor[256]; 2191b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *vpred_ptr = &x->predictor[320]; 2201b362b15af34006e6a11974088a46d42b903418eJohann 2211b362b15af34006e6a11974088a46d42b903418eJohann int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 2221b362b15af34006e6a11974088a46d42b903418eJohann int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 2231b362b15af34006e6a11974088a46d42b903418eJohann int offset; 2241b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.uv_stride; 2251b362b15af34006e6a11974088a46d42b903418eJohann 2261b362b15af34006e6a11974088a46d42b903418eJohann /* calc uv motion vectors */ 2271b362b15af34006e6a11974088a46d42b903418eJohann mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1)); 2281b362b15af34006e6a11974088a46d42b903418eJohann mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1)); 2291b362b15af34006e6a11974088a46d42b903418eJohann mv_row /= 2; 2301b362b15af34006e6a11974088a46d42b903418eJohann mv_col /= 2; 2311b362b15af34006e6a11974088a46d42b903418eJohann mv_row &= x->fullpixel_mask; 2321b362b15af34006e6a11974088a46d42b903418eJohann mv_col &= x->fullpixel_mask; 2331b362b15af34006e6a11974088a46d42b903418eJohann 2341b362b15af34006e6a11974088a46d42b903418eJohann offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); 2351b362b15af34006e6a11974088a46d42b903418eJohann uptr = x->pre.u_buffer + offset; 2361b362b15af34006e6a11974088a46d42b903418eJohann vptr = x->pre.v_buffer + offset; 2371b362b15af34006e6a11974088a46d42b903418eJohann 2381b362b15af34006e6a11974088a46d42b903418eJohann if ((mv_row | mv_col) & 7) 2391b362b15af34006e6a11974088a46d42b903418eJohann { 2401b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8); 2411b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8); 2421b362b15af34006e6a11974088a46d42b903418eJohann } 2431b362b15af34006e6a11974088a46d42b903418eJohann else 2441b362b15af34006e6a11974088a46d42b903418eJohann { 2451b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8); 2461b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8); 2471b362b15af34006e6a11974088a46d42b903418eJohann } 2481b362b15af34006e6a11974088a46d42b903418eJohann} 2491b362b15af34006e6a11974088a46d42b903418eJohann 2501b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 2511b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x) 2521b362b15af34006e6a11974088a46d42b903418eJohann{ 2531b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 2541b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.uv_stride; 2551b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_pre; 2561b362b15af34006e6a11974088a46d42b903418eJohann 2571b362b15af34006e6a11974088a46d42b903418eJohann /* build uv mvs */ 2581b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 2; i++) 2591b362b15af34006e6a11974088a46d42b903418eJohann { 2601b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < 2; j++) 2611b362b15af34006e6a11974088a46d42b903418eJohann { 2621b362b15af34006e6a11974088a46d42b903418eJohann int yoffset = i * 8 + j * 2; 2631b362b15af34006e6a11974088a46d42b903418eJohann int uoffset = 16 + i * 2 + j; 2641b362b15af34006e6a11974088a46d42b903418eJohann int voffset = 20 + i * 2 + j; 2651b362b15af34006e6a11974088a46d42b903418eJohann 2661b362b15af34006e6a11974088a46d42b903418eJohann int temp; 2671b362b15af34006e6a11974088a46d42b903418eJohann 2681b362b15af34006e6a11974088a46d42b903418eJohann temp = x->block[yoffset ].bmi.mv.as_mv.row 2691b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+1].bmi.mv.as_mv.row 2701b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+4].bmi.mv.as_mv.row 2711b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+5].bmi.mv.as_mv.row; 2721b362b15af34006e6a11974088a46d42b903418eJohann 2731b362b15af34006e6a11974088a46d42b903418eJohann temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3); 2741b362b15af34006e6a11974088a46d42b903418eJohann 2751b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 2761b362b15af34006e6a11974088a46d42b903418eJohann 2771b362b15af34006e6a11974088a46d42b903418eJohann temp = x->block[yoffset ].bmi.mv.as_mv.col 2781b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+1].bmi.mv.as_mv.col 2791b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+4].bmi.mv.as_mv.col 2801b362b15af34006e6a11974088a46d42b903418eJohann + x->block[yoffset+5].bmi.mv.as_mv.col; 2811b362b15af34006e6a11974088a46d42b903418eJohann 2821b362b15af34006e6a11974088a46d42b903418eJohann temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3); 2831b362b15af34006e6a11974088a46d42b903418eJohann 2841b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 2851b362b15af34006e6a11974088a46d42b903418eJohann 2861b362b15af34006e6a11974088a46d42b903418eJohann x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 2871b362b15af34006e6a11974088a46d42b903418eJohann } 2881b362b15af34006e6a11974088a46d42b903418eJohann } 2891b362b15af34006e6a11974088a46d42b903418eJohann 2901b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.u_buffer; 2911b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 20; i += 2) 2921b362b15af34006e6a11974088a46d42b903418eJohann { 2931b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 2941b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 2951b362b15af34006e6a11974088a46d42b903418eJohann 2961b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 2971b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 2981b362b15af34006e6a11974088a46d42b903418eJohann else 2991b362b15af34006e6a11974088a46d42b903418eJohann { 3001b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 3011b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 3021b362b15af34006e6a11974088a46d42b903418eJohann } 3031b362b15af34006e6a11974088a46d42b903418eJohann } 3041b362b15af34006e6a11974088a46d42b903418eJohann 3051b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.v_buffer; 3061b362b15af34006e6a11974088a46d42b903418eJohann for (i = 20; i < 24; i += 2) 3071b362b15af34006e6a11974088a46d42b903418eJohann { 3081b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 3091b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 3101b362b15af34006e6a11974088a46d42b903418eJohann 3111b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 3121b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 3131b362b15af34006e6a11974088a46d42b903418eJohann else 3141b362b15af34006e6a11974088a46d42b903418eJohann { 3151b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 3161b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 3171b362b15af34006e6a11974088a46d42b903418eJohann } 3181b362b15af34006e6a11974088a46d42b903418eJohann } 3191b362b15af34006e6a11974088a46d42b903418eJohann} 3201b362b15af34006e6a11974088a46d42b903418eJohann 3211b362b15af34006e6a11974088a46d42b903418eJohann 3221b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/ 3231b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x, 3241b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_y, 3251b362b15af34006e6a11974088a46d42b903418eJohann int dst_ystride) 3261b362b15af34006e6a11974088a46d42b903418eJohann{ 3271b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr_base; 3281b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 3291b362b15af34006e6a11974088a46d42b903418eJohann int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 3301b362b15af34006e6a11974088a46d42b903418eJohann int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 3311b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.y_stride; 3321b362b15af34006e6a11974088a46d42b903418eJohann 3331b362b15af34006e6a11974088a46d42b903418eJohann ptr_base = x->pre.y_buffer; 3341b362b15af34006e6a11974088a46d42b903418eJohann ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3); 3351b362b15af34006e6a11974088a46d42b903418eJohann 3361b362b15af34006e6a11974088a46d42b903418eJohann if ((mv_row | mv_col) & 7) 3371b362b15af34006e6a11974088a46d42b903418eJohann { 3381b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, 3391b362b15af34006e6a11974088a46d42b903418eJohann dst_y, dst_ystride); 3401b362b15af34006e6a11974088a46d42b903418eJohann } 3411b362b15af34006e6a11974088a46d42b903418eJohann else 3421b362b15af34006e6a11974088a46d42b903418eJohann { 3431b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem16x16(ptr, pre_stride, dst_y, 3441b362b15af34006e6a11974088a46d42b903418eJohann dst_ystride); 3451b362b15af34006e6a11974088a46d42b903418eJohann } 3461b362b15af34006e6a11974088a46d42b903418eJohann} 3471b362b15af34006e6a11974088a46d42b903418eJohann 3481b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 3491b362b15af34006e6a11974088a46d42b903418eJohann{ 3501b362b15af34006e6a11974088a46d42b903418eJohann /* If the MV points so far into the UMV border that no visible pixels 3511b362b15af34006e6a11974088a46d42b903418eJohann * are used for reconstruction, the subpel part of the MV can be 3521b362b15af34006e6a11974088a46d42b903418eJohann * discarded and the MV limited to 16 pixels with equivalent results. 3531b362b15af34006e6a11974088a46d42b903418eJohann * 3541b362b15af34006e6a11974088a46d42b903418eJohann * This limit kicks in at 19 pixels for the top and left edges, for 3551b362b15af34006e6a11974088a46d42b903418eJohann * the 16 pixels plus 3 taps right of the central pixel when subpel 3561b362b15af34006e6a11974088a46d42b903418eJohann * filtering. The bottom and right edges use 16 pixels plus 2 pixels 3571b362b15af34006e6a11974088a46d42b903418eJohann * left of the central pixel when filtering. 3581b362b15af34006e6a11974088a46d42b903418eJohann */ 3591b362b15af34006e6a11974088a46d42b903418eJohann if (mv->col < (xd->mb_to_left_edge - (19 << 3))) 3601b362b15af34006e6a11974088a46d42b903418eJohann mv->col = xd->mb_to_left_edge - (16 << 3); 3611b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->col > xd->mb_to_right_edge + (18 << 3)) 3621b362b15af34006e6a11974088a46d42b903418eJohann mv->col = xd->mb_to_right_edge + (16 << 3); 3631b362b15af34006e6a11974088a46d42b903418eJohann 3641b362b15af34006e6a11974088a46d42b903418eJohann if (mv->row < (xd->mb_to_top_edge - (19 << 3))) 3651b362b15af34006e6a11974088a46d42b903418eJohann mv->row = xd->mb_to_top_edge - (16 << 3); 3661b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->row > xd->mb_to_bottom_edge + (18 << 3)) 3671b362b15af34006e6a11974088a46d42b903418eJohann mv->row = xd->mb_to_bottom_edge + (16 << 3); 3681b362b15af34006e6a11974088a46d42b903418eJohann} 3691b362b15af34006e6a11974088a46d42b903418eJohann 3701b362b15af34006e6a11974088a46d42b903418eJohann/* A version of the above function for chroma block MVs.*/ 3711b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 3721b362b15af34006e6a11974088a46d42b903418eJohann{ 3731b362b15af34006e6a11974088a46d42b903418eJohann mv->col = (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ? 3741b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_left_edge - (16 << 3)) >> 1 : mv->col; 3751b362b15af34006e6a11974088a46d42b903418eJohann mv->col = (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ? 3761b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_right_edge + (16 << 3)) >> 1 : mv->col; 3771b362b15af34006e6a11974088a46d42b903418eJohann 3781b362b15af34006e6a11974088a46d42b903418eJohann mv->row = (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ? 3791b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_top_edge - (16 << 3)) >> 1 : mv->row; 3801b362b15af34006e6a11974088a46d42b903418eJohann mv->row = (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ? 3811b362b15af34006e6a11974088a46d42b903418eJohann (xd->mb_to_bottom_edge + (16 << 3)) >> 1 : mv->row; 3821b362b15af34006e6a11974088a46d42b903418eJohann} 3831b362b15af34006e6a11974088a46d42b903418eJohann 3841b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x, 3851b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_y, 3861b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_u, 3871b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_v, 3881b362b15af34006e6a11974088a46d42b903418eJohann int dst_ystride, 3891b362b15af34006e6a11974088a46d42b903418eJohann int dst_uvstride) 3901b362b15af34006e6a11974088a46d42b903418eJohann{ 3911b362b15af34006e6a11974088a46d42b903418eJohann int offset; 3921b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr; 3931b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uptr, *vptr; 3941b362b15af34006e6a11974088a46d42b903418eJohann 3951b362b15af34006e6a11974088a46d42b903418eJohann int_mv _16x16mv; 3961b362b15af34006e6a11974088a46d42b903418eJohann 3971b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ptr_base = x->pre.y_buffer; 3981b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->pre.y_stride; 3991b362b15af34006e6a11974088a46d42b903418eJohann 4001b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int; 4011b362b15af34006e6a11974088a46d42b903418eJohann 4021b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 4031b362b15af34006e6a11974088a46d42b903418eJohann { 4041b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&_16x16mv.as_mv, x); 4051b362b15af34006e6a11974088a46d42b903418eJohann } 4061b362b15af34006e6a11974088a46d42b903418eJohann 4071b362b15af34006e6a11974088a46d42b903418eJohann ptr = ptr_base + ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 4081b362b15af34006e6a11974088a46d42b903418eJohann 4091b362b15af34006e6a11974088a46d42b903418eJohann if ( _16x16mv.as_int & 0x00070007) 4101b362b15af34006e6a11974088a46d42b903418eJohann { 4111b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict16x16(ptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_y, dst_ystride); 4121b362b15af34006e6a11974088a46d42b903418eJohann } 4131b362b15af34006e6a11974088a46d42b903418eJohann else 4141b362b15af34006e6a11974088a46d42b903418eJohann { 4151b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride); 4161b362b15af34006e6a11974088a46d42b903418eJohann } 4171b362b15af34006e6a11974088a46d42b903418eJohann 4181b362b15af34006e6a11974088a46d42b903418eJohann /* calc uv motion vectors */ 4191b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1)); 4201b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1)); 4211b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row /= 2; 4221b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col /= 2; 4231b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.row &= x->fullpixel_mask; 4241b362b15af34006e6a11974088a46d42b903418eJohann _16x16mv.as_mv.col &= x->fullpixel_mask; 4251b362b15af34006e6a11974088a46d42b903418eJohann 4261b362b15af34006e6a11974088a46d42b903418eJohann pre_stride >>= 1; 4271b362b15af34006e6a11974088a46d42b903418eJohann offset = ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 4281b362b15af34006e6a11974088a46d42b903418eJohann uptr = x->pre.u_buffer + offset; 4291b362b15af34006e6a11974088a46d42b903418eJohann vptr = x->pre.v_buffer + offset; 4301b362b15af34006e6a11974088a46d42b903418eJohann 4311b362b15af34006e6a11974088a46d42b903418eJohann if ( _16x16mv.as_int & 0x00070007) 4321b362b15af34006e6a11974088a46d42b903418eJohann { 4331b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(uptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_u, dst_uvstride); 4341b362b15af34006e6a11974088a46d42b903418eJohann x->subpixel_predict8x8(vptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_v, dst_uvstride); 4351b362b15af34006e6a11974088a46d42b903418eJohann } 4361b362b15af34006e6a11974088a46d42b903418eJohann else 4371b362b15af34006e6a11974088a46d42b903418eJohann { 4381b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride); 4391b362b15af34006e6a11974088a46d42b903418eJohann vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride); 4401b362b15af34006e6a11974088a46d42b903418eJohann } 4411b362b15af34006e6a11974088a46d42b903418eJohann} 4421b362b15af34006e6a11974088a46d42b903418eJohann 4431b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter4x4_predictors_mb(MACROBLOCKD *x) 4441b362b15af34006e6a11974088a46d42b903418eJohann{ 4451b362b15af34006e6a11974088a46d42b903418eJohann int i; 4461b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_dst = x->dst.y_buffer; 4471b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_pre = x->pre.y_buffer; 4481b362b15af34006e6a11974088a46d42b903418eJohann 4491b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.partitioning < 3) 4501b362b15af34006e6a11974088a46d42b903418eJohann { 4511b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b; 4521b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.y_stride; 4531b362b15af34006e6a11974088a46d42b903418eJohann 4541b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 0].bmi = x->mode_info_context->bmi[ 0]; 4551b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 2].bmi = x->mode_info_context->bmi[ 2]; 4561b362b15af34006e6a11974088a46d42b903418eJohann x->block[ 8].bmi = x->mode_info_context->bmi[ 8]; 4571b362b15af34006e6a11974088a46d42b903418eJohann x->block[10].bmi = x->mode_info_context->bmi[10]; 4581b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 4591b362b15af34006e6a11974088a46d42b903418eJohann { 4601b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 0].bmi.mv.as_mv, x); 4611b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 2].bmi.mv.as_mv, x); 4621b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[ 8].bmi.mv.as_mv, x); 4631b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[10].bmi.mv.as_mv, x); 4641b362b15af34006e6a11974088a46d42b903418eJohann } 4651b362b15af34006e6a11974088a46d42b903418eJohann 4661b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 0]; 4671b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4681b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 2]; 4691b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4701b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[ 8]; 4711b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4721b362b15af34006e6a11974088a46d42b903418eJohann b = &x->block[10]; 4731b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 4741b362b15af34006e6a11974088a46d42b903418eJohann } 4751b362b15af34006e6a11974088a46d42b903418eJohann else 4761b362b15af34006e6a11974088a46d42b903418eJohann { 4771b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i += 2) 4781b362b15af34006e6a11974088a46d42b903418eJohann { 4791b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 4801b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 4811b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.y_stride; 4821b362b15af34006e6a11974088a46d42b903418eJohann 4831b362b15af34006e6a11974088a46d42b903418eJohann x->block[i+0].bmi = x->mode_info_context->bmi[i+0]; 4841b362b15af34006e6a11974088a46d42b903418eJohann x->block[i+1].bmi = x->mode_info_context->bmi[i+1]; 4851b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 4861b362b15af34006e6a11974088a46d42b903418eJohann { 4871b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[i+0].bmi.mv.as_mv, x); 4881b362b15af34006e6a11974088a46d42b903418eJohann clamp_mv_to_umv_border(&x->block[i+1].bmi.mv.as_mv, x); 4891b362b15af34006e6a11974088a46d42b903418eJohann } 4901b362b15af34006e6a11974088a46d42b903418eJohann 4911b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 4921b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 4931b362b15af34006e6a11974088a46d42b903418eJohann else 4941b362b15af34006e6a11974088a46d42b903418eJohann { 4951b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 4961b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 4971b362b15af34006e6a11974088a46d42b903418eJohann } 4981b362b15af34006e6a11974088a46d42b903418eJohann 4991b362b15af34006e6a11974088a46d42b903418eJohann } 5001b362b15af34006e6a11974088a46d42b903418eJohann 5011b362b15af34006e6a11974088a46d42b903418eJohann } 5021b362b15af34006e6a11974088a46d42b903418eJohann base_dst = x->dst.u_buffer; 5031b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.u_buffer; 5041b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 20; i += 2) 5051b362b15af34006e6a11974088a46d42b903418eJohann { 5061b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 5071b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 5081b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.uv_stride; 5091b362b15af34006e6a11974088a46d42b903418eJohann 5101b362b15af34006e6a11974088a46d42b903418eJohann /* Note: uv mvs already clamped in build_4x4uvmvs() */ 5111b362b15af34006e6a11974088a46d42b903418eJohann 5121b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5131b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 5141b362b15af34006e6a11974088a46d42b903418eJohann else 5151b362b15af34006e6a11974088a46d42b903418eJohann { 5161b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5171b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5181b362b15af34006e6a11974088a46d42b903418eJohann } 5191b362b15af34006e6a11974088a46d42b903418eJohann } 5201b362b15af34006e6a11974088a46d42b903418eJohann 5211b362b15af34006e6a11974088a46d42b903418eJohann base_dst = x->dst.v_buffer; 5221b362b15af34006e6a11974088a46d42b903418eJohann base_pre = x->pre.v_buffer; 5231b362b15af34006e6a11974088a46d42b903418eJohann for (i = 20; i < 24; i += 2) 5241b362b15af34006e6a11974088a46d42b903418eJohann { 5251b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d0 = &x->block[i]; 5261b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d1 = &x->block[i+1]; 5271b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->dst.uv_stride; 5281b362b15af34006e6a11974088a46d42b903418eJohann 5291b362b15af34006e6a11974088a46d42b903418eJohann /* Note: uv mvs already clamped in build_4x4uvmvs() */ 5301b362b15af34006e6a11974088a46d42b903418eJohann 5311b362b15af34006e6a11974088a46d42b903418eJohann if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5321b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 5331b362b15af34006e6a11974088a46d42b903418eJohann else 5341b362b15af34006e6a11974088a46d42b903418eJohann { 5351b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5361b362b15af34006e6a11974088a46d42b903418eJohann build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5371b362b15af34006e6a11974088a46d42b903418eJohann } 5381b362b15af34006e6a11974088a46d42b903418eJohann } 5391b362b15af34006e6a11974088a46d42b903418eJohann} 5401b362b15af34006e6a11974088a46d42b903418eJohann 5411b362b15af34006e6a11974088a46d42b903418eJohannstatic 5421b362b15af34006e6a11974088a46d42b903418eJohannvoid build_4x4uvmvs(MACROBLOCKD *x) 5431b362b15af34006e6a11974088a46d42b903418eJohann{ 5441b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 5451b362b15af34006e6a11974088a46d42b903418eJohann 5461b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 2; i++) 5471b362b15af34006e6a11974088a46d42b903418eJohann { 5481b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < 2; j++) 5491b362b15af34006e6a11974088a46d42b903418eJohann { 5501b362b15af34006e6a11974088a46d42b903418eJohann int yoffset = i * 8 + j * 2; 5511b362b15af34006e6a11974088a46d42b903418eJohann int uoffset = 16 + i * 2 + j; 5521b362b15af34006e6a11974088a46d42b903418eJohann int voffset = 20 + i * 2 + j; 5531b362b15af34006e6a11974088a46d42b903418eJohann 5541b362b15af34006e6a11974088a46d42b903418eJohann int temp; 5551b362b15af34006e6a11974088a46d42b903418eJohann 5561b362b15af34006e6a11974088a46d42b903418eJohann temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.row 5571b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.row 5581b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row 5591b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row; 5601b362b15af34006e6a11974088a46d42b903418eJohann 5611b362b15af34006e6a11974088a46d42b903418eJohann temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3); 5621b362b15af34006e6a11974088a46d42b903418eJohann 5631b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 5641b362b15af34006e6a11974088a46d42b903418eJohann 5651b362b15af34006e6a11974088a46d42b903418eJohann temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.col 5661b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.col 5671b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col 5681b362b15af34006e6a11974088a46d42b903418eJohann + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col; 5691b362b15af34006e6a11974088a46d42b903418eJohann 5701b362b15af34006e6a11974088a46d42b903418eJohann temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3); 5711b362b15af34006e6a11974088a46d42b903418eJohann 5721b362b15af34006e6a11974088a46d42b903418eJohann x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 5731b362b15af34006e6a11974088a46d42b903418eJohann 5741b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.need_to_clamp_mvs) 5751b362b15af34006e6a11974088a46d42b903418eJohann clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x); 5761b362b15af34006e6a11974088a46d42b903418eJohann 5771b362b15af34006e6a11974088a46d42b903418eJohann x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 5781b362b15af34006e6a11974088a46d42b903418eJohann } 5791b362b15af34006e6a11974088a46d42b903418eJohann } 5801b362b15af34006e6a11974088a46d42b903418eJohann} 5811b362b15af34006e6a11974088a46d42b903418eJohann 5821b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter_predictors_mb(MACROBLOCKD *xd) 5831b362b15af34006e6a11974088a46d42b903418eJohann{ 5841b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.mode != SPLITMV) 5851b362b15af34006e6a11974088a46d42b903418eJohann { 5861b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, 5871b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 5881b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, xd->dst.uv_stride); 5891b362b15af34006e6a11974088a46d42b903418eJohann } 5901b362b15af34006e6a11974088a46d42b903418eJohann else 5911b362b15af34006e6a11974088a46d42b903418eJohann { 5921b362b15af34006e6a11974088a46d42b903418eJohann build_4x4uvmvs(xd); 5931b362b15af34006e6a11974088a46d42b903418eJohann build_inter4x4_predictors_mb(xd); 5941b362b15af34006e6a11974088a46d42b903418eJohann } 5951b362b15af34006e6a11974088a46d42b903418eJohann} 596