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)
20typedef build_intra_predictors_mbuv_prototype((*build_intra_predictors_mbuv_fn_t));
21
22extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc_mmx2);
23extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dctop_mmx2);
24extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dcleft_mmx2);
25extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc128_mmx);
26extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_mmx2);
27extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_ssse3);
28extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ve_mmx);
29extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_sse2);
30extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_ssse3);
31
32static 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
71void 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
92void 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)
117typedef build_intra_predictors_mby_prototype((*build_intra_predictors_mby_fn_t));
118
119extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc_sse2);
120extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dctop_sse2);
121extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dcleft_sse2);
122extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc128_sse2);
123extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ho_sse2);
124extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ve_sse2);
125extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_sse2);
126extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_ssse3);
127
128static 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
163void 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
175void 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