1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /**
21*495ae853SAndroid Build Coastguard Worker *******************************************************************************
22*495ae853SAndroid Build Coastguard Worker * @file
23*495ae853SAndroid Build Coastguard Worker * isvcd_iquant_itrans.c
24*495ae853SAndroid Build Coastguard Worker *
25*495ae853SAndroid Build Coastguard Worker * @brief
26*495ae853SAndroid Build Coastguard Worker * Contains definition of functions for h264 inverse quantization inverse
27*495ae853SAndroid Build Coastguard Worker transformation and resd comp
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker * Kishore
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_4x4()
34*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_8x8()
35*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_4x4_dc()
36*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_8x8_dc()
37*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_chroma_4x4()
38*495ae853SAndroid Build Coastguard Worker * - isvcd_iquant_itrans_chroma_4x4_dc()
39*495ae853SAndroid Build Coastguard Worker
40*495ae853SAndroid Build Coastguard Worker *
41*495ae853SAndroid Build Coastguard Worker * @remarks
42*495ae853SAndroid Build Coastguard Worker *
43*495ae853SAndroid Build Coastguard Worker *******************************************************************************
44*495ae853SAndroid Build Coastguard Worker */
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
47*495ae853SAndroid Build Coastguard Worker /* File Includes */
48*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
49*495ae853SAndroid Build Coastguard Worker
50*495ae853SAndroid Build Coastguard Worker /* User include files */
51*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_macros.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
59*495ae853SAndroid Build Coastguard Worker #include "isvcd_iquant_itrans.h"
60*495ae853SAndroid Build Coastguard Worker
61*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
62*495ae853SAndroid Build Coastguard Worker /* */
63*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_iquant_itrans_4x4 */
64*495ae853SAndroid Build Coastguard Worker /* */
65*495ae853SAndroid Build Coastguard Worker /* Description : this function computes the inverse quantized and */
66*495ae853SAndroid Build Coastguard Worker /* inverse transformed output */
67*495ae853SAndroid Build Coastguard Worker /* */
68*495ae853SAndroid Build Coastguard Worker /* Inputs : */
69*495ae853SAndroid Build Coastguard Worker /* Globals : none */
70*495ae853SAndroid Build Coastguard Worker /* Processing : */
71*495ae853SAndroid Build Coastguard Worker /* */
72*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
73*495ae853SAndroid Build Coastguard Worker /* Returns : none */
74*495ae853SAndroid Build Coastguard Worker /* */
75*495ae853SAndroid Build Coastguard Worker /* Issues : none */
76*495ae853SAndroid Build Coastguard Worker /* */
77*495ae853SAndroid Build Coastguard Worker /* Revision History: */
78*495ae853SAndroid Build Coastguard Worker /* */
79*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
80*495ae853SAndroid Build Coastguard Worker /* 25 11 2021 Kishore creation */
81*495ae853SAndroid Build Coastguard Worker /* */
82*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_iquant_itrans_4x4(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscal_mat,const UWORD16 * pu2_weigh_mat,UWORD32 u4_qp_div_6,WORD16 * pi2_tmp,WORD32 iq_start_idx,WORD16 * pi2_dc_ld_addr)83*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_4x4(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
84*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat, const UWORD16 *pu2_weigh_mat,
85*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6, WORD16 *pi2_tmp, WORD32 iq_start_idx,
86*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
87*495ae853SAndroid Build Coastguard Worker {
88*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_src_ptr = pi2_src;
89*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
90*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
91*495ae853SAndroid Build Coastguard Worker WORD16 x0, x1, x2, x3, i;
92*495ae853SAndroid Build Coastguard Worker WORD32 q0, q1, q2, q3;
93*495ae853SAndroid Build Coastguard Worker WORD16 i_macro;
94*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
95*495ae853SAndroid Build Coastguard Worker
96*495ae853SAndroid Build Coastguard Worker /* inverse quant */
97*495ae853SAndroid Build Coastguard Worker /*horizontal inverse transform */
98*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
99*495ae853SAndroid Build Coastguard Worker {
100*495ae853SAndroid Build Coastguard Worker q0 = pi2_src_ptr[0];
101*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
102*495ae853SAndroid Build Coastguard Worker if(i == 0 && iq_start_idx == 1)
103*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_ld_addr[0]; // Restoring dc value for intra case
104*495ae853SAndroid Build Coastguard Worker
105*495ae853SAndroid Build Coastguard Worker q2 = pi2_src_ptr[2];
106*495ae853SAndroid Build Coastguard Worker INV_QUANT(q2, pu2_iscal_mat[2], pu2_weigh_mat[2], u4_qp_div_6, rnd_fact, 4);
107*495ae853SAndroid Build Coastguard Worker
108*495ae853SAndroid Build Coastguard Worker x0 = q0 + q2;
109*495ae853SAndroid Build Coastguard Worker x1 = q0 - q2;
110*495ae853SAndroid Build Coastguard Worker
111*495ae853SAndroid Build Coastguard Worker q1 = pi2_src_ptr[1];
112*495ae853SAndroid Build Coastguard Worker INV_QUANT(q1, pu2_iscal_mat[1], pu2_weigh_mat[1], u4_qp_div_6, rnd_fact, 4);
113*495ae853SAndroid Build Coastguard Worker
114*495ae853SAndroid Build Coastguard Worker q3 = pi2_src_ptr[3];
115*495ae853SAndroid Build Coastguard Worker INV_QUANT(q3, pu2_iscal_mat[3], pu2_weigh_mat[3], u4_qp_div_6, rnd_fact, 4);
116*495ae853SAndroid Build Coastguard Worker
117*495ae853SAndroid Build Coastguard Worker x2 = (q1 >> 1) - q3;
118*495ae853SAndroid Build Coastguard Worker x3 = q1 + (q3 >> 1);
119*495ae853SAndroid Build Coastguard Worker
120*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = x0 + x3;
121*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = x1 + x2;
122*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = x1 - x2;
123*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = x0 - x3;
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker pi2_src_ptr += SUB_BLK_WIDTH_4x4;
126*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_4x4;
127*495ae853SAndroid Build Coastguard Worker pu2_iscal_mat += SUB_BLK_WIDTH_4x4;
128*495ae853SAndroid Build Coastguard Worker pu2_weigh_mat += SUB_BLK_WIDTH_4x4;
129*495ae853SAndroid Build Coastguard Worker }
130*495ae853SAndroid Build Coastguard Worker
131*495ae853SAndroid Build Coastguard Worker /* vertical inverse transform */
132*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
133*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
134*495ae853SAndroid Build Coastguard Worker {
135*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
136*495ae853SAndroid Build Coastguard Worker
137*495ae853SAndroid Build Coastguard Worker x0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[8]);
138*495ae853SAndroid Build Coastguard Worker x1 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[8]);
139*495ae853SAndroid Build Coastguard Worker x2 = (pi2_tmp_ptr[4] >> 1) - pi2_tmp_ptr[12];
140*495ae853SAndroid Build Coastguard Worker x3 = pi2_tmp_ptr[4] + (pi2_tmp_ptr[12] >> 1);
141*495ae853SAndroid Build Coastguard Worker
142*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
143*495ae853SAndroid Build Coastguard Worker i_macro = x0 + x3;
144*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
145*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
146*495ae853SAndroid Build Coastguard Worker
147*495ae853SAndroid Build Coastguard Worker i_macro = x1 + x2;
148*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
149*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
150*495ae853SAndroid Build Coastguard Worker
151*495ae853SAndroid Build Coastguard Worker i_macro = x1 - x2;
152*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
153*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
154*495ae853SAndroid Build Coastguard Worker
155*495ae853SAndroid Build Coastguard Worker i_macro = x0 - x3;
156*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
157*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
158*495ae853SAndroid Build Coastguard Worker pi2_out_ptr++;
159*495ae853SAndroid Build Coastguard Worker }
160*495ae853SAndroid Build Coastguard Worker }
161*495ae853SAndroid Build Coastguard Worker
162*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
163*495ae853SAndroid Build Coastguard Worker /* */
164*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_iquant_itrans_4x4_dc */
165*495ae853SAndroid Build Coastguard Worker /* */
166*495ae853SAndroid Build Coastguard Worker /* Description : this function computes the inverse quantized and */
167*495ae853SAndroid Build Coastguard Worker /* inverse transformed output */
168*495ae853SAndroid Build Coastguard Worker /* */
169*495ae853SAndroid Build Coastguard Worker /* Inputs : */
170*495ae853SAndroid Build Coastguard Worker /* Globals : none */
171*495ae853SAndroid Build Coastguard Worker /* Processing : */
172*495ae853SAndroid Build Coastguard Worker /* */
173*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
174*495ae853SAndroid Build Coastguard Worker /* Returns : none */
175*495ae853SAndroid Build Coastguard Worker /* */
176*495ae853SAndroid Build Coastguard Worker /* Issues : none */
177*495ae853SAndroid Build Coastguard Worker /* */
178*495ae853SAndroid Build Coastguard Worker /* Revision History: */
179*495ae853SAndroid Build Coastguard Worker /* */
180*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
181*495ae853SAndroid Build Coastguard Worker /* 25 11 2021 Kishore creation */
182*495ae853SAndroid Build Coastguard Worker /* */
183*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_iquant_itrans_4x4_dc(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscal_mat,const UWORD16 * pu2_weigh_mat,UWORD32 u4_qp_div_6,WORD16 * pi2_tmp,WORD32 iq_start_idx,WORD16 * pi2_dc_ld_addr)184*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_4x4_dc(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
185*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat, const UWORD16 *pu2_weigh_mat,
186*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6, WORD16 *pi2_tmp, WORD32 iq_start_idx,
187*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
188*495ae853SAndroid Build Coastguard Worker {
189*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
190*495ae853SAndroid Build Coastguard Worker WORD32 q0;
191*495ae853SAndroid Build Coastguard Worker WORD16 i_macro, i;
192*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
193*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
194*495ae853SAndroid Build Coastguard Worker
195*495ae853SAndroid Build Coastguard Worker if(iq_start_idx == 0)
196*495ae853SAndroid Build Coastguard Worker {
197*495ae853SAndroid Build Coastguard Worker q0 = pi2_src[0];
198*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
199*495ae853SAndroid Build Coastguard Worker }
200*495ae853SAndroid Build Coastguard Worker else
201*495ae853SAndroid Build Coastguard Worker {
202*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_ld_addr[0]; // Restoring dc value for intra case3
203*495ae853SAndroid Build Coastguard Worker }
204*495ae853SAndroid Build Coastguard Worker i_macro = CLIP_RSD((q0 + 32) >> 6);
205*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
206*495ae853SAndroid Build Coastguard Worker {
207*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
210*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
211*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
212*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
213*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
214*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
215*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
216*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
217*495ae853SAndroid Build Coastguard Worker pi2_out_ptr++;
218*495ae853SAndroid Build Coastguard Worker }
219*495ae853SAndroid Build Coastguard Worker }
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
222*495ae853SAndroid Build Coastguard Worker /* */
223*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_iquant_itrans_chroma_4x4 */
224*495ae853SAndroid Build Coastguard Worker /* */
225*495ae853SAndroid Build Coastguard Worker /* Description : this function computes the inverse quantized and */
226*495ae853SAndroid Build Coastguard Worker /* inverse transformed output */
227*495ae853SAndroid Build Coastguard Worker /* */
228*495ae853SAndroid Build Coastguard Worker /* Inputs : */
229*495ae853SAndroid Build Coastguard Worker /* Globals : none */
230*495ae853SAndroid Build Coastguard Worker /* Processing : */
231*495ae853SAndroid Build Coastguard Worker /* */
232*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
233*495ae853SAndroid Build Coastguard Worker /* Returns : none */
234*495ae853SAndroid Build Coastguard Worker /* */
235*495ae853SAndroid Build Coastguard Worker /* Issues : none */
236*495ae853SAndroid Build Coastguard Worker /* */
237*495ae853SAndroid Build Coastguard Worker /* Revision History: */
238*495ae853SAndroid Build Coastguard Worker /* */
239*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
240*495ae853SAndroid Build Coastguard Worker /* 25 11 2021 Kishore creation */
241*495ae853SAndroid Build Coastguard Worker /* */
242*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_iquant_itrans_chroma_4x4(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscal_mat,const UWORD16 * pu2_weigh_mat,UWORD32 u4_qp_div_6,WORD16 * pi2_tmp,WORD16 * pi2_dc_src)243*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_chroma_4x4(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
244*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat, const UWORD16 *pu2_weigh_mat,
245*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6, WORD16 *pi2_tmp, WORD16 *pi2_dc_src)
246*495ae853SAndroid Build Coastguard Worker {
247*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_src_ptr = pi2_src;
248*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
249*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
250*495ae853SAndroid Build Coastguard Worker WORD16 x0, x1, x2, x3, i;
251*495ae853SAndroid Build Coastguard Worker WORD32 q0, q1, q2, q3;
252*495ae853SAndroid Build Coastguard Worker WORD16 i_macro;
253*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker /* inverse quant */
256*495ae853SAndroid Build Coastguard Worker /*horizontal inverse transform */
257*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
258*495ae853SAndroid Build Coastguard Worker {
259*495ae853SAndroid Build Coastguard Worker if(i == 0)
260*495ae853SAndroid Build Coastguard Worker {
261*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_src[0];
262*495ae853SAndroid Build Coastguard Worker }
263*495ae853SAndroid Build Coastguard Worker else
264*495ae853SAndroid Build Coastguard Worker {
265*495ae853SAndroid Build Coastguard Worker q0 = pi2_src_ptr[0];
266*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
267*495ae853SAndroid Build Coastguard Worker }
268*495ae853SAndroid Build Coastguard Worker
269*495ae853SAndroid Build Coastguard Worker q2 = pi2_src_ptr[2];
270*495ae853SAndroid Build Coastguard Worker INV_QUANT(q2, pu2_iscal_mat[2], pu2_weigh_mat[2], u4_qp_div_6, rnd_fact, 4);
271*495ae853SAndroid Build Coastguard Worker
272*495ae853SAndroid Build Coastguard Worker x0 = q0 + q2;
273*495ae853SAndroid Build Coastguard Worker x1 = q0 - q2;
274*495ae853SAndroid Build Coastguard Worker
275*495ae853SAndroid Build Coastguard Worker q1 = pi2_src_ptr[1];
276*495ae853SAndroid Build Coastguard Worker INV_QUANT(q1, pu2_iscal_mat[1], pu2_weigh_mat[1], u4_qp_div_6, rnd_fact, 4);
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker q3 = pi2_src_ptr[3];
279*495ae853SAndroid Build Coastguard Worker INV_QUANT(q3, pu2_iscal_mat[3], pu2_weigh_mat[3], u4_qp_div_6, rnd_fact, 4);
280*495ae853SAndroid Build Coastguard Worker
281*495ae853SAndroid Build Coastguard Worker x2 = (q1 >> 1) - q3;
282*495ae853SAndroid Build Coastguard Worker x3 = q1 + (q3 >> 1);
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = x0 + x3;
285*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = x1 + x2;
286*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = x1 - x2;
287*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = x0 - x3;
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker pi2_src_ptr += SUB_BLK_WIDTH_4x4;
290*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_4x4;
291*495ae853SAndroid Build Coastguard Worker pu2_iscal_mat += SUB_BLK_WIDTH_4x4;
292*495ae853SAndroid Build Coastguard Worker pu2_weigh_mat += SUB_BLK_WIDTH_4x4;
293*495ae853SAndroid Build Coastguard Worker }
294*495ae853SAndroid Build Coastguard Worker
295*495ae853SAndroid Build Coastguard Worker /* vertical inverse transform */
296*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
297*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
298*495ae853SAndroid Build Coastguard Worker {
299*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
300*495ae853SAndroid Build Coastguard Worker
301*495ae853SAndroid Build Coastguard Worker x0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[8]);
302*495ae853SAndroid Build Coastguard Worker x1 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[8]);
303*495ae853SAndroid Build Coastguard Worker x2 = (pi2_tmp_ptr[4] >> 1) - pi2_tmp_ptr[12];
304*495ae853SAndroid Build Coastguard Worker x3 = pi2_tmp_ptr[4] + (pi2_tmp_ptr[12] >> 1);
305*495ae853SAndroid Build Coastguard Worker
306*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
307*495ae853SAndroid Build Coastguard Worker i_macro = x0 + x3;
308*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
309*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
310*495ae853SAndroid Build Coastguard Worker
311*495ae853SAndroid Build Coastguard Worker i_macro = x1 + x2;
312*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
313*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
314*495ae853SAndroid Build Coastguard Worker
315*495ae853SAndroid Build Coastguard Worker i_macro = x1 - x2;
316*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
317*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
318*495ae853SAndroid Build Coastguard Worker
319*495ae853SAndroid Build Coastguard Worker i_macro = x0 - x3;
320*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_macro + 32) >> 6);
321*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
322*495ae853SAndroid Build Coastguard Worker pi2_out_ptr += 2; // Interleaved store for output
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker }
325*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
326*495ae853SAndroid Build Coastguard Worker /* */
327*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_iquant_itrans_chroma_4x4_dc */
328*495ae853SAndroid Build Coastguard Worker /* */
329*495ae853SAndroid Build Coastguard Worker /* Description : this function computes the inverse quantized and */
330*495ae853SAndroid Build Coastguard Worker /* inverse transformed output */
331*495ae853SAndroid Build Coastguard Worker /* */
332*495ae853SAndroid Build Coastguard Worker /* Inputs : */
333*495ae853SAndroid Build Coastguard Worker /* Globals : none */
334*495ae853SAndroid Build Coastguard Worker /* Processing : */
335*495ae853SAndroid Build Coastguard Worker /* */
336*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
337*495ae853SAndroid Build Coastguard Worker /* Returns : none */
338*495ae853SAndroid Build Coastguard Worker /* */
339*495ae853SAndroid Build Coastguard Worker /* Issues : none */
340*495ae853SAndroid Build Coastguard Worker /* */
341*495ae853SAndroid Build Coastguard Worker /* Revision History: */
342*495ae853SAndroid Build Coastguard Worker /* */
343*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
344*495ae853SAndroid Build Coastguard Worker /* 25 11 2021 Kishore creation */
345*495ae853SAndroid Build Coastguard Worker /* */
346*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
347*495ae853SAndroid Build Coastguard Worker
isvcd_iquant_itrans_chroma_4x4_dc(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscal_mat,const UWORD16 * pu2_weigh_mat,UWORD32 u4_qp_div_6,WORD16 * pi2_tmp,WORD16 * pi2_dc_src)348*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_chroma_4x4_dc(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
349*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat, const UWORD16 *pu2_weigh_mat,
350*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6, WORD16 *pi2_tmp, WORD16 *pi2_dc_src)
351*495ae853SAndroid Build Coastguard Worker {
352*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
353*495ae853SAndroid Build Coastguard Worker WORD32 q0;
354*495ae853SAndroid Build Coastguard Worker WORD16 i_macro, i;
355*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_src);
356*495ae853SAndroid Build Coastguard Worker UNUSED(pu2_iscal_mat);
357*495ae853SAndroid Build Coastguard Worker UNUSED(pu2_weigh_mat);
358*495ae853SAndroid Build Coastguard Worker UNUSED(u4_qp_div_6);
359*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_src[0]; // Restoring dc value for intra case3
362*495ae853SAndroid Build Coastguard Worker i_macro = CLIP_RSD((q0 + 32) >> 6);
363*495ae853SAndroid Build Coastguard Worker
364*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
365*495ae853SAndroid Build Coastguard Worker {
366*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
369*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
370*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
371*495ae853SAndroid Build Coastguard Worker
372*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
373*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
374*495ae853SAndroid Build Coastguard Worker
375*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
376*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
377*495ae853SAndroid Build Coastguard Worker
378*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
379*495ae853SAndroid Build Coastguard Worker
380*495ae853SAndroid Build Coastguard Worker pi2_out_ptr += 2;
381*495ae853SAndroid Build Coastguard Worker }
382*495ae853SAndroid Build Coastguard Worker }
383*495ae853SAndroid Build Coastguard Worker
384*495ae853SAndroid Build Coastguard Worker /**
385*495ae853SAndroid Build Coastguard Worker *******************************************************************************
386*495ae853SAndroid Build Coastguard Worker *
387*495ae853SAndroid Build Coastguard Worker * @brief
388*495ae853SAndroid Build Coastguard Worker * This function performs inverse quant and Inverse transform type Ci4 for 8x8
389*495ae853SAndroid Build Coastguard Worker *block
390*495ae853SAndroid Build Coastguard Worker *
391*495ae853SAndroid Build Coastguard Worker * @par Description:
392*495ae853SAndroid Build Coastguard Worker * Performs inverse transform Ci8 and adds the residue to get the
393*495ae853SAndroid Build Coastguard Worker * reconstructed block
394*495ae853SAndroid Build Coastguard Worker *
395*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
396*495ae853SAndroid Build Coastguard Worker * Input 8x8coefficients
397*495ae853SAndroid Build Coastguard Worker *
398*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
399*495ae853SAndroid Build Coastguard Worker * Prediction 8x8 block
400*495ae853SAndroid Build Coastguard Worker *
401*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_recon
402*495ae853SAndroid Build Coastguard Worker * Output 8x8 block
403*495ae853SAndroid Build Coastguard Worker *
404*495ae853SAndroid Build Coastguard Worker * @param[in] q_div
405*495ae853SAndroid Build Coastguard Worker * QP/6
406*495ae853SAndroid Build Coastguard Worker *
407*495ae853SAndroid Build Coastguard Worker * @param[in] q_rem
408*495ae853SAndroid Build Coastguard Worker * QP%6
409*495ae853SAndroid Build Coastguard Worker *
410*495ae853SAndroid Build Coastguard Worker * @param[in] q_lev
411*495ae853SAndroid Build Coastguard Worker * Quantizer level
412*495ae853SAndroid Build Coastguard Worker *
413*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
414*495ae853SAndroid Build Coastguard Worker * Input stride
415*495ae853SAndroid Build Coastguard Worker *
416*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd,
417*495ae853SAndroid Build Coastguard Worker * Prediction stride
418*495ae853SAndroid Build Coastguard Worker *
419*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
420*495ae853SAndroid Build Coastguard Worker * Output Stride
421*495ae853SAndroid Build Coastguard Worker *
422*495ae853SAndroid Build Coastguard Worker * @param[in] pi4_tmp
423*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16 we dont need a bigger blcok since we reuse
424*495ae853SAndroid Build Coastguard Worker * the tmp for each block
425*495ae853SAndroid Build Coastguard Worker *
426*495ae853SAndroid Build Coastguard Worker * @param[in] pu4_iquant_mat
427*495ae853SAndroid Build Coastguard Worker * Pointer to the inverse quantization matrix
428*495ae853SAndroid Build Coastguard Worker *
429*495ae853SAndroid Build Coastguard Worker * @returns Void
430*495ae853SAndroid Build Coastguard Worker *
431*495ae853SAndroid Build Coastguard Worker * @remarks
432*495ae853SAndroid Build Coastguard Worker * None
433*495ae853SAndroid Build Coastguard Worker *
434*495ae853SAndroid Build Coastguard Worker *******************************************************************************
435*495ae853SAndroid Build Coastguard Worker */
isvcd_iquant_itrans_8x8_dc(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscale_mat,const UWORD16 * pu2_weigh_mat,UWORD32 qp_div,WORD16 * pi2_tmp,WORD32 iq_start_idx,WORD16 * pi2_dc_ld_addr)436*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_8x8_dc(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
437*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscale_mat, const UWORD16 *pu2_weigh_mat,
438*495ae853SAndroid Build Coastguard Worker UWORD32 qp_div, WORD16 *pi2_tmp, WORD32 iq_start_idx,
439*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
440*495ae853SAndroid Build Coastguard Worker {
441*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
442*495ae853SAndroid Build Coastguard Worker WORD16 i, i_macro;
443*495ae853SAndroid Build Coastguard Worker WORD32 q;
444*495ae853SAndroid Build Coastguard Worker WORD32 rnd_fact = (qp_div < 6) ? (1 << (5 - qp_div)) : 0;
445*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
446*495ae853SAndroid Build Coastguard Worker UNUSED(iq_start_idx);
447*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_dc_ld_addr);
448*495ae853SAndroid Build Coastguard Worker /*************************************************************/
449*495ae853SAndroid Build Coastguard Worker /* Dequantization of coefficients. Will be replaced by SIMD */
450*495ae853SAndroid Build Coastguard Worker /* operations on platform. Note : DC coeff is not scaled */
451*495ae853SAndroid Build Coastguard Worker /*************************************************************/
452*495ae853SAndroid Build Coastguard Worker q = pi2_src[0];
453*495ae853SAndroid Build Coastguard Worker INV_QUANT(q, pu2_iscale_mat[0], pu2_weigh_mat[0], qp_div, rnd_fact, 6);
454*495ae853SAndroid Build Coastguard Worker i_macro = CLIP_RSD((q + 32) >> 6);
455*495ae853SAndroid Build Coastguard Worker /* Perform Inverse transform */
456*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
457*495ae853SAndroid Build Coastguard Worker /* IDCT [ Horizontal transformation ] */
458*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
459*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
460*495ae853SAndroid Build Coastguard Worker /* IDCT [ Vertical transformation] and Xij = (xij + 32)>>6 */
461*495ae853SAndroid Build Coastguard Worker /* */
462*495ae853SAndroid Build Coastguard Worker /* Add the prediction and store it back to reconstructed frame buffer */
463*495ae853SAndroid Build Coastguard Worker /* [Prediction buffer itself in this case] */
464*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
465*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
466*495ae853SAndroid Build Coastguard Worker {
467*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
468*495ae853SAndroid Build Coastguard Worker
469*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
470*495ae853SAndroid Build Coastguard Worker /* Change uc_recBuffer to Point to next element in the same column*/
471*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
472*495ae853SAndroid Build Coastguard Worker
473*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
474*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
475*495ae853SAndroid Build Coastguard Worker
476*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
477*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
478*495ae853SAndroid Build Coastguard Worker
479*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
480*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
481*495ae853SAndroid Build Coastguard Worker
482*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
483*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
484*495ae853SAndroid Build Coastguard Worker
485*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
486*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
487*495ae853SAndroid Build Coastguard Worker
488*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
489*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
490*495ae853SAndroid Build Coastguard Worker
491*495ae853SAndroid Build Coastguard Worker *pi2_out = i_macro;
492*495ae853SAndroid Build Coastguard Worker
493*495ae853SAndroid Build Coastguard Worker pi2_out_ptr++;
494*495ae853SAndroid Build Coastguard Worker }
495*495ae853SAndroid Build Coastguard Worker }
496*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
497*495ae853SAndroid Build Coastguard Worker /* */
498*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_iquant_itrans_8x8 */
499*495ae853SAndroid Build Coastguard Worker /* */
500*495ae853SAndroid Build Coastguard Worker /* Description : this function computes the inverse quantized and */
501*495ae853SAndroid Build Coastguard Worker /* inverse transformed output */
502*495ae853SAndroid Build Coastguard Worker /* */
503*495ae853SAndroid Build Coastguard Worker /* Inputs : */
504*495ae853SAndroid Build Coastguard Worker /* Globals : none */
505*495ae853SAndroid Build Coastguard Worker /* Processing : */
506*495ae853SAndroid Build Coastguard Worker /* */
507*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
508*495ae853SAndroid Build Coastguard Worker /* Returns : none */
509*495ae853SAndroid Build Coastguard Worker /* */
510*495ae853SAndroid Build Coastguard Worker /* Issues : none */
511*495ae853SAndroid Build Coastguard Worker /* */
512*495ae853SAndroid Build Coastguard Worker /* Revision History: */
513*495ae853SAndroid Build Coastguard Worker /* */
514*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
515*495ae853SAndroid Build Coastguard Worker /* 25 11 2021 Kishore creation */
516*495ae853SAndroid Build Coastguard Worker /* */
517*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
518*495ae853SAndroid Build Coastguard Worker
isvcd_iquant_itrans_8x8(WORD16 * pi2_src,WORD16 * pi2_out,WORD32 out_strd,const UWORD16 * pu2_iscale_mat,const UWORD16 * pu2_weigh_mat,UWORD32 qp_div,WORD16 * pi2_tmp,WORD32 iq_start_idx,WORD16 * pi2_dc_ld_addr)519*495ae853SAndroid Build Coastguard Worker void isvcd_iquant_itrans_8x8(WORD16 *pi2_src, WORD16 *pi2_out, WORD32 out_strd,
520*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscale_mat, const UWORD16 *pu2_weigh_mat,
521*495ae853SAndroid Build Coastguard Worker UWORD32 qp_div, WORD16 *pi2_tmp, WORD32 iq_start_idx,
522*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
523*495ae853SAndroid Build Coastguard Worker {
524*495ae853SAndroid Build Coastguard Worker WORD32 i;
525*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
526*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_ptr = pi2_out;
527*495ae853SAndroid Build Coastguard Worker WORD16 i_z0, i_z1, i_z2, i_z3, i_z4, i_z5, i_z6, i_z7;
528*495ae853SAndroid Build Coastguard Worker WORD16 i_y0, i_y1, i_y2, i_y3, i_y4, i_y5, i_y6, i_y7;
529*495ae853SAndroid Build Coastguard Worker WORD32 q;
530*495ae853SAndroid Build Coastguard Worker WORD32 rnd_fact = (qp_div < 6) ? (1 << (5 - qp_div)) : 0;
531*495ae853SAndroid Build Coastguard Worker UNUSED(iq_start_idx);
532*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_dc_ld_addr);
533*495ae853SAndroid Build Coastguard Worker /*************************************************************/
534*495ae853SAndroid Build Coastguard Worker /* De quantization of coefficients. Will be replaced by SIMD */
535*495ae853SAndroid Build Coastguard Worker /* operations on platform. Note : DC coeff is not scaled */
536*495ae853SAndroid Build Coastguard Worker /*************************************************************/
537*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (SUB_BLK_WIDTH_8x8 * SUB_BLK_WIDTH_8x8); i++)
538*495ae853SAndroid Build Coastguard Worker {
539*495ae853SAndroid Build Coastguard Worker q = pi2_src[i];
540*495ae853SAndroid Build Coastguard Worker INV_QUANT(q, pu2_iscale_mat[i], pu2_weigh_mat[i], qp_div, rnd_fact, 6);
541*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[i] = q;
542*495ae853SAndroid Build Coastguard Worker }
543*495ae853SAndroid Build Coastguard Worker /* Perform Inverse transform */
544*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
545*495ae853SAndroid Build Coastguard Worker /* IDCT [ Horizontal transformation ] */
546*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
547*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
548*495ae853SAndroid Build Coastguard Worker {
549*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
550*495ae853SAndroid Build Coastguard Worker /* y0 = w0 + w4 */
551*495ae853SAndroid Build Coastguard Worker /* y1 = -w3 + w5 - w7 - (w7 >> 1) */
552*495ae853SAndroid Build Coastguard Worker /* y2 = w0 - w4 */
553*495ae853SAndroid Build Coastguard Worker /* y3 = w1 + w7 - w3 - (w3 >> 1) */
554*495ae853SAndroid Build Coastguard Worker /* y4 = (w2 >> 1) - w6 */
555*495ae853SAndroid Build Coastguard Worker /* y5 = -w1 + w7 + w5 + (w5 >> 1) */
556*495ae853SAndroid Build Coastguard Worker /* y6 = w2 + (w6 >> 1) */
557*495ae853SAndroid Build Coastguard Worker /* y7 = w3 + w5 + w1 + (w1 >> 1) */
558*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
559*495ae853SAndroid Build Coastguard Worker i_y0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[4]);
560*495ae853SAndroid Build Coastguard Worker
561*495ae853SAndroid Build Coastguard Worker i_y1 =
562*495ae853SAndroid Build Coastguard Worker ((WORD32) (-pi2_tmp_ptr[3]) + pi2_tmp_ptr[5] - pi2_tmp_ptr[7] - (pi2_tmp_ptr[7] >> 1));
563*495ae853SAndroid Build Coastguard Worker
564*495ae853SAndroid Build Coastguard Worker i_y2 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[4]);
565*495ae853SAndroid Build Coastguard Worker
566*495ae853SAndroid Build Coastguard Worker i_y3 = ((WORD32) pi2_tmp_ptr[1] + pi2_tmp_ptr[7] - pi2_tmp_ptr[3] - (pi2_tmp_ptr[3] >> 1));
567*495ae853SAndroid Build Coastguard Worker
568*495ae853SAndroid Build Coastguard Worker i_y4 = ((pi2_tmp_ptr[2] >> 1) - pi2_tmp_ptr[6]);
569*495ae853SAndroid Build Coastguard Worker
570*495ae853SAndroid Build Coastguard Worker i_y5 =
571*495ae853SAndroid Build Coastguard Worker ((WORD32) (-pi2_tmp_ptr[1]) + pi2_tmp_ptr[7] + pi2_tmp_ptr[5] + (pi2_tmp_ptr[5] >> 1));
572*495ae853SAndroid Build Coastguard Worker
573*495ae853SAndroid Build Coastguard Worker i_y6 = (pi2_tmp_ptr[2] + (pi2_tmp_ptr[6] >> 1));
574*495ae853SAndroid Build Coastguard Worker
575*495ae853SAndroid Build Coastguard Worker i_y7 = ((WORD32) pi2_tmp_ptr[3] + pi2_tmp_ptr[5] + pi2_tmp_ptr[1] + (pi2_tmp_ptr[1] >> 1));
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
578*495ae853SAndroid Build Coastguard Worker /* z0 = y0 + y6 */
579*495ae853SAndroid Build Coastguard Worker /* z1 = y1 + (y7 >> 2) */
580*495ae853SAndroid Build Coastguard Worker /* z2 = y2 + y4 */
581*495ae853SAndroid Build Coastguard Worker /* z3 = y3 + (y5 >> 2) */
582*495ae853SAndroid Build Coastguard Worker /* z4 = y2 - y4 */
583*495ae853SAndroid Build Coastguard Worker /* z5 = (y3 >> 2) - y5 */
584*495ae853SAndroid Build Coastguard Worker /* z6 = y0 - y6 */
585*495ae853SAndroid Build Coastguard Worker /* z7 = y7 - (y1 >> 2) */
586*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
587*495ae853SAndroid Build Coastguard Worker i_z0 = i_y0 + i_y6;
588*495ae853SAndroid Build Coastguard Worker i_z1 = i_y1 + (i_y7 >> 2);
589*495ae853SAndroid Build Coastguard Worker i_z2 = i_y2 + i_y4;
590*495ae853SAndroid Build Coastguard Worker i_z3 = i_y3 + (i_y5 >> 2);
591*495ae853SAndroid Build Coastguard Worker i_z4 = i_y2 - i_y4;
592*495ae853SAndroid Build Coastguard Worker i_z5 = (i_y3 >> 2) - i_y5;
593*495ae853SAndroid Build Coastguard Worker i_z6 = i_y0 - i_y6;
594*495ae853SAndroid Build Coastguard Worker i_z7 = i_y7 - (i_y1 >> 2);
595*495ae853SAndroid Build Coastguard Worker
596*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
597*495ae853SAndroid Build Coastguard Worker /* x0 = z0 + z7 */
598*495ae853SAndroid Build Coastguard Worker /* x1 = z2 + z5 */
599*495ae853SAndroid Build Coastguard Worker /* x2 = z4 + z3 */
600*495ae853SAndroid Build Coastguard Worker /* x3 = z6 + z1 */
601*495ae853SAndroid Build Coastguard Worker /* x4 = z6 - z1 */
602*495ae853SAndroid Build Coastguard Worker /* x5 = z4 - z3 */
603*495ae853SAndroid Build Coastguard Worker /* x6 = z2 - z5 */
604*495ae853SAndroid Build Coastguard Worker /* x7 = z0 - z7 */
605*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
606*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = i_z0 + i_z7;
607*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = i_z2 + i_z5;
608*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = i_z4 + i_z3;
609*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = i_z6 + i_z1;
610*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[4] = i_z6 - i_z1;
611*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[5] = i_z4 - i_z3;
612*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[6] = i_z2 - i_z5;
613*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[7] = i_z0 - i_z7;
614*495ae853SAndroid Build Coastguard Worker
615*495ae853SAndroid Build Coastguard Worker /* move to the next row */
616*495ae853SAndroid Build Coastguard Worker // pi2_src_ptr += SUB_BLK_WIDTH_8x8;
617*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_8x8;
618*495ae853SAndroid Build Coastguard Worker }
619*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
620*495ae853SAndroid Build Coastguard Worker /* IDCT [ Vertical transformation] and Xij = (xij + 32)>>6 */
621*495ae853SAndroid Build Coastguard Worker /* */
622*495ae853SAndroid Build Coastguard Worker /* Add the prediction and store it back to reconstructed frame buffer */
623*495ae853SAndroid Build Coastguard Worker /* [Prediction buffer itself in this case] */
624*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
625*495ae853SAndroid Build Coastguard Worker
626*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
627*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
628*495ae853SAndroid Build Coastguard Worker {
629*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_ptr;
630*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
631*495ae853SAndroid Build Coastguard Worker /* y0j = w0j + w4j */
632*495ae853SAndroid Build Coastguard Worker /* y1j = -w3j + w5j -w7j -(w7j >> 1) */
633*495ae853SAndroid Build Coastguard Worker /* y2j = w0j -w4j */
634*495ae853SAndroid Build Coastguard Worker /* y3j = w1j + w7j -w3j -(w3j >> 1) */
635*495ae853SAndroid Build Coastguard Worker /* y4j = ( w2j >> 1 ) -w6j */
636*495ae853SAndroid Build Coastguard Worker /* y5j = -w1j + w7j + w5j + (w5j >> 1) */
637*495ae853SAndroid Build Coastguard Worker /* y6j = w2j + ( w6j >> 1 ) */
638*495ae853SAndroid Build Coastguard Worker /* y7j = w3j + w5j + w1j + (w1j >> 1) */
639*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
640*495ae853SAndroid Build Coastguard Worker i_y0 = pi2_tmp_ptr[0] + pi2_tmp_ptr[32];
641*495ae853SAndroid Build Coastguard Worker
642*495ae853SAndroid Build Coastguard Worker i_y1 = (WORD32) (-pi2_tmp_ptr[24]) + pi2_tmp_ptr[40] - pi2_tmp_ptr[56] -
643*495ae853SAndroid Build Coastguard Worker (pi2_tmp_ptr[56] >> 1);
644*495ae853SAndroid Build Coastguard Worker
645*495ae853SAndroid Build Coastguard Worker i_y2 = pi2_tmp_ptr[0] - pi2_tmp_ptr[32];
646*495ae853SAndroid Build Coastguard Worker
647*495ae853SAndroid Build Coastguard Worker i_y3 = (WORD32) pi2_tmp_ptr[8] + pi2_tmp_ptr[56] - pi2_tmp_ptr[24] - (pi2_tmp_ptr[24] >> 1);
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker i_y4 = (pi2_tmp_ptr[16] >> 1) - pi2_tmp_ptr[48];
650*495ae853SAndroid Build Coastguard Worker
651*495ae853SAndroid Build Coastguard Worker i_y5 =
652*495ae853SAndroid Build Coastguard Worker (WORD32) (-pi2_tmp_ptr[8]) + pi2_tmp_ptr[56] + pi2_tmp_ptr[40] + (pi2_tmp_ptr[40] >> 1);
653*495ae853SAndroid Build Coastguard Worker
654*495ae853SAndroid Build Coastguard Worker i_y6 = pi2_tmp_ptr[16] + (pi2_tmp_ptr[48] >> 1);
655*495ae853SAndroid Build Coastguard Worker
656*495ae853SAndroid Build Coastguard Worker i_y7 = (WORD32) pi2_tmp_ptr[24] + pi2_tmp_ptr[40] + pi2_tmp_ptr[8] + (pi2_tmp_ptr[8] >> 1);
657*495ae853SAndroid Build Coastguard Worker
658*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
659*495ae853SAndroid Build Coastguard Worker /* z0j = y0j + y6j */
660*495ae853SAndroid Build Coastguard Worker /* z1j = y1j + (y7j >> 2) */
661*495ae853SAndroid Build Coastguard Worker /* z2j = y2j + y4j */
662*495ae853SAndroid Build Coastguard Worker /* z3j = y3j + (y5j >> 2) */
663*495ae853SAndroid Build Coastguard Worker /* z4j = y2j -y4j */
664*495ae853SAndroid Build Coastguard Worker /* z5j = (y3j >> 2) -y5j */
665*495ae853SAndroid Build Coastguard Worker /* z6j = y0j -y6j */
666*495ae853SAndroid Build Coastguard Worker /* z7j = y7j -(y1j >> 2) */
667*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
668*495ae853SAndroid Build Coastguard Worker i_z0 = i_y0 + i_y6;
669*495ae853SAndroid Build Coastguard Worker i_z1 = i_y1 + (i_y7 >> 2);
670*495ae853SAndroid Build Coastguard Worker i_z2 = i_y2 + i_y4;
671*495ae853SAndroid Build Coastguard Worker i_z3 = i_y3 + (i_y5 >> 2);
672*495ae853SAndroid Build Coastguard Worker i_z4 = i_y2 - i_y4;
673*495ae853SAndroid Build Coastguard Worker i_z5 = (i_y3 >> 2) - i_y5;
674*495ae853SAndroid Build Coastguard Worker i_z6 = i_y0 - i_y6;
675*495ae853SAndroid Build Coastguard Worker i_z7 = i_y7 - (i_y1 >> 2);
676*495ae853SAndroid Build Coastguard Worker
677*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
678*495ae853SAndroid Build Coastguard Worker /* x0j = z0j + z7j */
679*495ae853SAndroid Build Coastguard Worker /* x1j = z2j + z5j */
680*495ae853SAndroid Build Coastguard Worker /* x2j = z4j + z3j */
681*495ae853SAndroid Build Coastguard Worker /* x3j = z6j + z1j */
682*495ae853SAndroid Build Coastguard Worker /* x4j = z6j -z1j */
683*495ae853SAndroid Build Coastguard Worker /* x5j = z4j -z3j */
684*495ae853SAndroid Build Coastguard Worker /* x6j = z2j -z5j */
685*495ae853SAndroid Build Coastguard Worker /* x7j = z0j -z7j */
686*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
687*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z0 + i_z7 + 32) >> 6);
688*495ae853SAndroid Build Coastguard Worker /* Change uc_recBuffer to Point to next element in the same column*/
689*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
690*495ae853SAndroid Build Coastguard Worker
691*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z2 + i_z5 + 32) >> 6);
692*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
693*495ae853SAndroid Build Coastguard Worker
694*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z4 + i_z3 + 32) >> 6);
695*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
696*495ae853SAndroid Build Coastguard Worker
697*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z6 + i_z1 + 32) >> 6);
698*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
699*495ae853SAndroid Build Coastguard Worker
700*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z6 - i_z1 + 32) >> 6);
701*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
702*495ae853SAndroid Build Coastguard Worker
703*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z4 - i_z3 + 32) >> 6);
704*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
705*495ae853SAndroid Build Coastguard Worker
706*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z2 - i_z5 + 32) >> 6);
707*495ae853SAndroid Build Coastguard Worker pi2_out += out_strd;
708*495ae853SAndroid Build Coastguard Worker
709*495ae853SAndroid Build Coastguard Worker *pi2_out = CLIP_RSD((i_z0 - i_z7 + 32) >> 6);
710*495ae853SAndroid Build Coastguard Worker
711*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
712*495ae853SAndroid Build Coastguard Worker pi2_out_ptr++;
713*495ae853SAndroid Build Coastguard Worker }
714*495ae853SAndroid Build Coastguard Worker }
715