1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h>
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_fdct4x4_c(short *input, short *output, int pitch)
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int a1, b1, c1, d1;
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *ip = input;
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *op = output;
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 4; i++)
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a1 = ((ip[0] + ip[3]) * 8);
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b1 = ((ip[1] + ip[2]) * 8);
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c1 = ((ip[1] - ip[2]) * 8);
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d1 = ((ip[0] - ip[3]) * 8);
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[0] = a1 + b1;
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[2] = a1 - b1;
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[1] = (c1 * 2217 + d1 * 5352 +  14500)>>12;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[3] = (d1 * 2217 - c1 * 5352 +   7500)>>12;
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ip += pitch / 2;
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op += 4;
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ip = output;
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan    op = output;
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 4; i++)
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a1 = ip[0] + ip[12];
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b1 = ip[4] + ip[8];
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c1 = ip[4] - ip[8];
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d1 = ip[0] - ip[12];
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[0]  = ( a1 + b1 + 7)>>4;
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[8]  = ( a1 - b1 + 7)>>4;
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[4]  =((c1 * 2217 + d1 * 5352 +  12000)>>16) + (d1!=0);
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[12] = (d1 * 2217 - c1 * 5352 +  51000)>>16;
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ip++;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op++;
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_fdct8x4_c(short *input, short *output, int pitch)
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_short_fdct4x4_c(input,   output,    pitch);
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_short_fdct4x4_c(input + 4, output + 16, pitch);
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan
64233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_walsh4x4_c(short *input, short *output, int pitch)
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int i;
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int a1, b1, c1, d1;
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int a2, b2, c2, d2;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *ip = input;
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *op = output;
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 4; i++)
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a1 = ((ip[0] + ip[2]) * 4);
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d1 = ((ip[1] + ip[3]) * 4);
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c1 = ((ip[1] - ip[3]) * 4);
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b1 = ((ip[0] - ip[2]) * 4);
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[0] = a1 + d1 + (a1!=0);
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[1] = b1 + c1;
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[2] = b1 - c1;
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[3] = a1 - d1;
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ip += pitch / 2;
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op += 4;
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ip = output;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    op = output;
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    for (i = 0; i < 4; i++)
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a1 = ip[0] + ip[8];
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d1 = ip[4] + ip[12];
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c1 = ip[4] - ip[12];
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b1 = ip[0] - ip[8];
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a2 = a1 + d1;
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b2 = b1 + c1;
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c2 = b1 - c1;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d2 = a1 - d1;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan        a2 += a2<0;
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan        b2 += b2<0;
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan        c2 += c2<0;
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan        d2 += d2<0;
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[0] = (a2+3) >> 3;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[4] = (b2+3) >> 3;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[8] = (c2+3) >> 3;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op[12]= (d2+3) >> 3;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ip++;
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan        op++;
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
117