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 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 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 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