2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
12 #include "vpx_ports/config.h"
14 #include "vp8/common/filter.h"
15 #include "vp8/common/subpixel.h"
16 #include "vpx_ports/mem.h"
18 extern void vp8_filter_block2d_first_pass_armv6
20 unsigned char *src_ptr
,
22 unsigned int src_pixels_per_line
,
23 unsigned int output_width
,
24 unsigned int output_height
,
25 const short *vp8_filter
28 extern void vp8_filter_block2d_second_pass_armv6
31 unsigned char *output_ptr
,
32 unsigned int output_pitch
,
34 const short *vp8_filter
37 extern void vp8_filter4_block2d_second_pass_armv6
40 unsigned char *output_ptr
,
41 unsigned int output_pitch
,
43 const short *vp8_filter
46 extern void vp8_filter_block2d_first_pass_only_armv6
48 unsigned char *src_ptr
,
49 unsigned char *output_ptr
,
50 unsigned int src_pixels_per_line
,
52 unsigned int output_pitch
,
53 const short *vp8_filter
57 extern void vp8_filter_block2d_second_pass_only_armv6
59 unsigned char *src_ptr
,
60 unsigned char *output_ptr
,
61 unsigned int src_pixels_per_line
,
63 unsigned int output_pitch
,
64 const short *vp8_filter
68 void vp8_sixtap_predict_armv6
70 unsigned char *src_ptr
,
71 int src_pixels_per_line
,
74 unsigned char *dst_ptr
,
80 DECLARE_ALIGNED_ARRAY(4, short, FData
, 12*4); /* Temp data buffer used in filtering */
83 HFilter
= vp8_sub_pel_filters
[xoffset
]; /* 6 tap */
84 VFilter
= vp8_sub_pel_filters
[yoffset
]; /* 6 tap */
86 /* Vfilter is null. First pass only */
87 if (xoffset
&& !yoffset
)
89 /*vp8_filter_block2d_first_pass_armv6 ( src_ptr, FData+2, src_pixels_per_line, 4, 4, HFilter );
90 vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4, VFilter );*/
92 vp8_filter_block2d_first_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 4, dst_pitch
, HFilter
);
94 /* Hfilter is null. Second pass only */
95 else if (!xoffset
&& yoffset
)
97 vp8_filter_block2d_second_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 4, dst_pitch
, VFilter
);
101 /* Vfilter is a 4 tap filter */
104 vp8_filter_block2d_first_pass_armv6(src_ptr
- src_pixels_per_line
, FData
+ 1, src_pixels_per_line
, 4, 7, HFilter
);
105 vp8_filter4_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 4, VFilter
);
107 /* Vfilter is 6 tap filter */
110 vp8_filter_block2d_first_pass_armv6(src_ptr
- (2 * src_pixels_per_line
), FData
, src_pixels_per_line
, 4, 9, HFilter
);
111 vp8_filter_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 4, VFilter
);
116 void vp8_sixtap_predict8x8_armv6
118 unsigned char *src_ptr
,
119 int src_pixels_per_line
,
122 unsigned char *dst_ptr
,
126 const short *HFilter
;
127 const short *VFilter
;
128 DECLARE_ALIGNED_ARRAY(4, short, FData
, 16*8); /* Temp data buffer used in filtering */
130 HFilter
= vp8_sub_pel_filters
[xoffset
]; /* 6 tap */
131 VFilter
= vp8_sub_pel_filters
[yoffset
]; /* 6 tap */
133 if (xoffset
&& !yoffset
)
135 vp8_filter_block2d_first_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 8, dst_pitch
, HFilter
);
137 /* Hfilter is null. Second pass only */
138 else if (!xoffset
&& yoffset
)
140 vp8_filter_block2d_second_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 8, dst_pitch
, VFilter
);
146 vp8_filter_block2d_first_pass_armv6(src_ptr
- src_pixels_per_line
, FData
+ 1, src_pixels_per_line
, 8, 11, HFilter
);
147 vp8_filter4_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 8, VFilter
);
151 vp8_filter_block2d_first_pass_armv6(src_ptr
- (2 * src_pixels_per_line
), FData
, src_pixels_per_line
, 8, 13, HFilter
);
152 vp8_filter_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 8, VFilter
);
158 void vp8_sixtap_predict16x16_armv6
160 unsigned char *src_ptr
,
161 int src_pixels_per_line
,
164 unsigned char *dst_ptr
,
168 const short *HFilter
;
169 const short *VFilter
;
170 DECLARE_ALIGNED_ARRAY(4, short, FData
, 24*16); /* Temp data buffer used in filtering */
172 HFilter
= vp8_sub_pel_filters
[xoffset
]; /* 6 tap */
173 VFilter
= vp8_sub_pel_filters
[yoffset
]; /* 6 tap */
175 if (xoffset
&& !yoffset
)
177 vp8_filter_block2d_first_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 16, dst_pitch
, HFilter
);
179 /* Hfilter is null. Second pass only */
180 else if (!xoffset
&& yoffset
)
182 vp8_filter_block2d_second_pass_only_armv6(src_ptr
, dst_ptr
, src_pixels_per_line
, 16, dst_pitch
, VFilter
);
188 vp8_filter_block2d_first_pass_armv6(src_ptr
- src_pixels_per_line
, FData
+ 1, src_pixels_per_line
, 16, 19, HFilter
);
189 vp8_filter4_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 16, VFilter
);
193 vp8_filter_block2d_first_pass_armv6(src_ptr
- (2 * src_pixels_per_line
), FData
, src_pixels_per_line
, 16, 21, HFilter
);
194 vp8_filter_block2d_second_pass_armv6(FData
+ 2, dst_ptr
, dst_pitch
, 16, VFilter
);