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