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