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