1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 
12 #include "vpx_config.h"
13 #include "vp8_rtcd.h"
14 #include "vpx_mem/vpx_mem.h"
15 #include "blockd.h"
16 
vp8_build_intra_predictors_mby_s_c(MACROBLOCKD * x,unsigned char * yabove_row,unsigned char * yleft,int left_stride,unsigned char * ypred_ptr,int y_stride)17 void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x,
18                                           unsigned char * yabove_row,
19                                           unsigned char * yleft,
20                                           int left_stride,
21                                           unsigned char * ypred_ptr,
22                                           int y_stride)
23 {
24     unsigned char yleft_col[16];
25     unsigned char ytop_left = yabove_row[-1];
26     int r, c, i;
27 
28     for (i = 0; i < 16; i++)
29     {
30         yleft_col[i] = yleft[i* left_stride];
31     }
32 
33     /* for Y */
34     switch (x->mode_info_context->mbmi.mode)
35     {
36     case DC_PRED:
37     {
38         int expected_dc;
39         int shift;
40         int average = 0;
41 
42 
43         if (x->up_available || x->left_available)
44         {
45             if (x->up_available)
46             {
47                 for (i = 0; i < 16; i++)
48                 {
49                     average += yabove_row[i];
50                 }
51             }
52 
53             if (x->left_available)
54             {
55 
56                 for (i = 0; i < 16; i++)
57                 {
58                     average += yleft_col[i];
59                 }
60 
61             }
62 
63 
64 
65             shift = 3 + x->up_available + x->left_available;
66             expected_dc = (average + (1 << (shift - 1))) >> shift;
67         }
68         else
69         {
70             expected_dc = 128;
71         }
72 
73         /*vpx_memset(ypred_ptr, expected_dc, 256);*/
74         for (r = 0; r < 16; r++)
75         {
76             vpx_memset(ypred_ptr, expected_dc, 16);
77             ypred_ptr += y_stride;
78         }
79     }
80     break;
81     case V_PRED:
82     {
83 
84         for (r = 0; r < 16; r++)
85         {
86 
87             ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
88             ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
89             ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
90             ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
91             ypred_ptr += y_stride;
92         }
93     }
94     break;
95     case H_PRED:
96     {
97 
98         for (r = 0; r < 16; r++)
99         {
100 
101             vpx_memset(ypred_ptr, yleft_col[r], 16);
102             ypred_ptr += y_stride;
103         }
104 
105     }
106     break;
107     case TM_PRED:
108     {
109 
110         for (r = 0; r < 16; r++)
111         {
112             for (c = 0; c < 16; c++)
113             {
114                 int pred =  yleft_col[r] + yabove_row[ c] - ytop_left;
115 
116                 if (pred < 0)
117                     pred = 0;
118 
119                 if (pred > 255)
120                     pred = 255;
121 
122                 ypred_ptr[c] = pred;
123             }
124 
125             ypred_ptr += y_stride;
126         }
127 
128     }
129     break;
130     case B_PRED:
131     case NEARESTMV:
132     case NEARMV:
133     case ZEROMV:
134     case NEWMV:
135     case SPLITMV:
136     case MB_MODE_COUNT:
137         break;
138     }
139 }
140 
vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD * x,unsigned char * uabove_row,unsigned char * vabove_row,unsigned char * uleft,unsigned char * vleft,int left_stride,unsigned char * upred_ptr,unsigned char * vpred_ptr,int pred_stride)141 void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x,
142                                          unsigned char * uabove_row,
143                                          unsigned char * vabove_row,
144                                          unsigned char * uleft,
145                                          unsigned char * vleft,
146                                          int left_stride,
147                                          unsigned char * upred_ptr,
148                                          unsigned char * vpred_ptr,
149                                          int pred_stride)
150 {
151     unsigned char uleft_col[8];
152     unsigned char utop_left = uabove_row[-1];
153     unsigned char vleft_col[8];
154     unsigned char vtop_left = vabove_row[-1];
155 
156     int i, j;
157 
158     for (i = 0; i < 8; i++)
159     {
160         uleft_col[i] = uleft [i* left_stride];
161         vleft_col[i] = vleft [i* left_stride];
162     }
163 
164     switch (x->mode_info_context->mbmi.uv_mode)
165     {
166     case DC_PRED:
167     {
168         int expected_udc;
169         int expected_vdc;
170         int shift;
171         int Uaverage = 0;
172         int Vaverage = 0;
173 
174         if (x->up_available)
175         {
176             for (i = 0; i < 8; i++)
177             {
178                 Uaverage += uabove_row[i];
179                 Vaverage += vabove_row[i];
180             }
181         }
182 
183         if (x->left_available)
184         {
185             for (i = 0; i < 8; i++)
186             {
187                 Uaverage += uleft_col[i];
188                 Vaverage += vleft_col[i];
189             }
190         }
191 
192         if (!x->up_available && !x->left_available)
193         {
194             expected_udc = 128;
195             expected_vdc = 128;
196         }
197         else
198         {
199             shift = 2 + x->up_available + x->left_available;
200             expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
201             expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
202         }
203 
204 
205         /*vpx_memset(upred_ptr,expected_udc,64);*/
206         /*vpx_memset(vpred_ptr,expected_vdc,64);*/
207         for (i = 0; i < 8; i++)
208         {
209             vpx_memset(upred_ptr, expected_udc, 8);
210             vpx_memset(vpred_ptr, expected_vdc, 8);
211             upred_ptr += pred_stride;
212             vpred_ptr += pred_stride;
213         }
214     }
215     break;
216     case V_PRED:
217     {
218         for (i = 0; i < 8; i++)
219         {
220             vpx_memcpy(upred_ptr, uabove_row, 8);
221             vpx_memcpy(vpred_ptr, vabove_row, 8);
222             upred_ptr += pred_stride;
223             vpred_ptr += pred_stride;
224         }
225 
226     }
227     break;
228     case H_PRED:
229     {
230         for (i = 0; i < 8; i++)
231         {
232             vpx_memset(upred_ptr, uleft_col[i], 8);
233             vpx_memset(vpred_ptr, vleft_col[i], 8);
234             upred_ptr += pred_stride;
235             vpred_ptr += pred_stride;
236         }
237     }
238 
239     break;
240     case TM_PRED:
241     {
242         for (i = 0; i < 8; i++)
243         {
244             for (j = 0; j < 8; j++)
245             {
246                 int predu = uleft_col[i] + uabove_row[j] - utop_left;
247                 int predv = vleft_col[i] + vabove_row[j] - vtop_left;
248 
249                 if (predu < 0)
250                     predu = 0;
251 
252                 if (predu > 255)
253                     predu = 255;
254 
255                 if (predv < 0)
256                     predv = 0;
257 
258                 if (predv > 255)
259                     predv = 255;
260 
261                 upred_ptr[j] = predu;
262                 vpred_ptr[j] = predv;
263             }
264 
265             upred_ptr += pred_stride;
266             vpred_ptr += pred_stride;
267         }
268 
269     }
270     break;
271     case B_PRED:
272     case NEARESTMV:
273     case NEARMV:
274     case ZEROMV:
275     case NEWMV:
276     case SPLITMV:
277     case MB_MODE_COUNT:
278         break;
279     }
280 }
281