1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <math.h>
12
13 #include "./vp8_rtcd.h"
14
vp8_short_fdct4x4_c(short * input,short * output,int pitch)15 void vp8_short_fdct4x4_c(short *input, short *output, int pitch) {
16 int i;
17 int a1, b1, c1, d1;
18 short *ip = input;
19 short *op = output;
20
21 for (i = 0; i < 4; ++i) {
22 a1 = ((ip[0] + ip[3]) * 8);
23 b1 = ((ip[1] + ip[2]) * 8);
24 c1 = ((ip[1] - ip[2]) * 8);
25 d1 = ((ip[0] - ip[3]) * 8);
26
27 op[0] = a1 + b1;
28 op[2] = a1 - b1;
29
30 op[1] = (c1 * 2217 + d1 * 5352 + 14500) >> 12;
31 op[3] = (d1 * 2217 - c1 * 5352 + 7500) >> 12;
32
33 ip += pitch / 2;
34 op += 4;
35 }
36 ip = output;
37 op = output;
38 for (i = 0; i < 4; ++i) {
39 a1 = ip[0] + ip[12];
40 b1 = ip[4] + ip[8];
41 c1 = ip[4] - ip[8];
42 d1 = ip[0] - ip[12];
43
44 op[0] = (a1 + b1 + 7) >> 4;
45 op[8] = (a1 - b1 + 7) >> 4;
46
47 op[4] = ((c1 * 2217 + d1 * 5352 + 12000) >> 16) + (d1 != 0);
48 op[12] = (d1 * 2217 - c1 * 5352 + 51000) >> 16;
49
50 ip++;
51 op++;
52 }
53 }
54
vp8_short_fdct8x4_c(short * input,short * output,int pitch)55 void vp8_short_fdct8x4_c(short *input, short *output, int pitch) {
56 vp8_short_fdct4x4_c(input, output, pitch);
57 vp8_short_fdct4x4_c(input + 4, output + 16, pitch);
58 }
59
vp8_short_walsh4x4_c(short * input,short * output,int pitch)60 void vp8_short_walsh4x4_c(short *input, short *output, int pitch) {
61 int i;
62 int a1, b1, c1, d1;
63 int a2, b2, c2, d2;
64 short *ip = input;
65 short *op = output;
66
67 for (i = 0; i < 4; ++i) {
68 a1 = ((ip[0] + ip[2]) * 4);
69 d1 = ((ip[1] + ip[3]) * 4);
70 c1 = ((ip[1] - ip[3]) * 4);
71 b1 = ((ip[0] - ip[2]) * 4);
72
73 op[0] = a1 + d1 + (a1 != 0);
74 op[1] = b1 + c1;
75 op[2] = b1 - c1;
76 op[3] = a1 - d1;
77 ip += pitch / 2;
78 op += 4;
79 }
80
81 ip = output;
82 op = output;
83
84 for (i = 0; i < 4; ++i) {
85 a1 = ip[0] + ip[8];
86 d1 = ip[4] + ip[12];
87 c1 = ip[4] - ip[12];
88 b1 = ip[0] - ip[8];
89
90 a2 = a1 + d1;
91 b2 = b1 + c1;
92 c2 = b1 - c1;
93 d2 = a1 - d1;
94
95 a2 += a2 < 0;
96 b2 += b2 < 0;
97 c2 += c2 < 0;
98 d2 += d2 < 0;
99
100 op[0] = (a2 + 3) >> 3;
101 op[4] = (b2 + 3) >> 3;
102 op[8] = (c2 + 3) >> 3;
103 op[12] = (d2 + 3) >> 3;
104
105 ip++;
106 op++;
107 }
108 }
109