1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 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 *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264_iquant_itrans_recon.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains definition of functions for h264 inverse quantization,
28*495ae853SAndroid Build Coastguard Worker * inverse transformation and recon
29*495ae853SAndroid Build Coastguard Worker *
30*495ae853SAndroid Build Coastguard Worker * @author
31*495ae853SAndroid Build Coastguard Worker * ittiam
32*495ae853SAndroid Build Coastguard Worker *
33*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
34*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_4x4
35*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_8x8
36*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_4x4_dc
37*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_8x8_dc
38*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_chroma_4x4
39*495ae853SAndroid Build Coastguard Worker * - ih264_iquant_itrans_recon_chroma_4x4_dc
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_macros.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_macros.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
60*495ae853SAndroid Build Coastguard Worker
61*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
62*495ae853SAndroid Build Coastguard Worker /* Function definitions */
63*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
64*495ae853SAndroid Build Coastguard Worker
65*495ae853SAndroid Build Coastguard Worker /**
66*495ae853SAndroid Build Coastguard Worker ********************************************************************************
67*495ae853SAndroid Build Coastguard Worker *
68*495ae853SAndroid Build Coastguard Worker * @brief This function reconstructs a 4x4 sub block from quantized residue and
69*495ae853SAndroid Build Coastguard Worker * prediction buffer
70*495ae853SAndroid Build Coastguard Worker *
71*495ae853SAndroid Build Coastguard Worker * @par Description:
72*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized, then inverse transformed.
73*495ae853SAndroid Build Coastguard Worker * This inverse transformed content is added to the prediction buffer to recon-
74*495ae853SAndroid Build Coastguard Worker * struct the end output
75*495ae853SAndroid Build Coastguard Worker *
76*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
77*495ae853SAndroid Build Coastguard Worker * quantized 4x4 block
78*495ae853SAndroid Build Coastguard Worker *
79*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
80*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block
81*495ae853SAndroid Build Coastguard Worker *
82*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_out
83*495ae853SAndroid Build Coastguard Worker * reconstructed 4x4 block
84*495ae853SAndroid Build Coastguard Worker *
85*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
86*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride
87*495ae853SAndroid Build Coastguard Worker *
88*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
89*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
90*495ae853SAndroid Build Coastguard Worker *
91*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
92*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
93*495ae853SAndroid Build Coastguard Worker *
94*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
95*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
96*495ae853SAndroid Build Coastguard Worker *
97*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
98*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
99*495ae853SAndroid Build Coastguard Worker *
100*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
101*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16
102*495ae853SAndroid Build Coastguard Worker *
103*495ae853SAndroid Build Coastguard Worker * @param[in] iq_start_idx
104*495ae853SAndroid Build Coastguard Worker * Differentiates b/w intra or inter
105*495ae853SAndroid Build Coastguard Worker *
106*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_ld_addr
107*495ae853SAndroid Build Coastguard Worker * Address to load DC value of the 4x4 blk
108*495ae853SAndroid Build Coastguard Worker *
109*495ae853SAndroid Build Coastguard Worker * @returns none
110*495ae853SAndroid Build Coastguard Worker *
111*495ae853SAndroid Build Coastguard Worker * @remarks none
112*495ae853SAndroid Build Coastguard Worker *
113*495ae853SAndroid Build Coastguard Worker *******************************************************************************
114*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_4x4(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)115*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_4x4(WORD16 *pi2_src,
116*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
117*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
118*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
119*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
120*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat,
121*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
122*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6,
123*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
124*495ae853SAndroid Build Coastguard Worker WORD32 iq_start_idx,
125*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
126*495ae853SAndroid Build Coastguard Worker {
127*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_src_ptr = pi2_src;
128*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
129*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
130*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
131*495ae853SAndroid Build Coastguard Worker WORD16 x0, x1, x2, x3, i;
132*495ae853SAndroid Build Coastguard Worker WORD32 q0, q1, q2, q3;
133*495ae853SAndroid Build Coastguard Worker WORD16 i_macro;
134*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker /* inverse quant */
137*495ae853SAndroid Build Coastguard Worker /* horizontal inverse transform */
138*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
139*495ae853SAndroid Build Coastguard Worker {
140*495ae853SAndroid Build Coastguard Worker q0 = pi2_src_ptr[0];
141*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
142*495ae853SAndroid Build Coastguard Worker /* Restoring dc value for intra case */
143*495ae853SAndroid Build Coastguard Worker if (i==0 && iq_start_idx == 1)
144*495ae853SAndroid Build Coastguard Worker {
145*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_ld_addr[0];
146*495ae853SAndroid Build Coastguard Worker }
147*495ae853SAndroid Build Coastguard Worker
148*495ae853SAndroid Build Coastguard Worker q2 = pi2_src_ptr[2];
149*495ae853SAndroid Build Coastguard Worker INV_QUANT(q2, pu2_iscal_mat[2], pu2_weigh_mat[2], u4_qp_div_6, rnd_fact, 4);
150*495ae853SAndroid Build Coastguard Worker
151*495ae853SAndroid Build Coastguard Worker x0 = q0 + q2;
152*495ae853SAndroid Build Coastguard Worker x1 = q0 - q2;
153*495ae853SAndroid Build Coastguard Worker
154*495ae853SAndroid Build Coastguard Worker q1 = pi2_src_ptr[1];
155*495ae853SAndroid Build Coastguard Worker INV_QUANT(q1, pu2_iscal_mat[1], pu2_weigh_mat[1], u4_qp_div_6, rnd_fact, 4);
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker q3 = pi2_src_ptr[3];
158*495ae853SAndroid Build Coastguard Worker INV_QUANT(q3, pu2_iscal_mat[3], pu2_weigh_mat[3], u4_qp_div_6, rnd_fact, 4);
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker x2 = (q1 >> 1) - q3;
161*495ae853SAndroid Build Coastguard Worker x3 = q1 + (q3 >> 1);
162*495ae853SAndroid Build Coastguard Worker
163*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = x0 + x3;
164*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = x1 + x2;
165*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = x1 - x2;
166*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = x0 - x3;
167*495ae853SAndroid Build Coastguard Worker
168*495ae853SAndroid Build Coastguard Worker pi2_src_ptr += SUB_BLK_WIDTH_4x4;
169*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_4x4;
170*495ae853SAndroid Build Coastguard Worker pu2_iscal_mat += SUB_BLK_WIDTH_4x4;
171*495ae853SAndroid Build Coastguard Worker pu2_weigh_mat += SUB_BLK_WIDTH_4x4;
172*495ae853SAndroid Build Coastguard Worker }
173*495ae853SAndroid Build Coastguard Worker
174*495ae853SAndroid Build Coastguard Worker /* vertical inverse transform */
175*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
176*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
177*495ae853SAndroid Build Coastguard Worker {
178*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
179*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker x0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[8]);
182*495ae853SAndroid Build Coastguard Worker x1 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[8]);
183*495ae853SAndroid Build Coastguard Worker x2 = (pi2_tmp_ptr[4] >> 1) - pi2_tmp_ptr[12];
184*495ae853SAndroid Build Coastguard Worker x3 = pi2_tmp_ptr[4] + (pi2_tmp_ptr[12] >> 1);
185*495ae853SAndroid Build Coastguard Worker
186*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
187*495ae853SAndroid Build Coastguard Worker i_macro = x0 + x3;
188*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
189*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
190*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
191*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
192*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
193*495ae853SAndroid Build Coastguard Worker
194*495ae853SAndroid Build Coastguard Worker i_macro = x1 + x2;
195*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
196*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
197*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
198*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
199*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
200*495ae853SAndroid Build Coastguard Worker
201*495ae853SAndroid Build Coastguard Worker i_macro = x1 - x2;
202*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
203*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
204*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
205*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
206*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
207*495ae853SAndroid Build Coastguard Worker
208*495ae853SAndroid Build Coastguard Worker i_macro = x0 - x3;
209*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
210*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
211*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
212*495ae853SAndroid Build Coastguard Worker
213*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
214*495ae853SAndroid Build Coastguard Worker pu1_out_ptr++;
215*495ae853SAndroid Build Coastguard Worker pu1_pred++;
216*495ae853SAndroid Build Coastguard Worker }
217*495ae853SAndroid Build Coastguard Worker }
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 * @brief This function reconstructs a 4x4 sub block from quantized residue and
223*495ae853SAndroid Build Coastguard Worker * prediction buffer, if only dc value is present for residue
224*495ae853SAndroid Build Coastguard Worker *
225*495ae853SAndroid Build Coastguard Worker * @par Description:
226*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized, then inverse transformed.
227*495ae853SAndroid Build Coastguard Worker * This inverse transformed content is added to the prediction buffer to recon-
228*495ae853SAndroid Build Coastguard Worker * struct the end output
229*495ae853SAndroid Build Coastguard Worker *
230*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
231*495ae853SAndroid Build Coastguard Worker * quantized 4x4 block
232*495ae853SAndroid Build Coastguard Worker *
233*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
234*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block
235*495ae853SAndroid Build Coastguard Worker *
236*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_out
237*495ae853SAndroid Build Coastguard Worker * reconstructed 4x4 block
238*495ae853SAndroid Build Coastguard Worker *
239*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
240*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride
241*495ae853SAndroid Build Coastguard Worker *
242*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
243*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
244*495ae853SAndroid Build Coastguard Worker *
245*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
246*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
247*495ae853SAndroid Build Coastguard Worker *
248*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
249*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
250*495ae853SAndroid Build Coastguard Worker *
251*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
252*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
253*495ae853SAndroid Build Coastguard Worker *
254*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
255*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16
256*495ae853SAndroid Build Coastguard Worker *
257*495ae853SAndroid Build Coastguard Worker * @param[in] iq_start_idx
258*495ae853SAndroid Build Coastguard Worker * Differentiates b/w intra or inter
259*495ae853SAndroid Build Coastguard Worker *
260*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_ld_addr
261*495ae853SAndroid Build Coastguard Worker * Address to load DC value of the 4x4 blk
262*495ae853SAndroid Build Coastguard Worker *
263*495ae853SAndroid Build Coastguard Worker * @returns none
264*495ae853SAndroid Build Coastguard Worker *
265*495ae853SAndroid Build Coastguard Worker * @remarks none
266*495ae853SAndroid Build Coastguard Worker *
267*495ae853SAndroid Build Coastguard Worker *******************************************************************************
268*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_4x4_dc(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)269*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_4x4_dc(WORD16 *pi2_src,
270*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
271*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
272*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
273*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
274*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat,
275*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
276*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6,
277*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
278*495ae853SAndroid Build Coastguard Worker WORD32 iq_start_idx,
279*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
280*495ae853SAndroid Build Coastguard Worker {
281*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
282*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
283*495ae853SAndroid Build Coastguard Worker WORD32 q0;
284*495ae853SAndroid Build Coastguard Worker WORD16 x, i_macro, i;
285*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
286*495ae853SAndroid Build Coastguard Worker
287*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
288*495ae853SAndroid Build Coastguard Worker if(iq_start_idx == 0)
289*495ae853SAndroid Build Coastguard Worker {
290*495ae853SAndroid Build Coastguard Worker q0 = pi2_src[0];
291*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
292*495ae853SAndroid Build Coastguard Worker }
293*495ae853SAndroid Build Coastguard Worker else
294*495ae853SAndroid Build Coastguard Worker {
295*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_ld_addr[0]; // Restoring dc value for intra case3
296*495ae853SAndroid Build Coastguard Worker }
297*495ae853SAndroid Build Coastguard Worker i_macro = ((q0 + 32) >> 6);
298*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
299*495ae853SAndroid Build Coastguard Worker {
300*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
301*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
302*495ae853SAndroid Build Coastguard Worker
303*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
304*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
305*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
306*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
307*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
308*495ae853SAndroid Build Coastguard Worker
309*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
310*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
311*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
312*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
315*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
316*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
317*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
318*495ae853SAndroid Build Coastguard Worker
319*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
320*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
321*495ae853SAndroid Build Coastguard Worker
322*495ae853SAndroid Build Coastguard Worker pu1_out_ptr++;
323*495ae853SAndroid Build Coastguard Worker pu1_pred++;
324*495ae853SAndroid Build Coastguard Worker }
325*495ae853SAndroid Build Coastguard Worker }
326*495ae853SAndroid Build Coastguard Worker
327*495ae853SAndroid Build Coastguard Worker /**
328*495ae853SAndroid Build Coastguard Worker ********************************************************************************
329*495ae853SAndroid Build Coastguard Worker *
330*495ae853SAndroid Build Coastguard Worker * @brief This function reconstructs a 8x8 sub block from quantized residue and
331*495ae853SAndroid Build Coastguard Worker * prediction buffer
332*495ae853SAndroid Build Coastguard Worker *
333*495ae853SAndroid Build Coastguard Worker * @par Description:
334*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized, then inverse transformed.
335*495ae853SAndroid Build Coastguard Worker * This inverse transformed content is added to the prediction buffer to recon-
336*495ae853SAndroid Build Coastguard Worker * struct the end output
337*495ae853SAndroid Build Coastguard Worker *
338*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
339*495ae853SAndroid Build Coastguard Worker * quantized 4x4 block
340*495ae853SAndroid Build Coastguard Worker *
341*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
342*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block
343*495ae853SAndroid Build Coastguard Worker *
344*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_out
345*495ae853SAndroid Build Coastguard Worker * reconstructed 4x4 block
346*495ae853SAndroid Build Coastguard Worker *
347*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
348*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride
349*495ae853SAndroid Build Coastguard Worker *
350*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
351*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
352*495ae853SAndroid Build Coastguard Worker *
353*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
354*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
355*495ae853SAndroid Build Coastguard Worker *
356*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
357*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
358*495ae853SAndroid Build Coastguard Worker *
359*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
360*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
361*495ae853SAndroid Build Coastguard Worker *
362*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
363*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16. we dont need a bigger block since we reuse
364*495ae853SAndroid Build Coastguard Worker * the tmp for each block
365*495ae853SAndroid Build Coastguard Worker *
366*495ae853SAndroid Build Coastguard Worker * @param[in] iq_start_idx
367*495ae853SAndroid Build Coastguard Worker * UNUSED
368*495ae853SAndroid Build Coastguard Worker *
369*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_ld_addr
370*495ae853SAndroid Build Coastguard Worker * UNUSED
371*495ae853SAndroid Build Coastguard Worker *
372*495ae853SAndroid Build Coastguard Worker * @returns none
373*495ae853SAndroid Build Coastguard Worker *
374*495ae853SAndroid Build Coastguard Worker * @remarks none
375*495ae853SAndroid Build Coastguard Worker *
376*495ae853SAndroid Build Coastguard Worker *******************************************************************************
377*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_8x8(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)378*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_8x8(WORD16 *pi2_src,
379*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
380*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
381*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
382*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
383*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscale_mat,
384*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
385*495ae853SAndroid Build Coastguard Worker UWORD32 qp_div,
386*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
387*495ae853SAndroid Build Coastguard Worker WORD32 iq_start_idx,
388*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
389*495ae853SAndroid Build Coastguard Worker {
390*495ae853SAndroid Build Coastguard Worker WORD32 i;
391*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
392*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
393*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
394*495ae853SAndroid Build Coastguard Worker WORD16 i_z0, i_z1, i_z2, i_z3, i_z4, i_z5, i_z6, i_z7;
395*495ae853SAndroid Build Coastguard Worker WORD16 i_y0, i_y1, i_y2, i_y3, i_y4, i_y5, i_y6, i_y7;
396*495ae853SAndroid Build Coastguard Worker WORD16 i_macro;
397*495ae853SAndroid Build Coastguard Worker WORD32 q;
398*495ae853SAndroid Build Coastguard Worker WORD32 rnd_fact = (qp_div < 6) ? (1 << (5 - qp_div)) : 0;
399*495ae853SAndroid Build Coastguard Worker
400*495ae853SAndroid Build Coastguard Worker UNUSED(iq_start_idx);
401*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_dc_ld_addr);
402*495ae853SAndroid Build Coastguard Worker /*************************************************************/
403*495ae853SAndroid Build Coastguard Worker /* De quantization of coefficients. Will be replaced by SIMD */
404*495ae853SAndroid Build Coastguard Worker /* operations on platform. Note : DC coeff is not scaled */
405*495ae853SAndroid Build Coastguard Worker /*************************************************************/
406*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (SUB_BLK_WIDTH_8x8 * SUB_BLK_WIDTH_8x8); i++)
407*495ae853SAndroid Build Coastguard Worker {
408*495ae853SAndroid Build Coastguard Worker q = pi2_src[i];
409*495ae853SAndroid Build Coastguard Worker INV_QUANT(q, pu2_iscale_mat[i], pu2_weigh_mat[i], qp_div, rnd_fact, 6);
410*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[i] = q;
411*495ae853SAndroid Build Coastguard Worker }
412*495ae853SAndroid Build Coastguard Worker /* Perform Inverse transform */
413*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
414*495ae853SAndroid Build Coastguard Worker /* IDCT [ Horizontal transformation ] */
415*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
416*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
417*495ae853SAndroid Build Coastguard Worker {
418*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
419*495ae853SAndroid Build Coastguard Worker /* y0 = w0 + w4 */
420*495ae853SAndroid Build Coastguard Worker /* y1 = -w3 + w5 - w7 - (w7 >> 1) */
421*495ae853SAndroid Build Coastguard Worker /* y2 = w0 - w4 */
422*495ae853SAndroid Build Coastguard Worker /* y3 = w1 + w7 - w3 - (w3 >> 1) */
423*495ae853SAndroid Build Coastguard Worker /* y4 = (w2 >> 1) - w6 */
424*495ae853SAndroid Build Coastguard Worker /* y5 = -w1 + w7 + w5 + (w5 >> 1) */
425*495ae853SAndroid Build Coastguard Worker /* y6 = w2 + (w6 >> 1) */
426*495ae853SAndroid Build Coastguard Worker /* y7 = w3 + w5 + w1 + (w1 >> 1) */
427*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
428*495ae853SAndroid Build Coastguard Worker i_y0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[4] );
429*495ae853SAndroid Build Coastguard Worker
430*495ae853SAndroid Build Coastguard Worker i_y1 = ((WORD32)(-pi2_tmp_ptr[3]) + pi2_tmp_ptr[5] - pi2_tmp_ptr[7]
431*495ae853SAndroid Build Coastguard Worker - (pi2_tmp_ptr[7] >> 1));
432*495ae853SAndroid Build Coastguard Worker
433*495ae853SAndroid Build Coastguard Worker i_y2 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[4] );
434*495ae853SAndroid Build Coastguard Worker
435*495ae853SAndroid Build Coastguard Worker i_y3 = ((WORD32)pi2_tmp_ptr[1] + pi2_tmp_ptr[7] - pi2_tmp_ptr[3]
436*495ae853SAndroid Build Coastguard Worker - (pi2_tmp_ptr[3] >> 1));
437*495ae853SAndroid Build Coastguard Worker
438*495ae853SAndroid Build Coastguard Worker i_y4 = ((pi2_tmp_ptr[2] >> 1) - pi2_tmp_ptr[6] );
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker i_y5 = ((WORD32)(-pi2_tmp_ptr[1]) + pi2_tmp_ptr[7] + pi2_tmp_ptr[5]
441*495ae853SAndroid Build Coastguard Worker + (pi2_tmp_ptr[5] >> 1));
442*495ae853SAndroid Build Coastguard Worker
443*495ae853SAndroid Build Coastguard Worker i_y6 = (pi2_tmp_ptr[2] + (pi2_tmp_ptr[6] >> 1));
444*495ae853SAndroid Build Coastguard Worker
445*495ae853SAndroid Build Coastguard Worker i_y7 = ((WORD32)pi2_tmp_ptr[3] + pi2_tmp_ptr[5] + pi2_tmp_ptr[1]
446*495ae853SAndroid Build Coastguard Worker + (pi2_tmp_ptr[1] >> 1));
447*495ae853SAndroid Build Coastguard Worker
448*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
449*495ae853SAndroid Build Coastguard Worker /* z0 = y0 + y6 */
450*495ae853SAndroid Build Coastguard Worker /* z1 = y1 + (y7 >> 2) */
451*495ae853SAndroid Build Coastguard Worker /* z2 = y2 + y4 */
452*495ae853SAndroid Build Coastguard Worker /* z3 = y3 + (y5 >> 2) */
453*495ae853SAndroid Build Coastguard Worker /* z4 = y2 - y4 */
454*495ae853SAndroid Build Coastguard Worker /* z5 = (y3 >> 2) - y5 */
455*495ae853SAndroid Build Coastguard Worker /* z6 = y0 - y6 */
456*495ae853SAndroid Build Coastguard Worker /* z7 = y7 - (y1 >> 2) */
457*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
458*495ae853SAndroid Build Coastguard Worker i_z0 = i_y0 + i_y6;
459*495ae853SAndroid Build Coastguard Worker i_z1 = i_y1 + (i_y7 >> 2);
460*495ae853SAndroid Build Coastguard Worker i_z2 = i_y2 + i_y4;
461*495ae853SAndroid Build Coastguard Worker i_z3 = i_y3 + (i_y5 >> 2);
462*495ae853SAndroid Build Coastguard Worker i_z4 = i_y2 - i_y4;
463*495ae853SAndroid Build Coastguard Worker i_z5 = (i_y3 >> 2) - i_y5;
464*495ae853SAndroid Build Coastguard Worker i_z6 = i_y0 - i_y6;
465*495ae853SAndroid Build Coastguard Worker i_z7 = i_y7 - (i_y1 >> 2);
466*495ae853SAndroid Build Coastguard Worker
467*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
468*495ae853SAndroid Build Coastguard Worker /* x0 = z0 + z7 */
469*495ae853SAndroid Build Coastguard Worker /* x1 = z2 + z5 */
470*495ae853SAndroid Build Coastguard Worker /* x2 = z4 + z3 */
471*495ae853SAndroid Build Coastguard Worker /* x3 = z6 + z1 */
472*495ae853SAndroid Build Coastguard Worker /* x4 = z6 - z1 */
473*495ae853SAndroid Build Coastguard Worker /* x5 = z4 - z3 */
474*495ae853SAndroid Build Coastguard Worker /* x6 = z2 - z5 */
475*495ae853SAndroid Build Coastguard Worker /* x7 = z0 - z7 */
476*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
477*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = i_z0 + i_z7;
478*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = i_z2 + i_z5;
479*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = i_z4 + i_z3;
480*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = i_z6 + i_z1;
481*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[4] = i_z6 - i_z1;
482*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[5] = i_z4 - i_z3;
483*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[6] = i_z2 - i_z5;
484*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[7] = i_z0 - i_z7;
485*495ae853SAndroid Build Coastguard Worker
486*495ae853SAndroid Build Coastguard Worker /* move to the next row */
487*495ae853SAndroid Build Coastguard Worker //pi2_src_ptr += SUB_BLK_WIDTH_8x8;
488*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_8x8;
489*495ae853SAndroid Build Coastguard Worker }
490*495ae853SAndroid Build Coastguard Worker
491*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
492*495ae853SAndroid Build Coastguard Worker /* IDCT [ Vertical transformation] and Xij = (xij + 32)>>6 */
493*495ae853SAndroid Build Coastguard Worker /* */
494*495ae853SAndroid Build Coastguard Worker /* Add the prediction and store it back to reconstructed frame buffer */
495*495ae853SAndroid Build Coastguard Worker /* [Prediction buffer itself in this case] */
496*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
497*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
498*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
499*495ae853SAndroid Build Coastguard Worker {
500*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
501*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
502*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
503*495ae853SAndroid Build Coastguard Worker /* y0j = w0j + w4j */
504*495ae853SAndroid Build Coastguard Worker /* y1j = -w3j + w5j -w7j -(w7j >> 1) */
505*495ae853SAndroid Build Coastguard Worker /* y2j = w0j -w4j */
506*495ae853SAndroid Build Coastguard Worker /* y3j = w1j + w7j -w3j -(w3j >> 1) */
507*495ae853SAndroid Build Coastguard Worker /* y4j = ( w2j >> 1 ) -w6j */
508*495ae853SAndroid Build Coastguard Worker /* y5j = -w1j + w7j + w5j + (w5j >> 1) */
509*495ae853SAndroid Build Coastguard Worker /* y6j = w2j + ( w6j >> 1 ) */
510*495ae853SAndroid Build Coastguard Worker /* y7j = w3j + w5j + w1j + (w1j >> 1) */
511*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
512*495ae853SAndroid Build Coastguard Worker i_y0 = pi2_tmp_ptr[0] + pi2_tmp_ptr[32];
513*495ae853SAndroid Build Coastguard Worker
514*495ae853SAndroid Build Coastguard Worker i_y1 = (WORD32)(-pi2_tmp_ptr[24]) + pi2_tmp_ptr[40] - pi2_tmp_ptr[56]
515*495ae853SAndroid Build Coastguard Worker - (pi2_tmp_ptr[56] >> 1);
516*495ae853SAndroid Build Coastguard Worker
517*495ae853SAndroid Build Coastguard Worker i_y2 = pi2_tmp_ptr[0] - pi2_tmp_ptr[32];
518*495ae853SAndroid Build Coastguard Worker
519*495ae853SAndroid Build Coastguard Worker i_y3 = (WORD32)pi2_tmp_ptr[8] + pi2_tmp_ptr[56] - pi2_tmp_ptr[24]
520*495ae853SAndroid Build Coastguard Worker - (pi2_tmp_ptr[24] >> 1);
521*495ae853SAndroid Build Coastguard Worker
522*495ae853SAndroid Build Coastguard Worker i_y4 = (pi2_tmp_ptr[16] >> 1) - pi2_tmp_ptr[48];
523*495ae853SAndroid Build Coastguard Worker
524*495ae853SAndroid Build Coastguard Worker i_y5 = (WORD32)(-pi2_tmp_ptr[8]) + pi2_tmp_ptr[56] + pi2_tmp_ptr[40]
525*495ae853SAndroid Build Coastguard Worker + (pi2_tmp_ptr[40] >> 1);
526*495ae853SAndroid Build Coastguard Worker
527*495ae853SAndroid Build Coastguard Worker i_y6 = pi2_tmp_ptr[16] + (pi2_tmp_ptr[48] >> 1);
528*495ae853SAndroid Build Coastguard Worker
529*495ae853SAndroid Build Coastguard Worker i_y7 = (WORD32)pi2_tmp_ptr[24] + pi2_tmp_ptr[40] + pi2_tmp_ptr[8]
530*495ae853SAndroid Build Coastguard Worker + (pi2_tmp_ptr[8] >> 1);
531*495ae853SAndroid Build Coastguard Worker
532*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
533*495ae853SAndroid Build Coastguard Worker /* z0j = y0j + y6j */
534*495ae853SAndroid Build Coastguard Worker /* z1j = y1j + (y7j >> 2) */
535*495ae853SAndroid Build Coastguard Worker /* z2j = y2j + y4j */
536*495ae853SAndroid Build Coastguard Worker /* z3j = y3j + (y5j >> 2) */
537*495ae853SAndroid Build Coastguard Worker /* z4j = y2j -y4j */
538*495ae853SAndroid Build Coastguard Worker /* z5j = (y3j >> 2) -y5j */
539*495ae853SAndroid Build Coastguard Worker /* z6j = y0j -y6j */
540*495ae853SAndroid Build Coastguard Worker /* z7j = y7j -(y1j >> 2) */
541*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
542*495ae853SAndroid Build Coastguard Worker i_z0 = i_y0 + i_y6;
543*495ae853SAndroid Build Coastguard Worker i_z1 = i_y1 + (i_y7 >> 2);
544*495ae853SAndroid Build Coastguard Worker i_z2 = i_y2 + i_y4;
545*495ae853SAndroid Build Coastguard Worker i_z3 = i_y3 + (i_y5 >> 2);
546*495ae853SAndroid Build Coastguard Worker i_z4 = i_y2 - i_y4;
547*495ae853SAndroid Build Coastguard Worker i_z5 = (i_y3 >> 2) - i_y5;
548*495ae853SAndroid Build Coastguard Worker i_z6 = i_y0 - i_y6;
549*495ae853SAndroid Build Coastguard Worker i_z7 = i_y7 - (i_y1 >> 2);
550*495ae853SAndroid Build Coastguard Worker
551*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
552*495ae853SAndroid Build Coastguard Worker /* x0j = z0j + z7j */
553*495ae853SAndroid Build Coastguard Worker /* x1j = z2j + z5j */
554*495ae853SAndroid Build Coastguard Worker /* x2j = z4j + z3j */
555*495ae853SAndroid Build Coastguard Worker /* x3j = z6j + z1j */
556*495ae853SAndroid Build Coastguard Worker /* x4j = z6j -z1j */
557*495ae853SAndroid Build Coastguard Worker /* x5j = z4j -z3j */
558*495ae853SAndroid Build Coastguard Worker /* x6j = z2j -z5j */
559*495ae853SAndroid Build Coastguard Worker /* x7j = z0j -z7j */
560*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------------------*/
561*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z0 + i_z7 + 32) >> 6) + *pu1_pred_ptr;
562*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
563*495ae853SAndroid Build Coastguard Worker /* Change uc_recBuffer to Point to next element in the same column*/
564*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
565*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
566*495ae853SAndroid Build Coastguard Worker
567*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z2 + i_z5 + 32) >> 6) + *pu1_pred_ptr;
568*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
569*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
570*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
571*495ae853SAndroid Build Coastguard Worker
572*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z4 + i_z3 + 32) >> 6) + *pu1_pred_ptr;
573*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
574*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
575*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z6 + i_z1 + 32) >> 6) + *pu1_pred_ptr;
578*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
579*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
580*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
581*495ae853SAndroid Build Coastguard Worker
582*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z6 - i_z1 + 32) >> 6) + *pu1_pred_ptr;
583*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
584*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
585*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
586*495ae853SAndroid Build Coastguard Worker
587*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z4 - i_z3 + 32) >> 6) + *pu1_pred_ptr;
588*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
589*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
590*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
591*495ae853SAndroid Build Coastguard Worker
592*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z2 - i_z5 + 32) >> 6) + *pu1_pred_ptr;
593*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
594*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
595*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker i_macro = ((i_z0 - i_z7 + 32) >> 6) + *pu1_pred_ptr;
598*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
599*495ae853SAndroid Build Coastguard Worker
600*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
601*495ae853SAndroid Build Coastguard Worker pu1_out_ptr++;
602*495ae853SAndroid Build Coastguard Worker pu1_pred++;
603*495ae853SAndroid Build Coastguard Worker }
604*495ae853SAndroid Build Coastguard Worker }
605*495ae853SAndroid Build Coastguard Worker
606*495ae853SAndroid Build Coastguard Worker /**
607*495ae853SAndroid Build Coastguard Worker ********************************************************************************
608*495ae853SAndroid Build Coastguard Worker *
609*495ae853SAndroid Build Coastguard Worker * @brief This function reconstructs a 8x8 sub block from quantized residue and
610*495ae853SAndroid Build Coastguard Worker * prediction buffer, if only dc value is present
611*495ae853SAndroid Build Coastguard Worker *
612*495ae853SAndroid Build Coastguard Worker * @par Description:
613*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized, then inverse transformed.
614*495ae853SAndroid Build Coastguard Worker * This inverse transformed content is added to the prediction buffer to recon-
615*495ae853SAndroid Build Coastguard Worker * struct the end output
616*495ae853SAndroid Build Coastguard Worker *
617*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
618*495ae853SAndroid Build Coastguard Worker * quantized 4x4 block
619*495ae853SAndroid Build Coastguard Worker *
620*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
621*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block
622*495ae853SAndroid Build Coastguard Worker *
623*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_out
624*495ae853SAndroid Build Coastguard Worker * reconstructed 4x4 block
625*495ae853SAndroid Build Coastguard Worker *
626*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
627*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride
628*495ae853SAndroid Build Coastguard Worker *
629*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
630*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
631*495ae853SAndroid Build Coastguard Worker *
632*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
633*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
634*495ae853SAndroid Build Coastguard Worker *
635*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
636*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
637*495ae853SAndroid Build Coastguard Worker *
638*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
639*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
640*495ae853SAndroid Build Coastguard Worker *
641*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
642*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16. we dont need a bigger block since we reuse
643*495ae853SAndroid Build Coastguard Worker * the tmp for each block
644*495ae853SAndroid Build Coastguard Worker *
645*495ae853SAndroid Build Coastguard Worker * @param[in] iq_start_idx
646*495ae853SAndroid Build Coastguard Worker * UNUSED
647*495ae853SAndroid Build Coastguard Worker *
648*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_ld_addr
649*495ae853SAndroid Build Coastguard Worker * UNUSED
650*495ae853SAndroid Build Coastguard Worker *
651*495ae853SAndroid Build Coastguard Worker * @returns none
652*495ae853SAndroid Build Coastguard Worker *
653*495ae853SAndroid Build Coastguard Worker * @remarks none
654*495ae853SAndroid Build Coastguard Worker *
655*495ae853SAndroid Build Coastguard Worker *******************************************************************************
656*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_8x8_dc(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)657*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_8x8_dc(WORD16 *pi2_src,
658*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
659*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
660*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
661*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
662*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscale_mat,
663*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
664*495ae853SAndroid Build Coastguard Worker UWORD32 qp_div,
665*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
666*495ae853SAndroid Build Coastguard Worker WORD32 iq_start_idx,
667*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_ld_addr)
668*495ae853SAndroid Build Coastguard Worker {
669*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
670*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
671*495ae853SAndroid Build Coastguard Worker WORD16 x, i, i_macro;
672*495ae853SAndroid Build Coastguard Worker WORD32 q;
673*495ae853SAndroid Build Coastguard Worker WORD32 rnd_fact = (qp_div < 6) ? (1 << (5 - qp_div)) : 0;
674*495ae853SAndroid Build Coastguard Worker
675*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
676*495ae853SAndroid Build Coastguard Worker UNUSED(iq_start_idx);
677*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_dc_ld_addr);
678*495ae853SAndroid Build Coastguard Worker /*************************************************************/
679*495ae853SAndroid Build Coastguard Worker /* Dequantization of coefficients. Will be replaced by SIMD */
680*495ae853SAndroid Build Coastguard Worker /* operations on platform. Note : DC coeff is not scaled */
681*495ae853SAndroid Build Coastguard Worker /*************************************************************/
682*495ae853SAndroid Build Coastguard Worker q = pi2_src[0];
683*495ae853SAndroid Build Coastguard Worker INV_QUANT(q, pu2_iscale_mat[0], pu2_weigh_mat[0], qp_div, rnd_fact, 6);
684*495ae853SAndroid Build Coastguard Worker i_macro = (q + 32) >> 6;
685*495ae853SAndroid Build Coastguard Worker /* Perform Inverse transform */
686*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
687*495ae853SAndroid Build Coastguard Worker /* IDCT [ Horizontal transformation ] */
688*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
689*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
690*495ae853SAndroid Build Coastguard Worker /* IDCT [ Vertical transformation] and Xij = (xij + 32)>>6 */
691*495ae853SAndroid Build Coastguard Worker /* */
692*495ae853SAndroid Build Coastguard Worker /* Add the prediction and store it back to reconstructed frame buffer */
693*495ae853SAndroid Build Coastguard Worker /* [Prediction buffer itself in this case] */
694*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
695*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; i++)
696*495ae853SAndroid Build Coastguard Worker {
697*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
698*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
699*495ae853SAndroid Build Coastguard Worker
700*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
701*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
702*495ae853SAndroid Build Coastguard Worker /* Change uc_recBuffer to Point to next element in the same column*/
703*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
704*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
705*495ae853SAndroid Build Coastguard Worker
706*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
707*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
708*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
709*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
710*495ae853SAndroid Build Coastguard Worker
711*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
712*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
713*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
714*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
715*495ae853SAndroid Build Coastguard Worker
716*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
717*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
718*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
719*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
722*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
723*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
724*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
725*495ae853SAndroid Build Coastguard Worker
726*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
727*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
728*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
729*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
730*495ae853SAndroid Build Coastguard Worker
731*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
732*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
733*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
734*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
735*495ae853SAndroid Build Coastguard Worker
736*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
737*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
738*495ae853SAndroid Build Coastguard Worker
739*495ae853SAndroid Build Coastguard Worker pu1_out_ptr++;
740*495ae853SAndroid Build Coastguard Worker pu1_pred++;
741*495ae853SAndroid Build Coastguard Worker }
742*495ae853SAndroid Build Coastguard Worker }
743*495ae853SAndroid Build Coastguard Worker
744*495ae853SAndroid Build Coastguard Worker /**
745*495ae853SAndroid Build Coastguard Worker ********************************************************************************
746*495ae853SAndroid Build Coastguard Worker *
747*495ae853SAndroid Build Coastguard Worker * @brief This function reconstructs a 4x4 sub block from quantized residue and
748*495ae853SAndroid Build Coastguard Worker * prediction buffer
749*495ae853SAndroid Build Coastguard Worker *
750*495ae853SAndroid Build Coastguard Worker * @par Description:
751*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized, then inverse transformed.
752*495ae853SAndroid Build Coastguard Worker * This inverse transformed content is added to the prediction buffer to recon-
753*495ae853SAndroid Build Coastguard Worker * struct the end output
754*495ae853SAndroid Build Coastguard Worker *
755*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
756*495ae853SAndroid Build Coastguard Worker * quantized 4x4 block
757*495ae853SAndroid Build Coastguard Worker *
758*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
759*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block
760*495ae853SAndroid Build Coastguard Worker *
761*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_out
762*495ae853SAndroid Build Coastguard Worker * reconstructed 4x4 block
763*495ae853SAndroid Build Coastguard Worker *
764*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
765*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride
766*495ae853SAndroid Build Coastguard Worker *
767*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
768*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
769*495ae853SAndroid Build Coastguard Worker *
770*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
771*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
772*495ae853SAndroid Build Coastguard Worker *
773*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
774*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
775*495ae853SAndroid Build Coastguard Worker *
776*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
777*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
778*495ae853SAndroid Build Coastguard Worker *
779*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
780*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16
781*495ae853SAndroid Build Coastguard Worker *
782*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_src
783*495ae853SAndroid Build Coastguard Worker * Address to load DC value of the 4x4 blk
784*495ae853SAndroid Build Coastguard Worker *
785*495ae853SAndroid Build Coastguard Worker * @returns none
786*495ae853SAndroid Build Coastguard Worker *
787*495ae853SAndroid Build Coastguard Worker * @remarks none
788*495ae853SAndroid Build Coastguard Worker *
789*495ae853SAndroid Build Coastguard Worker *******************************************************************************
790*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_chroma_4x4(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)791*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_chroma_4x4(WORD16 *pi2_src,
792*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
793*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
794*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
795*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
796*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat,
797*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
798*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6,
799*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
800*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_src)
801*495ae853SAndroid Build Coastguard Worker {
802*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_src_ptr = pi2_src;
803*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_ptr = pi2_tmp;
804*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
805*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
806*495ae853SAndroid Build Coastguard Worker WORD16 x0, x1, x2, x3, i;
807*495ae853SAndroid Build Coastguard Worker WORD32 q0, q1, q2, q3;
808*495ae853SAndroid Build Coastguard Worker WORD16 i_macro;
809*495ae853SAndroid Build Coastguard Worker WORD16 rnd_fact = (u4_qp_div_6 < 4) ? 1 << (3 - u4_qp_div_6) : 0;
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker /* inverse quant */
812*495ae853SAndroid Build Coastguard Worker /* horizontal inverse transform */
813*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
814*495ae853SAndroid Build Coastguard Worker {
815*495ae853SAndroid Build Coastguard Worker if(i == 0)
816*495ae853SAndroid Build Coastguard Worker {
817*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_src[0];
818*495ae853SAndroid Build Coastguard Worker }
819*495ae853SAndroid Build Coastguard Worker else
820*495ae853SAndroid Build Coastguard Worker {
821*495ae853SAndroid Build Coastguard Worker q0 = pi2_src_ptr[0];
822*495ae853SAndroid Build Coastguard Worker INV_QUANT(q0, pu2_iscal_mat[0], pu2_weigh_mat[0], u4_qp_div_6, rnd_fact, 4);
823*495ae853SAndroid Build Coastguard Worker }
824*495ae853SAndroid Build Coastguard Worker
825*495ae853SAndroid Build Coastguard Worker q2 = pi2_src_ptr[2];
826*495ae853SAndroid Build Coastguard Worker INV_QUANT(q2, pu2_iscal_mat[2], pu2_weigh_mat[2], u4_qp_div_6, rnd_fact, 4);
827*495ae853SAndroid Build Coastguard Worker
828*495ae853SAndroid Build Coastguard Worker x0 = q0 + q2;
829*495ae853SAndroid Build Coastguard Worker x1 = q0 - q2;
830*495ae853SAndroid Build Coastguard Worker
831*495ae853SAndroid Build Coastguard Worker q1 = pi2_src_ptr[1];
832*495ae853SAndroid Build Coastguard Worker INV_QUANT(q1, pu2_iscal_mat[1], pu2_weigh_mat[1], u4_qp_div_6, rnd_fact, 4);
833*495ae853SAndroid Build Coastguard Worker
834*495ae853SAndroid Build Coastguard Worker q3 = pi2_src_ptr[3];
835*495ae853SAndroid Build Coastguard Worker INV_QUANT(q3, pu2_iscal_mat[3], pu2_weigh_mat[3], u4_qp_div_6, rnd_fact, 4);
836*495ae853SAndroid Build Coastguard Worker
837*495ae853SAndroid Build Coastguard Worker x2 = (q1 >> 1) - q3;
838*495ae853SAndroid Build Coastguard Worker x3 = q1 + (q3 >> 1);
839*495ae853SAndroid Build Coastguard Worker
840*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[0] = x0 + x3;
841*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[1] = x1 + x2;
842*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[2] = x1 - x2;
843*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr[3] = x0 - x3;
844*495ae853SAndroid Build Coastguard Worker
845*495ae853SAndroid Build Coastguard Worker pi2_src_ptr += SUB_BLK_WIDTH_4x4;
846*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr += SUB_BLK_WIDTH_4x4;
847*495ae853SAndroid Build Coastguard Worker pu2_iscal_mat += SUB_BLK_WIDTH_4x4;
848*495ae853SAndroid Build Coastguard Worker pu2_weigh_mat += SUB_BLK_WIDTH_4x4;
849*495ae853SAndroid Build Coastguard Worker }
850*495ae853SAndroid Build Coastguard Worker
851*495ae853SAndroid Build Coastguard Worker /* vertical inverse transform */
852*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr = pi2_tmp;
853*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
854*495ae853SAndroid Build Coastguard Worker {
855*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
856*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
857*495ae853SAndroid Build Coastguard Worker
858*495ae853SAndroid Build Coastguard Worker x0 = (pi2_tmp_ptr[0] + pi2_tmp_ptr[8]);
859*495ae853SAndroid Build Coastguard Worker x1 = (pi2_tmp_ptr[0] - pi2_tmp_ptr[8]);
860*495ae853SAndroid Build Coastguard Worker x2 = (pi2_tmp_ptr[4] >> 1) - pi2_tmp_ptr[12];
861*495ae853SAndroid Build Coastguard Worker x3 = pi2_tmp_ptr[4] + (pi2_tmp_ptr[12] >> 1);
862*495ae853SAndroid Build Coastguard Worker
863*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
864*495ae853SAndroid Build Coastguard Worker i_macro = x0 + x3;
865*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
866*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
867*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
868*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
869*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
870*495ae853SAndroid Build Coastguard Worker
871*495ae853SAndroid Build Coastguard Worker i_macro = x1 + x2;
872*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
873*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
874*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
875*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
876*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
877*495ae853SAndroid Build Coastguard Worker
878*495ae853SAndroid Build Coastguard Worker i_macro = x1 - x2;
879*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
880*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
881*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
882*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
883*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
884*495ae853SAndroid Build Coastguard Worker
885*495ae853SAndroid Build Coastguard Worker i_macro = x0 - x3;
886*495ae853SAndroid Build Coastguard Worker i_macro = ((i_macro + 32) >> 6);
887*495ae853SAndroid Build Coastguard Worker i_macro += *pu1_pred_ptr;
888*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(i_macro);
889*495ae853SAndroid Build Coastguard Worker
890*495ae853SAndroid Build Coastguard Worker pi2_tmp_ptr++;
891*495ae853SAndroid Build Coastguard Worker pu1_out_ptr += 2; // Interleaved store for output
892*495ae853SAndroid Build Coastguard Worker pu1_pred += 2; // Interleaved load for pred buffer
893*495ae853SAndroid Build Coastguard Worker }
894*495ae853SAndroid Build Coastguard Worker }
895*495ae853SAndroid Build Coastguard Worker
896*495ae853SAndroid Build Coastguard Worker /**
897*495ae853SAndroid Build Coastguard Worker ********************************************************************************
898*495ae853SAndroid Build Coastguard Worker *
899*495ae853SAndroid Build Coastguard Worker * @brief This function reconstructs a 4x4 sub block from quantized residue and
900*495ae853SAndroid Build Coastguard Worker * prediction buffer if only dc value is present for residue
901*495ae853SAndroid Build Coastguard Worker *
902*495ae853SAndroid Build Coastguard Worker * @par Description:
903*495ae853SAndroid Build Coastguard Worker * The quantized residue is first inverse quantized,
904*495ae853SAndroid Build Coastguard Worker * This inverse quantized content is added to the prediction buffer to recon-
905*495ae853SAndroid Build Coastguard Worker * struct the end output
906*495ae853SAndroid Build Coastguard Worker *
907*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_src
908*495ae853SAndroid Build Coastguard Worker * quantized dc coefficient
909*495ae853SAndroid Build Coastguard Worker *
910*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
911*495ae853SAndroid Build Coastguard Worker * prediction 4x4 block in interleaved format
912*495ae853SAndroid Build Coastguard Worker *
913*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd,
914*495ae853SAndroid Build Coastguard Worker * Prediction buffer stride in interleaved format
915*495ae853SAndroid Build Coastguard Worker *
916*495ae853SAndroid Build Coastguard Worker * @param[in] out_strd
917*495ae853SAndroid Build Coastguard Worker * recon buffer Stride
918*495ae853SAndroid Build Coastguard Worker *
919*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_iscal_mat
920*495ae853SAndroid Build Coastguard Worker * pointer to inverse scaling matrix
921*495ae853SAndroid Build Coastguard Worker *
922*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_weigh_mat
923*495ae853SAndroid Build Coastguard Worker * pointer to weight matrix
924*495ae853SAndroid Build Coastguard Worker *
925*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qp_div_6
926*495ae853SAndroid Build Coastguard Worker * Floor (qp/6)
927*495ae853SAndroid Build Coastguard Worker *
928*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_tmp
929*495ae853SAndroid Build Coastguard Worker * temporary buffer of size 1*16
930*495ae853SAndroid Build Coastguard Worker *
931*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dc_src
932*495ae853SAndroid Build Coastguard Worker * Address to load DC value of the 4x4 blk
933*495ae853SAndroid Build Coastguard Worker *
934*495ae853SAndroid Build Coastguard Worker * @returns none
935*495ae853SAndroid Build Coastguard Worker *
936*495ae853SAndroid Build Coastguard Worker * @remarks none
937*495ae853SAndroid Build Coastguard Worker *
938*495ae853SAndroid Build Coastguard Worker *******************************************************************************
939*495ae853SAndroid Build Coastguard Worker */
ih264_iquant_itrans_recon_chroma_4x4_dc(WORD16 * pi2_src,UWORD8 * pu1_pred,UWORD8 * pu1_out,WORD32 pred_strd,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)940*495ae853SAndroid Build Coastguard Worker void ih264_iquant_itrans_recon_chroma_4x4_dc(WORD16 *pi2_src,
941*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
942*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out,
943*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
944*495ae853SAndroid Build Coastguard Worker WORD32 out_strd,
945*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_iscal_mat,
946*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_weigh_mat,
947*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qp_div_6,
948*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp,
949*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dc_src)
950*495ae853SAndroid Build Coastguard Worker {
951*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_ptr = pu1_pred;
952*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_ptr = pu1_out;
953*495ae853SAndroid Build Coastguard Worker WORD32 q0;
954*495ae853SAndroid Build Coastguard Worker WORD16 x, i_macro, i;
955*495ae853SAndroid Build Coastguard Worker
956*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_src);
957*495ae853SAndroid Build Coastguard Worker UNUSED(pu2_iscal_mat);
958*495ae853SAndroid Build Coastguard Worker UNUSED(pu2_weigh_mat);
959*495ae853SAndroid Build Coastguard Worker UNUSED(u4_qp_div_6);
960*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_tmp);
961*495ae853SAndroid Build Coastguard Worker
962*495ae853SAndroid Build Coastguard Worker q0 = pi2_dc_src[0]; // Restoring dc value for intra case3
963*495ae853SAndroid Build Coastguard Worker i_macro = ((q0 + 32) >> 6);
964*495ae853SAndroid Build Coastguard Worker
965*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
966*495ae853SAndroid Build Coastguard Worker {
967*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr = pu1_pred;
968*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_ptr;
969*495ae853SAndroid Build Coastguard Worker
970*495ae853SAndroid Build Coastguard Worker /* inverse prediction */
971*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
972*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
973*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
974*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
975*495ae853SAndroid Build Coastguard Worker
976*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
977*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
978*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
979*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
980*495ae853SAndroid Build Coastguard Worker
981*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
982*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
983*495ae853SAndroid Build Coastguard Worker pu1_pred_ptr += pred_strd;
984*495ae853SAndroid Build Coastguard Worker pu1_out += out_strd;
985*495ae853SAndroid Build Coastguard Worker
986*495ae853SAndroid Build Coastguard Worker x = i_macro + *pu1_pred_ptr;
987*495ae853SAndroid Build Coastguard Worker *pu1_out = CLIP_U8(x);
988*495ae853SAndroid Build Coastguard Worker
989*495ae853SAndroid Build Coastguard Worker pu1_out_ptr+=2;
990*495ae853SAndroid Build Coastguard Worker pu1_pred+=2;
991*495ae853SAndroid Build Coastguard Worker }
992*495ae853SAndroid Build Coastguard Worker }
993