1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h"
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h"
135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/common/variance.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/filter.h"
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA
17167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vp8/common/arm/bilinearfilter_arm.h"
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance8x8_armv6
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char  *src_ptr,
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char *dst_ptr,
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int dst_pixels_per_line,
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int *sse
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned short first_pass[10*8];
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char  second_pass[8*8];
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *HFilter, *VFilter;
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    HFilter = vp8_bilinear_filters[xoffset];
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VFilter = vp8_bilinear_filters[yoffset];
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                            src_pixels_per_line,
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                            9, 8, HFilter);
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                             8, 8, 8, VFilter);
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_variance8x8_armv6(second_pass, 8, dst_ptr,
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                   dst_pixels_per_line, sse);
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance16x16_armv6
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char  *src_ptr,
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char *dst_ptr,
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int dst_pixels_per_line,
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int *sse
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned short first_pass[36*16];
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char  second_pass[20*16];
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const short *HFilter, *VFilter;
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int var;
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xoffset == 4 && yoffset == 0)
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        var = vp8_variance_halfpixvar16x16_h_armv6(src_ptr, src_pixels_per_line,
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                   dst_ptr, dst_pixels_per_line, sse);
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (xoffset == 0 && yoffset == 4)
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        var = vp8_variance_halfpixvar16x16_v_armv6(src_ptr, src_pixels_per_line,
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                   dst_ptr, dst_pixels_per_line, sse);
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (xoffset == 4 && yoffset == 4)
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        var = vp8_variance_halfpixvar16x16_hv_armv6(src_ptr, src_pixels_per_line,
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                   dst_ptr, dst_pixels_per_line, sse);
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        HFilter = vp8_bilinear_filters[xoffset];
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        VFilter = vp8_bilinear_filters[yoffset];
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                src_pixels_per_line,
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                17, 16, HFilter);
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                                 16, 16, 16, VFilter);
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        var = vp8_variance16x16_armv6(second_pass, 16, dst_ptr,
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                       dst_pixels_per_line, sse);
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return var;
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif /* HAVE_MEDIA */
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
987765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#if HAVE_NEON_ASM
995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgextern unsigned int vp8_sub_pixel_variance16x16_neon_func
1015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org(
1025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const unsigned char  *src_ptr,
1035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int  src_pixels_per_line,
1045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int  xoffset,
1055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int  yoffset,
1065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const unsigned char *dst_ptr,
1075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    int dst_pixels_per_line,
1085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    unsigned int *sse
1095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org);
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance16x16_neon
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char  *src_ptr,
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  src_pixels_per_line,
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  xoffset,
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int  yoffset,
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const unsigned char *dst_ptr,
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int dst_pixels_per_line,
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int *sse
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  if (xoffset == 4 && yoffset == 0)
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_variance_halfpixvar16x16_h_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  else if (xoffset == 0 && yoffset == 4)
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_variance_halfpixvar16x16_v_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  else if (xoffset == 4 && yoffset == 4)
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_variance_halfpixvar16x16_hv_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org  else
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_sub_pixel_variance16x16_neon_func(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse);
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
133