1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libvpx/vp8/common/reconintra.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,280 @@ 1.4 +/* 1.5 + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license 1.8 + * that can be found in the LICENSE file in the root of the source 1.9 + * tree. An additional intellectual property rights grant can be found 1.10 + * in the file PATENTS. All contributing project authors may 1.11 + * be found in the AUTHORS file in the root of the source tree. 1.12 + */ 1.13 + 1.14 + 1.15 +#include "vpx_config.h" 1.16 +#include "vp8_rtcd.h" 1.17 +#include "vpx_mem/vpx_mem.h" 1.18 +#include "blockd.h" 1.19 + 1.20 +void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x, 1.21 + unsigned char * yabove_row, 1.22 + unsigned char * yleft, 1.23 + int left_stride, 1.24 + unsigned char * ypred_ptr, 1.25 + int y_stride) 1.26 +{ 1.27 + unsigned char yleft_col[16]; 1.28 + unsigned char ytop_left = yabove_row[-1]; 1.29 + int r, c, i; 1.30 + 1.31 + for (i = 0; i < 16; i++) 1.32 + { 1.33 + yleft_col[i] = yleft[i* left_stride]; 1.34 + } 1.35 + 1.36 + /* for Y */ 1.37 + switch (x->mode_info_context->mbmi.mode) 1.38 + { 1.39 + case DC_PRED: 1.40 + { 1.41 + int expected_dc; 1.42 + int shift; 1.43 + int average = 0; 1.44 + 1.45 + 1.46 + if (x->up_available || x->left_available) 1.47 + { 1.48 + if (x->up_available) 1.49 + { 1.50 + for (i = 0; i < 16; i++) 1.51 + { 1.52 + average += yabove_row[i]; 1.53 + } 1.54 + } 1.55 + 1.56 + if (x->left_available) 1.57 + { 1.58 + 1.59 + for (i = 0; i < 16; i++) 1.60 + { 1.61 + average += yleft_col[i]; 1.62 + } 1.63 + 1.64 + } 1.65 + 1.66 + 1.67 + 1.68 + shift = 3 + x->up_available + x->left_available; 1.69 + expected_dc = (average + (1 << (shift - 1))) >> shift; 1.70 + } 1.71 + else 1.72 + { 1.73 + expected_dc = 128; 1.74 + } 1.75 + 1.76 + /*vpx_memset(ypred_ptr, expected_dc, 256);*/ 1.77 + for (r = 0; r < 16; r++) 1.78 + { 1.79 + vpx_memset(ypred_ptr, expected_dc, 16); 1.80 + ypred_ptr += y_stride; 1.81 + } 1.82 + } 1.83 + break; 1.84 + case V_PRED: 1.85 + { 1.86 + 1.87 + for (r = 0; r < 16; r++) 1.88 + { 1.89 + 1.90 + ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0]; 1.91 + ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1]; 1.92 + ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2]; 1.93 + ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3]; 1.94 + ypred_ptr += y_stride; 1.95 + } 1.96 + } 1.97 + break; 1.98 + case H_PRED: 1.99 + { 1.100 + 1.101 + for (r = 0; r < 16; r++) 1.102 + { 1.103 + 1.104 + vpx_memset(ypred_ptr, yleft_col[r], 16); 1.105 + ypred_ptr += y_stride; 1.106 + } 1.107 + 1.108 + } 1.109 + break; 1.110 + case TM_PRED: 1.111 + { 1.112 + 1.113 + for (r = 0; r < 16; r++) 1.114 + { 1.115 + for (c = 0; c < 16; c++) 1.116 + { 1.117 + int pred = yleft_col[r] + yabove_row[ c] - ytop_left; 1.118 + 1.119 + if (pred < 0) 1.120 + pred = 0; 1.121 + 1.122 + if (pred > 255) 1.123 + pred = 255; 1.124 + 1.125 + ypred_ptr[c] = pred; 1.126 + } 1.127 + 1.128 + ypred_ptr += y_stride; 1.129 + } 1.130 + 1.131 + } 1.132 + break; 1.133 + case B_PRED: 1.134 + case NEARESTMV: 1.135 + case NEARMV: 1.136 + case ZEROMV: 1.137 + case NEWMV: 1.138 + case SPLITMV: 1.139 + case MB_MODE_COUNT: 1.140 + break; 1.141 + } 1.142 +} 1.143 + 1.144 +void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x, 1.145 + unsigned char * uabove_row, 1.146 + unsigned char * vabove_row, 1.147 + unsigned char * uleft, 1.148 + unsigned char * vleft, 1.149 + int left_stride, 1.150 + unsigned char * upred_ptr, 1.151 + unsigned char * vpred_ptr, 1.152 + int pred_stride) 1.153 +{ 1.154 + unsigned char uleft_col[8]; 1.155 + unsigned char utop_left = uabove_row[-1]; 1.156 + unsigned char vleft_col[8]; 1.157 + unsigned char vtop_left = vabove_row[-1]; 1.158 + 1.159 + int i, j; 1.160 + 1.161 + for (i = 0; i < 8; i++) 1.162 + { 1.163 + uleft_col[i] = uleft [i* left_stride]; 1.164 + vleft_col[i] = vleft [i* left_stride]; 1.165 + } 1.166 + 1.167 + switch (x->mode_info_context->mbmi.uv_mode) 1.168 + { 1.169 + case DC_PRED: 1.170 + { 1.171 + int expected_udc; 1.172 + int expected_vdc; 1.173 + int shift; 1.174 + int Uaverage = 0; 1.175 + int Vaverage = 0; 1.176 + 1.177 + if (x->up_available) 1.178 + { 1.179 + for (i = 0; i < 8; i++) 1.180 + { 1.181 + Uaverage += uabove_row[i]; 1.182 + Vaverage += vabove_row[i]; 1.183 + } 1.184 + } 1.185 + 1.186 + if (x->left_available) 1.187 + { 1.188 + for (i = 0; i < 8; i++) 1.189 + { 1.190 + Uaverage += uleft_col[i]; 1.191 + Vaverage += vleft_col[i]; 1.192 + } 1.193 + } 1.194 + 1.195 + if (!x->up_available && !x->left_available) 1.196 + { 1.197 + expected_udc = 128; 1.198 + expected_vdc = 128; 1.199 + } 1.200 + else 1.201 + { 1.202 + shift = 2 + x->up_available + x->left_available; 1.203 + expected_udc = (Uaverage + (1 << (shift - 1))) >> shift; 1.204 + expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift; 1.205 + } 1.206 + 1.207 + 1.208 + /*vpx_memset(upred_ptr,expected_udc,64);*/ 1.209 + /*vpx_memset(vpred_ptr,expected_vdc,64);*/ 1.210 + for (i = 0; i < 8; i++) 1.211 + { 1.212 + vpx_memset(upred_ptr, expected_udc, 8); 1.213 + vpx_memset(vpred_ptr, expected_vdc, 8); 1.214 + upred_ptr += pred_stride; 1.215 + vpred_ptr += pred_stride; 1.216 + } 1.217 + } 1.218 + break; 1.219 + case V_PRED: 1.220 + { 1.221 + for (i = 0; i < 8; i++) 1.222 + { 1.223 + vpx_memcpy(upred_ptr, uabove_row, 8); 1.224 + vpx_memcpy(vpred_ptr, vabove_row, 8); 1.225 + upred_ptr += pred_stride; 1.226 + vpred_ptr += pred_stride; 1.227 + } 1.228 + 1.229 + } 1.230 + break; 1.231 + case H_PRED: 1.232 + { 1.233 + for (i = 0; i < 8; i++) 1.234 + { 1.235 + vpx_memset(upred_ptr, uleft_col[i], 8); 1.236 + vpx_memset(vpred_ptr, vleft_col[i], 8); 1.237 + upred_ptr += pred_stride; 1.238 + vpred_ptr += pred_stride; 1.239 + } 1.240 + } 1.241 + 1.242 + break; 1.243 + case TM_PRED: 1.244 + { 1.245 + for (i = 0; i < 8; i++) 1.246 + { 1.247 + for (j = 0; j < 8; j++) 1.248 + { 1.249 + int predu = uleft_col[i] + uabove_row[j] - utop_left; 1.250 + int predv = vleft_col[i] + vabove_row[j] - vtop_left; 1.251 + 1.252 + if (predu < 0) 1.253 + predu = 0; 1.254 + 1.255 + if (predu > 255) 1.256 + predu = 255; 1.257 + 1.258 + if (predv < 0) 1.259 + predv = 0; 1.260 + 1.261 + if (predv > 255) 1.262 + predv = 255; 1.263 + 1.264 + upred_ptr[j] = predu; 1.265 + vpred_ptr[j] = predv; 1.266 + } 1.267 + 1.268 + upred_ptr += pred_stride; 1.269 + vpred_ptr += pred_stride; 1.270 + } 1.271 + 1.272 + } 1.273 + break; 1.274 + case B_PRED: 1.275 + case NEARESTMV: 1.276 + case NEARMV: 1.277 + case ZEROMV: 1.278 + case NEWMV: 1.279 + case SPLITMV: 1.280 + case MB_MODE_COUNT: 1.281 + break; 1.282 + } 1.283 +}