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