1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include <limits.h> 13167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h" 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/vpx_integer.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "blockd.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "reconinter.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_RUNTIME_CPU_DETECT 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyxc_int.h" 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_copy_mem16x16_c( 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src, 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_stride, 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst, 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_stride) 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r; 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 16; r++) 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_FAST_UNALIGNED) 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[0] = src[0]; 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[1] = src[1]; 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[2] = src[2]; 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[3] = src[3]; 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[4] = src[4]; 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[5] = src[5]; 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[6] = src[6]; 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[7] = src[7]; 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[8] = src[8]; 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[9] = src[9]; 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[10] = src[10]; 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[11] = src[11]; 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[12] = src[12]; 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[13] = src[13]; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[14] = src[14]; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[15] = src[15]; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[2] = ((uint32_t *)src)[2] ; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[3] = ((uint32_t *)src)[3] ; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src += src_stride; 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst += dst_stride; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_copy_mem8x8_c( 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src, 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_stride, 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst, 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_stride) 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r; 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 8; r++) 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_FAST_UNALIGNED) 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[0] = src[0]; 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[1] = src[1]; 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[2] = src[2]; 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[3] = src[3]; 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[4] = src[4]; 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[5] = src[5]; 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[6] = src[6]; 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[7] = src[7]; 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src += src_stride; 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst += dst_stride; 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_copy_mem8x4_c( 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src, 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_stride, 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst, 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_stride) 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r; 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 4; r++) 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !(CONFIG_FAST_UNALIGNED) 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[0] = src[0]; 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[1] = src[1]; 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[2] = src[2]; 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[3] = src[3]; 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[4] = src[4]; 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[5] = src[5]; 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[6] = src[6]; 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst[7] = src[7]; 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ; 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ; 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src += src_stride; 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst += dst_stride; 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_build_inter_predictors_b(BLOCKD *d, int pitch, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf) 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r; 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *pred_ptr = d->predictor; 1305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *ptr; 1315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch); 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 4; r++) 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_ptr[0] = ptr[0]; 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_ptr[1] = ptr[1]; 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_ptr[2] = ptr[2]; 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_ptr[3] = ptr[3]; 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pred_ptr += pitch; 1465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ptr += pre_stride; 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr; 1545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride); 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride) 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr; 1695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 174167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 175167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 176167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride); 178167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 179167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 180167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic 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) 182167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 183167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int r; 184167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *ptr; 1855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3); 186167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 187167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7) 188167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 1895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride); 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 193167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (r = 0; r < 4; r++) 194167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 195167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst[0] = ptr[0]; 196167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst[1] = ptr[1]; 197167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst[2] = ptr[2]; 198167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst[3] = ptr[3]; 199085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org dst += dst_stride; 200085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org ptr += pre_stride; 201167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*encoder only*/ 207167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x) 208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *uptr, *vptr; 210167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *upred_ptr = &x->predictor[256]; 211167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *vpred_ptr = &x->predictor[320]; 212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 213167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 214167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 215167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int offset; 2165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int pre_stride = x->pre.uv_stride; 217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 218167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* calc uv motion vectors */ 2195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1)); 2205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1)); 221167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv_row /= 2; 222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv_col /= 2; 223167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv_row &= x->fullpixel_mask; 224167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv_col &= x->fullpixel_mask; 225167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 226167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); 227167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org uptr = x->pre.u_buffer + offset; 228167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vptr = x->pre.v_buffer + offset; 229167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 230167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if ((mv_row | mv_col) & 7) 231167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 232167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8); 233167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8); 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 2375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8); 2385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8); 239167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 240167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 241167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 242167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org/*encoder only*/ 243167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x) 244167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 245167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int i, j; 2465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int pre_stride = x->pre.uv_stride; 2475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *base_pre; 248167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* build uv mvs */ 250167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (i = 0; i < 2; i++) 251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (j = 0; j < 2; j++) 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int yoffset = i * 8 + j * 2; 255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int uoffset = 16 + i * 2 + j; 256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int voffset = 20 + i * 2 + j; 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int temp; 259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp = x->block[yoffset ].bmi.mv.as_mv.row 261167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+1].bmi.mv.as_mv.row 262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+4].bmi.mv.as_mv.row 263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+5].bmi.mv.as_mv.row; 264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 265085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 267167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 268167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp = x->block[yoffset ].bmi.mv.as_mv.col 270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+1].bmi.mv.as_mv.col 271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+4].bmi.mv.as_mv.col 272167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->block[yoffset+5].bmi.mv.as_mv.col; 273167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 274085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 2785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 2825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_pre = x->pre.u_buffer; 2835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 16; i < 20; i += 2) 284167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org BLOCKD *d0 = &x->block[i]; 286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org BLOCKD *d1 = &x->block[i+1]; 287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 2895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 290167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 291167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 2935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 2945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_pre = x->pre.v_buffer; 2985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 20; i < 24; i += 2) 2995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *d0 = &x->block[i]; 3015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *d1 = &x->block[i+1]; 3025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 3045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride); 3055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 3065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict); 3085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict); 309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 313167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*encoder only*/ 315167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x, 316167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned char *dst_y, 317167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dst_ystride) 318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr_base; 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr; 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mv_row = x->mode_info_context->mbmi.mv.as_mv.row; 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mv_col = x->mode_info_context->mbmi.mv.as_mv.col; 3235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int pre_stride = x->pre.y_stride; 324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ptr_base = x->pre.y_buffer; 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3); 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((mv_row | mv_col) & 7) 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 330167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, 331167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst_y, dst_ystride); 332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 3355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem16x16(ptr, pre_stride, dst_y, 336167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst_ystride); 337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 340167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 341167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 342167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* If the MV points so far into the UMV border that no visible pixels 343167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * are used for reconstruction, the subpel part of the MV can be 344167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * discarded and the MV limited to 16 pixels with equivalent results. 345167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * 346167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * This limit kicks in at 19 pixels for the top and left edges, for 347167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * the 16 pixels plus 3 taps right of the central pixel when subpel 348167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * filtering. The bottom and right edges use 16 pixels plus 2 pixels 349167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * left of the central pixel when filtering. 350167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 351167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (mv->col < (xd->mb_to_left_edge - (19 << 3))) 352167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->col = xd->mb_to_left_edge - (16 << 3); 353167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if (mv->col > xd->mb_to_right_edge + (18 << 3)) 354167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->col = xd->mb_to_right_edge + (16 << 3); 355167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 356167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (mv->row < (xd->mb_to_top_edge - (19 << 3))) 357167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->row = xd->mb_to_top_edge - (16 << 3); 358167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if (mv->row > xd->mb_to_bottom_edge + (18 << 3)) 359167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->row = xd->mb_to_bottom_edge + (16 << 3); 360167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 361167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 362167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org/* A version of the above function for chroma block MVs.*/ 363167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd) 364167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 365167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->col = (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ? 366167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->mb_to_left_edge - (16 << 3)) >> 1 : mv->col; 367167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->col = (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ? 368167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->mb_to_right_edge + (16 << 3)) >> 1 : mv->col; 369167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 370167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->row = (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ? 371167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->mb_to_top_edge - (16 << 3)) >> 1 : mv->row; 372167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mv->row = (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ? 373167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->mb_to_bottom_edge + (16 << 3)) >> 1 : mv->row; 374167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 375167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x, 377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_y, 378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_u, 379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_v, 380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_ystride, 381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_uvstride) 382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int offset; 384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr; 385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *uptr, *vptr; 386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 387167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int_mv _16x16mv; 388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *ptr_base = x->pre.y_buffer; 3905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int pre_stride = x->pre.y_stride; 391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 392167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org _16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int; 393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 394167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mode_info_context->mbmi.need_to_clamp_mvs) 395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 396167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&_16x16mv.as_mv, x); 397167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 398167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 399167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ptr = ptr_base + ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 400167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 401167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if ( _16x16mv.as_int & 0x00070007) 402167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 403167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict16x16(ptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_y, dst_ystride); 404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 4075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride); 408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 410167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* calc uv motion vectors */ 4115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org _16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1)); 4125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org _16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1)); 413167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org _16x16mv.as_mv.row /= 2; 414167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org _16x16mv.as_mv.col /= 2; 415167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org _16x16mv.as_mv.row &= x->fullpixel_mask; 416167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org _16x16mv.as_mv.col &= x->fullpixel_mask; 417167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pre_stride >>= 1; 419167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org offset = ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3); 420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uptr = x->pre.u_buffer + offset; 421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vptr = x->pre.v_buffer + offset; 422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 423167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if ( _16x16mv.as_int & 0x00070007) 424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 425167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict8x8(uptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_u, dst_uvstride); 426167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->subpixel_predict8x8(vptr, pre_stride, _16x16mv.as_mv.col & 7, _16x16mv.as_mv.row & 7, dst_v, dst_uvstride); 427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 4305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride); 4315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride); 432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 435167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic void build_inter4x4_predictors_mb(MACROBLOCKD *x) 436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 4385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *base_dst = x->dst.y_buffer; 4395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *base_pre = x->pre.y_buffer; 440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->mode_info_context->mbmi.partitioning < 3) 442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 443167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org BLOCKD *b; 4445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->dst.y_stride; 445167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 446167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[ 0].bmi = x->mode_info_context->bmi[ 0]; 447167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[ 2].bmi = x->mode_info_context->bmi[ 2]; 448167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[ 8].bmi = x->mode_info_context->bmi[ 8]; 449167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[10].bmi = x->mode_info_context->bmi[10]; 450167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mode_info_context->mbmi.need_to_clamp_mvs) 451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 452167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[ 0].bmi.mv.as_mv, x); 453167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[ 2].bmi.mv.as_mv, x); 454167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[ 8].bmi.mv.as_mv, x); 455167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[10].bmi.mv.as_mv, x); 456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 457167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 458167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b = &x->block[ 0]; 4595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 460167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b = &x->block[ 2]; 4615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 462167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b = &x->block[ 8]; 4635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 464167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b = &x->block[10]; 4655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride); 466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 16; i += 2) 470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d0 = &x->block[i]; 472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d1 = &x->block[i+1]; 4735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->dst.y_stride; 474167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 475167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[i+0].bmi = x->mode_info_context->bmi[i+0]; 476167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[i+1].bmi = x->mode_info_context->bmi[i+1]; 477167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mode_info_context->mbmi.need_to_clamp_mvs) 478167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 479167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[i+0].bmi.mv.as_mv, x); 480167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_mv_to_umv_border(&x->block[i+1].bmi.mv.as_mv, x); 481167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 4845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 4875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 4885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 4945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_dst = x->dst.u_buffer; 4955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_pre = x->pre.u_buffer; 4965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 16; i < 20; i += 2) 4975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *d0 = &x->block[i]; 4995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *d1 = &x->block[i+1]; 5005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->dst.uv_stride; 5015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Note: uv mvs already clamped in build_4x4uvmvs() */ 5035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 5065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 5075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_dst = x->dst.v_buffer; 5145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org base_pre = x->pre.v_buffer; 5155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 20; i < 24; i += 2) 516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d0 = &x->block[i]; 518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *d1 = &x->block[i+1]; 5195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->dst.uv_stride; 520167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 521167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Note: uv mvs already clamped in build_4x4uvmvs() */ 522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (d0->bmi.mv.as_int == d1->bmi.mv.as_int) 5245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride); 525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 5275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 5285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict); 529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 533167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic 534167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid build_4x4uvmvs(MACROBLOCKD *x) 535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j; 537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 538167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (i = 0; i < 2; i++) 539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 540167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (j = 0; j < 2; j++) 541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 542167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int yoffset = i * 8 + j * 2; 543167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int uoffset = 16 + i * 2 + j; 544167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int voffset = 20 + i * 2 + j; 545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 546167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int temp; 547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 548167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.row 549167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.row 550167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row 551167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row; 552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 553085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 555167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask; 556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 557167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.col 558167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.col 559167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col 560167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col; 561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 562085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8); 563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 564167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask; 565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 566167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (x->mode_info_context->mbmi.need_to_clamp_mvs) 567167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x); 568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int; 570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 572167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 573167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 574167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_build_inter_predictors_mb(MACROBLOCKD *xd) 575167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 576167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (xd->mode_info_context->mbmi.mode != SPLITMV) 577167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 578167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, 579167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 580167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.y_stride, xd->dst.uv_stride); 581167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 584167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org build_4x4uvmvs(xd); 585167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org build_inter4x4_predictors_mb(xd); 586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 588