190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/config.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "recon.h"
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "subpixel.h"
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "blockd.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "reconinter.h"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxc_int.h"
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* use this define on systems where unaligned int reads and writes are
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * not allowed, i.e. ARM architectures
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*#define MUST_BE_ALIGNED*/
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const int bbb[4] = {0, 2, 8, 10};
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_copy_mem16x16_c(
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src,
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int src_stride,
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst,
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_stride)
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r;
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (r = 0; r < 16; r++)
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MUST_BE_ALIGNED
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[0] = src[0];
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[1] = src[1];
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[2] = src[2];
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[3] = src[3];
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[4] = src[4];
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[5] = src[5];
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[6] = src[6];
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[7] = src[7];
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[8] = src[8];
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[9] = src[9];
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[10] = src[10];
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[11] = src[11];
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[12] = src[12];
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[13] = src[13];
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[14] = src[14];
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[15] = src[15];
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[0] = ((int *)src)[0] ;
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[1] = ((int *)src)[1] ;
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[2] = ((int *)src)[2] ;
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[3] = ((int *)src)[3] ;
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src += src_stride;
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst += dst_stride;
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_copy_mem8x8_c(
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src,
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int src_stride,
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst,
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_stride)
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (r = 0; r < 8; r++)
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MUST_BE_ALIGNED
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[0] = src[0];
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[1] = src[1];
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[2] = src[2];
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[3] = src[3];
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[4] = src[4];
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[5] = src[5];
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[6] = src[6];
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[7] = src[7];
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[0] = ((int *)src)[0] ;
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[1] = ((int *)src)[1] ;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src += src_stride;
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst += dst_stride;
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_copy_mem8x4_c(
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src,
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int src_stride,
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst,
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_stride)
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r;
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (r = 0; r < 4; r++)
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MUST_BE_ALIGNED
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[0] = src[0];
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[1] = src[1];
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[2] = src[2];
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[3] = src[3];
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[4] = src[4];
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[5] = src[5];
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[6] = src[6];
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst[7] = src[7];
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[0] = ((int *)src)[0] ;
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((int *)dst)[1] = ((int *)src)[1] ;
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src += src_stride;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        dst += dst_stride;
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_inter_predictors_b(BLOCKD *d, int pitch, vp8_subpix_fn_t sppf)
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r;
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr_base;
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *pred_ptr = d->predictor;
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr_base = *(d->base_pre);
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sppf(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr_base += d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base;
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (r = 0; r < 4; r++)
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MUST_BE_ALIGNED
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pred_ptr[0]  = ptr[0];
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pred_ptr[1]  = ptr[1];
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pred_ptr[2]  = ptr[2];
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pred_ptr[3]  = ptr[3];
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *(int *)pred_ptr = *(int *)ptr ;
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pred_ptr     += pitch;
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ptr         += d->pre_stride;
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17179f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, int pitch)
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr_base;
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr;
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *pred_ptr = d->predictor;
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr_base = *(d->base_pre);
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x->subpixel_predict8x8(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        RECON_INVOKE(&x->rtcd->recon, copy8x8)(ptr, d->pre_stride, pred_ptr, pitch);
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, int pitch)
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr_base;
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr;
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *pred_ptr = d->predictor;
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr_base = *(d->base_pre);
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x->subpixel_predict8x4(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        RECON_INVOKE(&x->rtcd->recon, copy8x4)(ptr, d->pre_stride, pred_ptr, pitch);
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_inter_predictors_mbuv(MACROBLOCKD *x)
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
214f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.ref_frame != INTRA_FRAME &&
215f71323e297a928af368937089d3ed71239786f86Andreas Huber        x->mode_info_context->mbmi.mode != SPLITMV)
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *uptr, *vptr;
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *upred_ptr = &x->predictor[256];
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *vpred_ptr = &x->predictor[320];
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mv_row = x->block[16].bmi.mv.as_mv.row;
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int mv_col = x->block[16].bmi.mv.as_mv.col;
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int offset;
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int pre_stride = x->block[16].pre_stride;
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        uptr = x->pre.u_buffer + offset;
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vptr = x->pre.v_buffer + offset;
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8);
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8);
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(uptr, pre_stride, upred_ptr, 8);
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, pre_stride, vpred_ptr, 8);
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 16; i < 24; i += 2)
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d0 = &x->block[i];
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d1 = &x->block[i+1];
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
24979f15823c34ae1e423108295e416213200bb280fAndreas Huber                build_inter_predictors2b(x, d0, 8);
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b(d0, 8, x->subpixel_predict);
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b(d1, 8, x->subpixel_predict);
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
259538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*encoder only*/
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_inter_predictors_mby(MACROBLOCKD *x)
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
262f71323e297a928af368937089d3ed71239786f86Andreas Huber
263f71323e297a928af368937089d3ed71239786f86Andreas Huber  if (x->mode_info_context->mbmi.ref_frame != INTRA_FRAME &&
264f71323e297a928af368937089d3ed71239786f86Andreas Huber      x->mode_info_context->mbmi.mode != SPLITMV)
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr_base;
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr;
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *pred_ptr = x->predictor;
269f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
270f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int pre_stride = x->block[0].pre_stride;
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr_base = x->pre.y_buffer;
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, pred_ptr, 16);
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy16x16)(ptr, pre_stride, pred_ptr, 16);
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
289f71323e297a928af368937089d3ed71239786f86Andreas Huber        if (x->mode_info_context->mbmi.partitioning < 3)
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 4; i++)
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d = &x->block[bbb[i]];
29479f15823c34ae1e423108295e416213200bb280fAndreas Huber                build_inter_predictors4b(x, d, 16);
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 16; i += 2)
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d0 = &x->block[i];
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d1 = &x->block[i+1];
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
30679f15823c34ae1e423108295e416213200bb280fAndreas Huber                    build_inter_predictors2b(x, d0, 16);
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b(d0, 16, x->subpixel_predict);
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b(d1, 16, x->subpixel_predict);
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_inter_predictors_mb(MACROBLOCKD *x)
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
320f71323e297a928af368937089d3ed71239786f86Andreas Huber
321f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.ref_frame != INTRA_FRAME &&
322f71323e297a928af368937089d3ed71239786f86Andreas Huber        x->mode_info_context->mbmi.mode != SPLITMV)
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int offset;
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr_base;
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr;
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *uptr, *vptr;
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *pred_ptr = x->predictor;
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *upred_ptr = &x->predictor[256];
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *vpred_ptr = &x->predictor[320];
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
332f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
333f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int pre_stride = x->block[0].pre_stride;
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr_base = x->pre.y_buffer;
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, pred_ptr, 16);
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy16x16)(ptr, pre_stride, pred_ptr, 16);
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mv_row = x->block[16].bmi.mv.as_mv.row;
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mv_col = x->block[16].bmi.mv.as_mv.col;
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        pre_stride >>= 1;
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        uptr = x->pre.u_buffer + offset;
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vptr = x->pre.v_buffer + offset;
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, 8);
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, 8);
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(uptr, pre_stride, upred_ptr, 8);
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, pre_stride, vpred_ptr, 8);
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
370f71323e297a928af368937089d3ed71239786f86Andreas Huber        if (x->mode_info_context->mbmi.partitioning < 3)
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 4; i++)
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d = &x->block[bbb[i]];
37579f15823c34ae1e423108295e416213200bb280fAndreas Huber                build_inter_predictors4b(x, d, 16);
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 16; i += 2)
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d0 = &x->block[i];
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d1 = &x->block[i+1];
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
38679f15823c34ae1e423108295e416213200bb280fAndreas Huber                    build_inter_predictors2b(x, d0, 16);
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b(d0, 16, x->subpixel_predict);
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b(d1, 16, x->subpixel_predict);
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 16; i < 24; i += 2)
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d0 = &x->block[i];
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d1 = &x->block[i+1];
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
40379f15823c34ae1e423108295e416213200bb280fAndreas Huber                build_inter_predictors2b(x, d0, 8);
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b(d0, 8, x->subpixel_predict);
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b(d1, 8, x->subpixel_predict);
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_uvmvs(MACROBLOCKD *x, int fullpixel)
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i, j;
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
419f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mode == SPLITMV)
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < 2; i++)
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (j = 0; j < 2; j++)
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int yoffset = i * 8 + j * 2;
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int uoffset = 16 + i * 2 + j;
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int voffset = 20 + i * 2 + j;
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int temp;
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                temp = x->block[yoffset  ].bmi.mv.as_mv.row
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+1].bmi.mv.as_mv.row
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+4].bmi.mv.as_mv.row
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+5].bmi.mv.as_mv.row;
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (temp < 0) temp -= 4;
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else temp += 4;
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[uoffset].bmi.mv.as_mv.row = temp / 8;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (fullpixel)
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & 0xfffffff8;
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                temp = x->block[yoffset  ].bmi.mv.as_mv.col
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+1].bmi.mv.as_mv.col
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+4].bmi.mv.as_mv.col
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                       + x->block[yoffset+5].bmi.mv.as_mv.col;
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (temp < 0) temp -= 4;
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else temp += 4;
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[uoffset].bmi.mv.as_mv.col = temp / 8;
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (fullpixel)
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & 0xfffffff8;
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[voffset].bmi.mv.as_mv.row = x->block[uoffset].bmi.mv.as_mv.row ;
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[voffset].bmi.mv.as_mv.col = x->block[uoffset].bmi.mv.as_mv.col ;
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
464f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mvrow = x->mode_info_context->mbmi.mv.as_mv.row;
465f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mvcol = x->mode_info_context->mbmi.mv.as_mv.col;
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (mvrow < 0)
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mvrow -= 1;
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mvrow += 1;
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (mvcol < 0)
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mvcol -= 1;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            mvcol += 1;
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mvrow /= 2;
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mvcol /= 2;
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < 8; i++)
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->block[ 16 + i].bmi.mv.as_mv.row = mvrow;
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->block[ 16 + i].bmi.mv.as_mv.col = mvcol;
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (fullpixel)
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[ 16 + i].bmi.mv.as_mv.row = mvrow & 0xfffffff8;
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x->block[ 16 + i].bmi.mv.as_mv.col = mvcol & 0xfffffff8;
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
495538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* The following functions are wriiten for skip_recon_mb() to call. Since there is no recon in this
496538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * situation, we can write the result directly to dst buffer instead of writing it to predictor
497538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * buffer and then copying it to dst buffer.
498538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_build_inter_predictors_b_s(BLOCKD *d, unsigned char *dst_ptr, vp8_subpix_fn_t sppf)
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int r;
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr_base;
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *ptr;
504538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /*unsigned char *pred_ptr = d->predictor;*/
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_stride = d->dst_stride;
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pre_stride = d->pre_stride;
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ptr_base = *(d->base_pre);
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst_ptr, dst_stride);
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr_base += d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base;
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (r = 0; r < 4; r++)
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MUST_BE_ALIGNED
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dst_ptr[0]   = ptr[0];
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dst_ptr[1]   = ptr[1];
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dst_ptr[2]   = ptr[2];
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dst_ptr[3]   = ptr[3];
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *(int *)dst_ptr = *(int *)ptr ;
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            dst_ptr      += dst_stride;
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            ptr         += pre_stride;
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_inter_predictors_mb_s(MACROBLOCKD *x)
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
540538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /*unsigned char *pred_ptr = x->block[0].predictor;
541538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char *dst_ptr = *(x->block[0].base_dst) + x->block[0].dst;*/
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *pred_ptr = x->predictor;
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr = x->dst.y_buffer;
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
545f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mode != SPLITMV)
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int offset;
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr_base;
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *ptr;
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *uptr, *vptr;
551538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /*unsigned char *pred_ptr = x->predictor;
552538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *upred_ptr = &x->predictor[256];
553538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        unsigned char *vpred_ptr = &x->predictor[320];*/
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *udst_ptr = x->dst.u_buffer;
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char *vdst_ptr = x->dst.v_buffer;
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
557f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
558f71323e297a928af368937089d3ed71239786f86Andreas Huber        int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
559538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        int pre_stride = x->dst.y_stride; /*x->block[0].pre_stride;*/
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr_base = x->pre.y_buffer;
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
566538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, dst_ptr, x->dst.y_stride); /*x->block[0].dst_stride);*/
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
570538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            RECON_INVOKE(&x->rtcd->recon, copy16x16)(ptr, pre_stride, dst_ptr, x->dst.y_stride); /*x->block[0].dst_stride);*/
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mv_row = x->block[16].bmi.mv.as_mv.row;
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mv_col = x->block[16].bmi.mv.as_mv.col;
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        pre_stride >>= 1;
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        uptr = x->pre.u_buffer + offset;
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vptr = x->pre.v_buffer + offset;
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((mv_row | mv_col) & 7)
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(uptr, pre_stride, mv_col & 7, mv_row & 7, udst_ptr, x->dst.uv_stride);
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->subpixel_predict8x8(vptr, pre_stride, mv_col & 7, mv_row & 7, vdst_ptr, x->dst.uv_stride);
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(uptr, pre_stride, udst_ptr, x->dst.uv_stride);
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, pre_stride, vdst_ptr, x->dst.uv_stride);
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
593538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* note: this whole ELSE part is not executed at all. So, no way to test the correctness of my modification. Later,
594538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber         * if sth is wrong, go back to what it is in build_inter_predictors_mb.
595538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber         */
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
598f71323e297a928af368937089d3ed71239786f86Andreas Huber        if (x->mode_info_context->mbmi.partitioning < 3)
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 4; i++)
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d = &x->block[bbb[i]];
60379f15823c34ae1e423108295e416213200bb280fAndreas Huber                /*build_inter_predictors4b(x, d, 16);*/
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *ptr_base;
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *ptr;
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *pred_ptr = d->predictor;
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ptr_base = *(d->base_pre);
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
615538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        x->subpixel_predict8x8(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst_ptr, x->dst.y_stride); /*x->block[0].dst_stride);*/
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
619538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        RECON_INVOKE(&x->rtcd->recon, copy8x8)(ptr, d->pre_stride, dst_ptr, x->dst.y_stride); /*x->block[0].dst_stride);*/
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < 16; i += 2)
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d0 = &x->block[i];
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                BLOCKD *d1 = &x->block[i+1];
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
63379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    /*build_inter_predictors2b(x, d0, 16);*/
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *ptr_base;
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *ptr;
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    unsigned char *pred_ptr = d0->predictor;
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ptr_base = *(d0->base_pre);
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    ptr = ptr_base + d0->pre + (d0->bmi.mv.as_mv.row >> 3) * d0->pre_stride + (d0->bmi.mv.as_mv.col >> 3);
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (d0->bmi.mv.as_mv.row & 7 || d0->bmi.mv.as_mv.col & 7)
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->subpixel_predict8x4(ptr, d0->pre_stride, d0->bmi.mv.as_mv.col & 7, d0->bmi.mv.as_mv.row & 7, dst_ptr, x->dst.y_stride);
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        RECON_INVOKE(&x->rtcd->recon, copy8x4)(ptr, d0->pre_stride, dst_ptr, x->dst.y_stride);
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b_s(d0, dst_ptr, x->subpixel_predict);
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_build_inter_predictors_b_s(d1, dst_ptr, x->subpixel_predict);
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 16; i < 24; i += 2)
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d0 = &x->block[i];
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            BLOCKD *d1 = &x->block[i+1];
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
66579f15823c34ae1e423108295e416213200bb280fAndreas Huber                /*build_inter_predictors2b(x, d0, 8);*/
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                unsigned char *ptr_base;
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                unsigned char *ptr;
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                unsigned char *pred_ptr = d0->predictor;
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ptr_base = *(d0->base_pre);
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                ptr = ptr_base + d0->pre + (d0->bmi.mv.as_mv.row >> 3) * d0->pre_stride + (d0->bmi.mv.as_mv.col >> 3);
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (d0->bmi.mv.as_mv.row & 7 || d0->bmi.mv.as_mv.col & 7)
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
675538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    x->subpixel_predict8x4(ptr, d0->pre_stride,
676538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        d0->bmi.mv.as_mv.col & 7,
677538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        d0->bmi.mv.as_mv.row & 7,
678538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        dst_ptr, x->dst.uv_stride);
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
682538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    RECON_INVOKE(&x->rtcd->recon, copy8x4)(ptr,
683538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                        d0->pre_stride, dst_ptr, x->dst.uv_stride);
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b_s(d0, dst_ptr, x->subpixel_predict);
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vp8_build_inter_predictors_b_s(d1, dst_ptr, x->subpixel_predict);
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
694