190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h> 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_short_fdct4x4_c(short *input, short *output, int pitch) 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int a1, b1, c1, d1; 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *ip = input; 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *op = output; 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 4; i++) 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang a1 = ((ip[0] + ip[3]) * 8); 245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang b1 = ((ip[1] + ip[2]) * 8); 255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang c1 = ((ip[1] - ip[2]) * 8); 265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang d1 = ((ip[0] - ip[3]) * 8); 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28f71323e297a928af368937089d3ed71239786f86Andreas Huber op[0] = a1 + b1; 29f71323e297a928af368937089d3ed71239786f86Andreas Huber op[2] = a1 - b1; 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31f71323e297a928af368937089d3ed71239786f86Andreas Huber op[1] = (c1 * 2217 + d1 * 5352 + 14500)>>12; 32f71323e297a928af368937089d3ed71239786f86Andreas Huber op[3] = (d1 * 2217 - c1 * 5352 + 7500)>>12; 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip += pitch / 2; 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op += 4; 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37f71323e297a928af368937089d3ed71239786f86Andreas Huber } 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip = output; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op = output; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 4; i++) 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber a1 = ip[0] + ip[12]; 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b1 = ip[4] + ip[8]; 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber c1 = ip[4] - ip[8]; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber d1 = ip[0] - ip[12]; 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47f71323e297a928af368937089d3ed71239786f86Andreas Huber op[0] = ( a1 + b1 + 7)>>4; 48f71323e297a928af368937089d3ed71239786f86Andreas Huber op[8] = ( a1 - b1 + 7)>>4; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50f71323e297a928af368937089d3ed71239786f86Andreas Huber op[4] =((c1 * 2217 + d1 * 5352 + 12000)>>16) + (d1!=0); 51f71323e297a928af368937089d3ed71239786f86Andreas Huber op[12] = (d1 * 2217 - c1 * 5352 + 51000)>>16; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip++; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op++; 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_short_fdct8x4_c(short *input, short *output, int pitch) 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 60f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_short_fdct4x4_c(input, output, pitch); 61f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_short_fdct4x4_c(input + 4, output + 16, pitch); 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_short_walsh4x4_c(short *input, short *output, int pitch) 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int a1, b1, c1, d1; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int a2, b2, c2, d2; 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *ip = input; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *op = output; 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72f71323e297a928af368937089d3ed71239786f86Andreas Huber 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 4; i++) 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang a1 = ((ip[0] + ip[2]) * 4); 765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang d1 = ((ip[1] + ip[3]) * 4); 775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang c1 = ((ip[1] - ip[3]) * 4); 785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang b1 = ((ip[0] - ip[2]) * 4); 79f71323e297a928af368937089d3ed71239786f86Andreas Huber 80f71323e297a928af368937089d3ed71239786f86Andreas Huber op[0] = a1 + d1 + (a1!=0); 81f71323e297a928af368937089d3ed71239786f86Andreas Huber op[1] = b1 + c1; 82f71323e297a928af368937089d3ed71239786f86Andreas Huber op[2] = b1 - c1; 83f71323e297a928af368937089d3ed71239786f86Andreas Huber op[3] = a1 - d1; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip += pitch / 2; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op += 4; 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip = output; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op = output; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 4; i++) 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 93f71323e297a928af368937089d3ed71239786f86Andreas Huber a1 = ip[0] + ip[8]; 94f71323e297a928af368937089d3ed71239786f86Andreas Huber d1 = ip[4] + ip[12]; 95f71323e297a928af368937089d3ed71239786f86Andreas Huber c1 = ip[4] - ip[12]; 96f71323e297a928af368937089d3ed71239786f86Andreas Huber b1 = ip[0] - ip[8]; 97f71323e297a928af368937089d3ed71239786f86Andreas Huber 98f71323e297a928af368937089d3ed71239786f86Andreas Huber a2 = a1 + d1; 99f71323e297a928af368937089d3ed71239786f86Andreas Huber b2 = b1 + c1; 100f71323e297a928af368937089d3ed71239786f86Andreas Huber c2 = b1 - c1; 101f71323e297a928af368937089d3ed71239786f86Andreas Huber d2 = a1 - d1; 102f71323e297a928af368937089d3ed71239786f86Andreas Huber 103f71323e297a928af368937089d3ed71239786f86Andreas Huber a2 += a2<0; 104f71323e297a928af368937089d3ed71239786f86Andreas Huber b2 += b2<0; 105f71323e297a928af368937089d3ed71239786f86Andreas Huber c2 += c2<0; 106f71323e297a928af368937089d3ed71239786f86Andreas Huber d2 += d2<0; 107f71323e297a928af368937089d3ed71239786f86Andreas Huber 108f71323e297a928af368937089d3ed71239786f86Andreas Huber op[0] = (a2+3) >> 3; 109f71323e297a928af368937089d3ed71239786f86Andreas Huber op[4] = (b2+3) >> 3; 110f71323e297a928af368937089d3ed71239786f86Andreas Huber op[8] = (c2+3) >> 3; 111f71323e297a928af368937089d3ed71239786f86Andreas Huber op[12]= (d2+3) >> 3; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ip++; 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber op++; 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 117