11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
121b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h>
131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h"
151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx/vpx_integer.h"
161b362b15af34006e6a11974088a46d42b903418eJohann#include "blockd.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "reconinter.h"
181b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_RUNTIME_CPU_DETECT
191b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxc_int.h"
201b362b15af34006e6a11974088a46d42b903418eJohann#endif
211b362b15af34006e6a11974088a46d42b903418eJohann
221b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem16x16_c(
231b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *src,
241b362b15af34006e6a11974088a46d42b903418eJohann    int src_stride,
251b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *dst,
261b362b15af34006e6a11974088a46d42b903418eJohann    int dst_stride)
271b362b15af34006e6a11974088a46d42b903418eJohann{
281b362b15af34006e6a11974088a46d42b903418eJohann
291b362b15af34006e6a11974088a46d42b903418eJohann    int r;
301b362b15af34006e6a11974088a46d42b903418eJohann
311b362b15af34006e6a11974088a46d42b903418eJohann    for (r = 0; r < 16; r++)
321b362b15af34006e6a11974088a46d42b903418eJohann    {
331b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED)
341b362b15af34006e6a11974088a46d42b903418eJohann        dst[0] = src[0];
351b362b15af34006e6a11974088a46d42b903418eJohann        dst[1] = src[1];
361b362b15af34006e6a11974088a46d42b903418eJohann        dst[2] = src[2];
371b362b15af34006e6a11974088a46d42b903418eJohann        dst[3] = src[3];
381b362b15af34006e6a11974088a46d42b903418eJohann        dst[4] = src[4];
391b362b15af34006e6a11974088a46d42b903418eJohann        dst[5] = src[5];
401b362b15af34006e6a11974088a46d42b903418eJohann        dst[6] = src[6];
411b362b15af34006e6a11974088a46d42b903418eJohann        dst[7] = src[7];
421b362b15af34006e6a11974088a46d42b903418eJohann        dst[8] = src[8];
431b362b15af34006e6a11974088a46d42b903418eJohann        dst[9] = src[9];
441b362b15af34006e6a11974088a46d42b903418eJohann        dst[10] = src[10];
451b362b15af34006e6a11974088a46d42b903418eJohann        dst[11] = src[11];
461b362b15af34006e6a11974088a46d42b903418eJohann        dst[12] = src[12];
471b362b15af34006e6a11974088a46d42b903418eJohann        dst[13] = src[13];
481b362b15af34006e6a11974088a46d42b903418eJohann        dst[14] = src[14];
491b362b15af34006e6a11974088a46d42b903418eJohann        dst[15] = src[15];
501b362b15af34006e6a11974088a46d42b903418eJohann
511b362b15af34006e6a11974088a46d42b903418eJohann#else
521b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ;
531b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ;
541b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[2] = ((uint32_t *)src)[2] ;
551b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[3] = ((uint32_t *)src)[3] ;
561b362b15af34006e6a11974088a46d42b903418eJohann
571b362b15af34006e6a11974088a46d42b903418eJohann#endif
581b362b15af34006e6a11974088a46d42b903418eJohann        src += src_stride;
591b362b15af34006e6a11974088a46d42b903418eJohann        dst += dst_stride;
601b362b15af34006e6a11974088a46d42b903418eJohann
611b362b15af34006e6a11974088a46d42b903418eJohann    }
621b362b15af34006e6a11974088a46d42b903418eJohann
631b362b15af34006e6a11974088a46d42b903418eJohann}
641b362b15af34006e6a11974088a46d42b903418eJohann
651b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem8x8_c(
661b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *src,
671b362b15af34006e6a11974088a46d42b903418eJohann    int src_stride,
681b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *dst,
691b362b15af34006e6a11974088a46d42b903418eJohann    int dst_stride)
701b362b15af34006e6a11974088a46d42b903418eJohann{
711b362b15af34006e6a11974088a46d42b903418eJohann    int r;
721b362b15af34006e6a11974088a46d42b903418eJohann
731b362b15af34006e6a11974088a46d42b903418eJohann    for (r = 0; r < 8; r++)
741b362b15af34006e6a11974088a46d42b903418eJohann    {
751b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED)
761b362b15af34006e6a11974088a46d42b903418eJohann        dst[0] = src[0];
771b362b15af34006e6a11974088a46d42b903418eJohann        dst[1] = src[1];
781b362b15af34006e6a11974088a46d42b903418eJohann        dst[2] = src[2];
791b362b15af34006e6a11974088a46d42b903418eJohann        dst[3] = src[3];
801b362b15af34006e6a11974088a46d42b903418eJohann        dst[4] = src[4];
811b362b15af34006e6a11974088a46d42b903418eJohann        dst[5] = src[5];
821b362b15af34006e6a11974088a46d42b903418eJohann        dst[6] = src[6];
831b362b15af34006e6a11974088a46d42b903418eJohann        dst[7] = src[7];
841b362b15af34006e6a11974088a46d42b903418eJohann#else
851b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ;
861b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ;
871b362b15af34006e6a11974088a46d42b903418eJohann#endif
881b362b15af34006e6a11974088a46d42b903418eJohann        src += src_stride;
891b362b15af34006e6a11974088a46d42b903418eJohann        dst += dst_stride;
901b362b15af34006e6a11974088a46d42b903418eJohann
911b362b15af34006e6a11974088a46d42b903418eJohann    }
921b362b15af34006e6a11974088a46d42b903418eJohann
931b362b15af34006e6a11974088a46d42b903418eJohann}
941b362b15af34006e6a11974088a46d42b903418eJohann
951b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy_mem8x4_c(
961b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *src,
971b362b15af34006e6a11974088a46d42b903418eJohann    int src_stride,
981b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *dst,
991b362b15af34006e6a11974088a46d42b903418eJohann    int dst_stride)
1001b362b15af34006e6a11974088a46d42b903418eJohann{
1011b362b15af34006e6a11974088a46d42b903418eJohann    int r;
1021b362b15af34006e6a11974088a46d42b903418eJohann
1031b362b15af34006e6a11974088a46d42b903418eJohann    for (r = 0; r < 4; r++)
1041b362b15af34006e6a11974088a46d42b903418eJohann    {
1051b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED)
1061b362b15af34006e6a11974088a46d42b903418eJohann        dst[0] = src[0];
1071b362b15af34006e6a11974088a46d42b903418eJohann        dst[1] = src[1];
1081b362b15af34006e6a11974088a46d42b903418eJohann        dst[2] = src[2];
1091b362b15af34006e6a11974088a46d42b903418eJohann        dst[3] = src[3];
1101b362b15af34006e6a11974088a46d42b903418eJohann        dst[4] = src[4];
1111b362b15af34006e6a11974088a46d42b903418eJohann        dst[5] = src[5];
1121b362b15af34006e6a11974088a46d42b903418eJohann        dst[6] = src[6];
1131b362b15af34006e6a11974088a46d42b903418eJohann        dst[7] = src[7];
1141b362b15af34006e6a11974088a46d42b903418eJohann#else
1151b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[0] = ((uint32_t *)src)[0] ;
1161b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst)[1] = ((uint32_t *)src)[1] ;
1171b362b15af34006e6a11974088a46d42b903418eJohann#endif
1181b362b15af34006e6a11974088a46d42b903418eJohann        src += src_stride;
1191b362b15af34006e6a11974088a46d42b903418eJohann        dst += dst_stride;
1201b362b15af34006e6a11974088a46d42b903418eJohann
1211b362b15af34006e6a11974088a46d42b903418eJohann    }
1221b362b15af34006e6a11974088a46d42b903418eJohann
1231b362b15af34006e6a11974088a46d42b903418eJohann}
1241b362b15af34006e6a11974088a46d42b903418eJohann
1251b362b15af34006e6a11974088a46d42b903418eJohann
1261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter_predictors_b(BLOCKD *d, int pitch, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf)
1271b362b15af34006e6a11974088a46d42b903418eJohann{
1281b362b15af34006e6a11974088a46d42b903418eJohann    int r;
1291b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *pred_ptr = d->predictor;
1301b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
1311b362b15af34006e6a11974088a46d42b903418eJohann    ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
1321b362b15af34006e6a11974088a46d42b903418eJohann
1331b362b15af34006e6a11974088a46d42b903418eJohann    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
1341b362b15af34006e6a11974088a46d42b903418eJohann    {
1351b362b15af34006e6a11974088a46d42b903418eJohann        sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
1361b362b15af34006e6a11974088a46d42b903418eJohann    }
1371b362b15af34006e6a11974088a46d42b903418eJohann    else
1381b362b15af34006e6a11974088a46d42b903418eJohann    {
1391b362b15af34006e6a11974088a46d42b903418eJohann        for (r = 0; r < 4; r++)
1401b362b15af34006e6a11974088a46d42b903418eJohann        {
1411b362b15af34006e6a11974088a46d42b903418eJohann            pred_ptr[0]  = ptr[0];
1421b362b15af34006e6a11974088a46d42b903418eJohann            pred_ptr[1]  = ptr[1];
1431b362b15af34006e6a11974088a46d42b903418eJohann            pred_ptr[2]  = ptr[2];
1441b362b15af34006e6a11974088a46d42b903418eJohann            pred_ptr[3]  = ptr[3];
1451b362b15af34006e6a11974088a46d42b903418eJohann            pred_ptr     += pitch;
1461b362b15af34006e6a11974088a46d42b903418eJohann            ptr         += pre_stride;
1471b362b15af34006e6a11974088a46d42b903418eJohann        }
1481b362b15af34006e6a11974088a46d42b903418eJohann    }
1491b362b15af34006e6a11974088a46d42b903418eJohann}
1501b362b15af34006e6a11974088a46d42b903418eJohann
1511b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride)
1521b362b15af34006e6a11974088a46d42b903418eJohann{
1531b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
1541b362b15af34006e6a11974088a46d42b903418eJohann    ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
1551b362b15af34006e6a11974088a46d42b903418eJohann
1561b362b15af34006e6a11974088a46d42b903418eJohann    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
1571b362b15af34006e6a11974088a46d42b903418eJohann    {
1581b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
1591b362b15af34006e6a11974088a46d42b903418eJohann    }
1601b362b15af34006e6a11974088a46d42b903418eJohann    else
1611b362b15af34006e6a11974088a46d42b903418eJohann    {
1621b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride);
1631b362b15af34006e6a11974088a46d42b903418eJohann    }
1641b362b15af34006e6a11974088a46d42b903418eJohann}
1651b362b15af34006e6a11974088a46d42b903418eJohann
1661b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride)
1671b362b15af34006e6a11974088a46d42b903418eJohann{
1681b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
1691b362b15af34006e6a11974088a46d42b903418eJohann    ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
1701b362b15af34006e6a11974088a46d42b903418eJohann
1711b362b15af34006e6a11974088a46d42b903418eJohann    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
1721b362b15af34006e6a11974088a46d42b903418eJohann    {
1731b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
1741b362b15af34006e6a11974088a46d42b903418eJohann    }
1751b362b15af34006e6a11974088a46d42b903418eJohann    else
1761b362b15af34006e6a11974088a46d42b903418eJohann    {
1771b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride);
1781b362b15af34006e6a11974088a46d42b903418eJohann    }
1791b362b15af34006e6a11974088a46d42b903418eJohann}
1801b362b15af34006e6a11974088a46d42b903418eJohann
1811b362b15af34006e6a11974088a46d42b903418eJohannstatic 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)
1821b362b15af34006e6a11974088a46d42b903418eJohann{
1831b362b15af34006e6a11974088a46d42b903418eJohann    int r;
1841b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
1851b362b15af34006e6a11974088a46d42b903418eJohann    ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
1861b362b15af34006e6a11974088a46d42b903418eJohann
1871b362b15af34006e6a11974088a46d42b903418eJohann    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
1881b362b15af34006e6a11974088a46d42b903418eJohann    {
1891b362b15af34006e6a11974088a46d42b903418eJohann        sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
1901b362b15af34006e6a11974088a46d42b903418eJohann    }
1911b362b15af34006e6a11974088a46d42b903418eJohann    else
1921b362b15af34006e6a11974088a46d42b903418eJohann    {
1931b362b15af34006e6a11974088a46d42b903418eJohann        for (r = 0; r < 4; r++)
1941b362b15af34006e6a11974088a46d42b903418eJohann        {
1951b362b15af34006e6a11974088a46d42b903418eJohann          dst[0]  = ptr[0];
1961b362b15af34006e6a11974088a46d42b903418eJohann          dst[1]  = ptr[1];
1971b362b15af34006e6a11974088a46d42b903418eJohann          dst[2]  = ptr[2];
1981b362b15af34006e6a11974088a46d42b903418eJohann          dst[3]  = ptr[3];
1995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          dst     += dst_stride;
2005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ptr     += pre_stride;
2011b362b15af34006e6a11974088a46d42b903418eJohann        }
2021b362b15af34006e6a11974088a46d42b903418eJohann    }
2031b362b15af34006e6a11974088a46d42b903418eJohann}
2041b362b15af34006e6a11974088a46d42b903418eJohann
2051b362b15af34006e6a11974088a46d42b903418eJohann
2061b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/
2071b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x)
2081b362b15af34006e6a11974088a46d42b903418eJohann{
2091b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *uptr, *vptr;
2101b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *upred_ptr = &x->predictor[256];
2111b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *vpred_ptr = &x->predictor[320];
2121b362b15af34006e6a11974088a46d42b903418eJohann
2131b362b15af34006e6a11974088a46d42b903418eJohann    int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
2141b362b15af34006e6a11974088a46d42b903418eJohann    int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
2151b362b15af34006e6a11974088a46d42b903418eJohann    int offset;
2161b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->pre.uv_stride;
2171b362b15af34006e6a11974088a46d42b903418eJohann
2181b362b15af34006e6a11974088a46d42b903418eJohann    /* calc uv motion vectors */
2191b362b15af34006e6a11974088a46d42b903418eJohann    mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1));
2201b362b15af34006e6a11974088a46d42b903418eJohann    mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1));
2211b362b15af34006e6a11974088a46d42b903418eJohann    mv_row /= 2;
2221b362b15af34006e6a11974088a46d42b903418eJohann    mv_col /= 2;
2231b362b15af34006e6a11974088a46d42b903418eJohann    mv_row &= x->fullpixel_mask;
2241b362b15af34006e6a11974088a46d42b903418eJohann    mv_col &= x->fullpixel_mask;
2251b362b15af34006e6a11974088a46d42b903418eJohann
2261b362b15af34006e6a11974088a46d42b903418eJohann    offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
2271b362b15af34006e6a11974088a46d42b903418eJohann    uptr = x->pre.u_buffer + offset;
2281b362b15af34006e6a11974088a46d42b903418eJohann    vptr = x->pre.v_buffer + offset;
2291b362b15af34006e6a11974088a46d42b903418eJohann
2301b362b15af34006e6a11974088a46d42b903418eJohann    if ((mv_row | mv_col) & 7)
2311b362b15af34006e6a11974088a46d42b903418eJohann    {
2321b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8);
2331b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8);
2341b362b15af34006e6a11974088a46d42b903418eJohann    }
2351b362b15af34006e6a11974088a46d42b903418eJohann    else
2361b362b15af34006e6a11974088a46d42b903418eJohann    {
2371b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8);
2381b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8);
2391b362b15af34006e6a11974088a46d42b903418eJohann    }
2401b362b15af34006e6a11974088a46d42b903418eJohann}
2411b362b15af34006e6a11974088a46d42b903418eJohann
2421b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/
2431b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x)
2441b362b15af34006e6a11974088a46d42b903418eJohann{
2451b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
2461b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->pre.uv_stride;
2471b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre;
2481b362b15af34006e6a11974088a46d42b903418eJohann
2491b362b15af34006e6a11974088a46d42b903418eJohann    /* build uv mvs */
2501b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 2; i++)
2511b362b15af34006e6a11974088a46d42b903418eJohann    {
2521b362b15af34006e6a11974088a46d42b903418eJohann        for (j = 0; j < 2; j++)
2531b362b15af34006e6a11974088a46d42b903418eJohann        {
2541b362b15af34006e6a11974088a46d42b903418eJohann            int yoffset = i * 8 + j * 2;
2551b362b15af34006e6a11974088a46d42b903418eJohann            int uoffset = 16 + i * 2 + j;
2561b362b15af34006e6a11974088a46d42b903418eJohann            int voffset = 20 + i * 2 + j;
2571b362b15af34006e6a11974088a46d42b903418eJohann
2581b362b15af34006e6a11974088a46d42b903418eJohann            int temp;
2591b362b15af34006e6a11974088a46d42b903418eJohann
2601b362b15af34006e6a11974088a46d42b903418eJohann            temp = x->block[yoffset  ].bmi.mv.as_mv.row
2611b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+1].bmi.mv.as_mv.row
2621b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+4].bmi.mv.as_mv.row
2631b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+5].bmi.mv.as_mv.row;
2641b362b15af34006e6a11974088a46d42b903418eJohann
2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8);
2661b362b15af34006e6a11974088a46d42b903418eJohann
2671b362b15af34006e6a11974088a46d42b903418eJohann            x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
2681b362b15af34006e6a11974088a46d42b903418eJohann
2691b362b15af34006e6a11974088a46d42b903418eJohann            temp = x->block[yoffset  ].bmi.mv.as_mv.col
2701b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+1].bmi.mv.as_mv.col
2711b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+4].bmi.mv.as_mv.col
2721b362b15af34006e6a11974088a46d42b903418eJohann                   + x->block[yoffset+5].bmi.mv.as_mv.col;
2731b362b15af34006e6a11974088a46d42b903418eJohann
2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8);
2751b362b15af34006e6a11974088a46d42b903418eJohann
2761b362b15af34006e6a11974088a46d42b903418eJohann            x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
2771b362b15af34006e6a11974088a46d42b903418eJohann
2781b362b15af34006e6a11974088a46d42b903418eJohann            x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int;
2791b362b15af34006e6a11974088a46d42b903418eJohann        }
2801b362b15af34006e6a11974088a46d42b903418eJohann    }
2811b362b15af34006e6a11974088a46d42b903418eJohann
2821b362b15af34006e6a11974088a46d42b903418eJohann    base_pre = x->pre.u_buffer;
2831b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 16; i < 20; i += 2)
2841b362b15af34006e6a11974088a46d42b903418eJohann    {
2851b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d0 = &x->block[i];
2861b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d1 = &x->block[i+1];
2871b362b15af34006e6a11974088a46d42b903418eJohann
2881b362b15af34006e6a11974088a46d42b903418eJohann        if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
2891b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride);
2901b362b15af34006e6a11974088a46d42b903418eJohann        else
2911b362b15af34006e6a11974088a46d42b903418eJohann        {
2921b362b15af34006e6a11974088a46d42b903418eJohann            vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict);
2931b362b15af34006e6a11974088a46d42b903418eJohann            vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict);
2941b362b15af34006e6a11974088a46d42b903418eJohann        }
2951b362b15af34006e6a11974088a46d42b903418eJohann    }
2961b362b15af34006e6a11974088a46d42b903418eJohann
2971b362b15af34006e6a11974088a46d42b903418eJohann    base_pre = x->pre.v_buffer;
2981b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 20; i < 24; i += 2)
2991b362b15af34006e6a11974088a46d42b903418eJohann    {
3001b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d0 = &x->block[i];
3011b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d1 = &x->block[i+1];
3021b362b15af34006e6a11974088a46d42b903418eJohann
3031b362b15af34006e6a11974088a46d42b903418eJohann        if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
3041b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride);
3051b362b15af34006e6a11974088a46d42b903418eJohann        else
3061b362b15af34006e6a11974088a46d42b903418eJohann        {
3071b362b15af34006e6a11974088a46d42b903418eJohann            vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict);
3081b362b15af34006e6a11974088a46d42b903418eJohann            vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict);
3091b362b15af34006e6a11974088a46d42b903418eJohann        }
3101b362b15af34006e6a11974088a46d42b903418eJohann    }
3111b362b15af34006e6a11974088a46d42b903418eJohann}
3121b362b15af34006e6a11974088a46d42b903418eJohann
3131b362b15af34006e6a11974088a46d42b903418eJohann
3141b362b15af34006e6a11974088a46d42b903418eJohann/*encoder only*/
3151b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x,
3161b362b15af34006e6a11974088a46d42b903418eJohann                                         unsigned char *dst_y,
3171b362b15af34006e6a11974088a46d42b903418eJohann                                         int dst_ystride)
3181b362b15af34006e6a11974088a46d42b903418eJohann{
3191b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr_base;
3201b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
3211b362b15af34006e6a11974088a46d42b903418eJohann    int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
3221b362b15af34006e6a11974088a46d42b903418eJohann    int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
3231b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->pre.y_stride;
3241b362b15af34006e6a11974088a46d42b903418eJohann
3251b362b15af34006e6a11974088a46d42b903418eJohann    ptr_base = x->pre.y_buffer;
3261b362b15af34006e6a11974088a46d42b903418eJohann    ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
3271b362b15af34006e6a11974088a46d42b903418eJohann
3281b362b15af34006e6a11974088a46d42b903418eJohann    if ((mv_row | mv_col) & 7)
3291b362b15af34006e6a11974088a46d42b903418eJohann    {
3301b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7,
3311b362b15af34006e6a11974088a46d42b903418eJohann                                 dst_y, dst_ystride);
3321b362b15af34006e6a11974088a46d42b903418eJohann    }
3331b362b15af34006e6a11974088a46d42b903418eJohann    else
3341b362b15af34006e6a11974088a46d42b903418eJohann    {
3351b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem16x16(ptr, pre_stride, dst_y,
3361b362b15af34006e6a11974088a46d42b903418eJohann            dst_ystride);
3371b362b15af34006e6a11974088a46d42b903418eJohann    }
3381b362b15af34006e6a11974088a46d42b903418eJohann}
3391b362b15af34006e6a11974088a46d42b903418eJohann
3401b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd)
3411b362b15af34006e6a11974088a46d42b903418eJohann{
3421b362b15af34006e6a11974088a46d42b903418eJohann    /* If the MV points so far into the UMV border that no visible pixels
3431b362b15af34006e6a11974088a46d42b903418eJohann     * are used for reconstruction, the subpel part of the MV can be
3441b362b15af34006e6a11974088a46d42b903418eJohann     * discarded and the MV limited to 16 pixels with equivalent results.
3451b362b15af34006e6a11974088a46d42b903418eJohann     *
3461b362b15af34006e6a11974088a46d42b903418eJohann     * This limit kicks in at 19 pixels for the top and left edges, for
3471b362b15af34006e6a11974088a46d42b903418eJohann     * the 16 pixels plus 3 taps right of the central pixel when subpel
3481b362b15af34006e6a11974088a46d42b903418eJohann     * filtering. The bottom and right edges use 16 pixels plus 2 pixels
3491b362b15af34006e6a11974088a46d42b903418eJohann     * left of the central pixel when filtering.
3501b362b15af34006e6a11974088a46d42b903418eJohann     */
3511b362b15af34006e6a11974088a46d42b903418eJohann    if (mv->col < (xd->mb_to_left_edge - (19 << 3)))
3521b362b15af34006e6a11974088a46d42b903418eJohann        mv->col = xd->mb_to_left_edge - (16 << 3);
3531b362b15af34006e6a11974088a46d42b903418eJohann    else if (mv->col > xd->mb_to_right_edge + (18 << 3))
3541b362b15af34006e6a11974088a46d42b903418eJohann        mv->col = xd->mb_to_right_edge + (16 << 3);
3551b362b15af34006e6a11974088a46d42b903418eJohann
3561b362b15af34006e6a11974088a46d42b903418eJohann    if (mv->row < (xd->mb_to_top_edge - (19 << 3)))
3571b362b15af34006e6a11974088a46d42b903418eJohann        mv->row = xd->mb_to_top_edge - (16 << 3);
3581b362b15af34006e6a11974088a46d42b903418eJohann    else if (mv->row > xd->mb_to_bottom_edge + (18 << 3))
3591b362b15af34006e6a11974088a46d42b903418eJohann        mv->row = xd->mb_to_bottom_edge + (16 << 3);
3601b362b15af34006e6a11974088a46d42b903418eJohann}
3611b362b15af34006e6a11974088a46d42b903418eJohann
3621b362b15af34006e6a11974088a46d42b903418eJohann/* A version of the above function for chroma block MVs.*/
3631b362b15af34006e6a11974088a46d42b903418eJohannstatic void clamp_uvmv_to_umv_border(MV *mv, const MACROBLOCKD *xd)
3641b362b15af34006e6a11974088a46d42b903418eJohann{
3651b362b15af34006e6a11974088a46d42b903418eJohann    mv->col = (2*mv->col < (xd->mb_to_left_edge - (19 << 3))) ?
3661b362b15af34006e6a11974088a46d42b903418eJohann        (xd->mb_to_left_edge - (16 << 3)) >> 1 : mv->col;
3671b362b15af34006e6a11974088a46d42b903418eJohann    mv->col = (2*mv->col > xd->mb_to_right_edge + (18 << 3)) ?
3681b362b15af34006e6a11974088a46d42b903418eJohann        (xd->mb_to_right_edge + (16 << 3)) >> 1 : mv->col;
3691b362b15af34006e6a11974088a46d42b903418eJohann
3701b362b15af34006e6a11974088a46d42b903418eJohann    mv->row = (2*mv->row < (xd->mb_to_top_edge - (19 << 3))) ?
3711b362b15af34006e6a11974088a46d42b903418eJohann        (xd->mb_to_top_edge - (16 << 3)) >> 1 : mv->row;
3721b362b15af34006e6a11974088a46d42b903418eJohann    mv->row = (2*mv->row > xd->mb_to_bottom_edge + (18 << 3)) ?
3731b362b15af34006e6a11974088a46d42b903418eJohann        (xd->mb_to_bottom_edge + (16 << 3)) >> 1 : mv->row;
3741b362b15af34006e6a11974088a46d42b903418eJohann}
3751b362b15af34006e6a11974088a46d42b903418eJohann
3761b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x,
3771b362b15af34006e6a11974088a46d42b903418eJohann                                        unsigned char *dst_y,
3781b362b15af34006e6a11974088a46d42b903418eJohann                                        unsigned char *dst_u,
3791b362b15af34006e6a11974088a46d42b903418eJohann                                        unsigned char *dst_v,
3801b362b15af34006e6a11974088a46d42b903418eJohann                                        int dst_ystride,
3811b362b15af34006e6a11974088a46d42b903418eJohann                                        int dst_uvstride)
3821b362b15af34006e6a11974088a46d42b903418eJohann{
3831b362b15af34006e6a11974088a46d42b903418eJohann    int offset;
3841b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr;
3851b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *uptr, *vptr;
3861b362b15af34006e6a11974088a46d42b903418eJohann
3871b362b15af34006e6a11974088a46d42b903418eJohann    int_mv _16x16mv;
3881b362b15af34006e6a11974088a46d42b903418eJohann
3891b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *ptr_base = x->pre.y_buffer;
3901b362b15af34006e6a11974088a46d42b903418eJohann    int pre_stride = x->pre.y_stride;
3911b362b15af34006e6a11974088a46d42b903418eJohann
3921b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int;
3931b362b15af34006e6a11974088a46d42b903418eJohann
3941b362b15af34006e6a11974088a46d42b903418eJohann    if (x->mode_info_context->mbmi.need_to_clamp_mvs)
3951b362b15af34006e6a11974088a46d42b903418eJohann    {
3961b362b15af34006e6a11974088a46d42b903418eJohann        clamp_mv_to_umv_border(&_16x16mv.as_mv, x);
3971b362b15af34006e6a11974088a46d42b903418eJohann    }
3981b362b15af34006e6a11974088a46d42b903418eJohann
3991b362b15af34006e6a11974088a46d42b903418eJohann    ptr = ptr_base + ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3);
4001b362b15af34006e6a11974088a46d42b903418eJohann
4011b362b15af34006e6a11974088a46d42b903418eJohann    if ( _16x16mv.as_int & 0x00070007)
4021b362b15af34006e6a11974088a46d42b903418eJohann    {
4031b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict16x16(ptr, pre_stride, _16x16mv.as_mv.col & 7,  _16x16mv.as_mv.row & 7, dst_y, dst_ystride);
4041b362b15af34006e6a11974088a46d42b903418eJohann    }
4051b362b15af34006e6a11974088a46d42b903418eJohann    else
4061b362b15af34006e6a11974088a46d42b903418eJohann    {
4071b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride);
4081b362b15af34006e6a11974088a46d42b903418eJohann    }
4091b362b15af34006e6a11974088a46d42b903418eJohann
4101b362b15af34006e6a11974088a46d42b903418eJohann    /* calc uv motion vectors */
4111b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1));
4121b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1));
4131b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.row /= 2;
4141b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.col /= 2;
4151b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.row &= x->fullpixel_mask;
4161b362b15af34006e6a11974088a46d42b903418eJohann    _16x16mv.as_mv.col &= x->fullpixel_mask;
4171b362b15af34006e6a11974088a46d42b903418eJohann
4181b362b15af34006e6a11974088a46d42b903418eJohann    pre_stride >>= 1;
4191b362b15af34006e6a11974088a46d42b903418eJohann    offset = ( _16x16mv.as_mv.row >> 3) * pre_stride + (_16x16mv.as_mv.col >> 3);
4201b362b15af34006e6a11974088a46d42b903418eJohann    uptr = x->pre.u_buffer + offset;
4211b362b15af34006e6a11974088a46d42b903418eJohann    vptr = x->pre.v_buffer + offset;
4221b362b15af34006e6a11974088a46d42b903418eJohann
4231b362b15af34006e6a11974088a46d42b903418eJohann    if ( _16x16mv.as_int & 0x00070007)
4241b362b15af34006e6a11974088a46d42b903418eJohann    {
4251b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x8(uptr, pre_stride, _16x16mv.as_mv.col & 7,  _16x16mv.as_mv.row & 7, dst_u, dst_uvstride);
4261b362b15af34006e6a11974088a46d42b903418eJohann        x->subpixel_predict8x8(vptr, pre_stride, _16x16mv.as_mv.col & 7,  _16x16mv.as_mv.row & 7, dst_v, dst_uvstride);
4271b362b15af34006e6a11974088a46d42b903418eJohann    }
4281b362b15af34006e6a11974088a46d42b903418eJohann    else
4291b362b15af34006e6a11974088a46d42b903418eJohann    {
4301b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride);
4311b362b15af34006e6a11974088a46d42b903418eJohann        vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride);
4321b362b15af34006e6a11974088a46d42b903418eJohann    }
4331b362b15af34006e6a11974088a46d42b903418eJohann}
4341b362b15af34006e6a11974088a46d42b903418eJohann
4351b362b15af34006e6a11974088a46d42b903418eJohannstatic void build_inter4x4_predictors_mb(MACROBLOCKD *x)
4361b362b15af34006e6a11974088a46d42b903418eJohann{
4371b362b15af34006e6a11974088a46d42b903418eJohann    int i;
4381b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_dst = x->dst.y_buffer;
4391b362b15af34006e6a11974088a46d42b903418eJohann    unsigned char *base_pre = x->pre.y_buffer;
4401b362b15af34006e6a11974088a46d42b903418eJohann
4411b362b15af34006e6a11974088a46d42b903418eJohann    if (x->mode_info_context->mbmi.partitioning < 3)
4421b362b15af34006e6a11974088a46d42b903418eJohann    {
4431b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *b;
4441b362b15af34006e6a11974088a46d42b903418eJohann        int dst_stride = x->dst.y_stride;
4451b362b15af34006e6a11974088a46d42b903418eJohann
4461b362b15af34006e6a11974088a46d42b903418eJohann        x->block[ 0].bmi = x->mode_info_context->bmi[ 0];
4471b362b15af34006e6a11974088a46d42b903418eJohann        x->block[ 2].bmi = x->mode_info_context->bmi[ 2];
4481b362b15af34006e6a11974088a46d42b903418eJohann        x->block[ 8].bmi = x->mode_info_context->bmi[ 8];
4491b362b15af34006e6a11974088a46d42b903418eJohann        x->block[10].bmi = x->mode_info_context->bmi[10];
4501b362b15af34006e6a11974088a46d42b903418eJohann        if (x->mode_info_context->mbmi.need_to_clamp_mvs)
4511b362b15af34006e6a11974088a46d42b903418eJohann        {
4521b362b15af34006e6a11974088a46d42b903418eJohann            clamp_mv_to_umv_border(&x->block[ 0].bmi.mv.as_mv, x);
4531b362b15af34006e6a11974088a46d42b903418eJohann            clamp_mv_to_umv_border(&x->block[ 2].bmi.mv.as_mv, x);
4541b362b15af34006e6a11974088a46d42b903418eJohann            clamp_mv_to_umv_border(&x->block[ 8].bmi.mv.as_mv, x);
4551b362b15af34006e6a11974088a46d42b903418eJohann            clamp_mv_to_umv_border(&x->block[10].bmi.mv.as_mv, x);
4561b362b15af34006e6a11974088a46d42b903418eJohann        }
4571b362b15af34006e6a11974088a46d42b903418eJohann
4581b362b15af34006e6a11974088a46d42b903418eJohann        b = &x->block[ 0];
4591b362b15af34006e6a11974088a46d42b903418eJohann        build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
4601b362b15af34006e6a11974088a46d42b903418eJohann        b = &x->block[ 2];
4611b362b15af34006e6a11974088a46d42b903418eJohann        build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
4621b362b15af34006e6a11974088a46d42b903418eJohann        b = &x->block[ 8];
4631b362b15af34006e6a11974088a46d42b903418eJohann        build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
4641b362b15af34006e6a11974088a46d42b903418eJohann        b = &x->block[10];
4651b362b15af34006e6a11974088a46d42b903418eJohann        build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
4661b362b15af34006e6a11974088a46d42b903418eJohann    }
4671b362b15af34006e6a11974088a46d42b903418eJohann    else
4681b362b15af34006e6a11974088a46d42b903418eJohann    {
4691b362b15af34006e6a11974088a46d42b903418eJohann        for (i = 0; i < 16; i += 2)
4701b362b15af34006e6a11974088a46d42b903418eJohann        {
4711b362b15af34006e6a11974088a46d42b903418eJohann            BLOCKD *d0 = &x->block[i];
4721b362b15af34006e6a11974088a46d42b903418eJohann            BLOCKD *d1 = &x->block[i+1];
4731b362b15af34006e6a11974088a46d42b903418eJohann            int dst_stride = x->dst.y_stride;
4741b362b15af34006e6a11974088a46d42b903418eJohann
4751b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i+0].bmi = x->mode_info_context->bmi[i+0];
4761b362b15af34006e6a11974088a46d42b903418eJohann            x->block[i+1].bmi = x->mode_info_context->bmi[i+1];
4771b362b15af34006e6a11974088a46d42b903418eJohann            if (x->mode_info_context->mbmi.need_to_clamp_mvs)
4781b362b15af34006e6a11974088a46d42b903418eJohann            {
4791b362b15af34006e6a11974088a46d42b903418eJohann                clamp_mv_to_umv_border(&x->block[i+0].bmi.mv.as_mv, x);
4801b362b15af34006e6a11974088a46d42b903418eJohann                clamp_mv_to_umv_border(&x->block[i+1].bmi.mv.as_mv, x);
4811b362b15af34006e6a11974088a46d42b903418eJohann            }
4821b362b15af34006e6a11974088a46d42b903418eJohann
4831b362b15af34006e6a11974088a46d42b903418eJohann            if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
4841b362b15af34006e6a11974088a46d42b903418eJohann                build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
4851b362b15af34006e6a11974088a46d42b903418eJohann            else
4861b362b15af34006e6a11974088a46d42b903418eJohann            {
4871b362b15af34006e6a11974088a46d42b903418eJohann                build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
4881b362b15af34006e6a11974088a46d42b903418eJohann                build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
4891b362b15af34006e6a11974088a46d42b903418eJohann            }
4901b362b15af34006e6a11974088a46d42b903418eJohann
4911b362b15af34006e6a11974088a46d42b903418eJohann        }
4921b362b15af34006e6a11974088a46d42b903418eJohann
4931b362b15af34006e6a11974088a46d42b903418eJohann    }
4941b362b15af34006e6a11974088a46d42b903418eJohann    base_dst = x->dst.u_buffer;
4951b362b15af34006e6a11974088a46d42b903418eJohann    base_pre = x->pre.u_buffer;
4961b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 16; i < 20; i += 2)
4971b362b15af34006e6a11974088a46d42b903418eJohann    {
4981b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d0 = &x->block[i];
4991b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d1 = &x->block[i+1];
5001b362b15af34006e6a11974088a46d42b903418eJohann        int dst_stride = x->dst.uv_stride;
5011b362b15af34006e6a11974088a46d42b903418eJohann
5021b362b15af34006e6a11974088a46d42b903418eJohann        /* Note: uv mvs already clamped in build_4x4uvmvs() */
5031b362b15af34006e6a11974088a46d42b903418eJohann
5041b362b15af34006e6a11974088a46d42b903418eJohann        if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
5051b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
5061b362b15af34006e6a11974088a46d42b903418eJohann        else
5071b362b15af34006e6a11974088a46d42b903418eJohann        {
5081b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
5091b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
5101b362b15af34006e6a11974088a46d42b903418eJohann        }
5111b362b15af34006e6a11974088a46d42b903418eJohann    }
5121b362b15af34006e6a11974088a46d42b903418eJohann
5131b362b15af34006e6a11974088a46d42b903418eJohann    base_dst = x->dst.v_buffer;
5141b362b15af34006e6a11974088a46d42b903418eJohann    base_pre = x->pre.v_buffer;
5151b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 20; i < 24; i += 2)
5161b362b15af34006e6a11974088a46d42b903418eJohann    {
5171b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d0 = &x->block[i];
5181b362b15af34006e6a11974088a46d42b903418eJohann        BLOCKD *d1 = &x->block[i+1];
5191b362b15af34006e6a11974088a46d42b903418eJohann        int dst_stride = x->dst.uv_stride;
5201b362b15af34006e6a11974088a46d42b903418eJohann
5211b362b15af34006e6a11974088a46d42b903418eJohann        /* Note: uv mvs already clamped in build_4x4uvmvs() */
5221b362b15af34006e6a11974088a46d42b903418eJohann
5231b362b15af34006e6a11974088a46d42b903418eJohann        if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
5241b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
5251b362b15af34006e6a11974088a46d42b903418eJohann        else
5261b362b15af34006e6a11974088a46d42b903418eJohann        {
5271b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
5281b362b15af34006e6a11974088a46d42b903418eJohann            build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
5291b362b15af34006e6a11974088a46d42b903418eJohann        }
5301b362b15af34006e6a11974088a46d42b903418eJohann    }
5311b362b15af34006e6a11974088a46d42b903418eJohann}
5321b362b15af34006e6a11974088a46d42b903418eJohann
5331b362b15af34006e6a11974088a46d42b903418eJohannstatic
5341b362b15af34006e6a11974088a46d42b903418eJohannvoid build_4x4uvmvs(MACROBLOCKD *x)
5351b362b15af34006e6a11974088a46d42b903418eJohann{
5361b362b15af34006e6a11974088a46d42b903418eJohann    int i, j;
5371b362b15af34006e6a11974088a46d42b903418eJohann
5381b362b15af34006e6a11974088a46d42b903418eJohann    for (i = 0; i < 2; i++)
5391b362b15af34006e6a11974088a46d42b903418eJohann    {
5401b362b15af34006e6a11974088a46d42b903418eJohann        for (j = 0; j < 2; j++)
5411b362b15af34006e6a11974088a46d42b903418eJohann        {
5421b362b15af34006e6a11974088a46d42b903418eJohann            int yoffset = i * 8 + j * 2;
5431b362b15af34006e6a11974088a46d42b903418eJohann            int uoffset = 16 + i * 2 + j;
5441b362b15af34006e6a11974088a46d42b903418eJohann            int voffset = 20 + i * 2 + j;
5451b362b15af34006e6a11974088a46d42b903418eJohann
5461b362b15af34006e6a11974088a46d42b903418eJohann            int temp;
5471b362b15af34006e6a11974088a46d42b903418eJohann
5481b362b15af34006e6a11974088a46d42b903418eJohann            temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.row
5491b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.row
5501b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row
5511b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row;
5521b362b15af34006e6a11974088a46d42b903418eJohann
5535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8);
5541b362b15af34006e6a11974088a46d42b903418eJohann
5551b362b15af34006e6a11974088a46d42b903418eJohann            x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
5561b362b15af34006e6a11974088a46d42b903418eJohann
5571b362b15af34006e6a11974088a46d42b903418eJohann            temp = x->mode_info_context->bmi[yoffset + 0].mv.as_mv.col
5581b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 1].mv.as_mv.col
5591b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col
5601b362b15af34006e6a11974088a46d42b903418eJohann                 + x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col;
5611b362b15af34006e6a11974088a46d42b903418eJohann
5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            temp += 4 + ((temp >> (sizeof(temp) * CHAR_BIT - 1)) * 8);
5631b362b15af34006e6a11974088a46d42b903418eJohann
5641b362b15af34006e6a11974088a46d42b903418eJohann            x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
5651b362b15af34006e6a11974088a46d42b903418eJohann
5661b362b15af34006e6a11974088a46d42b903418eJohann            if (x->mode_info_context->mbmi.need_to_clamp_mvs)
5671b362b15af34006e6a11974088a46d42b903418eJohann                clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x);
5681b362b15af34006e6a11974088a46d42b903418eJohann
5691b362b15af34006e6a11974088a46d42b903418eJohann            x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int;
5701b362b15af34006e6a11974088a46d42b903418eJohann        }
5711b362b15af34006e6a11974088a46d42b903418eJohann    }
5721b362b15af34006e6a11974088a46d42b903418eJohann}
5731b362b15af34006e6a11974088a46d42b903418eJohann
5741b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_build_inter_predictors_mb(MACROBLOCKD *xd)
5751b362b15af34006e6a11974088a46d42b903418eJohann{
5761b362b15af34006e6a11974088a46d42b903418eJohann    if (xd->mode_info_context->mbmi.mode != SPLITMV)
5771b362b15af34006e6a11974088a46d42b903418eJohann    {
5781b362b15af34006e6a11974088a46d42b903418eJohann        vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
5791b362b15af34006e6a11974088a46d42b903418eJohann                                           xd->dst.u_buffer, xd->dst.v_buffer,
5801b362b15af34006e6a11974088a46d42b903418eJohann                                           xd->dst.y_stride, xd->dst.uv_stride);
5811b362b15af34006e6a11974088a46d42b903418eJohann    }
5821b362b15af34006e6a11974088a46d42b903418eJohann    else
5831b362b15af34006e6a11974088a46d42b903418eJohann    {
5841b362b15af34006e6a11974088a46d42b903418eJohann        build_4x4uvmvs(xd);
5851b362b15af34006e6a11974088a46d42b903418eJohann        build_inter4x4_predictors_mb(xd);
5861b362b15af34006e6a11974088a46d42b903418eJohann    }
5871b362b15af34006e6a11974088a46d42b903418eJohann}
588