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_resi_trans_quant.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains function definitions single stage forward transform for H.264
28*495ae853SAndroid Build Coastguard Worker * It will calculate the residue, do the cf and then do quantization
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_resi_trans_quant_4x4
35*495ae853SAndroid Build Coastguard Worker * - ih264_resi_trans_quant_chroma_4x4
36*495ae853SAndroid Build Coastguard Worker * - ih264_hadamard_quant_4x4
37*495ae853SAndroid Build Coastguard Worker * - ih264_hadamard_quant_2x2_uv
38*495ae853SAndroid Build Coastguard Worker * - ih264_resi_trans_quant_8x8
39*495ae853SAndroid Build Coastguard Worker *
40*495ae853SAndroid Build Coastguard Worker * @remarks
41*495ae853SAndroid Build Coastguard Worker * none
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 /*****************************************************************************/
48*495ae853SAndroid Build Coastguard Worker /* File Includes */
49*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
50*495ae853SAndroid Build Coastguard Worker
51*495ae853SAndroid Build Coastguard Worker /* System Include Files */
52*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
53*495ae853SAndroid Build Coastguard Worker
54*495ae853SAndroid Build Coastguard Worker /* User Include Files */
55*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_macros.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
63*495ae853SAndroid Build Coastguard Worker
64*495ae853SAndroid Build Coastguard Worker
65*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
66*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
67*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
68*495ae853SAndroid Build Coastguard Worker
69*495ae853SAndroid Build Coastguard Worker /**
70*495ae853SAndroid Build Coastguard Worker *******************************************************************************
71*495ae853SAndroid Build Coastguard Worker *
72*495ae853SAndroid Build Coastguard Worker * @brief
73*495ae853SAndroid Build Coastguard Worker * This function performs forward transform and quantization on a 4x4 block
74*495ae853SAndroid Build Coastguard Worker *
75*495ae853SAndroid Build Coastguard Worker * @par Description:
76*495ae853SAndroid Build Coastguard Worker * The function accepts source buffer and estimation buffer. From these, it
77*495ae853SAndroid Build Coastguard Worker * computes the residue. This is residue is then transformed and quantized.
78*495ae853SAndroid Build Coastguard Worker * The transform and quantization are in placed computed. They use the residue
79*495ae853SAndroid Build Coastguard Worker * buffer for this.
80*495ae853SAndroid Build Coastguard Worker *
81*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
82*495ae853SAndroid Build Coastguard Worker * Pointer to source sub-block
83*495ae853SAndroid Build Coastguard Worker *
84*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
85*495ae853SAndroid Build Coastguard Worker * Pointer to prediction sub-block
86*495ae853SAndroid Build Coastguard Worker *
87*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_out
88*495ae853SAndroid Build Coastguard Worker * Pointer to residual sub-block
89*495ae853SAndroid Build Coastguard Worker *
90*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
91*495ae853SAndroid Build Coastguard Worker * Source stride
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
94*495ae853SAndroid Build Coastguard Worker * Prediction stride
95*495ae853SAndroid Build Coastguard Worker *
96*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_scale_matrix
97*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Scale Matrix
98*495ae853SAndroid Build Coastguard Worker *
99*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_threshold_matrix
100*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Threshold Matrix
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qbits
103*495ae853SAndroid Build Coastguard Worker * QP_BITS_h264_4x4 + floor(QP/6)
104*495ae853SAndroid Build Coastguard Worker *
105*495ae853SAndroid Build Coastguard Worker * @param[in] u4_round_factor
106*495ae853SAndroid Build Coastguard Worker * Quantization Round factor
107*495ae853SAndroid Build Coastguard Worker *
108*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_nnz
109*495ae853SAndroid Build Coastguard Worker * Total non-zero coefficients in the current sub-block
110*495ae853SAndroid Build Coastguard Worker *
111*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_alt_dc_addr
112*495ae853SAndroid Build Coastguard Worker * DC Coefficient of the block
113*495ae853SAndroid Build Coastguard Worker *
114*495ae853SAndroid Build Coastguard Worker * @remarks none
115*495ae853SAndroid Build Coastguard Worker *
116*495ae853SAndroid Build Coastguard Worker *******************************************************************************
117*495ae853SAndroid Build Coastguard Worker */
ih264_resi_trans_quant_4x4(UWORD8 * pu1_src,UWORD8 * pu1_pred,WORD16 * pi2_out,WORD32 src_strd,WORD32 pred_strd,const UWORD16 * pu2_scale_matrix,const UWORD16 * pu2_threshold_matrix,UWORD32 u4_qbits,UWORD32 u4_round_factor,UWORD8 * pu1_nnz,WORD16 * pi2_alt_dc_addr)118*495ae853SAndroid Build Coastguard Worker void ih264_resi_trans_quant_4x4(UWORD8 *pu1_src,
119*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
120*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out,
121*495ae853SAndroid Build Coastguard Worker WORD32 src_strd,
122*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
123*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_scale_matrix,
124*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_threshold_matrix,
125*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qbits,
126*495ae853SAndroid Build Coastguard Worker UWORD32 u4_round_factor,
127*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_nnz,
128*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_alt_dc_addr)
129*495ae853SAndroid Build Coastguard Worker {
130*495ae853SAndroid Build Coastguard Worker UWORD32 i;
131*495ae853SAndroid Build Coastguard Worker WORD32 x0, x1, x2, x3, x4, x5, x6, x7;
132*495ae853SAndroid Build Coastguard Worker WORD32 i4_value;
133*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_tmp = pi2_out;
134*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nonzero_coeff = 0;
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker for (i = 0; i < SUB_BLK_WIDTH_4x4; i++)
137*495ae853SAndroid Build Coastguard Worker {
138*495ae853SAndroid Build Coastguard Worker /* computing prediction error (residue) */
139*495ae853SAndroid Build Coastguard Worker x4 = pu1_src[0] - pu1_pred[0];
140*495ae853SAndroid Build Coastguard Worker x5 = pu1_src[1] - pu1_pred[1];
141*495ae853SAndroid Build Coastguard Worker x6 = pu1_src[2] - pu1_pred[2];
142*495ae853SAndroid Build Coastguard Worker x7 = pu1_src[3] - pu1_pred[3];
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker /* Horizontal transform */
145*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
146*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
147*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
148*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = x0 + x1;
151*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[1] = (x3 << 1) + x2;
152*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[2] = x0 - x1;
153*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[3] = x3 - (x2 << 1);
154*495ae853SAndroid Build Coastguard Worker
155*495ae853SAndroid Build Coastguard Worker /* pointing to next row; */
156*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
157*495ae853SAndroid Build Coastguard Worker pu1_pred += pred_strd;
158*495ae853SAndroid Build Coastguard Worker pi2_out_tmp += 4;
159*495ae853SAndroid Build Coastguard Worker }
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker pi2_out_tmp = pi2_out;
162*495ae853SAndroid Build Coastguard Worker for (i = 0; i < SUB_BLK_WIDTH_4x4; i++)
163*495ae853SAndroid Build Coastguard Worker {
164*495ae853SAndroid Build Coastguard Worker /* Vertical transform and quantization */
165*495ae853SAndroid Build Coastguard Worker x4 = pi2_out_tmp[0];
166*495ae853SAndroid Build Coastguard Worker x5 = pi2_out_tmp[4];
167*495ae853SAndroid Build Coastguard Worker x6 = pi2_out_tmp[8];
168*495ae853SAndroid Build Coastguard Worker x7 = pi2_out_tmp[12];
169*495ae853SAndroid Build Coastguard Worker
170*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
171*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
172*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
173*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker /* quantization is done in place */
176*495ae853SAndroid Build Coastguard Worker i4_value = x0 + x1;
177*495ae853SAndroid Build Coastguard Worker if(i == 0)
178*495ae853SAndroid Build Coastguard Worker {
179*495ae853SAndroid Build Coastguard Worker (*pi2_alt_dc_addr) = i4_value;
180*495ae853SAndroid Build Coastguard Worker }
181*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
182*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
183*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
184*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = i4_value;
185*495ae853SAndroid Build Coastguard Worker
186*495ae853SAndroid Build Coastguard Worker i4_value = (x3 << 1) + x2;
187*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[4],
188*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[4], u4_round_factor, u4_qbits,
189*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
190*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[4] = i4_value;
191*495ae853SAndroid Build Coastguard Worker
192*495ae853SAndroid Build Coastguard Worker i4_value = x0 - x1;
193*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[8],
194*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[8], u4_round_factor, u4_qbits,
195*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
196*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[8] = i4_value;
197*495ae853SAndroid Build Coastguard Worker
198*495ae853SAndroid Build Coastguard Worker i4_value = x3 - (x2 << 1);
199*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[12],
200*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[12], u4_round_factor, u4_qbits,
201*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
202*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[12] = i4_value;
203*495ae853SAndroid Build Coastguard Worker
204*495ae853SAndroid Build Coastguard Worker pi2_out_tmp++;
205*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix++;
206*495ae853SAndroid Build Coastguard Worker pu2_threshold_matrix++;
207*495ae853SAndroid Build Coastguard Worker }
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker /* Return total nonzero coefficients in the current sub block */
210*495ae853SAndroid Build Coastguard Worker *pu1_nnz = u4_nonzero_coeff;
211*495ae853SAndroid Build Coastguard Worker }
212*495ae853SAndroid Build Coastguard Worker
213*495ae853SAndroid Build Coastguard Worker /**
214*495ae853SAndroid Build Coastguard Worker *******************************************************************************
215*495ae853SAndroid Build Coastguard Worker *
216*495ae853SAndroid Build Coastguard Worker * @brief
217*495ae853SAndroid Build Coastguard Worker * This function performs forward transform and quantization on a 4x4
218*495ae853SAndroid Build Coastguard Worker * chroma block with interleaved values
219*495ae853SAndroid Build Coastguard Worker *
220*495ae853SAndroid Build Coastguard Worker * @par Description:
221*495ae853SAndroid Build Coastguard Worker * The function accepts source buffer and estimation buffer. From these, it
222*495ae853SAndroid Build Coastguard Worker * computes the residue. This is residue is then transformed and quantized.
223*495ae853SAndroid Build Coastguard Worker * The transform and quantization are in placed computed. They use the residue
224*495ae853SAndroid Build Coastguard Worker * buffer for this.
225*495ae853SAndroid Build Coastguard Worker *
226*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
227*495ae853SAndroid Build Coastguard Worker * Pointer to source sub-block
228*495ae853SAndroid Build Coastguard Worker *
229*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
230*495ae853SAndroid Build Coastguard Worker * Pointer to prediction sub-block
231*495ae853SAndroid Build Coastguard Worker *
232*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_out
233*495ae853SAndroid Build Coastguard Worker * Pointer to residual sub-block
234*495ae853SAndroid Build Coastguard Worker *
235*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
236*495ae853SAndroid Build Coastguard Worker * Source stride
237*495ae853SAndroid Build Coastguard Worker *
238*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
239*495ae853SAndroid Build Coastguard Worker * Prediction stride
240*495ae853SAndroid Build Coastguard Worker *
241*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_scale_matrix
242*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Scale Matrix
243*495ae853SAndroid Build Coastguard Worker *
244*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_threshold_matrix
245*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Threshold Matrix
246*495ae853SAndroid Build Coastguard Worker *
247*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qbits
248*495ae853SAndroid Build Coastguard Worker * QP_BITS_h264_4x4 + floor(QP/6)
249*495ae853SAndroid Build Coastguard Worker *
250*495ae853SAndroid Build Coastguard Worker * @param[in] u4_round_factor
251*495ae853SAndroid Build Coastguard Worker * Quantization Round factor
252*495ae853SAndroid Build Coastguard Worker *
253*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_nnz
254*495ae853SAndroid Build Coastguard Worker * Total non-zero coefficients in the current sub-block
255*495ae853SAndroid Build Coastguard Worker *
256*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_alt_dc_addr
257*495ae853SAndroid Build Coastguard Worker * DC Coefficient of the block
258*495ae853SAndroid Build Coastguard Worker *
259*495ae853SAndroid Build Coastguard Worker * @remarks none
260*495ae853SAndroid Build Coastguard Worker *
261*495ae853SAndroid Build Coastguard Worker *******************************************************************************
262*495ae853SAndroid Build Coastguard Worker */
ih264_resi_trans_quant_chroma_4x4(UWORD8 * pu1_src,UWORD8 * pu1_pred,WORD16 * pi2_out,WORD32 src_strd,WORD32 pred_strd,const UWORD16 * pu2_scale_matrix,const UWORD16 * pu2_threshold_matrix,UWORD32 u4_qbits,UWORD32 u4_round_factor,UWORD8 * pu1_nnz,WORD16 * pu1_dc_alt_addr)263*495ae853SAndroid Build Coastguard Worker void ih264_resi_trans_quant_chroma_4x4(UWORD8 *pu1_src,
264*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
265*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out,
266*495ae853SAndroid Build Coastguard Worker WORD32 src_strd,
267*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
268*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_scale_matrix,
269*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_threshold_matrix,
270*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qbits,
271*495ae853SAndroid Build Coastguard Worker UWORD32 u4_round_factor,
272*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_nnz,
273*495ae853SAndroid Build Coastguard Worker WORD16 *pu1_dc_alt_addr)
274*495ae853SAndroid Build Coastguard Worker {
275*495ae853SAndroid Build Coastguard Worker UWORD32 i;
276*495ae853SAndroid Build Coastguard Worker WORD32 x0, x1, x2, x3, x4, x5, x6, x7;
277*495ae853SAndroid Build Coastguard Worker WORD32 i4_value;
278*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_tmp = pi2_out;
279*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nonzero_coeff = 0;
280*495ae853SAndroid Build Coastguard Worker
281*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
282*495ae853SAndroid Build Coastguard Worker {
283*495ae853SAndroid Build Coastguard Worker /* computing prediction error (residue) */
284*495ae853SAndroid Build Coastguard Worker x4 = pu1_src[0] - pu1_pred[0];
285*495ae853SAndroid Build Coastguard Worker x5 = pu1_src[2] - pu1_pred[2];
286*495ae853SAndroid Build Coastguard Worker x6 = pu1_src[4] - pu1_pred[4];
287*495ae853SAndroid Build Coastguard Worker x7 = pu1_src[6] - pu1_pred[6];
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker /* Horizontal transform */
290*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
291*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
292*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
293*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
294*495ae853SAndroid Build Coastguard Worker
295*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = x0 + x1;
296*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[1] = (x3 << 1) + x2;
297*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[2] = x0 - x1;
298*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[3] = x3 - (x2 << 1);
299*495ae853SAndroid Build Coastguard Worker
300*495ae853SAndroid Build Coastguard Worker /* pointing to next row; */
301*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
302*495ae853SAndroid Build Coastguard Worker pu1_pred += pred_strd;
303*495ae853SAndroid Build Coastguard Worker pi2_out_tmp += 4;
304*495ae853SAndroid Build Coastguard Worker }
305*495ae853SAndroid Build Coastguard Worker
306*495ae853SAndroid Build Coastguard Worker pi2_out_tmp = pi2_out;
307*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
308*495ae853SAndroid Build Coastguard Worker {
309*495ae853SAndroid Build Coastguard Worker /* Vertical transform and quantization */
310*495ae853SAndroid Build Coastguard Worker x4 = pi2_out_tmp[0];
311*495ae853SAndroid Build Coastguard Worker x5 = pi2_out_tmp[4];
312*495ae853SAndroid Build Coastguard Worker x6 = pi2_out_tmp[8];
313*495ae853SAndroid Build Coastguard Worker x7 = pi2_out_tmp[12];
314*495ae853SAndroid Build Coastguard Worker
315*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
316*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
317*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
318*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
319*495ae853SAndroid Build Coastguard Worker
320*495ae853SAndroid Build Coastguard Worker /* quantization is done in place */
321*495ae853SAndroid Build Coastguard Worker i4_value = x0 + x1;
322*495ae853SAndroid Build Coastguard Worker if(i == 0)
323*495ae853SAndroid Build Coastguard Worker {
324*495ae853SAndroid Build Coastguard Worker *pu1_dc_alt_addr = i4_value;
325*495ae853SAndroid Build Coastguard Worker }
326*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
327*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
328*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
329*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = i4_value;
330*495ae853SAndroid Build Coastguard Worker
331*495ae853SAndroid Build Coastguard Worker i4_value = (x3 << 1) + x2;
332*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[4],
333*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[4], u4_round_factor, u4_qbits,
334*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
335*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[4] = i4_value;
336*495ae853SAndroid Build Coastguard Worker
337*495ae853SAndroid Build Coastguard Worker i4_value = x0 - x1;
338*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[8],
339*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[8], u4_round_factor, u4_qbits,
340*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
341*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[8] = i4_value;
342*495ae853SAndroid Build Coastguard Worker
343*495ae853SAndroid Build Coastguard Worker i4_value = x3 - (x2 << 1);
344*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[12],
345*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[12], u4_round_factor, u4_qbits,
346*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
347*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[12] = i4_value;
348*495ae853SAndroid Build Coastguard Worker
349*495ae853SAndroid Build Coastguard Worker pi2_out_tmp++;
350*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix++;
351*495ae853SAndroid Build Coastguard Worker pu2_threshold_matrix++;
352*495ae853SAndroid Build Coastguard Worker }
353*495ae853SAndroid Build Coastguard Worker
354*495ae853SAndroid Build Coastguard Worker /* Return total nonzero coefficients in the current sub block */
355*495ae853SAndroid Build Coastguard Worker *pu1_nnz = u4_nonzero_coeff;
356*495ae853SAndroid Build Coastguard Worker }
357*495ae853SAndroid Build Coastguard Worker
358*495ae853SAndroid Build Coastguard Worker /**
359*495ae853SAndroid Build Coastguard Worker *******************************************************************************
360*495ae853SAndroid Build Coastguard Worker *
361*495ae853SAndroid Build Coastguard Worker * @brief
362*495ae853SAndroid Build Coastguard Worker * This function performs forward hadamard transform and quantization on a
363*495ae853SAndroid Build Coastguard Worker * 4x4 block
364*495ae853SAndroid Build Coastguard Worker *
365*495ae853SAndroid Build Coastguard Worker * @par Description:
366*495ae853SAndroid Build Coastguard Worker * The function accepts source buffer and estimation buffer. From these, it
367*495ae853SAndroid Build Coastguard Worker * computes the residue. This is residue is then transformed and quantized.
368*495ae853SAndroid Build Coastguard Worker * The transform and quantization are in placed computed. They use the residue
369*495ae853SAndroid Build Coastguard Worker * buffer for this.
370*495ae853SAndroid Build Coastguard Worker *
371*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
372*495ae853SAndroid Build Coastguard Worker * Pointer to source sub-block
373*495ae853SAndroid Build Coastguard Worker *
374*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dst
375*495ae853SAndroid Build Coastguard Worker * Pointer to destination sub-block
376*495ae853SAndroid Build Coastguard Worker *
377*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_threshold_matrix
378*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Threshold Matrix
379*495ae853SAndroid Build Coastguard Worker *
380*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_scale_matrix
381*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Scale Matrix
382*495ae853SAndroid Build Coastguard Worker *
383*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qbits
384*495ae853SAndroid Build Coastguard Worker * QP_BITS_h264_4x4 + floor(QP/6)
385*495ae853SAndroid Build Coastguard Worker *
386*495ae853SAndroid Build Coastguard Worker * @param[in] u4_round_factor
387*495ae853SAndroid Build Coastguard Worker * Quantization Round factor
388*495ae853SAndroid Build Coastguard Worker *
389*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_nnz
390*495ae853SAndroid Build Coastguard Worker * Total non-zero coefficients in the current sub-block
391*495ae853SAndroid Build Coastguard Worker *
392*495ae853SAndroid Build Coastguard Worker * @remarks none
393*495ae853SAndroid Build Coastguard Worker *
394*495ae853SAndroid Build Coastguard Worker ********************************************************************************
395*495ae853SAndroid Build Coastguard Worker */
ih264_hadamard_quant_4x4(WORD16 * pi2_src,WORD16 * pi2_dst,const UWORD16 * pu2_scale_matrix,const UWORD16 * pu2_threshold_matrix,UWORD32 u4_qbits,UWORD32 u4_round_factor,UWORD8 * pu1_nnz)396*495ae853SAndroid Build Coastguard Worker void ih264_hadamard_quant_4x4(WORD16 *pi2_src,
397*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dst,
398*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_scale_matrix,
399*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_threshold_matrix,
400*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qbits,
401*495ae853SAndroid Build Coastguard Worker UWORD32 u4_round_factor,
402*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_nnz)
403*495ae853SAndroid Build Coastguard Worker {
404*495ae853SAndroid Build Coastguard Worker WORD32 i;
405*495ae853SAndroid Build Coastguard Worker WORD32 x0, x1, x2, x3, x4, x5, x6, x7, i4_value;
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker *pu1_nnz = 0;
408*495ae853SAndroid Build Coastguard Worker
409*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
410*495ae853SAndroid Build Coastguard Worker {
411*495ae853SAndroid Build Coastguard Worker x4 = pi2_src[0];
412*495ae853SAndroid Build Coastguard Worker x5 = pi2_src[1];
413*495ae853SAndroid Build Coastguard Worker x6 = pi2_src[2];
414*495ae853SAndroid Build Coastguard Worker x7 = pi2_src[3];
415*495ae853SAndroid Build Coastguard Worker
416*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
417*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
418*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
419*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
420*495ae853SAndroid Build Coastguard Worker
421*495ae853SAndroid Build Coastguard Worker pi2_dst[0] = x0 + x1;
422*495ae853SAndroid Build Coastguard Worker pi2_dst[1] = x3 + x2;
423*495ae853SAndroid Build Coastguard Worker pi2_dst[2] = x0 - x1;
424*495ae853SAndroid Build Coastguard Worker pi2_dst[3] = x3 - x2;
425*495ae853SAndroid Build Coastguard Worker
426*495ae853SAndroid Build Coastguard Worker pi2_src += 4;
427*495ae853SAndroid Build Coastguard Worker pi2_dst += 4;
428*495ae853SAndroid Build Coastguard Worker }
429*495ae853SAndroid Build Coastguard Worker
430*495ae853SAndroid Build Coastguard Worker /* Vertical transform and quantization */
431*495ae853SAndroid Build Coastguard Worker pi2_dst -= SUB_BLK_WIDTH_4x4 << 2;
432*495ae853SAndroid Build Coastguard Worker
433*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_4x4; i++)
434*495ae853SAndroid Build Coastguard Worker {
435*495ae853SAndroid Build Coastguard Worker x4 = pi2_dst[0];
436*495ae853SAndroid Build Coastguard Worker x5 = pi2_dst[4];
437*495ae853SAndroid Build Coastguard Worker x6 = pi2_dst[8];
438*495ae853SAndroid Build Coastguard Worker x7 = pi2_dst[12];
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker x0 = x4 + x7;
441*495ae853SAndroid Build Coastguard Worker x1 = x5 + x6;
442*495ae853SAndroid Build Coastguard Worker x2 = x5 - x6;
443*495ae853SAndroid Build Coastguard Worker x3 = x4 - x7;
444*495ae853SAndroid Build Coastguard Worker
445*495ae853SAndroid Build Coastguard Worker i4_value = (x0 + x1) >> 1;
446*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
447*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits, pu1_nnz[0]);
448*495ae853SAndroid Build Coastguard Worker pi2_dst[0] = i4_value;
449*495ae853SAndroid Build Coastguard Worker
450*495ae853SAndroid Build Coastguard Worker i4_value = (x3 + x2) >> 1;
451*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
452*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits, pu1_nnz[0]);
453*495ae853SAndroid Build Coastguard Worker pi2_dst[4] = i4_value;
454*495ae853SAndroid Build Coastguard Worker
455*495ae853SAndroid Build Coastguard Worker i4_value = (x0 - x1) >> 1;
456*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
457*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits, pu1_nnz[0]);
458*495ae853SAndroid Build Coastguard Worker pi2_dst[8] = i4_value;
459*495ae853SAndroid Build Coastguard Worker
460*495ae853SAndroid Build Coastguard Worker i4_value = (x3 - x2) >> 1;
461*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
462*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits, pu1_nnz[0]);
463*495ae853SAndroid Build Coastguard Worker pi2_dst[12] = i4_value;
464*495ae853SAndroid Build Coastguard Worker
465*495ae853SAndroid Build Coastguard Worker pi2_dst++;
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker }
468*495ae853SAndroid Build Coastguard Worker
469*495ae853SAndroid Build Coastguard Worker /**
470*495ae853SAndroid Build Coastguard Worker *******************************************************************************
471*495ae853SAndroid Build Coastguard Worker *
472*495ae853SAndroid Build Coastguard Worker * @brief
473*495ae853SAndroid Build Coastguard Worker * This function performs forward hadamard transform and quantization on a
474*495ae853SAndroid Build Coastguard Worker * 2x2 block for both U and V planes
475*495ae853SAndroid Build Coastguard Worker *
476*495ae853SAndroid Build Coastguard Worker * @par Description:
477*495ae853SAndroid Build Coastguard Worker * The function accepts source buffer and estimation buffer. From these, it
478*495ae853SAndroid Build Coastguard Worker * computes the residue. This is residue is then transformed and quantized.
479*495ae853SAndroid Build Coastguard Worker * The transform and quantization are in placed computed. They use the residue
480*495ae853SAndroid Build Coastguard Worker * buffer for this.
481*495ae853SAndroid Build Coastguard Worker *
482*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
483*495ae853SAndroid Build Coastguard Worker * Pointer to source sub-block
484*495ae853SAndroid Build Coastguard Worker *
485*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_dst
486*495ae853SAndroid Build Coastguard Worker * Pointer to destination sub-block
487*495ae853SAndroid Build Coastguard Worker *
488*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_threshold_matrix
489*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Threshold Matrix
490*495ae853SAndroid Build Coastguard Worker *
491*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_scale_matrix
492*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Scale Matrix
493*495ae853SAndroid Build Coastguard Worker *
494*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qbits
495*495ae853SAndroid Build Coastguard Worker * QP_BITS_h264_4x4 + floor(QP/6)
496*495ae853SAndroid Build Coastguard Worker *
497*495ae853SAndroid Build Coastguard Worker * @param[in] u4_round_factor
498*495ae853SAndroid Build Coastguard Worker * Quantization Round factor
499*495ae853SAndroid Build Coastguard Worker *
500*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_nnz
501*495ae853SAndroid Build Coastguard Worker * Total non-zero coefficients in the current sub-block
502*495ae853SAndroid Build Coastguard Worker *
503*495ae853SAndroid Build Coastguard Worker * @remarks
504*495ae853SAndroid Build Coastguard Worker * NNZ for dc is populated at 0 and 5th position of pu1_nnz
505*495ae853SAndroid Build Coastguard Worker *
506*495ae853SAndroid Build Coastguard Worker *******************************************************************************
507*495ae853SAndroid Build Coastguard Worker */
ih264_hadamard_quant_2x2_uv(WORD16 * pi2_src,WORD16 * pi2_dst,const UWORD16 * pu2_scale_matrix,const UWORD16 * pu2_threshold_matrix,UWORD32 u4_qbits,UWORD32 u4_round_factor,UWORD8 * pu1_nnz)508*495ae853SAndroid Build Coastguard Worker void ih264_hadamard_quant_2x2_uv(WORD16 *pi2_src,
509*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_dst,
510*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_scale_matrix,
511*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_threshold_matrix,
512*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qbits,
513*495ae853SAndroid Build Coastguard Worker UWORD32 u4_round_factor,
514*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_nnz)
515*495ae853SAndroid Build Coastguard Worker {
516*495ae853SAndroid Build Coastguard Worker WORD32 x0, x1, x2, x3, x4, x5, x6, x7;
517*495ae853SAndroid Build Coastguard Worker WORD32 i4_value, plane;
518*495ae853SAndroid Build Coastguard Worker
519*495ae853SAndroid Build Coastguard Worker for(plane = 0; plane < 2; plane++)
520*495ae853SAndroid Build Coastguard Worker {
521*495ae853SAndroid Build Coastguard Worker pu1_nnz[plane] = 0;
522*495ae853SAndroid Build Coastguard Worker
523*495ae853SAndroid Build Coastguard Worker /* Horizontal transform */
524*495ae853SAndroid Build Coastguard Worker x4 = pi2_src[0];
525*495ae853SAndroid Build Coastguard Worker x5 = pi2_src[1];
526*495ae853SAndroid Build Coastguard Worker x6 = pi2_src[2];
527*495ae853SAndroid Build Coastguard Worker x7 = pi2_src[3];
528*495ae853SAndroid Build Coastguard Worker
529*495ae853SAndroid Build Coastguard Worker x0 = x4 + x5;
530*495ae853SAndroid Build Coastguard Worker x1 = x4 - x5;
531*495ae853SAndroid Build Coastguard Worker x2 = x6 + x7;
532*495ae853SAndroid Build Coastguard Worker x3 = x6 - x7;
533*495ae853SAndroid Build Coastguard Worker
534*495ae853SAndroid Build Coastguard Worker /* Vertical transform and quantization */
535*495ae853SAndroid Build Coastguard Worker i4_value = (x0 + x2);
536*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
537*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
538*495ae853SAndroid Build Coastguard Worker pu1_nnz[plane]);
539*495ae853SAndroid Build Coastguard Worker pi2_dst[0] = i4_value;
540*495ae853SAndroid Build Coastguard Worker
541*495ae853SAndroid Build Coastguard Worker i4_value = (x0 - x2);
542*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
543*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
544*495ae853SAndroid Build Coastguard Worker pu1_nnz[plane]);
545*495ae853SAndroid Build Coastguard Worker pi2_dst[2] = i4_value;
546*495ae853SAndroid Build Coastguard Worker
547*495ae853SAndroid Build Coastguard Worker i4_value = (x1 - x3);
548*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
549*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
550*495ae853SAndroid Build Coastguard Worker pu1_nnz[plane]);
551*495ae853SAndroid Build Coastguard Worker pi2_dst[3] = i4_value;
552*495ae853SAndroid Build Coastguard Worker
553*495ae853SAndroid Build Coastguard Worker i4_value = (x1 + x3);
554*495ae853SAndroid Build Coastguard Worker FWD_QUANT(i4_value, pu2_threshold_matrix[0],
555*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
556*495ae853SAndroid Build Coastguard Worker pu1_nnz[plane]);
557*495ae853SAndroid Build Coastguard Worker pi2_dst[1] = i4_value;
558*495ae853SAndroid Build Coastguard Worker
559*495ae853SAndroid Build Coastguard Worker pi2_dst += 4;
560*495ae853SAndroid Build Coastguard Worker pi2_src += 4;
561*495ae853SAndroid Build Coastguard Worker }
562*495ae853SAndroid Build Coastguard Worker }
563*495ae853SAndroid Build Coastguard Worker
564*495ae853SAndroid Build Coastguard Worker /**
565*495ae853SAndroid Build Coastguard Worker *******************************************************************************
566*495ae853SAndroid Build Coastguard Worker *
567*495ae853SAndroid Build Coastguard Worker * @brief
568*495ae853SAndroid Build Coastguard Worker * This function performs Single stage forward transform CF8 and quantization
569*495ae853SAndroid Build Coastguard Worker * on 8x8 blocks
570*495ae853SAndroid Build Coastguard Worker *
571*495ae853SAndroid Build Coastguard Worker * @par Description:
572*495ae853SAndroid Build Coastguard Worker * Performs single stage 8x8 forward transform CF8 after calculating the residue
573*495ae853SAndroid Build Coastguard Worker * The result is then quantized
574*495ae853SAndroid Build Coastguard Worker *
575*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
576*495ae853SAndroid Build Coastguard Worker * Pointer to source sub-block
577*495ae853SAndroid Build Coastguard Worker *
578*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_pred
579*495ae853SAndroid Build Coastguard Worker * Pointer to prediction sub-block
580*495ae853SAndroid Build Coastguard Worker *
581*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_out
582*495ae853SAndroid Build Coastguard Worker * Pointer to residual sub-block
583*495ae853SAndroid Build Coastguard Worker *
584*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
585*495ae853SAndroid Build Coastguard Worker * Source stride
586*495ae853SAndroid Build Coastguard Worker *
587*495ae853SAndroid Build Coastguard Worker * @param[in] pred_strd
588*495ae853SAndroid Build Coastguard Worker * Prediction stride
589*495ae853SAndroid Build Coastguard Worker *
590*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_scale_matrix
591*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Scale Matrix
592*495ae853SAndroid Build Coastguard Worker *
593*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_threshold_matrix
594*495ae853SAndroid Build Coastguard Worker * Pointer to Forward Quant Threshold Matrix
595*495ae853SAndroid Build Coastguard Worker *
596*495ae853SAndroid Build Coastguard Worker * @param[in] u4_qbits
597*495ae853SAndroid Build Coastguard Worker * QP_BITS_h264_8x8 + floor(QP/6)
598*495ae853SAndroid Build Coastguard Worker *
599*495ae853SAndroid Build Coastguard Worker * @param[in] u4_round_factor
600*495ae853SAndroid Build Coastguard Worker * Quantization Round factor
601*495ae853SAndroid Build Coastguard Worker *
602*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_nnz
603*495ae853SAndroid Build Coastguard Worker * Total non-zero coefficients in the current sub-block
604*495ae853SAndroid Build Coastguard Worker *
605*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_alt_dc_addr
606*495ae853SAndroid Build Coastguard Worker * UNUSED
607*495ae853SAndroid Build Coastguard Worker *
608*495ae853SAndroid Build Coastguard Worker * @returns none
609*495ae853SAndroid Build Coastguard Worker *
610*495ae853SAndroid Build Coastguard Worker * @remarks:
611*495ae853SAndroid Build Coastguard Worker * TODO: This function needs to be tested before integration
612*495ae853SAndroid Build Coastguard Worker *
613*495ae853SAndroid Build Coastguard Worker *******************************************************************************
614*495ae853SAndroid Build Coastguard Worker */
ih264_resi_trans_quant_8x8(UWORD8 * pu1_src,UWORD8 * pu1_pred,WORD16 * pi2_out,WORD32 src_strd,WORD32 pred_strd,const UWORD16 * pu2_scale_matrix,const UWORD16 * pu2_threshold_matrix,UWORD32 u4_qbits,UWORD32 u4_round_factor,UWORD8 * pu1_nnz,WORD16 * pu1_dc_alt_addr)615*495ae853SAndroid Build Coastguard Worker void ih264_resi_trans_quant_8x8(UWORD8 *pu1_src,
616*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred,
617*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out,
618*495ae853SAndroid Build Coastguard Worker WORD32 src_strd,
619*495ae853SAndroid Build Coastguard Worker WORD32 pred_strd,
620*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_scale_matrix,
621*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_threshold_matrix,
622*495ae853SAndroid Build Coastguard Worker UWORD32 u4_qbits,
623*495ae853SAndroid Build Coastguard Worker UWORD32 u4_round_factor,
624*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_nnz,
625*495ae853SAndroid Build Coastguard Worker WORD16 *pu1_dc_alt_addr)
626*495ae853SAndroid Build Coastguard Worker {
627*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_tmp = pi2_out;
628*495ae853SAndroid Build Coastguard Worker WORD32 i;
629*495ae853SAndroid Build Coastguard Worker WORD32 a0, a1, a2, a3, a4, a5, a6, a7;
630*495ae853SAndroid Build Coastguard Worker WORD32 r0, r1, r2, r3, r4, r5, r6, r7;
631*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nonzero_coeff = 0;
632*495ae853SAndroid Build Coastguard Worker
633*495ae853SAndroid Build Coastguard Worker UNUSED(pu1_dc_alt_addr);
634*495ae853SAndroid Build Coastguard Worker
635*495ae853SAndroid Build Coastguard Worker /* Horizontal transform */
636*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; ++i)
637*495ae853SAndroid Build Coastguard Worker {
638*495ae853SAndroid Build Coastguard Worker r0 = pu1_src[0];
639*495ae853SAndroid Build Coastguard Worker r0 -= pu1_pred[0];
640*495ae853SAndroid Build Coastguard Worker r1 = pu1_src[1];
641*495ae853SAndroid Build Coastguard Worker r1 -= pu1_pred[1];
642*495ae853SAndroid Build Coastguard Worker r2 = pu1_src[2]; r2 -= pu1_pred[2];
643*495ae853SAndroid Build Coastguard Worker r3 = pu1_src[3]; r3 -= pu1_pred[3];
644*495ae853SAndroid Build Coastguard Worker r4 = pu1_src[4]; r4 -= pu1_pred[4];
645*495ae853SAndroid Build Coastguard Worker r5 = pu1_src[5]; r5 -= pu1_pred[5];
646*495ae853SAndroid Build Coastguard Worker r6 = pu1_src[6]; r6 -= pu1_pred[6];
647*495ae853SAndroid Build Coastguard Worker r7 = pu1_src[7]; r7 -= pu1_pred[7];
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker a0 = r0 + r7;
650*495ae853SAndroid Build Coastguard Worker a1 = r1 + r6;
651*495ae853SAndroid Build Coastguard Worker a2 = r2 + r5;
652*495ae853SAndroid Build Coastguard Worker a3 = r3 + r4;
653*495ae853SAndroid Build Coastguard Worker
654*495ae853SAndroid Build Coastguard Worker a4 = a0 + a3;
655*495ae853SAndroid Build Coastguard Worker a5 = a1 + a2;
656*495ae853SAndroid Build Coastguard Worker a6 = a0 - a3;
657*495ae853SAndroid Build Coastguard Worker a7 = a1 - a2;
658*495ae853SAndroid Build Coastguard Worker
659*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = a4 + a5;
660*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[2] = a6 + (a7 >> 1);
661*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[4] = a4 - a5;
662*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[6] = (a6 >> 1) - a7;
663*495ae853SAndroid Build Coastguard Worker
664*495ae853SAndroid Build Coastguard Worker a0 = r0 - r7;
665*495ae853SAndroid Build Coastguard Worker a1 = r1 - r6;
666*495ae853SAndroid Build Coastguard Worker a2 = r2 - r5;
667*495ae853SAndroid Build Coastguard Worker a3 = r3 - r4;
668*495ae853SAndroid Build Coastguard Worker
669*495ae853SAndroid Build Coastguard Worker a4 = a1 + a2 + ((a0 >> 1) + a0);
670*495ae853SAndroid Build Coastguard Worker a5 = a0 - a3 - ((a2 >> 1) + a2);
671*495ae853SAndroid Build Coastguard Worker a6 = a0 + a3 - ((a1 >> 1) + a1);
672*495ae853SAndroid Build Coastguard Worker a7 = a1 - a2 + ((a3 >> 1) + a3);
673*495ae853SAndroid Build Coastguard Worker
674*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[1] = a4 + (a7 >> 2);
675*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[3] = a5 + (a6 >> 2);
676*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[5] = a6 - (a5 >> 2);
677*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[7] = (a4 >> 2) - a7;
678*495ae853SAndroid Build Coastguard Worker
679*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
680*495ae853SAndroid Build Coastguard Worker pu1_pred += pred_strd;
681*495ae853SAndroid Build Coastguard Worker pi2_out_tmp += 8;
682*495ae853SAndroid Build Coastguard Worker }
683*495ae853SAndroid Build Coastguard Worker
684*495ae853SAndroid Build Coastguard Worker /* vertical transform and quant */
685*495ae853SAndroid Build Coastguard Worker pi2_out_tmp = pi2_out;
686*495ae853SAndroid Build Coastguard Worker for(i = 0; i < SUB_BLK_WIDTH_8x8; ++i)
687*495ae853SAndroid Build Coastguard Worker {
688*495ae853SAndroid Build Coastguard Worker r0 = pi2_out_tmp[0];
689*495ae853SAndroid Build Coastguard Worker r1 = pi2_out_tmp[8];
690*495ae853SAndroid Build Coastguard Worker r2 = pi2_out_tmp[16];
691*495ae853SAndroid Build Coastguard Worker r3 = pi2_out_tmp[24];
692*495ae853SAndroid Build Coastguard Worker r4 = pi2_out_tmp[32];
693*495ae853SAndroid Build Coastguard Worker r5 = pi2_out_tmp[40];
694*495ae853SAndroid Build Coastguard Worker r6 = pi2_out_tmp[48];
695*495ae853SAndroid Build Coastguard Worker r7 = pi2_out_tmp[56];
696*495ae853SAndroid Build Coastguard Worker
697*495ae853SAndroid Build Coastguard Worker a0 = r0 + r7;
698*495ae853SAndroid Build Coastguard Worker a1 = r1 + r6;
699*495ae853SAndroid Build Coastguard Worker a2 = r2 + r5;
700*495ae853SAndroid Build Coastguard Worker a3 = r3 + r4;
701*495ae853SAndroid Build Coastguard Worker
702*495ae853SAndroid Build Coastguard Worker a4 = a0 + a3;
703*495ae853SAndroid Build Coastguard Worker a5 = a1 + a2;
704*495ae853SAndroid Build Coastguard Worker a6 = a0 - a3;
705*495ae853SAndroid Build Coastguard Worker a7 = a1 - a2;
706*495ae853SAndroid Build Coastguard Worker
707*495ae853SAndroid Build Coastguard Worker a0 = r0 - r7;
708*495ae853SAndroid Build Coastguard Worker a1 = r1 - r6;
709*495ae853SAndroid Build Coastguard Worker a2 = r2 - r5;
710*495ae853SAndroid Build Coastguard Worker a3 = r3 - r4;
711*495ae853SAndroid Build Coastguard Worker
712*495ae853SAndroid Build Coastguard Worker r0 = a4 + a5;
713*495ae853SAndroid Build Coastguard Worker r2 = a6 + (a7 >> 1);
714*495ae853SAndroid Build Coastguard Worker r4 = a4 - a5;
715*495ae853SAndroid Build Coastguard Worker r6 = (a6 >> 1) - a7;
716*495ae853SAndroid Build Coastguard Worker
717*495ae853SAndroid Build Coastguard Worker a4 = a1 + a2 + ((a0 >> 1) + a0);
718*495ae853SAndroid Build Coastguard Worker a5 = a0 - a3 - ((a2 >> 1) + a2);
719*495ae853SAndroid Build Coastguard Worker a6 = a0 + a3 - ((a1 >> 1) + a1);
720*495ae853SAndroid Build Coastguard Worker a7 = a1 - a2 + ((a3 >> 1) + a3);
721*495ae853SAndroid Build Coastguard Worker
722*495ae853SAndroid Build Coastguard Worker r1 = a4 + (a7 >> 2);
723*495ae853SAndroid Build Coastguard Worker r3 = a5 + (a6 >> 2);
724*495ae853SAndroid Build Coastguard Worker r5 = a6 - (a5 >> 2);
725*495ae853SAndroid Build Coastguard Worker r7 = (a4 >> 2) - a7;
726*495ae853SAndroid Build Coastguard Worker
727*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r0, pu2_threshold_matrix[0],
728*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[0], u4_round_factor, u4_qbits,
729*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
730*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[0] = r0;
731*495ae853SAndroid Build Coastguard Worker
732*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r1, pu2_threshold_matrix[8],
733*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[8], u4_round_factor, u4_qbits,
734*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
735*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[8] = r1;
736*495ae853SAndroid Build Coastguard Worker
737*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r2, pu2_threshold_matrix[16],
738*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[16], u4_round_factor, u4_qbits,
739*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
740*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[16] = r2;
741*495ae853SAndroid Build Coastguard Worker
742*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r3, pu2_threshold_matrix[24],
743*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[24], u4_round_factor, u4_qbits,
744*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
745*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[24] = r3;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r4, pu2_threshold_matrix[32],
748*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[32], u4_round_factor, u4_qbits,
749*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
750*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[32] = r4;
751*495ae853SAndroid Build Coastguard Worker
752*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r5, pu2_threshold_matrix[40],
753*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[40], u4_round_factor, u4_qbits,
754*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
755*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[40] = r5;
756*495ae853SAndroid Build Coastguard Worker
757*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r6, pu2_threshold_matrix[48],
758*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[48], u4_round_factor, u4_qbits,
759*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
760*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[48] = r6;
761*495ae853SAndroid Build Coastguard Worker
762*495ae853SAndroid Build Coastguard Worker FWD_QUANT(r7, pu2_threshold_matrix[56],
763*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix[56], u4_round_factor, u4_qbits,
764*495ae853SAndroid Build Coastguard Worker u4_nonzero_coeff);
765*495ae853SAndroid Build Coastguard Worker pi2_out_tmp[56] = r7;
766*495ae853SAndroid Build Coastguard Worker
767*495ae853SAndroid Build Coastguard Worker pi2_out_tmp++;
768*495ae853SAndroid Build Coastguard Worker pu2_scale_matrix++;
769*495ae853SAndroid Build Coastguard Worker pu2_threshold_matrix++;
770*495ae853SAndroid Build Coastguard Worker }
771*495ae853SAndroid Build Coastguard Worker /* Return total nonzero coefficients in the current sub block */
772*495ae853SAndroid Build Coastguard Worker *pu1_nnz = u4_nonzero_coeff;
773*495ae853SAndroid Build Coastguard Worker }
774