xref: /aosp_15_r20/external/libvpx/vp8/encoder/dct.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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