190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "variance.h" 131b362b15af34006e6a11974088a46d42b903418eJohann#include "filter.h" 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_get_mb_ss_c 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const short *src_ptr 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int i = 0, sum = 0; 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber do 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sum += (src_ptr[i] * src_ptr[i]); 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber i++; 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while (i < 256); 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return sum; 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3479f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void variance( 35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int w, 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int h, 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse, 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int *sum) 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i, j; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int diff; 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sum = 0; 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = 0; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < h; i++) 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (j = 0; j < w; j++) 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber diff = src_ptr[j] - ref_ptr[j]; 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sum += diff; 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse += diff * diff; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr += source_stride; 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref_ptr += recon_stride; 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_variance16x16_c( 66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7679f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (var - (((unsigned int)avg * avg) >> 8)); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_variance8x16_c( 82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9279f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 16, &var, &avg); 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (var - (((unsigned int)avg * avg) >> 7)); 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_variance16x8_c( 98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10879f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 8, &var, &avg); 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (var - (((unsigned int)avg * avg) >> 7)); 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_variance8x8_c( 115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12579f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 8, &var, &avg); 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (var - (((unsigned int)avg * avg) >> 6)); 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_variance4x4_c( 131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14179f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 4, 4, &var, &avg); 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (var - (((unsigned int)avg * avg) >> 4)); 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_mse16x16_c( 148538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int source_stride, 150538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int recon_stride, 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse) 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int var; 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int avg; 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15779f15823c34ae1e423108295e416213200bb280fAndreas Huber variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *sse = var; 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return var; 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/**************************************************************************** 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ROUTINE : filter_block2d_bil_first_pass 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INPUTS : UINT8 *src_ptr : Pointer to source block. 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 src_pixels_per_line : Stride of input block. 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 pixel_step : Offset between filter input samples (see notes). 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 output_height : Input block height. 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 output_width : Input block width. 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INT32 *vp8_filter : Array of 2 bi-linear filter taps. 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * OUTPUTS : INT32 *output_ptr : Pointer to filtered block. 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * RETURNS : void 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * either horizontal or vertical direction to produce the 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * filtered output block. Used to implement first-pass 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * of 2-D separable filter. 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * SPECIAL NOTES : Produces INT32 output to retain precision for next pass. 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Two filter taps should sum to VP8_FILTER_WEIGHT. 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * pixel_step defines whether the filter is applied 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * horizontally (pixel_step=1) or vertically (pixel_step=stride). 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * It defines the offset required to move from one input 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * to the next. 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/ 19179f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void var_filter_block2d_bil_first_pass 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 193538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned short *output_ptr, 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int src_pixels_per_line, 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int pixel_step, 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int output_height, 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int output_width, 19979f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *vp8_filter 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int i, j; 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < output_height; i++) 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (j = 0; j < output_width; j++) 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 2081b362b15af34006e6a11974088a46d42b903418eJohann /* Apply bilinear filter */ 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber output_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) + 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((int)src_ptr[pixel_step] * vp8_filter[1]) + 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT; 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr++; 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2151b362b15af34006e6a11974088a46d42b903418eJohann /* Next row... */ 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr += src_pixels_per_line - output_width; 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber output_ptr += output_width; 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/**************************************************************************** 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ROUTINE : filter_block2d_bil_second_pass 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INPUTS : INT32 *src_ptr : Pointer to source block. 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 src_pixels_per_line : Stride of input block. 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 pixel_step : Offset between filter input samples (see notes). 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 output_height : Input block height. 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * UINT32 output_width : Input block width. 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INT32 *vp8_filter : Array of 2 bi-linear filter taps. 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * OUTPUTS : UINT16 *output_ptr : Pointer to filtered block. 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * RETURNS : void 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * either horizontal or vertical direction to produce the 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * filtered output block. Used to implement second-pass 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * of 2-D separable filter. 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass. 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Two filter taps should sum to VP8_FILTER_WEIGHT. 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * pixel_step defines whether the filter is applied 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * horizontally (pixel_step=1) or vertically (pixel_step=stride). 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * It defines the offset required to move from one input 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * to the next. 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/ 24979f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void var_filter_block2d_bil_second_pass 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 251538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned short *src_ptr, 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *output_ptr, 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int src_pixels_per_line, 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int pixel_step, 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int output_height, 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int output_width, 25779f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *vp8_filter 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int i, j; 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int Temp; 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < output_height; i++) 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (j = 0; j < output_width; j++) 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 2671b362b15af34006e6a11974088a46d42b903418eJohann /* Apply filter */ 2681b362b15af34006e6a11974088a46d42b903418eJohann Temp = ((int)src_ptr[0] * vp8_filter[0]) + 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((int)src_ptr[pixel_step] * vp8_filter[1]) + 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (VP8_FILTER_WEIGHT / 2); 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber output_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT); 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr++; 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2751b362b15af34006e6a11974088a46d42b903418eJohann /* Next row... */ 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr += src_pixels_per_line - output_width; 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber output_ptr += output_width; 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_variance4x4_c 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 284538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 288538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char temp2[20*16]; 29479f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *HFilter, *VFilter; 2951b362b15af34006e6a11974088a46d42b903418eJohann unsigned short FData3[5*4]; /* Temp data bufffer used in filtering */ 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29779f15823c34ae1e423108295e416213200bb280fAndreas Huber HFilter = vp8_bilinear_filters[xoffset]; 29879f15823c34ae1e423108295e416213200bb280fAndreas Huber VFilter = vp8_bilinear_filters[yoffset]; 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3001b362b15af34006e6a11974088a46d42b903418eJohann /* First filter 1d Horizontal */ 30179f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 5, 4, HFilter); 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3031b362b15af34006e6a11974088a46d42b903418eJohann /* Now filter Verticaly */ 30479f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_second_pass(FData3, temp2, 4, 4, 4, 4, VFilter); 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return vp8_variance4x4_c(temp2, 4, dst_ptr, dst_pixels_per_line, sse); 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_variance8x8_c 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 312538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 316538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3211b362b15af34006e6a11974088a46d42b903418eJohann unsigned short FData3[9*8]; /* Temp data bufffer used in filtering */ 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char temp2[20*16]; 32379f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *HFilter, *VFilter; 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32579f15823c34ae1e423108295e416213200bb280fAndreas Huber HFilter = vp8_bilinear_filters[xoffset]; 32679f15823c34ae1e423108295e416213200bb280fAndreas Huber VFilter = vp8_bilinear_filters[yoffset]; 32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32879f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9, 8, HFilter); 32979f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 8, 8, VFilter); 33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return vp8_variance8x8_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); 33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_variance16x16_c 33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 336538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 340538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3451b362b15af34006e6a11974088a46d42b903418eJohann unsigned short FData3[17*16]; /* Temp data bufffer used in filtering */ 34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char temp2[20*16]; 34779f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *HFilter, *VFilter; 34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34979f15823c34ae1e423108295e416213200bb280fAndreas Huber HFilter = vp8_bilinear_filters[xoffset]; 35079f15823c34ae1e423108295e416213200bb280fAndreas Huber VFilter = vp8_bilinear_filters[yoffset]; 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35279f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 17, 16, HFilter); 35379f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 16, 16, VFilter); 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return vp8_variance16x16_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); 35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 358538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 359538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberunsigned int vp8_variance_halfpixvar16x16_h_c( 360538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 361538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int source_stride, 362538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 363538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int recon_stride, 364538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned int *sse) 365538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 366538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 4, 0, 367538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ref_ptr, recon_stride, sse); 368538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 369538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 370538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 371538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberunsigned int vp8_variance_halfpixvar16x16_v_c( 372538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 373538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int source_stride, 374538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 375538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int recon_stride, 376538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned int *sse) 377538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 378538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 0, 4, 379538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ref_ptr, recon_stride, sse); 380538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 381538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 382538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 383538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberunsigned int vp8_variance_halfpixvar16x16_hv_c( 384538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 385538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int source_stride, 386538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *ref_ptr, 387538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int recon_stride, 388538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned int *sse) 389538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 390538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return vp8_sub_pixel_variance16x16_c(src_ptr, source_stride, 4, 4, 391538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ref_ptr, recon_stride, sse); 392538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 393538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 394538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_mse16x16_c 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 397538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 401538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_sub_pixel_variance16x16_c(src_ptr, src_pixels_per_line, xoffset, yoffset, dst_ptr, dst_pixels_per_line, sse); 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return *sse; 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_variance16x8_c 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 412538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 416538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4211b362b15af34006e6a11974088a46d42b903418eJohann unsigned short FData3[16*9]; /* Temp data bufffer used in filtering */ 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char temp2[20*16]; 42379f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *HFilter, *VFilter; 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42579f15823c34ae1e423108295e416213200bb280fAndreas Huber HFilter = vp8_bilinear_filters[xoffset]; 42679f15823c34ae1e423108295e416213200bb280fAndreas Huber VFilter = vp8_bilinear_filters[yoffset]; 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42879f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9, 16, HFilter); 42979f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 8, 16, VFilter); 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return vp8_variance16x8_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int vp8_sub_pixel_variance8x16_c 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber( 436538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *src_ptr, 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_pixels_per_line, 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int xoffset, 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int yoffset, 440538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber const unsigned char *dst_ptr, 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int dst_pixels_per_line, 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int *sse 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber) 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4451b362b15af34006e6a11974088a46d42b903418eJohann unsigned short FData3[9*16]; /* Temp data bufffer used in filtering */ 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char temp2[20*16]; 44779f15823c34ae1e423108295e416213200bb280fAndreas Huber const short *HFilter, *VFilter; 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45079f15823c34ae1e423108295e416213200bb280fAndreas Huber HFilter = vp8_bilinear_filters[xoffset]; 45179f15823c34ae1e423108295e416213200bb280fAndreas Huber VFilter = vp8_bilinear_filters[yoffset]; 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45479f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 17, 8, HFilter); 45579f15823c34ae1e423108295e416213200bb280fAndreas Huber var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 16, 8, VFilter); 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return vp8_variance8x16_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); 45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 459