190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/config.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h>
1479f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/loopfilter.h"
1579f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxc_int.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6);
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6);
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon);
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon);
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon);
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon);
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon);
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon);
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon;
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon;
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if HAVE_ARMV6
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*ARMV6 loopfilter functions*/
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Horizontal MB filtering */
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
4479f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
4779f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (v_ptr)
5079f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
6079f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Vertical MB Filtering */
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
6879f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
7179f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (v_ptr)
7479f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
8479f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Horizontal B Filtering */
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
9779f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (v_ptr)
10079f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Vertical B Filtering */
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
12579f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (v_ptr)
12879f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if HAVE_ARMV7
145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* NEON loopfilter functions */
146538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Horizontal MB filtering */
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
15179f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
15479f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
16479f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
167538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Vertical MB Filtering */
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
17279f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
17579f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
18579f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
188538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Horizontal B Filtering */
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
19879f15823c34ae1e423108295e416213200bb280fAndreas Huber        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);
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Vertical B Filtering */
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                             int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (u_ptr)
22379f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4);
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_loop_filter_bvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) u_ptr;
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) v_ptr;
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) uv_stride;
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) simpler_lpf;
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
238