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
1279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "filter.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1479f15823c34ae1e423108295e416213200bb280fAndreas HuberDECLARE_ALIGNED(16, const short, vp8_bilinear_filters[8][2]) =
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 128,   0 },
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 112,  16 },
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  96,  32 },
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  80,  48 },
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  64,  64 },
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  48,  80 },
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  32,  96 },
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {  16, 112 }
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2679f15823c34ae1e423108295e416213200bb280fAndreas HuberDECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[8][6]) =
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { 0,  0,  128,    0,   0,  0 },         /* note that 1/8 pel positions are just as per alpha -0.5 bicubic */
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 0, -6,  123,   12,  -1,  0 },
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { 2, -11, 108,   36,  -8,  1 },         /* New 1/4 pel 6 tap filter */
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 0, -9,   93,   50,  -6,  0 },
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { 3, -16,  77,   77, -16,  3 },         /* New 1/2 pel 6 tap filter */
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 0, -6,   50,   93,  -9,  0 },
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { 1, -8,   36,  108, -11,  2 },         /* New 1/4 pel 6 tap filter */
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    { 0, -1,   12,  123,  -6,  0 },
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3979f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d_first_pass
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src_ptr,
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int *output_ptr,
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int src_pixels_per_line,
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int pixel_step,
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int output_height,
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int output_width,
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short *vp8_filter
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int i, j;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  Temp;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < output_height; i++)
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (j = 0; j < output_width; j++)
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp8_filter[0]) +
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[-1 * (int)pixel_step] * vp8_filter[1]) +
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[0]                 * vp8_filter[2]) +
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[pixel_step]         * vp8_filter[3]) +
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[2*pixel_step]       * vp8_filter[4]) +
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[3*pixel_step]       * vp8_filter[5]) +
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   (VP8_FILTER_WEIGHT >> 1);      /* Rounding */
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* Normalize back to 0-255 */
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Temp = Temp >> VP8_FILTER_SHIFT;
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Temp < 0)
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Temp = 0;
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (Temp > 255)
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Temp = 255;
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            output_ptr[j] = Temp;
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            src_ptr++;
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* Next row... */
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr    += src_pixels_per_line - output_width;
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        output_ptr += output_width;
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8379f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d_second_pass
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int *src_ptr,
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *output_ptr,
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int output_pitch,
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int src_pixels_per_line,
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int pixel_step,
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int output_height,
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int output_width,
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short *vp8_filter
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int i, j;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  Temp;
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < output_height; i++)
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (j = 0; j < output_width; j++)
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* Apply filter */
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp8_filter[0]) +
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[-1 * (int)pixel_step] * vp8_filter[1]) +
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[0]                 * vp8_filter[2]) +
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[pixel_step]         * vp8_filter[3]) +
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[2*pixel_step]       * vp8_filter[4]) +
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   ((int)src_ptr[3*pixel_step]       * vp8_filter[5]) +
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                   (VP8_FILTER_WEIGHT >> 1);   /* Rounding */
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* Normalize back to 0-255 */
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Temp = Temp >> VP8_FILTER_SHIFT;
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Temp < 0)
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Temp = 0;
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (Temp > 255)
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Temp = 255;
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            output_ptr[j] = (unsigned char)Temp;
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            src_ptr++;
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* Start next row */
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        src_ptr    += src_pixels_per_line - output_width;
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        output_ptr += output_pitch;
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *output_ptr,
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int src_pixels_per_line,
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int output_pitch,
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *HFilter,
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *VFilter
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14079f15823c34ae1e423108295e416213200bb280fAndreas Huber    int FData[9*4]; /* Temp data buffer used in filtering */
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* First filter 1-D horizontally... */
14379f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 4, HFilter);
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* then filter verticaly... */
14679f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_second_pass(FData + 8, output_ptr, output_pitch, 4, 4, 4, 4, VFilter);
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1501b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sixtap_predict4x4_c
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int   src_pixels_per_line,
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_pitch
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *HFilter;
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *VFilter;
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16379f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
16479f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16679f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter);
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_sixtap_predict8x8_c
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *HFilter;
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *VFilter;
18079f15823c34ae1e423108295e416213200bb280fAndreas Huber    int FData[13*16];   /* Temp data buffer used in filtering */
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18279f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
18379f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
185538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* First filter 1-D horizontally... */
18679f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 13, 8, HFilter);
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* then filter verticaly... */
19079f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_second_pass(FData + 16, dst_ptr, dst_pitch, 8, 8, 8, 8, VFilter);
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_sixtap_predict8x4_c
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *HFilter;
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *VFilter;
20679f15823c34ae1e423108295e416213200bb280fAndreas Huber    int FData[13*16];   /* Temp data buffer used in filtering */
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20879f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
20979f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* First filter 1-D horizontally... */
21279f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 8, HFilter);
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
215538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* then filter verticaly... */
21679f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_second_pass(FData + 16, dst_ptr, dst_pitch, 8, 8, 4, 8, VFilter);
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_sixtap_predict16x16_c
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *HFilter;
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short  *VFilter;
23279f15823c34ae1e423108295e416213200bb280fAndreas Huber    int FData[21*24];   /* Temp data buffer used in filtering */
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23579f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
23679f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
238538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* First filter 1-D horizontally... */
23979f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 21, 16, HFilter);
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
241538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* then filter verticaly... */
24279f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_second_pass(FData + 32, dst_ptr, dst_pitch, 16, 16, 16, 16, VFilter);
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  ROUTINE       : filter_block2d_bil_first_pass
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
25179f15823c34ae1e423108295e416213200bb280fAndreas Huber *  INPUTS        : UINT8  *src_ptr    : Pointer to source block.
25279f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  src_stride : Stride of source block.
25379f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  height     : Block height.
25479f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  width      : Block width.
25579f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  *vp8_filter : Array of 2 bi-linear filter taps.
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
25779f15823c34ae1e423108295e416213200bb280fAndreas Huber *  OUTPUTS       : INT32  *dst_ptr    : Pointer to filtered block.
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  RETURNS       : void
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
26179f15823c34ae1e423108295e416213200bb280fAndreas Huber *  FUNCTION      : Applies a 1-D 2-tap bi-linear filter to the source block
26279f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  in the horizontal direction to produce the filtered output
26379f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  block. Used to implement first-pass of 2-D separable filter.
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  SPECIAL NOTES : Produces INT32 output to retain precision for next pass.
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  Two filter taps should sum to VP8_FILTER_WEIGHT.
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
26979f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d_bil_first_pass
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
27179f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned char  *src_ptr,
27279f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned short *dst_ptr,
27379f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int    src_stride,
27479f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int    height,
27579f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int    width,
27679f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short    *vp8_filter
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int i, j;
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28179f15823c34ae1e423108295e416213200bb280fAndreas Huber    for (i = 0; i < height; i++)
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
28379f15823c34ae1e423108295e416213200bb280fAndreas Huber        for (j = 0; j < width; j++)
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
285538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* Apply bilinear filter */
28679f15823c34ae1e423108295e416213200bb280fAndreas Huber            dst_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) +
28779f15823c34ae1e423108295e416213200bb280fAndreas Huber                          ((int)src_ptr[1] * vp8_filter[1]) +
28879f15823c34ae1e423108295e416213200bb280fAndreas Huber                          (VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT;
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            src_ptr++;
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
292538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* Next row... */
29379f15823c34ae1e423108295e416213200bb280fAndreas Huber        src_ptr += src_stride - width;
29479f15823c34ae1e423108295e416213200bb280fAndreas Huber        dst_ptr += width;
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  ROUTINE       : filter_block2d_bil_second_pass
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
30279f15823c34ae1e423108295e416213200bb280fAndreas Huber *  INPUTS        : INT32  *src_ptr    : Pointer to source block.
30379f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  dst_pitch  : Destination block pitch.
30479f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  height     : Block height.
30579f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  width      : Block width.
30679f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  *vp8_filter : Array of 2 bi-linear filter taps.
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
30879f15823c34ae1e423108295e416213200bb280fAndreas Huber *  OUTPUTS       : UINT16 *dst_ptr    : Pointer to filtered block.
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  RETURNS       : void
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
31279f15823c34ae1e423108295e416213200bb280fAndreas Huber *  FUNCTION      : Applies a 1-D 2-tap bi-linear filter to the source block
31379f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  in the vertical direction to produce the filtered output
31479f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  block. Used to implement second-pass of 2-D separable filter.
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass.
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  Two filter taps should sum to VP8_FILTER_WEIGHT.
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
32079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d_bil_second_pass
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned short *src_ptr,
32379f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned char  *dst_ptr,
32479f15823c34ae1e423108295e416213200bb280fAndreas Huber    int             dst_pitch,
32579f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int    height,
32679f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int    width,
32779f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short    *vp8_filter
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int  i, j;
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  Temp;
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33379f15823c34ae1e423108295e416213200bb280fAndreas Huber    for (i = 0; i < height; i++)
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
33579f15823c34ae1e423108295e416213200bb280fAndreas Huber        for (j = 0; j < width; j++)
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
337538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            /* Apply filter */
33879f15823c34ae1e423108295e416213200bb280fAndreas Huber            Temp = ((int)src_ptr[0]     * vp8_filter[0]) +
33979f15823c34ae1e423108295e416213200bb280fAndreas Huber                   ((int)src_ptr[width] * vp8_filter[1]) +
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                   (VP8_FILTER_WEIGHT / 2);
34179f15823c34ae1e423108295e416213200bb280fAndreas Huber            dst_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT);
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            src_ptr++;
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
345538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        /* Next row... */
34679f15823c34ae1e423108295e416213200bb280fAndreas Huber        dst_ptr += dst_pitch;
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/****************************************************************************
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  ROUTINE       : filter_block2d_bil
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  INPUTS        : UINT8  *src_ptr          : Pointer to source block.
35679f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  src_pitch        : Stride of source block.
35779f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  UINT32  dst_pitch        : Stride of destination block.
35879f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  *HFilter          : Array of 2 horizontal filter taps.
35979f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  *VFilter          : Array of 2 vertical filter taps.
36079f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  Width             : Block width
36179f15823c34ae1e423108295e416213200bb280fAndreas Huber *                  INT32  Height            : Block height
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
36379f15823c34ae1e423108295e416213200bb280fAndreas Huber *  OUTPUTS       : UINT16 *dst_ptr       : Pointer to filtered block.
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  RETURNS       : void
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  FUNCTION      : 2-D filters an input block by applying a 2-tap
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  bi-linear filter horizontally followed by a 2-tap
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *                  bi-linear filter vertically on the result.
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *  SPECIAL NOTES : The largest block size can be handled here is 16x16
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ****************************************************************************/
37479f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void filter_block2d_bil
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *src_ptr,
37779f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned char *dst_ptr,
37879f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned int   src_pitch,
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int   dst_pitch,
38079f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short   *HFilter,
38179f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short   *VFilter,
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int            Width,
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int            Height
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38779f15823c34ae1e423108295e416213200bb280fAndreas Huber    unsigned short FData[17*16];    /* Temp data buffer used in filtering */
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
389538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* First filter 1-D horizontally... */
39079f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil_first_pass(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
392538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* then 1-D vertically... */
39379f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil_second_pass(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_bilinear_predict4x4_c
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int   src_pixels_per_line,
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int dst_pitch
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
40779f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter;
40879f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *VFilter;
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41079f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_bilinear_filters[xoffset];
41179f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_bilinear_filters[yoffset];
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char temp1[16];
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned char temp2[16];
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        bilinear_predict4x4_mmx(src_ptr, src_pixels_per_line, xoffset, yoffset, temp1, 4);
41979f15823c34ae1e423108295e416213200bb280fAndreas Huber        filter_block2d_bil(src_ptr, temp2, src_pixels_per_line, 4, HFilter, VFilter, 4, 4);
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < 16; i++)
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (temp1[i] != temp2[i])
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                bilinear_predict4x4_mmx(src_ptr, src_pixels_per_line, xoffset, yoffset, temp1, 4);
42679f15823c34ae1e423108295e416213200bb280fAndreas Huber                filter_block2d_bil(src_ptr, temp2, src_pixels_per_line, 4, HFilter, VFilter, 4, 4);
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
43179f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 4, 4);
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_bilinear_predict8x8_c
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
44579f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter;
44679f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *VFilter;
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44879f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_bilinear_filters[xoffset];
44979f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_bilinear_filters[yoffset];
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45179f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_bilinear_predict8x4_c
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
46579f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter;
46679f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *VFilter;
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46879f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_bilinear_filters[xoffset];
46979f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_bilinear_filters[yoffset];
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47179f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_bilinear_predict16x16_c
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char  *src_ptr,
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  src_pixels_per_line,
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  xoffset,
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  yoffset,
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned char *dst_ptr,
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int  dst_pitch
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
48579f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *HFilter;
48679f15823c34ae1e423108295e416213200bb280fAndreas Huber    const short *VFilter;
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48879f15823c34ae1e423108295e416213200bb280fAndreas Huber    HFilter = vp8_bilinear_filters[xoffset];
48979f15823c34ae1e423108295e416213200bb280fAndreas Huber    VFilter = vp8_bilinear_filters[yoffset];
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49179f15823c34ae1e423108295e416213200bb280fAndreas Huber    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
493