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
17extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
18extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
19extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
20extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
21extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6);
22extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6);
23
24extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon);
25extern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon);
26extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon);
27extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon);
28extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon);
29extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon);
30
31extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon;
32extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon;
33extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon;
34extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon;
35
36
37#if HAVE_ARMV6
38/*ARMV6 loopfilter functions*/
39/* Horizontal MB filtering */
40void 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
53void 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 */
64void 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
77void 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 */
88void 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
103void 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 */
116void 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
131void 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 */
147void 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
157void 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 */
168void 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
178void 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 */
189void 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
201void 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 */
214void 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
226void 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