filter.c revision 5ae7ac49f08a179e4f054d99fcfc9dce78d26e58
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Use of this source code is governed by a BSD-style license
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  that can be found in the LICENSE file in the root of the source
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  tree. An additional intellectual property rights grant can be found
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  in the file PATENTS.  All contributing project authors may
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  be found in the AUTHORS file in the root of the source tree.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "filter.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DECLARE_ALIGNED(16, const short, vp8_bilinear_filters[8][2]) =
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    { 128,   0 },
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    { 112,  16 },
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  96,  32 },
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  80,  48 },
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  64,  64 },
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  48,  80 },
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  32,  96 },
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {  16, 112 }
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[8][6]) =
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    { 0,  0,  128,    0,   0,  0 },         /* note that 1/8 pel positions are just as per alpha -0.5 bicubic */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    { 0, -6,  123,   12,  -1,  0 },
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    { 2, -11, 108,   36,  -8,  1 },         /* New 1/4 pel 6 tap filter */
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    { 0, -9,   93,   50,  -6,  0 },
33d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    { 3, -16,  77,   77, -16,  3 },         /* New 1/2 pel 6 tap filter */
34a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    { 0, -6,   50,   93,  -9,  0 },
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    { 1, -8,   36,  108, -11,  2 },         /* New 1/4 pel 6 tap filter */
3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    { 0, -1,   12,  123,  -6,  0 },
37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch};
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static void filter_block2d_first_pass
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)(
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    unsigned char *src_ptr,
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int *output_ptr,
43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    unsigned int src_pixels_per_line,
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned int pixel_step,
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned int output_height,
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    unsigned int output_width,
471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    const short *vp8_filter
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles))
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned int i, j;
51aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    int  Temp;
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
53a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    for (i = 0; i < output_height; i++)
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        for (j = 0; j < output_width; j++)
56591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
57591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp8_filter[0]) +
58591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                   ((int)src_ptr[-1 * (int)pixel_step] * vp8_filter[1]) +
59591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                   ((int)src_ptr[0]                 * vp8_filter[2]) +
60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                   ((int)src_ptr[pixel_step]         * vp8_filter[3]) +
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   ((int)src_ptr[2*pixel_step]       * vp8_filter[4]) +
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   ((int)src_ptr[3*pixel_step]       * vp8_filter[5]) +
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   (VP8_FILTER_WEIGHT >> 1);      /* Rounding */
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            /* Normalize back to 0-255 */
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Temp = Temp >> VP8_FILTER_SHIFT;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Temp < 0)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Temp = 0;
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            else if (Temp > 255)
71e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                Temp = 255;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            output_ptr[j] = Temp;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            src_ptr++;
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
76e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /* Next row... */
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        src_ptr    += src_pixels_per_line - output_width;
79521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        output_ptr += output_width;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochstatic void filter_block2d_second_pass
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int *src_ptr,
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned char *output_ptr,
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int output_pitch,
88f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    unsigned int src_pixels_per_line,
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned int pixel_step,
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    unsigned int output_height,
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    unsigned int output_width,
92df95704c49daea886ddad70775bda23618d6274dBen Murdoch    const short *vp8_filter
93a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles))
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
95df95704c49daea886ddad70775bda23618d6274dBen Murdoch    unsigned int i, j;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  Temp;
97f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (i = 0; i < output_height; i++)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
100df95704c49daea886ddad70775bda23618d6274dBen Murdoch        for (j = 0; j < output_width; j++)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            /* Apply filter */
103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            Temp = ((int)src_ptr[-2 * (int)pixel_step] * vp8_filter[0]) +
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   ((int)src_ptr[-1 * (int)pixel_step] * vp8_filter[1]) +
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   ((int)src_ptr[0]                 * vp8_filter[2]) +
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                   ((int)src_ptr[pixel_step]         * vp8_filter[3]) +
1076f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch                   ((int)src_ptr[2*pixel_step]       * vp8_filter[4]) +
1086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch                   ((int)src_ptr[3*pixel_step]       * vp8_filter[5]) +
109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                   (VP8_FILTER_WEIGHT >> 1);   /* Rounding */
110521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            /* Normalize back to 0-255 */
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Temp = Temp >> VP8_FILTER_SHIFT;
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Temp < 0)
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                Temp = 0;
116f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            else if (Temp > 255)
1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                Temp = 255;
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            output_ptr[j] = (unsigned char)Temp;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            src_ptr++;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /* Start next row */
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        src_ptr    += src_pixels_per_line - output_width;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        output_ptr += output_pitch;
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
130df95704c49daea886ddad70775bda23618d6274dBen Murdochstatic void filter_block2d
13193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)(
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned char  *src_ptr,
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *output_ptr,
13453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned int src_pixels_per_line,
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int output_pitch,
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const short  *HFilter,
13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const short  *VFilter
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int FData[9*4]; /* Temp data buffer used in filtering */
1411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /* First filter 1-D horizontally... */
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 4, HFilter);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /* then filter verticaly... */
14653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    filter_block2d_second_pass(FData + 8, output_ptr, output_pitch, 4, 4, 4, 4, VFilter);
14753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void vp8_sixtap_predict4x4_c
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)(
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    unsigned char  *src_ptr,
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int   src_pixels_per_line,
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  xoffset,
155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int  yoffset,
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char *dst_ptr,
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int dst_pitch
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
160591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const short  *HFilter;
161591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const short  *VFilter;
162591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
163591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
164591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
165591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter_block2d(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter);
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void vp8_sixtap_predict8x8_c
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *src_ptr,
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  src_pixels_per_line,
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  xoffset,
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  yoffset,
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char *dst_ptr,
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  dst_pitch
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const short  *HFilter;
1791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    const short  *VFilter;
1801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    int FData[13*16];   /* Temp data buffer used in filtering */
18181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
18281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
18381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
18481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
18581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    /* First filter 1-D horizontally... */
18681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 13, 8, HFilter);
18781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
18881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /* then filter verticaly... */
19081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    filter_block2d_second_pass(FData + 16, dst_ptr, dst_pitch, 8, 8, 8, 8, VFilter);
19181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
19281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
19381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void vp8_sixtap_predict8x4_c
19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)(
196f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    unsigned char  *src_ptr,
19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int  src_pixels_per_line,
19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int  xoffset,
19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int  yoffset,
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned char *dst_ptr,
20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int  dst_pitch
20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles))
20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const short  *HFilter;
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const short  *VFilter;
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int FData[13*16];   /* Temp data buffer used in filtering */
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
2095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
2105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /* First filter 1-D horizontally... */
21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 8, HFilter);
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /* then filter verticaly... */
21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    filter_block2d_second_pass(FData + 16, dst_ptr, dst_pitch, 8, 8, 4, 8, VFilter);
21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
218f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
219f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid vp8_sixtap_predict16x16_c
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
222d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    unsigned char  *src_ptr,
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  src_pixels_per_line,
2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    int  xoffset,
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  yoffset,
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char *dst_ptr,
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  dst_pitch
228f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles))
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const short  *HFilter;
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const short  *VFilter;
2325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    int FData[21*24];   /* Temp data buffer used in filtering */
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    HFilter = vp8_sub_pel_filters[xoffset];   /* 6 tap */
236f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    VFilter = vp8_sub_pel_filters[yoffset];   /* 6 tap */
237f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
238f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    /* First filter 1-D horizontally... */
239f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 21, 16, HFilter);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /* then filter verticaly... */
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter_block2d_second_pass(FData + 32, dst_ptr, dst_pitch, 16, 16, 16, 16, VFilter);
243f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/****************************************************************************
24809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  ROUTINE       : filter_block2d_bil_first_pass
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
251bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *  INPUTS        : UINT8  *src_ptr    : Pointer to source block.
252bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  UINT32  src_stride : Stride of source block.
253bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  UINT32  height     : Block height.
254bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  UINT32  width      : Block width.
255bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  INT32  *vp8_filter : Array of 2 bi-linear filter taps.
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
257323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *  OUTPUTS       : INT32  *dst_ptr    : Pointer to filtered block.
258323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) *
259bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *  RETURNS       : void
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
261bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *  FUNCTION      : Applies a 1-D 2-tap bi-linear filter to the source block
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                  in the horizontal direction to produce the filtered output
263bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  block. Used to implement first-pass of 2-D separable filter.
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
265bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *  SPECIAL NOTES : Produces INT32 output to retain precision for next pass.
266bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *                  Two filter taps should sum to VP8_FILTER_WEIGHT.
267bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ****************************************************************************/
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void filter_block2d_bil_first_pass
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *src_ptr,
272bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    unsigned short *dst_ptr,
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned int    src_stride,
274bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    unsigned int    height,
275bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    unsigned int    width,
2761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    const short    *vp8_filter
2771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles))
278aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
279aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    unsigned int i, j;
2801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < height; i++)
28209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (j = 0; j < width; j++)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
28509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            /* Apply bilinear filter */
28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            dst_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) +
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                          ((int)src_ptr[1] * vp8_filter[1]) +
288d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                          (VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            src_ptr++;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
29202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        /* Next row... */
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        src_ptr += src_stride - width;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dst_ptr += width;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
298d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)/****************************************************************************
299d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
30081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) *  ROUTINE       : filter_block2d_bil_second_pass
3011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) *
3021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) *  INPUTS        : INT32  *src_ptr    : Pointer to source block.
303d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  UINT32  dst_pitch  : Destination block pitch.
304d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  UINT32  height     : Block height.
305d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  UINT32  width      : Block width.
306d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  INT32  *vp8_filter : Array of 2 bi-linear filter taps.
307d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
308d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  OUTPUTS       : UINT16 *dst_ptr    : Pointer to filtered block.
309d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
310d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  RETURNS       : void
311d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
312d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  FUNCTION      : Applies a 1-D 2-tap bi-linear filter to the source block
313d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  in the vertical direction to produce the filtered output
314d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  block. Used to implement second-pass of 2-D separable filter.
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass.
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                  Two filter taps should sum to VP8_FILTER_WEIGHT.
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
319a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch ****************************************************************************/
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void filter_block2d_bil_second_pass
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned short *src_ptr,
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *dst_ptr,
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int             dst_pitch,
325a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned int    height,
326a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned int    width,
327a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    const short    *vp8_filter
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
329a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned int  i, j;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  Temp;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < height; i++)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (j = 0; j < width; j++)
336aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        {
337aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            /* Apply filter */
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Temp = ((int)src_ptr[0]     * vp8_filter[0]) +
339a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                   ((int)src_ptr[width] * vp8_filter[1]) +
340a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                   (VP8_FILTER_WEIGHT / 2);
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dst_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT);
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            src_ptr++;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /* Next row... */
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dst_ptr += dst_pitch;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
350df95704c49daea886ddad70775bda23618d6274dBen Murdoch
351df95704c49daea886ddad70775bda23618d6274dBen Murdoch/****************************************************************************
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  ROUTINE       : filter_block2d_bil
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  INPUTS        : UINT8  *src_ptr          : Pointer to source block.
35651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *                  UINT32  src_pitch        : Stride of source block.
35751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *                  UINT32  dst_pitch        : Stride of destination block.
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *                  INT32  *HFilter          : Array of 2 horizontal filter taps.
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                  INT32  *VFilter          : Array of 2 vertical filter taps.
360d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  INT32  Width             : Block width
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *                  INT32  Height            : Block height
362d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
363d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  OUTPUTS       : UINT16 *dst_ptr       : Pointer to filtered block.
364d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
365d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  RETURNS       : void
366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
367d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *  FUNCTION      : 2-D filters an input block by applying a 2-tap
368d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  bi-linear filter horizontally followed by a 2-tap
369d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *                  bi-linear filter vertically on the result.
370d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  SPECIAL NOTES : The largest block size can be handled here is 16x16
372d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *
373d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ****************************************************************************/
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void filter_block2d_bil
37581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)(
37681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    unsigned char *src_ptr,
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned char *dst_ptr,
37881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    unsigned int   src_pitch,
37981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    unsigned int   dst_pitch,
38081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    const short   *HFilter,
38181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    const short   *VFilter,
38281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    int            Width,
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int            Height
38481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles))
38581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned short FData[17*16];    /* Temp data buffer used in filtering */
3888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /* First filter 1-D horizontally... */
390d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    filter_block2d_bil_first_pass(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
391d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
392d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /* then 1-D vertically... */
393197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    filter_block2d_bil_second_pass(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
394197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
395197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
396197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
397197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid vp8_bilinear_predict4x4_c
398197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch(
399197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    unsigned char  *src_ptr,
40051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int   src_pixels_per_line,
401a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    int  xoffset,
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  yoffset,
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char *dst_ptr,
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int dst_pitch
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const short *HFilter;
408a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    const short *VFilter;
409a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HFilter = vp8_bilinear_filters[xoffset];
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VFilter = vp8_bilinear_filters[yoffset];
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if 0
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        int i;
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned char temp1[16];
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned char temp2[16];
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bilinear_predict4x4_mmx(src_ptr, src_pixels_per_line, xoffset, yoffset, temp1, 4);
419591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        filter_block2d_bil(src_ptr, temp2, src_pixels_per_line, 4, HFilter, VFilter, 4, 4);
420d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
421323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        for (i = 0; i < 16; i++)
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
423e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (temp1[i] != temp2[i])
424e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            {
425d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                bilinear_predict4x4_mmx(src_ptr, src_pixels_per_line, xoffset, yoffset, temp1, 4);
426d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                filter_block2d_bil(src_ptr, temp2, src_pixels_per_line, 4, HFilter, VFilter, 4, 4);
427d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            }
428d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
429e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
43009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 4, 4);
43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
433f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
434f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
435f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void vp8_bilinear_predict8x8_c
436f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)(
43707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    unsigned char  *src_ptr,
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  src_pixels_per_line,
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  xoffset,
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int  yoffset,
44110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    unsigned char *dst_ptr,
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  dst_pitch
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
44406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const short *HFilter;
44609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const short *VFilter;
44706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
44806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    HFilter = vp8_bilinear_filters[xoffset];
44906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    VFilter = vp8_bilinear_filters[yoffset];
45006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
452a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
454d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
455d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void vp8_bilinear_predict8x4_c
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *src_ptr,
458d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    int  src_pixels_per_line,
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  xoffset,
46009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int  yoffset,
46109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned char *dst_ptr,
462197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int  dst_pitch
46307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch)
46407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const short *HFilter;
46651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const short *VFilter;
46751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
46851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HFilter = vp8_bilinear_filters[xoffset];
46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    VFilter = vp8_bilinear_filters[yoffset];
47051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
474f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
475f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void vp8_bilinear_predict16x16_c
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char  *src_ptr,
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  src_pixels_per_line,
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  xoffset,
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  yoffset,
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char *dst_ptr,
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int  dst_pitch
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4853464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    const short *HFilter;
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const short *VFilter;
487521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
488521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HFilter = vp8_bilinear_filters[xoffset];
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VFilter = vp8_bilinear_filters[yoffset];
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
491d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
492d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
493d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)