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