OLD | NEW |
(Empty) | |
| 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_ports/config.h" |
| 12 #include "vpx_mem/vpx_mem.h" |
| 13 #include "vp9/common/vp9_blockd.h" |
| 14 |
| 15 #define build_intra_predictors_mbuv_prototype(sym) \ |
| 16 void sym(unsigned char *dst, int dst_stride, \ |
| 17 const unsigned char *src, int src_stride) |
| 18 typedef build_intra_predictors_mbuv_prototype((*build_intra_pred_mbuv_fn_t)); |
| 19 |
| 20 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_dc_mmx2); |
| 21 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_dctop_mmx2); |
| 22 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_dcleft_mmx2); |
| 23 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_dc128_mmx); |
| 24 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_ho_mmx2); |
| 25 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_ho_ssse3); |
| 26 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_ve_mmx); |
| 27 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_tm_sse2); |
| 28 extern build_intra_predictors_mbuv_prototype(vp9_intra_pred_uv_tm_ssse3); |
| 29 |
| 30 static void build_intra_predictors_mbuv_x86(MACROBLOCKD *xd, |
| 31 unsigned char *dst_u, |
| 32 unsigned char *dst_v, |
| 33 int dst_stride, |
| 34 build_intra_pred_mbuv_fn_t tm_fn, |
| 35 build_intra_pred_mbuv_fn_t ho_fn) { |
| 36 int mode = xd->mode_info_context->mbmi.uv_mode; |
| 37 build_intra_pred_mbuv_fn_t fn; |
| 38 int src_stride = xd->dst.uv_stride; |
| 39 |
| 40 switch (mode) { |
| 41 case V_PRED: |
| 42 fn = vp9_intra_pred_uv_ve_mmx; |
| 43 break; |
| 44 case H_PRED: |
| 45 fn = ho_fn; |
| 46 break; |
| 47 case TM_PRED: |
| 48 fn = tm_fn; |
| 49 break; |
| 50 case DC_PRED: |
| 51 if (xd->up_available) { |
| 52 if (xd->left_available) { |
| 53 fn = vp9_intra_pred_uv_dc_mmx2; |
| 54 break; |
| 55 } else { |
| 56 fn = vp9_intra_pred_uv_dctop_mmx2; |
| 57 break; |
| 58 } |
| 59 } else if (xd->left_available) { |
| 60 fn = vp9_intra_pred_uv_dcleft_mmx2; |
| 61 break; |
| 62 } else { |
| 63 fn = vp9_intra_pred_uv_dc128_mmx; |
| 64 break; |
| 65 } |
| 66 break; |
| 67 default: |
| 68 return; |
| 69 } |
| 70 |
| 71 fn(dst_u, dst_stride, xd->dst.u_buffer, src_stride); |
| 72 fn(dst_v, dst_stride, xd->dst.v_buffer, src_stride); |
| 73 } |
| 74 |
| 75 void vp9_build_intra_predictors_mbuv_sse2(MACROBLOCKD *xd) { |
| 76 build_intra_predictors_mbuv_x86(xd, &xd->predictor[256], |
| 77 &xd->predictor[320], 8, |
| 78 vp9_intra_pred_uv_tm_sse2, |
| 79 vp9_intra_pred_uv_ho_mmx2); |
| 80 } |
| 81 |
| 82 void vp9_build_intra_predictors_mbuv_ssse3(MACROBLOCKD *xd) { |
| 83 build_intra_predictors_mbuv_x86(xd, &xd->predictor[256], |
| 84 &xd->predictor[320], 8, |
| 85 vp9_intra_pred_uv_tm_ssse3, |
| 86 vp9_intra_pred_uv_ho_ssse3); |
| 87 } |
| 88 |
| 89 void vp9_build_intra_predictors_mbuv_s_sse2(MACROBLOCKD *xd) { |
| 90 build_intra_predictors_mbuv_x86(xd, xd->dst.u_buffer, |
| 91 xd->dst.v_buffer, xd->dst.uv_stride, |
| 92 vp9_intra_pred_uv_tm_sse2, |
| 93 vp9_intra_pred_uv_ho_mmx2); |
| 94 } |
| 95 |
| 96 void vp9_build_intra_predictors_mbuv_s_ssse3(MACROBLOCKD *xd) { |
| 97 build_intra_predictors_mbuv_x86(xd, xd->dst.u_buffer, |
| 98 xd->dst.v_buffer, xd->dst.uv_stride, |
| 99 vp9_intra_pred_uv_tm_ssse3, |
| 100 vp9_intra_pred_uv_ho_ssse3); |
| 101 } |
OLD | NEW |