1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h"
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/variance.h"
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/filter.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_MEDIA
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/arm/bilinearfilter_arm.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned int vp8_sub_pixel_variance8x8_armv6
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char  *src_ptr,
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  src_pixels_per_line,
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  xoffset,
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  yoffset,
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char *dst_ptr,
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int dst_pixels_per_line,
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int *sse
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned short first_pass[10*8];
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char  second_pass[8*8];
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const short *HFilter, *VFilter;
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    HFilter = vp8_bilinear_filters[xoffset];
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VFilter = vp8_bilinear_filters[yoffset];
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            src_pixels_per_line,
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            9, 8, HFilter);
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             8, 8, 8, VFilter);
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return vp8_variance8x8_armv6(second_pass, 8, dst_ptr,
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   dst_pixels_per_line, sse);
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned int vp8_sub_pixel_variance16x16_armv6
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char  *src_ptr,
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  src_pixels_per_line,
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  xoffset,
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  yoffset,
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char *dst_ptr,
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int dst_pixels_per_line,
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int *sse
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned short first_pass[36*16];
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char  second_pass[20*16];
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const short *HFilter, *VFilter;
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int var;
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (xoffset == 4 && yoffset == 0)
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan        var = vp8_variance_halfpixvar16x16_h_armv6(src_ptr, src_pixels_per_line,
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   dst_ptr, dst_pixels_per_line, sse);
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (xoffset == 0 && yoffset == 4)
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan        var = vp8_variance_halfpixvar16x16_v_armv6(src_ptr, src_pixels_per_line,
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   dst_ptr, dst_pixels_per_line, sse);
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (xoffset == 4 && yoffset == 4)
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan        var = vp8_variance_halfpixvar16x16_hv_armv6(src_ptr, src_pixels_per_line,
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   dst_ptr, dst_pixels_per_line, sse);
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan        HFilter = vp8_bilinear_filters[xoffset];
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan        VFilter = vp8_bilinear_filters[yoffset];
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                src_pixels_per_line,
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                17, 16, HFilter);
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 16, 16, 16, VFilter);
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan        var = vp8_variance16x16_armv6(second_pass, 16, dst_ptr,
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                       dst_pixels_per_line, sse);
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return var;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* HAVE_MEDIA */
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_NEON
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan
100233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern unsigned int vp8_sub_pixel_variance16x16_neon_func
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char  *src_ptr,
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  src_pixels_per_line,
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  xoffset,
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  yoffset,
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char *dst_ptr,
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int dst_pixels_per_line,
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int *sse
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan);
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan
111233d2500723e5594f3e7c70896ffeeef32b9c950ywanunsigned int vp8_sub_pixel_variance16x16_neon
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char  *src_ptr,
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  src_pixels_per_line,
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  xoffset,
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int  yoffset,
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const unsigned char *dst_ptr,
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int dst_pixels_per_line,
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int *sse
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (xoffset == 4 && yoffset == 0)
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return vp8_variance_halfpixvar16x16_h_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else if (xoffset == 0 && yoffset == 4)
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return vp8_variance_halfpixvar16x16_v_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else if (xoffset == 4 && yoffset == 4)
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return vp8_variance_halfpixvar16x16_hv_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return vp8_sub_pixel_variance16x16_neon_func(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse);
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
133