xref: /aosp_15_r20/external/libvpx/vp8/common/idctllm.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 "./vp8_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker 
13*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
14*fb1b10abSAndroid Build Coastguard Worker  * Notes:
15*fb1b10abSAndroid Build Coastguard Worker  *
16*fb1b10abSAndroid Build Coastguard Worker  * This implementation makes use of 16 bit fixed point verio of two multiply
17*fb1b10abSAndroid Build Coastguard Worker  * constants:
18*fb1b10abSAndroid Build Coastguard Worker  *         1.   sqrt(2) * cos (pi/8)
19*fb1b10abSAndroid Build Coastguard Worker  *         2.   sqrt(2) * sin (pi/8)
20*fb1b10abSAndroid Build Coastguard Worker  * Becuase the first constant is bigger than 1, to maintain the same 16 bit
21*fb1b10abSAndroid Build Coastguard Worker  * fixed point precision as the second one, we use a trick of
22*fb1b10abSAndroid Build Coastguard Worker  *         x * a = x + x*(a-1)
23*fb1b10abSAndroid Build Coastguard Worker  * so
24*fb1b10abSAndroid Build Coastguard Worker  *         x * sqrt(2) * cos (pi/8) = x + x * (sqrt(2) *cos(pi/8)-1).
25*fb1b10abSAndroid Build Coastguard Worker  **************************************************************************/
26*fb1b10abSAndroid Build Coastguard Worker static const int cospi8sqrt2minus1 = 20091;
27*fb1b10abSAndroid Build Coastguard Worker static const int sinpi8sqrt2 = 35468;
28*fb1b10abSAndroid Build Coastguard Worker 
vp8_short_idct4x4llm_c(short * input,unsigned char * pred_ptr,int pred_stride,unsigned char * dst_ptr,int dst_stride)29*fb1b10abSAndroid Build Coastguard Worker void vp8_short_idct4x4llm_c(short *input, unsigned char *pred_ptr,
30*fb1b10abSAndroid Build Coastguard Worker                             int pred_stride, unsigned char *dst_ptr,
31*fb1b10abSAndroid Build Coastguard Worker                             int dst_stride) {
32*fb1b10abSAndroid Build Coastguard Worker   int i;
33*fb1b10abSAndroid Build Coastguard Worker   int r, c;
34*fb1b10abSAndroid Build Coastguard Worker   int a1, b1, c1, d1;
35*fb1b10abSAndroid Build Coastguard Worker   short output[16];
36*fb1b10abSAndroid Build Coastguard Worker   short *ip = input;
37*fb1b10abSAndroid Build Coastguard Worker   short *op = output;
38*fb1b10abSAndroid Build Coastguard Worker   int temp1, temp2;
39*fb1b10abSAndroid Build Coastguard Worker   int shortpitch = 4;
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 4; ++i) {
42*fb1b10abSAndroid Build Coastguard Worker     a1 = ip[0] + ip[8];
43*fb1b10abSAndroid Build Coastguard Worker     b1 = ip[0] - ip[8];
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker     temp1 = (ip[4] * sinpi8sqrt2) >> 16;
46*fb1b10abSAndroid Build Coastguard Worker     temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
47*fb1b10abSAndroid Build Coastguard Worker     c1 = temp1 - temp2;
48*fb1b10abSAndroid Build Coastguard Worker 
49*fb1b10abSAndroid Build Coastguard Worker     temp1 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
50*fb1b10abSAndroid Build Coastguard Worker     temp2 = (ip[12] * sinpi8sqrt2) >> 16;
51*fb1b10abSAndroid Build Coastguard Worker     d1 = temp1 + temp2;
52*fb1b10abSAndroid Build Coastguard Worker 
53*fb1b10abSAndroid Build Coastguard Worker     op[shortpitch * 0] = a1 + d1;
54*fb1b10abSAndroid Build Coastguard Worker     op[shortpitch * 3] = a1 - d1;
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker     op[shortpitch * 1] = b1 + c1;
57*fb1b10abSAndroid Build Coastguard Worker     op[shortpitch * 2] = b1 - c1;
58*fb1b10abSAndroid Build Coastguard Worker 
59*fb1b10abSAndroid Build Coastguard Worker     ip++;
60*fb1b10abSAndroid Build Coastguard Worker     op++;
61*fb1b10abSAndroid Build Coastguard Worker   }
62*fb1b10abSAndroid Build Coastguard Worker 
63*fb1b10abSAndroid Build Coastguard Worker   ip = output;
64*fb1b10abSAndroid Build Coastguard Worker   op = output;
65*fb1b10abSAndroid Build Coastguard Worker 
66*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 4; ++i) {
67*fb1b10abSAndroid Build Coastguard Worker     a1 = ip[0] + ip[2];
68*fb1b10abSAndroid Build Coastguard Worker     b1 = ip[0] - ip[2];
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker     temp1 = (ip[1] * sinpi8sqrt2) >> 16;
71*fb1b10abSAndroid Build Coastguard Worker     temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
72*fb1b10abSAndroid Build Coastguard Worker     c1 = temp1 - temp2;
73*fb1b10abSAndroid Build Coastguard Worker 
74*fb1b10abSAndroid Build Coastguard Worker     temp1 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
75*fb1b10abSAndroid Build Coastguard Worker     temp2 = (ip[3] * sinpi8sqrt2) >> 16;
76*fb1b10abSAndroid Build Coastguard Worker     d1 = temp1 + temp2;
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker     op[0] = (a1 + d1 + 4) >> 3;
79*fb1b10abSAndroid Build Coastguard Worker     op[3] = (a1 - d1 + 4) >> 3;
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker     op[1] = (b1 + c1 + 4) >> 3;
82*fb1b10abSAndroid Build Coastguard Worker     op[2] = (b1 - c1 + 4) >> 3;
83*fb1b10abSAndroid Build Coastguard Worker 
84*fb1b10abSAndroid Build Coastguard Worker     ip += shortpitch;
85*fb1b10abSAndroid Build Coastguard Worker     op += shortpitch;
86*fb1b10abSAndroid Build Coastguard Worker   }
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker   ip = output;
89*fb1b10abSAndroid Build Coastguard Worker   for (r = 0; r < 4; ++r) {
90*fb1b10abSAndroid Build Coastguard Worker     for (c = 0; c < 4; ++c) {
91*fb1b10abSAndroid Build Coastguard Worker       int a = ip[c] + pred_ptr[c];
92*fb1b10abSAndroid Build Coastguard Worker 
93*fb1b10abSAndroid Build Coastguard Worker       if (a < 0) a = 0;
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker       if (a > 255) a = 255;
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker       dst_ptr[c] = (unsigned char)a;
98*fb1b10abSAndroid Build Coastguard Worker     }
99*fb1b10abSAndroid Build Coastguard Worker     ip += 4;
100*fb1b10abSAndroid Build Coastguard Worker     dst_ptr += dst_stride;
101*fb1b10abSAndroid Build Coastguard Worker     pred_ptr += pred_stride;
102*fb1b10abSAndroid Build Coastguard Worker   }
103*fb1b10abSAndroid Build Coastguard Worker }
104*fb1b10abSAndroid Build Coastguard Worker 
vp8_dc_only_idct_add_c(short input_dc,unsigned char * pred_ptr,int pred_stride,unsigned char * dst_ptr,int dst_stride)105*fb1b10abSAndroid Build Coastguard Worker void vp8_dc_only_idct_add_c(short input_dc, unsigned char *pred_ptr,
106*fb1b10abSAndroid Build Coastguard Worker                             int pred_stride, unsigned char *dst_ptr,
107*fb1b10abSAndroid Build Coastguard Worker                             int dst_stride) {
108*fb1b10abSAndroid Build Coastguard Worker   int a1 = ((input_dc + 4) >> 3);
109*fb1b10abSAndroid Build Coastguard Worker   int r, c;
110*fb1b10abSAndroid Build Coastguard Worker 
111*fb1b10abSAndroid Build Coastguard Worker   for (r = 0; r < 4; ++r) {
112*fb1b10abSAndroid Build Coastguard Worker     for (c = 0; c < 4; ++c) {
113*fb1b10abSAndroid Build Coastguard Worker       int a = a1 + pred_ptr[c];
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker       if (a < 0) a = 0;
116*fb1b10abSAndroid Build Coastguard Worker 
117*fb1b10abSAndroid Build Coastguard Worker       if (a > 255) a = 255;
118*fb1b10abSAndroid Build Coastguard Worker 
119*fb1b10abSAndroid Build Coastguard Worker       dst_ptr[c] = (unsigned char)a;
120*fb1b10abSAndroid Build Coastguard Worker     }
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker     dst_ptr += dst_stride;
123*fb1b10abSAndroid Build Coastguard Worker     pred_ptr += pred_stride;
124*fb1b10abSAndroid Build Coastguard Worker   }
125*fb1b10abSAndroid Build Coastguard Worker }
126*fb1b10abSAndroid Build Coastguard Worker 
vp8_short_inv_walsh4x4_c(short * input,short * mb_dqcoeff)127*fb1b10abSAndroid Build Coastguard Worker void vp8_short_inv_walsh4x4_c(short *input, short *mb_dqcoeff) {
128*fb1b10abSAndroid Build Coastguard Worker   short output[16];
129*fb1b10abSAndroid Build Coastguard Worker   int i;
130*fb1b10abSAndroid Build Coastguard Worker   int a1, b1, c1, d1;
131*fb1b10abSAndroid Build Coastguard Worker   int a2, b2, c2, d2;
132*fb1b10abSAndroid Build Coastguard Worker   short *ip = input;
133*fb1b10abSAndroid Build Coastguard Worker   short *op = output;
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 4; ++i) {
136*fb1b10abSAndroid Build Coastguard Worker     a1 = ip[0] + ip[12];
137*fb1b10abSAndroid Build Coastguard Worker     b1 = ip[4] + ip[8];
138*fb1b10abSAndroid Build Coastguard Worker     c1 = ip[4] - ip[8];
139*fb1b10abSAndroid Build Coastguard Worker     d1 = ip[0] - ip[12];
140*fb1b10abSAndroid Build Coastguard Worker 
141*fb1b10abSAndroid Build Coastguard Worker     op[0] = a1 + b1;
142*fb1b10abSAndroid Build Coastguard Worker     op[4] = c1 + d1;
143*fb1b10abSAndroid Build Coastguard Worker     op[8] = a1 - b1;
144*fb1b10abSAndroid Build Coastguard Worker     op[12] = d1 - c1;
145*fb1b10abSAndroid Build Coastguard Worker     ip++;
146*fb1b10abSAndroid Build Coastguard Worker     op++;
147*fb1b10abSAndroid Build Coastguard Worker   }
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker   ip = output;
150*fb1b10abSAndroid Build Coastguard Worker   op = output;
151*fb1b10abSAndroid Build Coastguard Worker 
152*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 4; ++i) {
153*fb1b10abSAndroid Build Coastguard Worker     a1 = ip[0] + ip[3];
154*fb1b10abSAndroid Build Coastguard Worker     b1 = ip[1] + ip[2];
155*fb1b10abSAndroid Build Coastguard Worker     c1 = ip[1] - ip[2];
156*fb1b10abSAndroid Build Coastguard Worker     d1 = ip[0] - ip[3];
157*fb1b10abSAndroid Build Coastguard Worker 
158*fb1b10abSAndroid Build Coastguard Worker     a2 = a1 + b1;
159*fb1b10abSAndroid Build Coastguard Worker     b2 = c1 + d1;
160*fb1b10abSAndroid Build Coastguard Worker     c2 = a1 - b1;
161*fb1b10abSAndroid Build Coastguard Worker     d2 = d1 - c1;
162*fb1b10abSAndroid Build Coastguard Worker 
163*fb1b10abSAndroid Build Coastguard Worker     op[0] = (a2 + 3) >> 3;
164*fb1b10abSAndroid Build Coastguard Worker     op[1] = (b2 + 3) >> 3;
165*fb1b10abSAndroid Build Coastguard Worker     op[2] = (c2 + 3) >> 3;
166*fb1b10abSAndroid Build Coastguard Worker     op[3] = (d2 + 3) >> 3;
167*fb1b10abSAndroid Build Coastguard Worker 
168*fb1b10abSAndroid Build Coastguard Worker     ip += 4;
169*fb1b10abSAndroid Build Coastguard Worker     op += 4;
170*fb1b10abSAndroid Build Coastguard Worker   }
171*fb1b10abSAndroid Build Coastguard Worker 
172*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; ++i) {
173*fb1b10abSAndroid Build Coastguard Worker     mb_dqcoeff[i * 16] = output[i];
174*fb1b10abSAndroid Build Coastguard Worker   }
175*fb1b10abSAndroid Build Coastguard Worker }
176*fb1b10abSAndroid Build Coastguard Worker 
vp8_short_inv_walsh4x4_1_c(short * input,short * mb_dqcoeff)177*fb1b10abSAndroid Build Coastguard Worker void vp8_short_inv_walsh4x4_1_c(short *input, short *mb_dqcoeff) {
178*fb1b10abSAndroid Build Coastguard Worker   int i;
179*fb1b10abSAndroid Build Coastguard Worker   int a1;
180*fb1b10abSAndroid Build Coastguard Worker 
181*fb1b10abSAndroid Build Coastguard Worker   a1 = ((input[0] + 3) >> 3);
182*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; ++i) {
183*fb1b10abSAndroid Build Coastguard Worker     mb_dqcoeff[i * 16] = a1;
184*fb1b10abSAndroid Build Coastguard Worker   }
185*fb1b10abSAndroid Build Coastguard Worker }
186