1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/loopfilter.h"
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxc_int.h"
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#define prototype_loopfilter(sym) \
185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    void sym(unsigned char *src, int pitch, const unsigned char *blimit,\
195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org             const unsigned char *limit, const unsigned char *thresh, int count)
205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
28d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if HAVE_NEON
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef void loopfilter_y_neon(unsigned char *src, int pitch,
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char blimit, unsigned char limit, unsigned char thresh);
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef void loopfilter_uv_neon(unsigned char *u, int pitch,
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char blimit, unsigned char limit, unsigned char thresh,
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned char *v);
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_y_neon vp8_loop_filter_horizontal_edge_y_neon;
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_y_neon vp8_loop_filter_vertical_edge_y_neon;
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_loop_filter_horizontal_edge_uv_neon;
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_loop_filter_vertical_edge_uv_neon;
397765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org
407765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgextern loopfilter_y_neon vp8_mbloop_filter_horizontal_edge_y_neon;
417765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgextern loopfilter_y_neon vp8_mbloop_filter_vertical_edge_y_neon;
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_mbloop_filter_horizontal_edge_uv_neon;
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern loopfilter_uv_neon vp8_mbloop_filter_vertical_edge_uv_neon;
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA
475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org/* ARMV6/MEDIA loopfilter functions*/
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal MB filtering */
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               int y_stride, int uv_stride, loop_filter_info *lfi)
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (v_ptr)
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical MB Filtering */
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               int y_stride, int uv_stride, loop_filter_info *lfi)
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (v_ptr)
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal B Filtering */
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (v_ptr)
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, int y_stride,
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               const unsigned char *blimit)
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, blimit);
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, blimit);
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, blimit);
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical B Filtering */
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (v_ptr)
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, int y_stride,
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               const unsigned char *blimit)
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, blimit);
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, blimit);
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, blimit);
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_NEON
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* NEON loopfilter functions */
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal MB filtering */
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char mblim = *lfi->mblim;
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char lim = *lfi->lim;
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char hev_thr = *lfi->hev_thr;
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr);
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr);
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical MB Filtering */
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              int y_stride, int uv_stride, loop_filter_info *lfi)
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char mblim = *lfi->mblim;
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char lim = *lfi->lim;
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char hev_thr = *lfi->hev_thr;
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr);
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr);
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Horizontal B Filtering */
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                             int y_stride, int uv_stride, loop_filter_info *lfi)
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char blim = *lfi->blim;
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char lim = *lfi->lim;
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char hev_thr = *lfi->hev_thr;
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, blim, lim, hev_thr);
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, blim, lim, hev_thr);
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, blim, lim, hev_thr);
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, blim, lim, hev_thr, v_ptr + 4 * uv_stride);
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Vertical B Filtering */
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                             int y_stride, int uv_stride, loop_filter_info *lfi)
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char blim = *lfi->blim;
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char lim = *lfi->lim;
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char hev_thr = *lfi->hev_thr;
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, blim, lim, hev_thr);
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, blim, lim, hev_thr);
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, blim, lim, hev_thr);
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (u_ptr)
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, blim, lim, hev_thr, v_ptr + 4);
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
182