1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "blockd.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_intra4x4_predict_c(unsigned char *Above,
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            unsigned char *yleft, int left_stride,
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            int           _b_mode,
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            unsigned char *dst, int dst_stride,
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            unsigned char top_left)
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i, r, c;
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan    B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode;
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char Left[4];
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Left[0] = yleft[0];
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Left[1] = yleft[left_stride];
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Left[2] = yleft[2 * left_stride];
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    Left[3] = yleft[3 * left_stride];
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    switch (b_mode)
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_DC_PRED:
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int expected_dc = 0;
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (i = 0; i < 4; i++)
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan            expected_dc += Above[i];
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan            expected_dc += Left[i];
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan        expected_dc = (expected_dc + 4) >> 3;
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (r = 0; r < 4; r++)
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan            for (c = 0; c < 4; c++)
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[c] = expected_dc;
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst += dst_stride;
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_TM_PRED:
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* prediction similar to true_motion prediction */
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (r = 0; r < 4; r++)
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan            for (c = 0; c < 4; c++)
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan                int pred = Above[c] - top_left + Left[r];
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan                if (pred < 0)
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    pred = 0;
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan                if (pred > 255)
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    pred = 255;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[c] = pred;
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst += dst_stride;
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_VE_PRED:
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned int ap[4];
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ap[0] = (top_left  + 2 * Above[0] + Above[1] + 2) >> 2;
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2;
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2;
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2;
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (r = 0; r < 4; r++)
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan            for (c = 0; c < 4; c++)
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[c] = ap[c];
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst += dst_stride;
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_HE_PRED:
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned int lp[4];
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan        lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2;
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan        lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2;
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        for (r = 0; r < 4; r++)
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan            for (c = 0; c < 4; c++)
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[c] = lp[r];
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst += dst_stride;
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_LD_PRED:
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char *ptr = Above;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 1] =
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 2] =
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 1] =
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[2 * dst_stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] =
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 2] =
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[2 * dst_stride + 1] =
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    dst[3 * dst_stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] =
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 2] =
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[3 * dst_stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 3] =
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[3 * dst_stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_RD_PRED:
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char pp[9];
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[0] = Left[3];
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[1] = Left[2];
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[2] = Left[1];
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[3] = Left[0];
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[4] = top_left;
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[5] = Above[0];
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[6] = Above[1];
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[7] = Above[2];
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[8] = Above[3];
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 1] =
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 2] =
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 1] =
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[1 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 3] =
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 2] =
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[1 * dst_stride + 1] =
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    dst[0 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 3] =
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 2] =
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[0 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] =
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_VR_PRED:
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char pp[9];
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[0] = Left[3];
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[1] = Left[2];
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[2] = Left[1];
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[3] = Left[0];
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[4] = top_left;
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[5] = Above[0];
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[6] = Above[1];
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[7] = Above[2];
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[8] = Above[3];
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 1] =
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 1] =
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 0] = (pp[4] + pp[5] + 1) >> 1;
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 2] =
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 2] =
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 1] = (pp[5] + pp[6] + 1) >> 1;
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 3] =
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 3] =
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 2] = (pp[6] + pp[7] + 1) >> 1;
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] = (pp[7] + pp[8] + 1) >> 1;
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_VL_PRED:
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char *pp = Above;
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 0] =
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 1] = (pp[1] + pp[2] + 1) >> 1;
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 1] =
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 1] =
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 2] = (pp[2] + pp[3] + 1) >> 1;
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 1] =
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] =
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 2] = (pp[3] + pp[4] + 1) >> 1;
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] =
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[3 * dst_stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_HD_PRED:
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char pp[9];
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[0] = Left[3];
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[1] = Left[2];
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[2] = Left[1];
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[3] = Left[0];
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[4] = top_left;
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[5] = Above[0];
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[6] = Above[1];
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[7] = Above[2];
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan        pp[8] = Above[3];
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[3 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 0] =
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[3 * dst_stride + 2] = (pp[1] + pp[2] + 1) >> 1;
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 1] =
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[3 * dst_stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 2] =
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 3] =
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 2] =
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 0] = (pp[3] + pp[4] + 1) >> 1;
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] =
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[0 * dst_stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case B_HU_PRED:
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan        unsigned char *pp = Left;
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 2] =
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 0] = (pp[1] + pp[2] + 1) >> 1;
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[0 * dst_stride + 3] =
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[1 * dst_stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 2] =
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[1 * dst_stride + 3] =
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan        dst[2 * dst_stride + 2] =
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan            dst[2 * dst_stride + 3] =
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan                dst[3 * dst_stride + 0] =
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan                    dst[3 * dst_stride + 1] =
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        dst[3 * dst_stride + 2] =
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            dst[3 * dst_stride + 3] = pp[3];
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    default:
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    break;
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
298