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