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 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "variance.h" 135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "filter.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_get_mb_ss_c 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *src_ptr 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int i = 0, sum = 0; 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org do 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sum += (src_ptr[i] * src_ptr[i]); 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org i++; 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (i < 256); 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return sum; 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void variance( 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int w, 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int h, 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse, 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *sum) 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j; 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int diff; 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sum = 0; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = 0; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < h; i++) 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < w; j++) 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org diff = src_ptr[j] - ref_ptr[j]; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sum += diff; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse += diff * diff; 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr += source_stride; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref_ptr += recon_stride; 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance16x16_c( 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 784b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org return (var - (((unsigned int)avg * avg) >> 8)); 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance8x16_c( 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 16, &var, &avg); 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 944b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org return (var - (((unsigned int)avg * avg) >> 7)); 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance16x8_c( 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 8, &var, &avg); 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 1104b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org return (var - (((unsigned int)avg * avg) >> 7)); 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance8x8_c( 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 8, &var, &avg); 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 1274b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org return (var - (((unsigned int)avg * avg) >> 6)); 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance4x4_c( 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 4, 4, &var, &avg); 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 1434b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org return (var - (((unsigned int)avg * avg) >> 4)); 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_mse16x16_c( 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int var; 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int avg; 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *sse = var; 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return var; 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/**************************************************************************** 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * ROUTINE : filter_block2d_bil_first_pass 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * INPUTS : UINT8 *src_ptr : Pointer to source block. 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 src_pixels_per_line : Stride of input block. 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 pixel_step : Offset between filter input samples (see notes). 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 output_height : Input block height. 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 output_width : Input block width. 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * INT32 *vp8_filter : Array of 2 bi-linear filter taps. 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * OUTPUTS : INT32 *output_ptr : Pointer to filtered block. 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * RETURNS : void 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * either horizontal or vertical direction to produce the 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * filtered output block. Used to implement first-pass 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * of 2-D separable filter. 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * SPECIAL NOTES : Produces INT32 output to retain precision for next pass. 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Two filter taps should sum to VP8_FILTER_WEIGHT. 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * pixel_step defines whether the filter is applied 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * horizontally (pixel_step=1) or vertically (pixel_step=stride). 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * It defines the offset required to move from one input 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * to the next. 189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ****************************************************************************/ 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void var_filter_block2d_bil_first_pass 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned short *output_ptr, 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int pixel_step, 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_height, 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_width, 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int i, j; 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < output_height; i++) 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < output_width; j++) 207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Apply bilinear filter */ 209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org output_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) + 210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((int)src_ptr[pixel_step] * vp8_filter[1]) + 211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT; 212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr++; 213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Next row... */ 216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr += src_pixels_per_line - output_width; 217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org output_ptr += output_width; 218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/**************************************************************************** 222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * ROUTINE : filter_block2d_bil_second_pass 224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * INPUTS : INT32 *src_ptr : Pointer to source block. 226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 src_pixels_per_line : Stride of input block. 227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 pixel_step : Offset between filter input samples (see notes). 228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 output_height : Input block height. 229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * UINT32 output_width : Input block width. 230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * INT32 *vp8_filter : Array of 2 bi-linear filter taps. 231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * OUTPUTS : UINT16 *output_ptr : Pointer to filtered block. 233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * RETURNS : void 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in 237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * either horizontal or vertical direction to produce the 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * filtered output block. Used to implement second-pass 239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * of 2-D separable filter. 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass. 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Two filter taps should sum to VP8_FILTER_WEIGHT. 243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * pixel_step defines whether the filter is applied 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * horizontally (pixel_step=1) or vertically (pixel_step=stride). 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * It defines the offset required to move from one input 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * to the next. 247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ****************************************************************************/ 249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void var_filter_block2d_bil_second_pass 250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned short *src_ptr, 252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *output_ptr, 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int src_pixels_per_line, 254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int pixel_step, 255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_height, 256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int output_width, 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *vp8_filter 258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int i, j; 261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Temp; 262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < output_height; i++) 264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < output_width; j++) 266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Apply filter */ 268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Temp = ((int)src_ptr[0] * vp8_filter[0]) + 269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ((int)src_ptr[pixel_step] * vp8_filter[1]) + 270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (VP8_FILTER_WEIGHT / 2); 271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org output_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT); 272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr++; 273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Next row... */ 276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org src_ptr += src_pixels_per_line - output_width; 277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org output_ptr += output_width; 278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance4x4_c 283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char temp2[20*16]; 294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter, *VFilter; 295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned short FData3[5*4]; /* Temp data bufffer used in filtering */ 296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_bilinear_filters[xoffset]; 298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_bilinear_filters[yoffset]; 299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* First filter 1d Horizontal */ 301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 5, 4, HFilter); 302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Now filter Verticaly */ 304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_second_pass(FData3, temp2, 4, 4, 4, 4, VFilter); 305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_variance4x4_c(temp2, 4, dst_ptr, dst_pixels_per_line, sse); 307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance8x8_c 311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned short FData3[9*8]; /* Temp data bufffer used in filtering */ 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char temp2[20*16]; 323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter, *VFilter; 324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_bilinear_filters[xoffset]; 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_bilinear_filters[yoffset]; 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9, 8, HFilter); 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 8, 8, VFilter); 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_variance8x8_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); 332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance16x16_c 335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned short FData3[17*16]; /* Temp data bufffer used in filtering */ 346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char temp2[20*16]; 347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter, *VFilter; 348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_bilinear_filters[xoffset]; 350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_bilinear_filters[yoffset]; 351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 17, 16, HFilter); 353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 16, 16, VFilter); 354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_variance16x16_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); 356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance_halfpixvar16x16_h_c( 360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 4, 0, 367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref_ptr, recon_stride, sse); 368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance_halfpixvar16x16_v_c( 372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 0, 4, 379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref_ptr, recon_stride, sse); 380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_variance_halfpixvar16x16_hv_c( 384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int source_stride, 386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *ref_ptr, 387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_stride, 388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse) 389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 4, 4, 391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref_ptr, recon_stride, sse); 392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_mse16x16_c 396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_sub_pixel_variance16x16_c(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse); 407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return *sse; 408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance16x8_c 411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned short FData3[16*9]; /* Temp data bufffer used in filtering */ 422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char temp2[20*16]; 423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter, *VFilter; 424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_bilinear_filters[xoffset]; 426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_bilinear_filters[yoffset]; 427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9, 16, HFilter); 429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 8, 16, VFilter); 430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_variance16x8_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); 432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int vp8_sub_pixel_variance8x16_c 435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *src_ptr, 437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int src_pixels_per_line, 438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int xoffset, 439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int yoffset, 440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const unsigned char *dst_ptr, 441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dst_pixels_per_line, 442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int *sse 443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned short FData3[9*16]; /* Temp data bufffer used in filtering */ 446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char temp2[20*16]; 447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const short *HFilter, *VFilter; 448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org HFilter = vp8_bilinear_filters[xoffset]; 451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VFilter = vp8_bilinear_filters[yoffset]; 452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 17, 8, HFilter); 455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 16, 8, VFilter); 456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return vp8_variance8x16_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); 458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 459