1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vpx_config.h"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h"
145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "blockd.h"
155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_intra4x4_predict_c(unsigned char *Above,
17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                            unsigned char *yleft, int left_stride,
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org                            int           _b_mode,
19ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                            unsigned char *dst, int dst_stride,
20ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                            unsigned char top_left)
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i, r, c;
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode;
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char Left[4];
255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    Left[0] = yleft[0];
265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    Left[1] = yleft[left_stride];
275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    Left[2] = yleft[2 * left_stride];
285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    Left[3] = yleft[3 * left_stride];
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    switch (b_mode)
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_DC_PRED:
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int expected_dc = 0;
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 0; i < 4; i++)
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            expected_dc += Above[i];
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            expected_dc += Left[i];
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        expected_dc = (expected_dc + 4) >> 3;
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (r = 0; r < 4; r++)
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (c = 0; c < 4; c++)
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
48167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[c] = expected_dc;
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
51167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst += dst_stride;
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_TM_PRED:
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* prediction similar to true_motion prediction */
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (r = 0; r < 4; r++)
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (c = 0; c < 4; c++)
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int pred = Above[c] - top_left + Left[r];
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (pred < 0)
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    pred = 0;
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (pred > 255)
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    pred = 255;
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
70167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[c] = pred;
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
73167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst += dst_stride;
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_VE_PRED:
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int ap[4];
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ap[0] = (top_left  + 2 * Above[0] + Above[1] + 2) >> 2;
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2;
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2;
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2;
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (r = 0; r < 4; r++)
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (c = 0; c < 4; c++)
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
92167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[c] = ap[c];
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst += dst_stride;
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_HE_PRED:
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int lp[4];
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2;
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2;
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2;
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2;
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (r = 0; r < 4; r++)
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (c = 0; c < 4; c++)
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
115167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[c] = lp[r];
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
118167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst += dst_stride;
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_LD_PRED:
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char *ptr = Above;
125167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
126167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 1] =
127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
128167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 2] =
129167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 1] =
130167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[2 * dst_stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
131167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] =
132167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 2] =
133167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[2 * dst_stride + 1] =
134167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    dst[3 * dst_stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
135167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] =
136167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 2] =
137167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[3 * dst_stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
138167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 3] =
139167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[3 * dst_stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
140167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_RD_PRED:
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char pp[9];
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[0] = Left[3];
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[1] = Left[2];
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[2] = Left[1];
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[3] = Left[0];
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[4] = top_left;
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[5] = Above[0];
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[6] = Above[1];
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[7] = Above[2];
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[8] = Above[3];
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
159167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
160167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 1] =
161167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
162167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 2] =
163167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 1] =
164167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[1 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
165167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 3] =
166167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 2] =
167167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[1 * dst_stride + 1] =
168167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    dst[0 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
169167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 3] =
170167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 2] =
171167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[0 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
172167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] =
173167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
174167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_VR_PRED:
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char pp[9];
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[0] = Left[3];
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[1] = Left[2];
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[2] = Left[1];
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[3] = Left[0];
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[4] = top_left;
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[5] = Above[0];
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[6] = Above[1];
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[7] = Above[2];
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[8] = Above[3];
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
194167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
195167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
196167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 1] =
197167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
198167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 1] =
199167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 0] = (pp[4] + pp[5] + 1) >> 1;
200167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 2] =
201167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
202167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 2] =
203167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 1] = (pp[5] + pp[6] + 1) >> 1;
204167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 3] =
205167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
206167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 3] =
207167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 2] = (pp[6] + pp[7] + 1) >> 1;
208167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] = (pp[7] + pp[8] + 1) >> 1;
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_VL_PRED:
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char *pp = Above;
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
218167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
219167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
220167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 0] =
221167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 1] = (pp[1] + pp[2] + 1) >> 1;
222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 1] =
223167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
224167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 1] =
225167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 2] = (pp[2] + pp[3] + 1) >> 1;
226167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 1] =
227167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
228167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] =
229167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 2] = (pp[3] + pp[4] + 1) >> 1;
230167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] =
231167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[3 * dst_stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
232167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
233167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_HD_PRED:
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char pp[9];
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[0] = Left[3];
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[1] = Left[2];
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[2] = Left[1];
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[3] = Left[0];
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[4] = top_left;
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[5] = Above[0];
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[6] = Above[1];
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[7] = Above[2];
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        pp[8] = Above[3];
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[3 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
253167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 0] =
254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[3 * dst_stride + 2] = (pp[1] + pp[2] + 1) >> 1;
255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 1] =
256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[3 * dst_stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 2] =
258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 3] =
260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
261167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 2] =
262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 0] = (pp[3] + pp[4] + 1) >> 1;
263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] =
264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[0 * dst_stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case B_HU_PRED:
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char *pp = Left;
274167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 2] =
277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 0] = (pp[1] + pp[2] + 1) >> 1;
278167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[0 * dst_stride + 3] =
279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[1 * dst_stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
280167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 2] =
281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
282167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[1 * dst_stride + 3] =
283167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
284167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        dst[2 * dst_stride + 2] =
285167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            dst[2 * dst_stride + 3] =
286167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                dst[3 * dst_stride + 0] =
287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    dst[3 * dst_stride + 1] =
288167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        dst[3 * dst_stride + 2] =
289167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            dst[3 * dst_stride + 3] = pp[3];
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    break;
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    default:
294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    break;
295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
298