1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "blockd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "reconinter.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_RUNTIME_CPU_DETECT 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "onyxc_int.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan 22233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_copy_mem16x16_c( 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src, 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_stride, 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst, 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride) 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r; 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 16; r++) 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_FAST_UNALIGNED) 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0] = src[0]; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1] = src[1]; 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2] = src[2]; 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3] = src[3]; 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[4] = src[4]; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[5] = src[5]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[6] = src[6]; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[7] = src[7]; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[8] = src[8]; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[9] = src[9]; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[10] = src[10]; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[11] = src[11]; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[12] = src[12]; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[13] = src[13]; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[14] = src[14]; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[15] = src[15]; 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[2] = ((uint32_t *)src)[2] ; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[3] = ((uint32_t *)src)[3] ; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan src += src_stride; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan 65233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_copy_mem8x8_c( 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src, 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_stride, 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst, 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride) 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 8; r++) 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_FAST_UNALIGNED) 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0] = src[0]; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1] = src[1]; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2] = src[2]; 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3] = src[3]; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[4] = src[4]; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[5] = src[5]; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[6] = src[6]; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[7] = src[7]; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan src += src_stride; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan 95233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_copy_mem8x4_c( 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_stride, 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst, 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride) 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_FAST_UNALIGNED) 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0] = src[0]; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1] = src[1]; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2] = src[2]; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3] = src[3]; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[4] = src[4]; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[5] = src[5]; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[6] = src[6]; 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[7] = src[7]; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan src += src_stride; 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter_predictors_b(BLOCKD *d, int pitch, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf) 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *pred_ptr = d->predictor; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch); 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred_ptr[0] = ptr[0]; 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred_ptr[1] = ptr[1]; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred_ptr[2] = ptr[2]; 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred_ptr[3] = ptr[3]; 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred_ptr += pitch; 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr += pre_stride; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 151233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride); 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride); 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 181233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic 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) 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r; 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0] = ptr[0]; 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1] = ptr[1]; 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2] = ptr[2]; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3] = ptr[3]; 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr += pre_stride; 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*encoder only*/ 207233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x) 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *uptr, *vptr; 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *upred_ptr = &x->predictor[256]; 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *vpred_ptr = &x->predictor[320]; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset; 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pre_stride = x->pre.uv_stride; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* calc uv motion vectors */ 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1)); 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1)); 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_row /= 2; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_col /= 2; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_row &= x->fullpixel_mask; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_col &= x->fullpixel_mask; 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan uptr = x->pre.u_buffer + offset; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan vptr = x->pre.v_buffer + offset; 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((mv_row | mv_col) & 7) 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8); 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8); 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8); 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8); 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*encoder only*/ 243233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x) 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pre_stride = x->pre.uv_stride; 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *base_pre; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* build uv mvs */ 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 2; j++) 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan int yoffset = i * 8 + j * 2; 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan int uoffset = 16 + i * 2 + j; 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan int voffset = 20 + i * 2 + j; 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan int temp; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp = x->block[yoffset ].bmi.mv.as_mv.row 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+1].bmi.mv.as_mv.row 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+4].bmi.mv.as_mv.row 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+5].bmi.mv.as_mv.row; 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp = x->block[yoffset ].bmi.mv.as_mv.col 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+1].bmi.mv.as_mv.col 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+4].bmi.mv.as_mv.col 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->block[yoffset+5].bmi.mv.as_mv.col; 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_pre = x->pre.u_buffer; 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 16; i < 20; i += 2) 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d0 = &x->block[i]; 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d1 = &x->block[i+1]; 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_pre = x->pre.v_buffer; 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 20; i < 24; i += 2) 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d0 = &x->block[i]; 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d1 = &x->block[i+1]; 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan 313233d2500723e5594f3e7c70896ffeeef32b9c950ywan 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*encoder only*/ 315233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x, 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst_y, 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_ystride) 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr_base; 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 322233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pre_stride = x->pre.y_stride; 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr_base = x->pre.y_buffer; 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3); 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((mv_row | mv_col) & 7) 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst_y, dst_ystride); 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem16x16(ptr, pre_stride, dst_y, 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst_ystride); 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan 340233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If the MV points so far into the UMV border that no visible pixels 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan * are used for reconstruction, the subpel part of the MV can be 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan * discarded and the MV limited to 16 pixels with equivalent results. 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan * This limit kicks in at 19 pixels for the top and left edges, for 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan * the 16 pixels plus 3 taps right of the central pixel when subpel 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan * filtering. The bottom and right edges use 16 pixels plus 2 pixels 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan * left of the central pixel when filtering. 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv->col < (xd->mb_to_left_edge - (19 << 3))) 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->col = xd->mb_to_left_edge - (16 << 3); 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv->col > xd->mb_to_right_edge + (18 << 3)) 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->col = xd->mb_to_right_edge + (16 << 3); 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv->row < (xd->mb_to_top_edge - (19 << 3))) 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->row = xd->mb_to_top_edge - (16 << 3); 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv->row > xd->mb_to_bottom_edge + (18 << 3)) 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->row = xd->mb_to_bottom_edge + (16 << 3); 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* A version of the above function for chroma block MVs.*/ 363233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->col = (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ? 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan (xd->mb_to_left_edge - (16 << 3)) >> 1 : mv->col; 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->col = (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ? 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan (xd->mb_to_right_edge + (16 << 3)) >> 1 : mv->col; 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->row = (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ? 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan (xd->mb_to_top_edge - (16 << 3)) >> 1 : mv->row; 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->row = (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ? 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan (xd->mb_to_bottom_edge + (16 << 3)) >> 1 : mv->row; 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan 376233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x, 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst_y, 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst_u, 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst_v, 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_ystride, 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_uvstride) 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset; 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr; 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *uptr, *vptr; 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan 387233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv _16x16mv; 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr_base = x->pre.y_buffer; 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pre_stride = x->pre.y_stride; 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int; 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mode_info_context->mbmi.need_to_clamp_mvs) 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&_16x16mv.as_mv, x); 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan ptr = ptr_base + ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( _16x16mv.as_int & 0x00070007) 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict16x16(ptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_y, dst_ystride); 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride); 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* calc uv motion vectors */ 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1)); 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1)); 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.row /= 2; 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.col /= 2; 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.row &= x->fullpixel_mask; 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan _16x16mv.as_mv.col &= x->fullpixel_mask; 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan pre_stride >>= 1; 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan offset = ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan uptr = x->pre.u_buffer + offset; 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan vptr = x->pre.v_buffer + offset; 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ( _16x16mv.as_int & 0x00070007) 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x8(uptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_u, dst_uvstride); 426233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->subpixel_predict8x8(vptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_v, dst_uvstride); 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride); 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride); 432233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan 435233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void build_inter4x4_predictors_mb(MACROBLOCKD *x) 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *base_dst = x->dst.y_buffer; 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *base_pre = x->pre.y_buffer; 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mode_info_context->mbmi.partitioning < 3) 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *b; 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride = x->dst.y_stride; 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[ 0].bmi = x->mode_info_context->bmi[ 0]; 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[ 2].bmi = x->mode_info_context->bmi[ 2]; 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[ 8].bmi = x->mode_info_context->bmi[ 8]; 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[10].bmi = x->mode_info_context->bmi[10]; 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mode_info_context->mbmi.need_to_clamp_mvs) 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[ 0].bmi.mv.as_mv, x); 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[ 2].bmi.mv.as_mv, x); 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[ 8].bmi.mv.as_mv, x); 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[10].bmi.mv.as_mv, x); 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan b = &x->block[ 0]; 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan b = &x->block[ 2]; 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan b = &x->block[ 8]; 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan b = &x->block[10]; 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 16; i += 2) 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d0 = &x->block[i]; 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d1 = &x->block[i+1]; 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride = x->dst.y_stride; 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[i+0].bmi = x->mode_info_context->bmi[i+0]; 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[i+1].bmi = x->mode_info_context->bmi[i+1]; 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mode_info_context->mbmi.need_to_clamp_mvs) 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[i+0].bmi.mv.as_mv, x); 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_mv_to_umv_border(&x->block[i+1].bmi.mv.as_mv, x); 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_dst = x->dst.u_buffer; 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_pre = x->pre.u_buffer; 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 16; i < 20; i += 2) 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d0 = &x->block[i]; 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d1 = &x->block[i+1]; 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride = x->dst.uv_stride; 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note: uv mvs already clamped in build_4x4uvmvs() */ 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 510233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_dst = x->dst.v_buffer; 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan base_pre = x->pre.v_buffer; 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 20; i < 24; i += 2) 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d0 = &x->block[i]; 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCKD *d1 = &x->block[i+1]; 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_stride = x->dst.uv_stride; 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Note: uv mvs already clamped in build_4x4uvmvs() */ 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan 533233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic 534233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid build_4x4uvmvs(MACROBLOCKD *x) 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 540233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 2; j++) 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan int yoffset = i * 8 + j * 2; 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan int uoffset = 16 + i * 2 + j; 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan int voffset = 20 + i * 2 + j; 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan int temp; 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.row 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.row 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row; 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.col 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.col 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col; 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x->mode_info_context->mbmi.need_to_clamp_mvs) 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x); 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan 574233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_build_inter_predictors_mb(MACROBLOCKD *xd) 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (xd->mode_info_context->mbmi.mode != SPLITMV) 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 578233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst.u_buffer, xd->dst.v_buffer, 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan xd->dst.y_stride, xd->dst.uv_stride); 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_4x4uvmvs(xd); 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan build_inter4x4_predictors_mb(xd); 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 588