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