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 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 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