179f15823c34ae1e423108295e416213200bb280fAndreas Huber/*
279f15823c34ae1e423108295e416213200bb280fAndreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
379f15823c34ae1e423108295e416213200bb280fAndreas Huber *
479f15823c34ae1e423108295e416213200bb280fAndreas Huber *  Use of this source code is governed by a BSD-style license
579f15823c34ae1e423108295e416213200bb280fAndreas Huber *  that can be found in the LICENSE file in the root of the source
679f15823c34ae1e423108295e416213200bb280fAndreas Huber *  tree. An additional intellectual property rights grant can be found
779f15823c34ae1e423108295e416213200bb280fAndreas Huber *  in the file PATENTS.  All contributing project authors may
879f15823c34ae1e423108295e416213200bb280fAndreas Huber *  be found in the AUTHORS file in the root of the source tree.
979f15823c34ae1e423108295e416213200bb280fAndreas Huber */
1079f15823c34ae1e423108295e416213200bb280fAndreas Huber
1179f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vpx_config.h"
1279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/encoder/variance.h"
1379f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/filter.h"
1479f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/arm/bilinearfilter_arm.h"
1579f15823c34ae1e423108295e416213200bb280fAndreas Huber
1679f15823c34ae1e423108295e416213200bb280fAndreas Huber#if HAVE_ARMV6
1779f15823c34ae1e423108295e416213200bb280fAndreas Huber
1879f15823c34ae1e423108295e416213200bb280fAndreas Huberunsigned int vp8_sub_pixel_variance8x8_armv6
1979f15823c34ae1e423108295e416213200bb280fAndreas Huber(
2079f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char  *src_ptr,
2179f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  src_pixels_per_line,
2279f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  xoffset,
2379f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  yoffset,
2479f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char *dst_ptr,
2579f15823c34ae1e423108295e416213200bb280fAndreas Huber    int dst_pixels_per_line,
2679f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int *sse
2779f15823c34ae1e423108295e416213200bb280fAndreas Huber)
2879f15823c34ae1e423108295e416213200bb280fAndreas Huber{
2979f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned short first_pass[10*8];
3079f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned char  second_pass[8*8];
3179f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter, *VFilter;
3279f15823c34ae1e423108295e416213200bb280fAndreas Huber
3379f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_bilinear_filters[xoffset];
3479f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_bilinear_filters[yoffset];
3579f15823c34ae1e423108295e416213200bb280fAndreas Huber
3679f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
3779f15823c34ae1e423108295e416213200bb280fAndreas Huber                                            src_pixels_per_line,
3879f15823c34ae1e423108295e416213200bb280fAndreas Huber                                            9, 8, HFilter);
3979f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
4079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                             8, 8, 8, VFilter);
4179f15823c34ae1e423108295e416213200bb280fAndreas Huber
4279f15823c34ae1e423108295e416213200bb280fAndreas Huber    return vp8_variance8x8_armv6(second_pass, 8, dst_ptr,
4379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                   dst_pixels_per_line, sse);
4479f15823c34ae1e423108295e416213200bb280fAndreas Huber}
4579f15823c34ae1e423108295e416213200bb280fAndreas Huber
4679f15823c34ae1e423108295e416213200bb280fAndreas Huberunsigned int vp8_sub_pixel_variance16x16_armv6
4779f15823c34ae1e423108295e416213200bb280fAndreas Huber(
4879f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char  *src_ptr,
4979f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  src_pixels_per_line,
5079f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  xoffset,
5179f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  yoffset,
5279f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char *dst_ptr,
5379f15823c34ae1e423108295e416213200bb280fAndreas Huber    int dst_pixels_per_line,
5479f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int *sse
5579f15823c34ae1e423108295e416213200bb280fAndreas Huber)
5679f15823c34ae1e423108295e416213200bb280fAndreas Huber{
5779f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned short first_pass[36*16];
5879f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned char  second_pass[20*16];
5979f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter, *VFilter;
6079f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int var;
6179f15823c34ae1e423108295e416213200bb280fAndreas Huber
6279f15823c34ae1e423108295e416213200bb280fAndreas Huber    if (xoffset == 4 && yoffset == 0)
6379f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
6479f15823c34ae1e423108295e416213200bb280fAndreas Huber        var = vp8_variance_halfpixvar16x16_h_armv6(src_ptr, src_pixels_per_line,
6579f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                   dst_ptr, dst_pixels_per_line, sse);
6679f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
6779f15823c34ae1e423108295e416213200bb280fAndreas Huber    else if (xoffset == 0 && yoffset == 4)
6879f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
6979f15823c34ae1e423108295e416213200bb280fAndreas Huber        var = vp8_variance_halfpixvar16x16_v_armv6(src_ptr, src_pixels_per_line,
7079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                   dst_ptr, dst_pixels_per_line, sse);
7179f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
7279f15823c34ae1e423108295e416213200bb280fAndreas Huber    else if (xoffset == 4 && yoffset == 4)
7379f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
7479f15823c34ae1e423108295e416213200bb280fAndreas Huber        var = vp8_variance_halfpixvar16x16_hv_armv6(src_ptr, src_pixels_per_line,
7579f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                   dst_ptr, dst_pixels_per_line, sse);
7679f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
7779f15823c34ae1e423108295e416213200bb280fAndreas Huber    else
7879f15823c34ae1e423108295e416213200bb280fAndreas Huber    {
7979f15823c34ae1e423108295e416213200bb280fAndreas Huber        HFilter = vp8_bilinear_filters[xoffset];
8079f15823c34ae1e423108295e416213200bb280fAndreas Huber        VFilter = vp8_bilinear_filters[yoffset];
8179f15823c34ae1e423108295e416213200bb280fAndreas Huber
8279f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_filter_block2d_bil_first_pass_armv6(src_ptr, first_pass,
8379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                src_pixels_per_line,
8479f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                17, 16, HFilter);
8579f15823c34ae1e423108295e416213200bb280fAndreas Huber        vp8_filter_block2d_bil_second_pass_armv6(first_pass, second_pass,
8679f15823c34ae1e423108295e416213200bb280fAndreas Huber                                                 16, 16, 16, VFilter);
8779f15823c34ae1e423108295e416213200bb280fAndreas Huber
8879f15823c34ae1e423108295e416213200bb280fAndreas Huber        var = vp8_variance16x16_armv6(second_pass, 16, dst_ptr,
8979f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       dst_pixels_per_line, sse);
9079f15823c34ae1e423108295e416213200bb280fAndreas Huber    }
9179f15823c34ae1e423108295e416213200bb280fAndreas Huber    return var;
9279f15823c34ae1e423108295e416213200bb280fAndreas Huber}
9379f15823c34ae1e423108295e416213200bb280fAndreas Huber
9479f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif /* HAVE_ARMV6 */
9579f15823c34ae1e423108295e416213200bb280fAndreas Huber
9679f15823c34ae1e423108295e416213200bb280fAndreas Huber
9779f15823c34ae1e423108295e416213200bb280fAndreas Huber#if HAVE_ARMV7
9879f15823c34ae1e423108295e416213200bb280fAndreas Huber
9979f15823c34ae1e423108295e416213200bb280fAndreas Huberunsigned int vp8_sub_pixel_variance16x16_neon
10079f15823c34ae1e423108295e416213200bb280fAndreas Huber(
10179f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char  *src_ptr,
10279f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  src_pixels_per_line,
10379f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  xoffset,
10479f15823c34ae1e423108295e416213200bb280fAndreas Huber    int  yoffset,
10579f15823c34ae1e423108295e416213200bb280fAndreas Huber    const unsigned char *dst_ptr,
10679f15823c34ae1e423108295e416213200bb280fAndreas Huber    int dst_pixels_per_line,
10779f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int *sse
10879f15823c34ae1e423108295e416213200bb280fAndreas Huber)
10979f15823c34ae1e423108295e416213200bb280fAndreas Huber{
11079f15823c34ae1e423108295e416213200bb280fAndreas Huber  if (xoffset == 4 && yoffset == 0)
11179f15823c34ae1e423108295e416213200bb280fAndreas Huber    return vp8_variance_halfpixvar16x16_h_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
11279f15823c34ae1e423108295e416213200bb280fAndreas Huber  else if (xoffset == 0 && yoffset == 4)
11379f15823c34ae1e423108295e416213200bb280fAndreas Huber    return vp8_variance_halfpixvar16x16_v_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
11479f15823c34ae1e423108295e416213200bb280fAndreas Huber  else if (xoffset == 4 && yoffset == 4)
11579f15823c34ae1e423108295e416213200bb280fAndreas Huber    return vp8_variance_halfpixvar16x16_hv_neon(src_ptr, src_pixels_per_line, dst_ptr, dst_pixels_per_line, sse);
11679f15823c34ae1e423108295e416213200bb280fAndreas Huber  else
11779f15823c34ae1e423108295e416213200bb280fAndreas Huber    return vp8_sub_pixel_variance16x16_neon_func(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse);
11879f15823c34ae1e423108295e416213200bb280fAndreas Huber}
11979f15823c34ae1e423108295e416213200bb280fAndreas Huber
12079f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
121