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