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