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