• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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