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 #include "vpx_config.h"
12 #include "vp8_rtcd.h"
13 #include "vp8/common/variance.h"
14 #include "vp8/common/filter.h"
15
16 #if HAVE_MEDIA
17 #include "vp8/common/arm/bilinearfilter_arm.h"
18
vp8_sub_pixel_variance8x8_armv6(const unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,const unsigned char * dst_ptr,int dst_pixels_per_line,unsigned int * sse)19 unsigned int vp8_sub_pixel_variance8x8_armv6
20 (
21 const unsigned char *src_ptr,
22 int src_pixels_per_line,
23 int xoffset,
24 int yoffset,
25 const unsigned char *dst_ptr,
26 int dst_pixels_per_line,
27 unsigned int *sse
28 )
29 {
30 unsigned short first_pass[10*8];
31 unsigned char second_pass[8*8];
32 const short *HFilter, *VFilter;
33
34 HFilter = vp8_bilinear_filters[xoffset];
35 VFilter = vp8_bilinear_filters[yoffset];
36
37 vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
38 src_pixels_per_line,
39 9, 8, HFilter);
40 vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
41 8, 8, 8, VFilter);
42
43 return vp8_variance8x8_armv6(second_pass, 8, dst_ptr,
44 dst_pixels_per_line, sse);
45 }
46
vp8_sub_pixel_variance16x16_armv6(const unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,const unsigned char * dst_ptr,int dst_pixels_per_line,unsigned int * sse)47 unsigned int vp8_sub_pixel_variance16x16_armv6
48 (
49 const unsigned char *src_ptr,
50 int src_pixels_per_line,
51 int xoffset,
52 int yoffset,
53 const unsigned char *dst_ptr,
54 int dst_pixels_per_line,
55 unsigned int *sse
56 )
57 {
58 unsigned short first_pass[36*16];
59 unsigned char second_pass[20*16];
60 const short *HFilter, *VFilter;
61 unsigned int var;
62
63 if (xoffset == 4 && yoffset == 0)
64 {
65 var = vp8_variance_halfpixvar16x16_h_armv6(src_ptr, src_pixels_per_line,
66 dst_ptr, dst_pixels_per_line, sse);
67 }
68 else if (xoffset == 0 && yoffset == 4)
69 {
70 var = vp8_variance_halfpixvar16x16_v_armv6(src_ptr, src_pixels_per_line,
71 dst_ptr, dst_pixels_per_line, sse);
72 }
73 else if (xoffset == 4 && yoffset == 4)
74 {
75 var = vp8_variance_halfpixvar16x16_hv_armv6(src_ptr, src_pixels_per_line,
76 dst_ptr, dst_pixels_per_line, sse);
77 }
78 else
79 {
80 HFilter = vp8_bilinear_filters[xoffset];
81 VFilter = vp8_bilinear_filters[yoffset];
82
83 vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
84 src_pixels_per_line,
85 17, 16, HFilter);
86 vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
87 16, 16, 16, VFilter);
88
89 var = vp8_variance16x16_armv6(second_pass, 16, dst_ptr,
90 dst_pixels_per_line, sse);
91 }
92 return var;
93 }
94
95 #endif /* HAVE_MEDIA */
96
97
98 #if HAVE_NEON_ASM
99
100 extern unsigned int vp8_sub_pixel_variance16x16_neon_func
101 (
102 const unsigned char *src_ptr,
103 int src_pixels_per_line,
104 int xoffset,
105 int yoffset,
106 const unsigned char *dst_ptr,
107 int dst_pixels_per_line,
108 unsigned int *sse
109 );
110
vp8_sub_pixel_variance16x16_neon(const unsigned char * src_ptr,int src_pixels_per_line,int xoffset,int yoffset,const unsigned char * dst_ptr,int dst_pixels_per_line,unsigned int * sse)111 unsigned int vp8_sub_pixel_variance16x16_neon
112 (
113 const unsigned char *src_ptr,
114 int src_pixels_per_line,
115 int xoffset,
116 int yoffset,
117 const unsigned char *dst_ptr,
118 int dst_pixels_per_line,
119 unsigned int *sse
120 )
121 {
122 if (xoffset == 4 && yoffset == 0)
123 return vp8_variance_halfpixvar16x16_h_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
124 else if (xoffset == 0 && yoffset == 4)
125 return vp8_variance_halfpixvar16x16_v_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
126 else if (xoffset == 4 && yoffset == 4)
127 return vp8_variance_halfpixvar16x16_hv_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
128 else
129 return vp8_sub_pixel_variance16x16_neon_func(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse);
130 }
131
132 #endif
133