• 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_config.h"
13 #include "vp8_rtcd.h"
14 #include <math.h>
15 #include "vp8/common/filter.h"
16 #include "vpx_ports/mem.h"
17 
18 extern void vp8_filter_block2d_first_pass_armv6
19 (
20     unsigned char *src_ptr,
21     short         *output_ptr,
22     unsigned int src_pixels_per_line,
23     unsigned int output_width,
24     unsigned int output_height,
25     const short *vp8_filter
26 );
27 
28 // 8x8
29 extern void vp8_filter_block2d_first_pass_8x8_armv6
30 (
31     unsigned char *src_ptr,
32     short         *output_ptr,
33     unsigned int src_pixels_per_line,
34     unsigned int output_width,
35     unsigned int output_height,
36     const short *vp8_filter
37 );
38 
39 // 16x16
40 extern void vp8_filter_block2d_first_pass_16x16_armv6
41 (
42     unsigned char *src_ptr,
43     short         *output_ptr,
44     unsigned int src_pixels_per_line,
45     unsigned int output_width,
46     unsigned int output_height,
47     const short *vp8_filter
48 );
49 
50 extern void vp8_filter_block2d_second_pass_armv6
51 (
52     short         *src_ptr,
53     unsigned char *output_ptr,
54     unsigned int output_pitch,
55     unsigned int cnt,
56     const short *vp8_filter
57 );
58 
59 extern void vp8_filter4_block2d_second_pass_armv6
60 (
61     short         *src_ptr,
62     unsigned char *output_ptr,
63     unsigned int output_pitch,
64     unsigned int cnt,
65     const short *vp8_filter
66 );
67 
68 extern void vp8_filter_block2d_first_pass_only_armv6
69 (
70     unsigned char *src_ptr,
71     unsigned char *output_ptr,
72     unsigned int src_pixels_per_line,
73     unsigned int cnt,
74     unsigned int output_pitch,
75     const short *vp8_filter
76 );
77 
78 
79 extern void vp8_filter_block2d_second_pass_only_armv6
80 (
81     unsigned char *src_ptr,
82     unsigned char *output_ptr,
83     unsigned int src_pixels_per_line,
84     unsigned int cnt,
85     unsigned int output_pitch,
86     const short *vp8_filter
87 );
88 
89 #if HAVE_MEDIA
vp8_sixtap_predict4x4_armv6(unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,unsigned char * dst_ptr,int dst_pitch)90 void vp8_sixtap_predict4x4_armv6
91 (
92     unsigned char  *src_ptr,
93     int  src_pixels_per_line,
94     int  xoffset,
95     int  yoffset,
96     unsigned char *dst_ptr,
97     int  dst_pitch
98 )
99 {
100     const short  *HFilter;
101     const short  *VFilter;
102     DECLARE_ALIGNED_ARRAY(4, short, FData, 12*4); /* Temp data buffer used in filtering */
103 
104 
105     HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
106     VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
107 
108     /* Vfilter is null. First pass only */
109     if (xoffset && !yoffset)
110     {
111         /*vp8_filter_block2d_first_pass_armv6 ( src_ptr, FData+2, src_pixels_per_line, 4, 4, HFilter );
112         vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4, VFilter );*/
113 
114         vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, HFilter);
115     }
116     /* Hfilter is null. Second pass only */
117     else if (!xoffset && yoffset)
118     {
119         vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, VFilter);
120     }
121     else
122     {
123         /* Vfilter is a 4 tap filter */
124         if (yoffset & 0x1)
125         {
126             vp8_filter_block2d_first_pass_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 4, 7, HFilter);
127             vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter);
128         }
129         /* Vfilter is 6 tap filter */
130         else
131         {
132             vp8_filter_block2d_first_pass_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 4, 9, HFilter);
133             vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter);
134         }
135     }
136 }
137 
vp8_sixtap_predict8x8_armv6(unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,unsigned char * dst_ptr,int dst_pitch)138 void vp8_sixtap_predict8x8_armv6
139 (
140     unsigned char  *src_ptr,
141     int  src_pixels_per_line,
142     int  xoffset,
143     int  yoffset,
144     unsigned char *dst_ptr,
145     int  dst_pitch
146 )
147 {
148     const short  *HFilter;
149     const short  *VFilter;
150     DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data buffer used in filtering */
151 
152     HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
153     VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
154 
155     if (xoffset && !yoffset)
156     {
157         vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, HFilter);
158     }
159     /* Hfilter is null. Second pass only */
160     else if (!xoffset && yoffset)
161     {
162         vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, VFilter);
163     }
164     else
165     {
166         if (yoffset & 0x1)
167         {
168             vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 8, 11, HFilter);
169             vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter);
170         }
171         else
172         {
173             vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 8, 13, HFilter);
174             vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter);
175         }
176     }
177 }
178 
179 
vp8_sixtap_predict16x16_armv6(unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,unsigned char * dst_ptr,int dst_pitch)180 void vp8_sixtap_predict16x16_armv6
181 (
182     unsigned char  *src_ptr,
183     int  src_pixels_per_line,
184     int  xoffset,
185     int  yoffset,
186     unsigned char *dst_ptr,
187     int  dst_pitch
188 )
189 {
190     const short  *HFilter;
191     const short  *VFilter;
192     DECLARE_ALIGNED_ARRAY(4, short, FData, 24*16);    /* Temp data buffer used in filtering */
193 
194     HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
195     VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
196 
197     if (xoffset && !yoffset)
198     {
199         vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, HFilter);
200     }
201     /* Hfilter is null. Second pass only */
202     else if (!xoffset && yoffset)
203     {
204         vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, VFilter);
205     }
206     else
207     {
208         if (yoffset & 0x1)
209         {
210             vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 16, 19, HFilter);
211             vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter);
212         }
213         else
214         {
215             vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 16, 21, HFilter);
216             vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter);
217         }
218     }
219 
220 }
221 #endif
222