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 #include "vpx_config.h" 12 #include "vp8_rtcd.h" 13 #include "vpx_mem/vpx_mem.h" 14 #include "vp8/common/blockd.h" 15 16 #define build_intra_predictors_mbuv_prototype(sym) \ 17 void sym(unsigned char *dst, int dst_stride, \ 18 const unsigned char *above, \ 19 const unsigned char *left, int left_stride) 20 typedef build_intra_predictors_mbuv_prototype((*build_intra_predictors_mbuv_fn_t)); 21 22 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc_mmx2); 23 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dctop_mmx2); 24 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dcleft_mmx2); 25 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc128_mmx); 26 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_mmx2); 27 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_ssse3); 28 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ve_mmx); 29 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_sse2); 30 extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_ssse3); 31 32 static void vp8_build_intra_predictors_mbuv_x86(MACROBLOCKD *x, 33 unsigned char * uabove_row, 34 unsigned char * vabove_row, 35 unsigned char *dst_u, 36 unsigned char *dst_v, 37 int dst_stride, 38 unsigned char * uleft, 39 unsigned char * vleft, 40 int left_stride, 41 build_intra_predictors_mbuv_fn_t tm_func, 42 build_intra_predictors_mbuv_fn_t ho_func) 43 { 44 int mode = x->mode_info_context->mbmi.uv_mode; 45 build_intra_predictors_mbuv_fn_t fn; 46 47 switch (mode) { 48 case V_PRED: fn = vp8_intra_pred_uv_ve_mmx; break; 49 case H_PRED: fn = ho_func; break; 50 case TM_PRED: fn = tm_func; break; 51 case DC_PRED: 52 if (x->up_available) { 53 if (x->left_available) { 54 fn = vp8_intra_pred_uv_dc_mmx2; break; 55 } else { 56 fn = vp8_intra_pred_uv_dctop_mmx2; break; 57 } 58 } else if (x->left_available) { 59 fn = vp8_intra_pred_uv_dcleft_mmx2; break; 60 } else { 61 fn = vp8_intra_pred_uv_dc128_mmx; break; 62 } 63 break; 64 default: return; 65 } 66 67 fn(dst_u, dst_stride, uabove_row, uleft, left_stride); 68 fn(dst_v, dst_stride, vabove_row, vleft, left_stride); 69 } 70 71 void vp8_build_intra_predictors_mbuv_s_sse2(MACROBLOCKD *x, 72 unsigned char * uabove_row, 73 unsigned char * vabove_row, 74 unsigned char * uleft, 75 unsigned char * vleft, 76 int left_stride, 77 unsigned char * upred_ptr, 78 unsigned char * vpred_ptr, 79 int pred_stride) 80 { 81 vp8_build_intra_predictors_mbuv_x86(x, 82 uabove_row, vabove_row, 83 upred_ptr, 84 vpred_ptr, pred_stride, 85 uleft, 86 vleft, 87 left_stride, 88 vp8_intra_pred_uv_tm_sse2, 89 vp8_intra_pred_uv_ho_mmx2); 90 } 91 92 void vp8_build_intra_predictors_mbuv_s_ssse3(MACROBLOCKD *x, 93 unsigned char * uabove_row, 94 unsigned char * vabove_row, 95 unsigned char * uleft, 96 unsigned char * vleft, 97 int left_stride, 98 unsigned char * upred_ptr, 99 unsigned char * vpred_ptr, 100 int pred_stride) 101 { 102 vp8_build_intra_predictors_mbuv_x86(x, 103 uabove_row, vabove_row, 104 upred_ptr, 105 vpred_ptr, pred_stride, 106 uleft, 107 vleft, 108 left_stride, 109 vp8_intra_pred_uv_tm_ssse3, 110 vp8_intra_pred_uv_ho_ssse3); 111 } 112 113 #define build_intra_predictors_mby_prototype(sym) \ 114 void sym(unsigned char *dst, int dst_stride, \ 115 const unsigned char *above, \ 116 const unsigned char *left, int left_stride) 117 typedef build_intra_predictors_mby_prototype((*build_intra_predictors_mby_fn_t)); 118 119 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc_sse2); 120 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dctop_sse2); 121 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dcleft_sse2); 122 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc128_sse2); 123 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ho_sse2); 124 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ve_sse2); 125 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_sse2); 126 extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_ssse3); 127 128 static void vp8_build_intra_predictors_mby_x86(MACROBLOCKD *x, 129 unsigned char * yabove_row, 130 unsigned char *dst_y, 131 int dst_stride, 132 unsigned char * yleft, 133 int left_stride, 134 build_intra_predictors_mby_fn_t tm_func) 135 { 136 int mode = x->mode_info_context->mbmi.mode; 137 build_intra_predictors_mbuv_fn_t fn; 138 139 switch (mode) { 140 case V_PRED: fn = vp8_intra_pred_y_ve_sse2; break; 141 case H_PRED: fn = vp8_intra_pred_y_ho_sse2; break; 142 case TM_PRED: fn = tm_func; break; 143 case DC_PRED: 144 if (x->up_available) { 145 if (x->left_available) { 146 fn = vp8_intra_pred_y_dc_sse2; break; 147 } else { 148 fn = vp8_intra_pred_y_dctop_sse2; break; 149 } 150 } else if (x->left_available) { 151 fn = vp8_intra_pred_y_dcleft_sse2; break; 152 } else { 153 fn = vp8_intra_pred_y_dc128_sse2; break; 154 } 155 break; 156 default: return; 157 } 158 159 fn(dst_y, dst_stride, yabove_row, yleft, left_stride); 160 return; 161 } 162 163 void vp8_build_intra_predictors_mby_s_sse2(MACROBLOCKD *x, 164 unsigned char * yabove_row, 165 unsigned char * yleft, 166 int left_stride, 167 unsigned char * ypred_ptr, 168 int y_stride) 169 { 170 vp8_build_intra_predictors_mby_x86(x, yabove_row, ypred_ptr, 171 y_stride, yleft, left_stride, 172 vp8_intra_pred_y_tm_sse2); 173 } 174 175 void vp8_build_intra_predictors_mby_s_ssse3(MACROBLOCKD *x, 176 unsigned char * yabove_row, 177 unsigned char * yleft, 178 int left_stride, 179 unsigned char * ypred_ptr, 180 int y_stride) 181 { 182 vp8_build_intra_predictors_mby_x86(x, yabove_row, ypred_ptr, 183 y_stride, yleft, left_stride, 184 vp8_intra_pred_y_tm_ssse3); 185 186 } 187