2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
12 #include "vpx_ports/config.h"
14 #include "vp8/common/loopfilter.h"
15 #include "vp8/common/onyxc_int.h"
17 extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6
);
18 extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6
);
19 extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6
);
20 extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6
);
21 extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6
);
22 extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6
);
24 extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon
);
25 extern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon
);
26 extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon
);
27 extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon
);
28 extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon
);
29 extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon
);
31 extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon
;
32 extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon
;
33 extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon
;
34 extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon
;
38 /*ARMV6 loopfilter functions*/
39 /* Horizontal MB filtering */
40 void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
41 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
44 vp8_mbloop_filter_horizontal_edge_armv6(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
47 vp8_mbloop_filter_horizontal_edge_armv6(u_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 1);
50 vp8_mbloop_filter_horizontal_edge_armv6(v_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 1);
53 void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
54 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
60 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
63 /* Vertical MB Filtering */
64 void vp8_loop_filter_mbv_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
65 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
68 vp8_mbloop_filter_vertical_edge_armv6(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
71 vp8_mbloop_filter_vertical_edge_armv6(u_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 1);
74 vp8_mbloop_filter_vertical_edge_armv6(v_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 1);
77 void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
78 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
84 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
87 /* Horizontal B Filtering */
88 void vp8_loop_filter_bh_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
89 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
92 vp8_loop_filter_horizontal_edge_armv6(y_ptr
+ 4 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
93 vp8_loop_filter_horizontal_edge_armv6(y_ptr
+ 8 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
94 vp8_loop_filter_horizontal_edge_armv6(y_ptr
+ 12 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
97 vp8_loop_filter_horizontal_edge_armv6(u_ptr
+ 4 * uv_stride
, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 1);
100 vp8_loop_filter_horizontal_edge_armv6(v_ptr
+ 4 * uv_stride
, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 1);
103 void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
104 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
110 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr
+ 4 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
111 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr
+ 8 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
112 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr
+ 12 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
115 /* Vertical B Filtering */
116 void vp8_loop_filter_bv_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
117 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
120 vp8_loop_filter_vertical_edge_armv6(y_ptr
+ 4, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
121 vp8_loop_filter_vertical_edge_armv6(y_ptr
+ 8, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
122 vp8_loop_filter_vertical_edge_armv6(y_ptr
+ 12, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
125 vp8_loop_filter_vertical_edge_armv6(u_ptr
+ 4, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 1);
128 vp8_loop_filter_vertical_edge_armv6(v_ptr
+ 4, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 1);
131 void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
132 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
138 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr
+ 4, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
139 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr
+ 8, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
140 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr
+ 12, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
145 /* NEON loopfilter functions */
146 /* Horizontal MB filtering */
147 void vp8_loop_filter_mbh_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
148 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
151 vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
154 vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, v_ptr
);
157 void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
158 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
164 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
167 /* Vertical MB Filtering */
168 void vp8_loop_filter_mbv_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
169 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
172 vp8_mbloop_filter_vertical_edge_y_neon(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
175 vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr
, uv_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, v_ptr
);
178 void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
179 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
185 vp8_loop_filter_simple_vertical_edge_neon(y_ptr
, y_stride
, lfi
->mbflim
, lfi
->lim
, lfi
->thr
, 2);
188 /* Horizontal B Filtering */
189 void vp8_loop_filter_bh_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
190 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
193 vp8_loop_filter_horizontal_edge_y_neon(y_ptr
+ 4 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
194 vp8_loop_filter_horizontal_edge_y_neon(y_ptr
+ 8 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
195 vp8_loop_filter_horizontal_edge_y_neon(y_ptr
+ 12 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
198 vp8_loop_filter_horizontal_edge_uv_neon(u_ptr
+ 4 * uv_stride
, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, v_ptr
+ 4 * uv_stride
);
201 void vp8_loop_filter_bhs_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
202 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
208 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr
+ 4 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
209 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr
+ 8 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
210 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr
+ 12 * y_stride
, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
213 /* Vertical B Filtering */
214 void vp8_loop_filter_bv_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
215 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
218 vp8_loop_filter_vertical_edge_y_neon(y_ptr
+ 4, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
219 vp8_loop_filter_vertical_edge_y_neon(y_ptr
+ 8, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
220 vp8_loop_filter_vertical_edge_y_neon(y_ptr
+ 12, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
223 vp8_loop_filter_vertical_edge_uv_neon(u_ptr
+ 4, uv_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, v_ptr
+ 4);
226 void vp8_loop_filter_bvs_neon(unsigned char *y_ptr
, unsigned char *u_ptr
, unsigned char *v_ptr
,
227 int y_stride
, int uv_stride
, loop_filter_info
*lfi
, int simpler_lpf
)
233 vp8_loop_filter_simple_vertical_edge_neon(y_ptr
+ 4, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
234 vp8_loop_filter_simple_vertical_edge_neon(y_ptr
+ 8, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);
235 vp8_loop_filter_simple_vertical_edge_neon(y_ptr
+ 12, y_stride
, lfi
->flim
, lfi
->lim
, lfi
->thr
, 2);