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