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
12167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h"
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <math.h>
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/filter.h"
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/mem.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_armv6
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src_ptr,
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    short         *output_ptr,
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int src_pixels_per_line,
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_width,
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_height,
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org// 8x8
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_8x8_armv6
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src_ptr,
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    short         *output_ptr,
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int src_pixels_per_line,
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_width,
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_height,
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org// 16x16
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_16x16_armv6
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src_ptr,
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    short         *output_ptr,
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int src_pixels_per_line,
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_width,
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_height,
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_second_pass_armv6
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    short         *src_ptr,
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *output_ptr,
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_pitch,
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int cnt,
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter4_block2d_second_pass_armv6
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    short         *src_ptr,
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *output_ptr,
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_pitch,
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int cnt,
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_only_armv6
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src_ptr,
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *output_ptr,
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int src_pixels_per_line,
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int cnt,
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_pitch,
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_second_pass_only_armv6
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *src_ptr,
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *output_ptr,
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int src_pixels_per_line,
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int cnt,
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int output_pitch,
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *vp8_filter
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org);
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA
905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_sixtap_predict4x4_armv6
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char  *src_ptr,
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *dst_ptr,
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  dst_pitch
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *HFilter;
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *VFilter;
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED_ARRAY(4, short, FData, 12*4); /* Temp data buffer used in filtering */
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Vfilter is null. First pass only */
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xoffset && !yoffset)
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /*vp8_filter_block2d_first_pass_armv6 ( src_ptr, FData+2, src_pixels_per_line, 4, 4, HFilter );
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4, VFilter );*/
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, HFilter);
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Hfilter is null. Second pass only */
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (!xoffset && yoffset)
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, VFilter);
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Vfilter is a 4 tap filter */
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (yoffset & 0x1)
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 4, 7, HFilter);
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter);
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Vfilter is 6 tap filter */
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 4, 9, HFilter);
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter);
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_sixtap_predict8x8_armv6
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char  *src_ptr,
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *dst_ptr,
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  dst_pitch
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *HFilter;
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *VFilter;
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data buffer used in filtering */
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xoffset && !yoffset)
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, HFilter);
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Hfilter is null. Second pass only */
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (!xoffset && yoffset)
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, VFilter);
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (yoffset & 0x1)
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 8, 11, HFilter);
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter);
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 8, 13, HFilter);
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter);
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_sixtap_predict16x16_armv6
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char  *src_ptr,
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char *dst_ptr,
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  dst_pitch
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *HFilter;
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short  *VFilter;
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED_ARRAY(4, short, FData, 24*16);    /* Temp data buffer used in filtering */
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xoffset && !yoffset)
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, HFilter);
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Hfilter is null. Second pass only */
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (!xoffset && yoffset)
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, VFilter);
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (yoffset & 0x1)
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 16, 19, HFilter);
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter);
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 16, 21, HFilter);
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter);
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
222