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
12 #include "vpx_ports/config.h"
13 #include <math.h>
14 #include "vp8/common/loopfilter.h"
15 #include "vp8/common/onyxc_int.h"
16
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);
23
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);
30
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;
35
36
37 #if HAVE_ARMV6
38 /*ARMV6 loopfilter functions*/
39 /* Horizontal MB filtering */
vp8_loop_filter_mbh_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
42 {
43 (void) simpler_lpf;
44 vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
45
46 if (u_ptr)
47 vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
48
49 if (v_ptr)
50 vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
51 }
52
vp8_loop_filter_mbhs_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
55 {
56 (void) u_ptr;
57 (void) v_ptr;
58 (void) uv_stride;
59 (void) simpler_lpf;
60 vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
61 }
62
63 /* Vertical MB Filtering */
vp8_loop_filter_mbv_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
66 {
67 (void) simpler_lpf;
68 vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
69
70 if (u_ptr)
71 vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
72
73 if (v_ptr)
74 vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
75 }
76
vp8_loop_filter_mbvs_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
79 {
80 (void) u_ptr;
81 (void) v_ptr;
82 (void) uv_stride;
83 (void) simpler_lpf;
84 vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
85 }
86
87 /* Horizontal B Filtering */
vp8_loop_filter_bh_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
90 {
91 (void) 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);
95
96 if (u_ptr)
97 vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
98
99 if (v_ptr)
100 vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
101 }
102
vp8_loop_filter_bhs_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
105 {
106 (void) u_ptr;
107 (void) v_ptr;
108 (void) uv_stride;
109 (void) 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);
113 }
114
115 /* Vertical B Filtering */
vp8_loop_filter_bv_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
118 {
119 (void) 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);
123
124 if (u_ptr)
125 vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
126
127 if (v_ptr)
128 vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
129 }
130
vp8_loop_filter_bvs_armv6(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
133 {
134 (void) u_ptr;
135 (void) v_ptr;
136 (void) uv_stride;
137 (void) 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);
141 }
142 #endif
143
144 #if HAVE_ARMV7
145 /* NEON loopfilter functions */
146 /* Horizontal MB filtering */
vp8_loop_filter_mbh_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
149 {
150 (void) simpler_lpf;
151 vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
152
153 if (u_ptr)
154 vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
155 }
156
vp8_loop_filter_mbhs_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
159 {
160 (void) u_ptr;
161 (void) v_ptr;
162 (void) uv_stride;
163 (void) simpler_lpf;
164 vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
165 }
166
167 /* Vertical MB Filtering */
vp8_loop_filter_mbv_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
170 {
171 (void) simpler_lpf;
172 vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
173
174 if (u_ptr)
175 vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
176 }
177
vp8_loop_filter_mbvs_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
180 {
181 (void) u_ptr;
182 (void) v_ptr;
183 (void) uv_stride;
184 (void) simpler_lpf;
185 vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
186 }
187
188 /* Horizontal B Filtering */
vp8_loop_filter_bh_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
191 {
192 (void) 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);
196
197 if (u_ptr)
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);
199 }
200
vp8_loop_filter_bhs_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
203 {
204 (void) u_ptr;
205 (void) v_ptr;
206 (void) uv_stride;
207 (void) 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);
211 }
212
213 /* Vertical B Filtering */
vp8_loop_filter_bv_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
216 {
217 (void) 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);
221
222 if (u_ptr)
223 vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4);
224 }
225
vp8_loop_filter_bvs_neon(unsigned char * y_ptr,unsigned char * u_ptr,unsigned char * v_ptr,int y_stride,int uv_stride,loop_filter_info * lfi,int simpler_lpf)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)
228 {
229 (void) u_ptr;
230 (void) v_ptr;
231 (void) uv_stride;
232 (void) 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);
236 }
237 #endif
238