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 "vpx_mem/vpx_mem.h" 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "reconintra.h" 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_predict_intra4x4(BLOCKD *x, 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int b_mode, 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *predictor) 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i, r, c; 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *Above = *(x->base_dst) + x->dst - x->dst_stride; 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char Left[4]; 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char top_left = Above[-1]; 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Left[0] = (*(x->base_dst))[x->dst - 1]; 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Left[1] = (*(x->base_dst))[x->dst - 1 + x->dst_stride]; 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Left[2] = (*(x->base_dst))[x->dst - 1 + 2 * x->dst_stride]; 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Left[3] = (*(x->base_dst))[x->dst - 1 + 3 * x->dst_stride]; 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch (b_mode) 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_DC_PRED: 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int expected_dc = 0; 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 4; i++) 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber expected_dc += Above[i]; 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber expected_dc += Left[i]; 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber expected_dc = (expected_dc + 4) >> 3; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 4; r++) 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 4; c++) 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[c] = expected_dc; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor += 16; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_TM_PRED: 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* prediction similar to true_motion prediction */ 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 4; r++) 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 4; c++) 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int pred = Above[c] - top_left + Left[r]; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (pred < 0) 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred = 0; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (pred > 255) 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred = 255; 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[c] = pred; 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor += 16; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_VE_PRED: 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int ap[4]; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ap[0] = (top_left + 2 * Above[0] + Above[1] + 2) >> 2; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2; 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2; 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 4; r++) 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 4; c++) 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[c] = ap[c]; 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor += 16; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_HE_PRED: 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int lp[4]; 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2; 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 4; r++) 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 4; c++) 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[c] = lp[r]; 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor += 16; 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_LD_PRED: 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *ptr = Above; 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2; 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2; 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2; 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2; 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2; 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2; 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2; 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_RD_PRED: 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char pp[9]; 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[0] = Left[3]; 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[1] = Left[2]; 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[2] = Left[1]; 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[3] = Left[0]; 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[4] = top_left; 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[5] = Above[0]; 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[6] = Above[1]; 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[7] = Above[2]; 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[8] = Above[3]; 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_VR_PRED: 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char pp[9]; 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[0] = Left[3]; 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[1] = Left[2]; 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[2] = Left[1]; 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[3] = Left[0]; 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[4] = top_left; 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[5] = Above[0]; 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[6] = Above[1]; 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[7] = Above[2]; 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[8] = Above[3]; 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (pp[4] + pp[5] + 1) >> 1; 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = (pp[5] + pp[6] + 1) >> 1; 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = (pp[6] + pp[7] + 1) >> 1; 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = (pp[7] + pp[8] + 1) >> 1; 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_VL_PRED: 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *pp = Above; 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = (pp[1] + pp[2] + 1) >> 1; 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = (pp[2] + pp[3] + 1) >> 1; 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = (pp[3] + pp[4] + 1) >> 1; 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_HD_PRED: 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char pp[9]; 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[0] = Left[3]; 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[1] = Left[2]; 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[2] = Left[1]; 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[3] = Left[0]; 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[4] = top_left; 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[5] = Above[0]; 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[6] = Above[1]; 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[7] = Above[2]; 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pp[8] = Above[3]; 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = (pp[1] + pp[2] + 1) >> 1; 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (pp[3] + pp[4] + 1) >> 1; 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case B_HU_PRED: 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *pp = Left; 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 2] = 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 0] = (pp[1] + pp[2] + 1) >> 1; 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[0 * 16 + 3] = 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 2] = 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[1 * 16 + 3] = 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2; 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 2] = 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[2 * 16 + 3] = 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 0] = 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 1] = 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 2] = 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber predictor[3 * 16 + 3] = pp[3]; 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 298538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and 299538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * to the right prediction have filled in pixels to use. 300538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_intra_prediction_down_copy(MACROBLOCKD *x) 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *above_right = *(x->block[0].base_dst) + x->block[0].dst - x->block[0].dst_stride + 16; 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *src_ptr = (unsigned int *)above_right; 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *dst_ptr0 = (unsigned int *)(above_right + 4 * x->block[0].dst_stride); 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *dst_ptr1 = (unsigned int *)(above_right + 8 * x->block[0].dst_stride); 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *dst_ptr2 = (unsigned int *)(above_right + 12 * x->block[0].dst_stride); 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *dst_ptr0 = *src_ptr; 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *dst_ptr1 = *src_ptr; 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *dst_ptr2 = *src_ptr; 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 316