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 12167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <math.h> 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/filter.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/mem.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_armv6 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *output_ptr, 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_width, 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_height, 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org// 8x8 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_8x8_armv6 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *output_ptr, 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_width, 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_height, 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org// 16x16 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_16x16_armv6 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *output_ptr, 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_width, 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_height, 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_second_pass_armv6 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *src_ptr, 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *output_ptr, 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_pitch, 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int cnt, 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter4_block2d_second_pass_armv6 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *src_ptr, 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *output_ptr, 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_pitch, 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int cnt, 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_first_pass_only_armv6 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *output_ptr, 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int cnt, 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_pitch, 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_filter_block2d_second_pass_only_armv6 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *output_ptr, 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int cnt, 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_pitch, 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org); 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if HAVE_MEDIA 905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_sixtap_predict4x4_armv6 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_ptr, 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pitch 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter; 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *VFilter; 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org DECLARE_ALIGNED_ARRAY(4, short, FData, 12*4); /* Temp data buffer used in filtering */ 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */ 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */ 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Vfilter is null. First pass only */ 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xoffset && !yoffset) 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*vp8_filter_block2d_first_pass_armv6 ( src_ptr, FData+2, src_pixels_per_line, 4, 4, HFilter ); 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4, VFilter );*/ 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, HFilter); 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Hfilter is null. Second pass only */ 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (!xoffset && yoffset) 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 4, dst_pitch, VFilter); 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Vfilter is a 4 tap filter */ 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (yoffset & 0x1) 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 4, 7, HFilter); 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter); 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Vfilter is 6 tap filter */ 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 4, 9, HFilter); 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 4, VFilter); 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_sixtap_predict8x8_armv6 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_ptr, 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pitch 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter; 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *VFilter; 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data buffer used in filtering */ 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */ 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */ 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xoffset && !yoffset) 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, HFilter); 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Hfilter is null. Second pass only */ 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (!xoffset && yoffset) 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, VFilter); 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (yoffset & 0x1) 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 8, 11, HFilter); 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter); 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_8x8_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 8, 13, HFilter); 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 8, VFilter); 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_sixtap_predict16x16_armv6 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *src_ptr, 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *dst_ptr, 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pitch 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter; 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *VFilter; 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org DECLARE_ALIGNED_ARRAY(4, short, FData, 24*16); /* Temp data buffer used in filtering */ 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */ 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */ 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xoffset && !yoffset) 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, HFilter); 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Hfilter is null. Second pass only */ 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (!xoffset && yoffset) 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_only_armv6(src_ptr, dst_ptr, src_pixels_per_line, 16, dst_pitch, VFilter); 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (yoffset & 0x1) 209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - src_pixels_per_line, FData + 1, src_pixels_per_line, 16, 19, HFilter); 211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter4_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter); 212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_first_pass_16x16_armv6(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 16, 21, HFilter); 216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_filter_block2d_second_pass_armv6(FData + 2, dst_ptr, dst_pitch, 16, VFilter); 217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 222