Coverage Report

Created: 2026-10-17 06:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/common/ihevc_itrans_recon_32x32.c
Line
Count
Source
1
/******************************************************************************
2
*
3
* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4
*
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
* you may not use this file except in compliance with the License.
7
* You may obtain a copy of the License at:
8
*
9
* http://www.apache.org/licenses/LICENSE-2.0
10
*
11
* Unless required by applicable law or agreed to in writing, software
12
* distributed under the License is distributed on an "AS IS" BASIS,
13
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
* See the License for the specific language governing permissions and
15
* limitations under the License.
16
*
17
******************************************************************************/
18
/**
19
 *******************************************************************************
20
 * @file
21
 *  ihevc_itrans_recon_32x32.c
22
 *
23
 * @brief
24
 *  Contains function definitions for inverse transform  and reconstruction 32x32
25
 *
26
 *
27
 * @author
28
 *  100470
29
 *
30
 * @par List of Functions:
31
 *  - ihevc_itrans_recon_32x32()
32
 *
33
 * @remarks
34
 *  None
35
 *
36
 *******************************************************************************
37
 */
38
#include <stdio.h>
39
#include <string.h>
40
#include "ihevc_typedefs.h"
41
#include "ihevc_macros.h"
42
#include "ihevc_platform_macros.h"
43
#include "ihevc_defs.h"
44
#include "ihevc_trans_tables.h"
45
#include "ihevc_itrans_recon.h"
46
#include "ihevc_trans_macros.h"
47
48
49
/**
50
 *******************************************************************************
51
 *
52
 * @brief
53
 *  This function performs Inverse transform  and reconstruction for 32x32
54
 * input block
55
 *
56
 * @par Description:
57
 *  Performs inverse transform and adds the prediction  data and clips output
58
 * to 8 bit
59
 *
60
 * @param[in] pi2_src
61
 *  Input 32x32 coefficients
62
 *
63
 * @param[in] pi2_tmp
64
 *  Temporary 32x32 buffer for storing inverse
65
 *
66
 *  transform
67
 *  1st stage output
68
 *
69
 * @param[in] pu1_pred
70
 *  Prediction 32x32 block
71
 *
72
 * @param[out] pu1_dst
73
 *  Output 32x32 block
74
 *
75
 * @param[in] src_strd
76
 *  Input stride
77
 *
78
 * @param[in] pred_strd
79
 *  Prediction stride
80
 *
81
 * @param[in] dst_strd
82
 *  Output Stride
83
 *
84
 * @param[in] shift
85
 *  Output shift
86
 *
87
 * @param[in] zero_cols
88
 *  Zero columns in pi2_src
89
 *
90
 * @returns  Void
91
 *
92
 * @remarks
93
 *  None
94
 *
95
 *******************************************************************************
96
 */
97
98
void ihevc_itrans_recon_32x32(WORD16 *pi2_src,
99
                              WORD16 *pi2_tmp,
100
                              UWORD8 *pu1_pred,
101
                              UWORD8 *pu1_dst,
102
                              WORD32 src_strd,
103
                              WORD32 pred_strd,
104
                              WORD32 dst_strd,
105
                              WORD32 zero_cols,
106
                              WORD32 zero_rows)
107
299k
{
108
299k
    WORD32 j, k;
109
299k
    WORD32 e[16], o[16];
110
299k
    WORD32 ee[8], eo[8];
111
299k
    WORD32 eee[4], eeo[4];
112
299k
    WORD32 eeee[2], eeeo[2];
113
299k
    WORD32 add;
114
299k
    WORD32 shift;
115
299k
    WORD16 *pi2_tmp_orig;
116
299k
    WORD32 trans_size;
117
299k
    WORD32 zero_rows_2nd_stage = zero_cols;
118
299k
    WORD32 row_limit_2nd_stage;
119
120
299k
    trans_size = TRANS_SIZE_32;
121
299k
    pi2_tmp_orig = pi2_tmp;
122
123
299k
    if((zero_cols & 0xFFFFFFF0) == 0xFFFFFFF0)
124
85.1k
        row_limit_2nd_stage = 4;
125
214k
    else if((zero_cols & 0xFFFFFF00) == 0xFFFFFF00)
126
50.0k
        row_limit_2nd_stage = 8;
127
163k
    else
128
163k
        row_limit_2nd_stage = TRANS_SIZE_32;
129
130
299k
    if((zero_rows & 0xFFFFFFF0) == 0xFFFFFFF0)  /* First 4 rows of input are non-zero */
131
82.9k
    {
132
        /************************************************************************************************/
133
        /**********************************START - IT_RECON_32x32****************************************/
134
        /************************************************************************************************/
135
        /* Inverse Transform 1st stage */
136
82.9k
        shift = IT_SHIFT_STAGE_1;
137
82.9k
        add = 1 << (shift - 1);
138
139
1.18M
        for(j = 0; j < row_limit_2nd_stage; j++)
140
1.09M
        {
141
            /* Checking for Zero Cols */
142
1.09M
            if((zero_cols & 1) == 1)
143
680k
            {
144
680k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
145
680k
            }
146
418k
            else
147
418k
            {
148
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
149
7.12M
                for(k = 0; k < 16; k++)
150
6.70M
                {
151
6.70M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
152
6.70M
                                    + g_ai2_ihevc_trans_32[3][k]
153
6.70M
                                                    * pi2_src[3 * src_strd];
154
6.70M
                }
155
3.77M
                for(k = 0; k < 8; k++)
156
3.35M
                {
157
3.35M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd];
158
3.35M
                }
159
//                for(k = 0; k < 4; k++)
160
418k
                {
161
418k
                    eeo[0] = 0;
162
418k
                    eeo[1] = 0;
163
418k
                    eeo[2] = 0;
164
418k
                    eeo[3] = 0;
165
418k
                }
166
418k
                eeeo[0] = 0;
167
418k
                eeeo[1] = 0;
168
418k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0];
169
418k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0];
170
171
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
172
418k
                eee[0] = eeee[0] + eeeo[0];
173
418k
                eee[3] = eeee[0] - eeeo[0];
174
418k
                eee[1] = eeee[1] + eeeo[1];
175
418k
                eee[2] = eeee[1] - eeeo[1];
176
2.09M
                for(k = 0; k < 4; k++)
177
1.67M
                {
178
1.67M
                    ee[k] = eee[k] + eeo[k];
179
1.67M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
180
1.67M
                }
181
3.77M
                for(k = 0; k < 8; k++)
182
3.35M
                {
183
3.35M
                    e[k] = ee[k] + eo[k];
184
3.35M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
185
3.35M
                }
186
7.12M
                for(k = 0; k < 16; k++)
187
6.70M
                {
188
6.70M
                    pi2_tmp[k] =
189
6.70M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
190
6.70M
                    pi2_tmp[k + 16] =
191
6.70M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
192
6.70M
                }
193
418k
            }
194
1.09M
            pi2_src++;
195
1.09M
            pi2_tmp += trans_size;
196
1.09M
            zero_cols = zero_cols >> 1;
197
1.09M
        }
198
199
82.9k
        pi2_tmp = pi2_tmp_orig;
200
201
        /* Inverse Transform 2nd stage */
202
82.9k
        shift = IT_SHIFT_STAGE_2;
203
82.9k
        add = 1 << (shift - 1);
204
82.9k
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
205
41.0k
        {
206
1.30M
            for(j = 0; j < trans_size; j++)
207
1.25M
            {
208
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
209
21.3M
                for(k = 0; k < 16; k++)
210
20.0M
                {
211
20.0M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
212
20.0M
                                    + g_ai2_ihevc_trans_32[3][k]
213
20.0M
                                                    * pi2_tmp[3 * trans_size];
214
20.0M
                }
215
11.3M
                for(k = 0; k < 8; k++)
216
10.1M
                {
217
10.1M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
218
10.1M
                }
219
//                for(k = 0; k < 4; k++)
220
1.25M
                {
221
1.25M
                    eeo[0] = 0;
222
1.25M
                    eeo[1] = 0;
223
1.25M
                    eeo[2] = 0;
224
1.25M
                    eeo[3] = 0;
225
1.25M
                }
226
1.25M
                eeeo[0] = 0;
227
1.25M
                eeeo[1] = 0;
228
1.25M
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
229
1.25M
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
230
231
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
232
1.25M
                eee[0] = eeee[0] + eeeo[0];
233
1.25M
                eee[3] = eeee[0] - eeeo[0];
234
1.25M
                eee[1] = eeee[1] + eeeo[1];
235
1.25M
                eee[2] = eeee[1] - eeeo[1];
236
6.33M
                for(k = 0; k < 4; k++)
237
5.07M
                {
238
5.07M
                    ee[k] = eee[k] + eeo[k];
239
5.07M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
240
5.07M
                }
241
11.3M
                for(k = 0; k < 8; k++)
242
10.0M
                {
243
10.0M
                    e[k] = ee[k] + eo[k];
244
10.0M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
245
10.0M
                }
246
21.2M
                for(k = 0; k < 16; k++)
247
19.9M
                {
248
19.9M
                    WORD32 itrans_out;
249
19.9M
                    itrans_out =
250
19.9M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
251
19.9M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
252
19.9M
                    itrans_out =
253
19.9M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
254
19.9M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
255
19.9M
                }
256
1.25M
                pi2_tmp++;
257
1.25M
                pu1_pred += pred_strd;
258
1.25M
                pu1_dst += dst_strd;
259
1.25M
            }
260
41.0k
        }
261
41.8k
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
262
16.9k
        {
263
522k
            for(j = 0; j < trans_size; j++)
264
505k
            {
265
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
266
8.54M
                for(k = 0; k < 16; k++)
267
8.03M
                {
268
8.03M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
269
8.03M
                                    + g_ai2_ihevc_trans_32[3][k]
270
8.03M
                                                    * pi2_tmp[3 * trans_size]
271
8.03M
                                    + g_ai2_ihevc_trans_32[5][k]
272
8.03M
                                                    * pi2_tmp[5 * trans_size]
273
8.03M
                                    + g_ai2_ihevc_trans_32[7][k]
274
8.03M
                                                    * pi2_tmp[7 * trans_size];
275
8.03M
                }
276
4.60M
                for(k = 0; k < 8; k++)
277
4.09M
                {
278
4.09M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
279
4.09M
                                    + g_ai2_ihevc_trans_32[6][k]
280
4.09M
                                                    * pi2_tmp[6 * trans_size];
281
4.09M
                }
282
2.57M
                for(k = 0; k < 4; k++)
283
2.06M
                {
284
2.06M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
285
2.06M
                }
286
505k
                eeeo[0] = 0;
287
505k
                eeeo[1] = 0;
288
505k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
289
505k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
290
291
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
292
505k
                eee[0] = eeee[0] + eeeo[0];
293
505k
                eee[3] = eeee[0] - eeeo[0];
294
505k
                eee[1] = eeee[1] + eeeo[1];
295
505k
                eee[2] = eeee[1] - eeeo[1];
296
2.57M
                for(k = 0; k < 4; k++)
297
2.07M
                {
298
2.07M
                    ee[k] = eee[k] + eeo[k];
299
2.07M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
300
2.07M
                }
301
4.55M
                for(k = 0; k < 8; k++)
302
4.04M
                {
303
4.04M
                    e[k] = ee[k] + eo[k];
304
4.04M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
305
4.04M
                }
306
8.47M
                for(k = 0; k < 16; k++)
307
7.97M
                {
308
7.97M
                    WORD32 itrans_out;
309
7.97M
                    itrans_out =
310
7.97M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
311
7.97M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
312
7.97M
                    itrans_out =
313
7.97M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
314
7.97M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
315
7.97M
                }
316
505k
                pi2_tmp++;
317
505k
                pu1_pred += pred_strd;
318
505k
                pu1_dst += dst_strd;
319
505k
            }
320
16.9k
        }
321
24.9k
        else /* All rows of output of 1st stage are non-zero */
322
24.9k
        {
323
802k
            for(j = 0; j < trans_size; j++)
324
777k
            {
325
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
326
13.1M
                for(k = 0; k < 16; k++)
327
12.3M
                {
328
12.3M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
329
12.3M
                                    + g_ai2_ihevc_trans_32[3][k]
330
12.3M
                                                    * pi2_tmp[3 * trans_size]
331
12.3M
                                    + g_ai2_ihevc_trans_32[5][k]
332
12.3M
                                                    * pi2_tmp[5 * trans_size]
333
12.3M
                                    + g_ai2_ihevc_trans_32[7][k]
334
12.3M
                                                    * pi2_tmp[7 * trans_size]
335
12.3M
                                    + g_ai2_ihevc_trans_32[9][k]
336
12.3M
                                                    * pi2_tmp[9 * trans_size]
337
12.3M
                                    + g_ai2_ihevc_trans_32[11][k]
338
12.3M
                                                    * pi2_tmp[11 * trans_size]
339
12.3M
                                    + g_ai2_ihevc_trans_32[13][k]
340
12.3M
                                                    * pi2_tmp[13 * trans_size]
341
12.3M
                                    + g_ai2_ihevc_trans_32[15][k]
342
12.3M
                                                    * pi2_tmp[15 * trans_size]
343
12.3M
                                    + g_ai2_ihevc_trans_32[17][k]
344
12.3M
                                                    * pi2_tmp[17 * trans_size]
345
12.3M
                                    + g_ai2_ihevc_trans_32[19][k]
346
12.3M
                                                    * pi2_tmp[19 * trans_size]
347
12.3M
                                    + g_ai2_ihevc_trans_32[21][k]
348
12.3M
                                                    * pi2_tmp[21 * trans_size]
349
12.3M
                                    + g_ai2_ihevc_trans_32[23][k]
350
12.3M
                                                    * pi2_tmp[23 * trans_size]
351
12.3M
                                    + g_ai2_ihevc_trans_32[25][k]
352
12.3M
                                                    * pi2_tmp[25 * trans_size]
353
12.3M
                                    + g_ai2_ihevc_trans_32[27][k]
354
12.3M
                                                    * pi2_tmp[27 * trans_size]
355
12.3M
                                    + g_ai2_ihevc_trans_32[29][k]
356
12.3M
                                                    * pi2_tmp[29 * trans_size]
357
12.3M
                                    + g_ai2_ihevc_trans_32[31][k]
358
12.3M
                                                    * pi2_tmp[31 * trans_size];
359
12.3M
                }
360
7.05M
                for(k = 0; k < 8; k++)
361
6.27M
                {
362
6.27M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
363
6.27M
                                    + g_ai2_ihevc_trans_32[6][k]
364
6.27M
                                                    * pi2_tmp[6 * trans_size]
365
6.27M
                                    + g_ai2_ihevc_trans_32[10][k]
366
6.27M
                                                    * pi2_tmp[10 * trans_size]
367
6.27M
                                    + g_ai2_ihevc_trans_32[14][k]
368
6.27M
                                                    * pi2_tmp[14 * trans_size]
369
6.27M
                                    + g_ai2_ihevc_trans_32[18][k]
370
6.27M
                                                    * pi2_tmp[18 * trans_size]
371
6.27M
                                    + g_ai2_ihevc_trans_32[22][k]
372
6.27M
                                                    * pi2_tmp[22 * trans_size]
373
6.27M
                                    + g_ai2_ihevc_trans_32[26][k]
374
6.27M
                                                    * pi2_tmp[26 * trans_size]
375
6.27M
                                    + g_ai2_ihevc_trans_32[30][k]
376
6.27M
                                                    * pi2_tmp[30 * trans_size];
377
6.27M
                }
378
3.95M
                for(k = 0; k < 4; k++)
379
3.17M
                {
380
3.17M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
381
3.17M
                                    + g_ai2_ihevc_trans_32[12][k]
382
3.17M
                                                    * pi2_tmp[12 * trans_size]
383
3.17M
                                    + g_ai2_ihevc_trans_32[20][k]
384
3.17M
                                                    * pi2_tmp[20 * trans_size]
385
3.17M
                                    + g_ai2_ihevc_trans_32[28][k]
386
3.17M
                                                    * pi2_tmp[28 * trans_size];
387
3.17M
                }
388
777k
                eeeo[0] =
389
777k
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
390
777k
                                                + g_ai2_ihevc_trans_32[24][0]
391
777k
                                                                * pi2_tmp[24
392
777k
                                                                                * trans_size];
393
777k
                eeeo[1] =
394
777k
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
395
777k
                                                + g_ai2_ihevc_trans_32[24][1]
396
777k
                                                                * pi2_tmp[24
397
777k
                                                                                * trans_size];
398
777k
                eeee[0] =
399
777k
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
400
777k
                                                + g_ai2_ihevc_trans_32[16][0]
401
777k
                                                                * pi2_tmp[16
402
777k
                                                                                * trans_size];
403
777k
                eeee[1] =
404
777k
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
405
777k
                                                + g_ai2_ihevc_trans_32[16][1]
406
777k
                                                                * pi2_tmp[16
407
777k
                                                                                * trans_size];
408
409
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
410
777k
                eee[0] = eeee[0] + eeeo[0];
411
777k
                eee[3] = eeee[0] - eeeo[0];
412
777k
                eee[1] = eeee[1] + eeeo[1];
413
777k
                eee[2] = eeee[1] - eeeo[1];
414
3.92M
                for(k = 0; k < 4; k++)
415
3.14M
                {
416
3.14M
                    ee[k] = eee[k] + eeo[k];
417
3.14M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
418
3.14M
                }
419
7.05M
                for(k = 0; k < 8; k++)
420
6.27M
                {
421
6.27M
                    e[k] = ee[k] + eo[k];
422
6.27M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
423
6.27M
                }
424
13.1M
                for(k = 0; k < 16; k++)
425
12.3M
                {
426
12.3M
                    WORD32 itrans_out;
427
12.3M
                    itrans_out =
428
12.3M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
429
12.3M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
430
12.3M
                    itrans_out =
431
12.3M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
432
12.3M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
433
12.3M
                }
434
777k
                pi2_tmp++;
435
777k
                pu1_pred += pred_strd;
436
777k
                pu1_dst += dst_strd;
437
777k
            }
438
24.9k
        }
439
        /************************************************************************************************/
440
        /************************************END - IT_RECON_32x32****************************************/
441
        /************************************************************************************************/
442
82.9k
    }
443
216k
    else if((zero_rows & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of input are non-zero */
444
50.9k
    {
445
        /************************************************************************************************/
446
        /**********************************START - IT_RECON_32x32****************************************/
447
        /************************************************************************************************/
448
        /* Inverse Transform 1st stage */
449
50.9k
        shift = IT_SHIFT_STAGE_1;
450
50.9k
        add = 1 << (shift - 1);
451
452
668k
        for(j = 0; j < row_limit_2nd_stage; j++)
453
617k
        {
454
            /* Checking for Zero Cols */
455
617k
            if((zero_cols & 1) == 1)
456
444k
            {
457
444k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
458
444k
            }
459
173k
            else
460
173k
            {
461
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
462
2.95M
                for(k = 0; k < 16; k++)
463
2.78M
                {
464
2.78M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
465
2.78M
                                    + g_ai2_ihevc_trans_32[3][k]
466
2.78M
                                                    * pi2_src[3 * src_strd]
467
2.78M
                                    + g_ai2_ihevc_trans_32[5][k]
468
2.78M
                                                    * pi2_src[5 * src_strd]
469
2.78M
                                    + g_ai2_ihevc_trans_32[7][k]
470
2.78M
                                                    * pi2_src[7 * src_strd];
471
2.78M
                }
472
1.56M
                for(k = 0; k < 8; k++)
473
1.39M
                {
474
1.39M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd]
475
1.39M
                                    + g_ai2_ihevc_trans_32[6][k]
476
1.39M
                                                    * pi2_src[6 * src_strd];
477
1.39M
                }
478
870k
                for(k = 0; k < 4; k++)
479
696k
                {
480
696k
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd];
481
696k
                }
482
173k
                eeeo[0] = 0;
483
173k
                eeeo[1] = 0;
484
173k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0];
485
173k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0];
486
487
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
488
173k
                eee[0] = eeee[0] + eeeo[0];
489
173k
                eee[3] = eeee[0] - eeeo[0];
490
173k
                eee[1] = eeee[1] + eeeo[1];
491
173k
                eee[2] = eeee[1] - eeeo[1];
492
870k
                for(k = 0; k < 4; k++)
493
696k
                {
494
696k
                    ee[k] = eee[k] + eeo[k];
495
696k
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
496
696k
                }
497
1.56M
                for(k = 0; k < 8; k++)
498
1.39M
                {
499
1.39M
                    e[k] = ee[k] + eo[k];
500
1.39M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
501
1.39M
                }
502
2.95M
                for(k = 0; k < 16; k++)
503
2.78M
                {
504
2.78M
                    pi2_tmp[k] =
505
2.78M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
506
2.78M
                    pi2_tmp[k + 16] =
507
2.78M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
508
2.78M
                }
509
173k
            }
510
617k
            pi2_src++;
511
617k
            pi2_tmp += trans_size;
512
617k
            zero_cols = zero_cols >> 1;
513
617k
        }
514
515
50.9k
        pi2_tmp = pi2_tmp_orig;
516
517
        /* Inverse Transform 2nd stage */
518
50.9k
        shift = IT_SHIFT_STAGE_2;
519
50.9k
        add = 1 << (shift - 1);
520
50.9k
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
521
19.1k
        {
522
613k
            for(j = 0; j < trans_size; j++)
523
594k
            {
524
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
525
10.0M
                for(k = 0; k < 16; k++)
526
9.43M
                {
527
9.43M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
528
9.43M
                                    + g_ai2_ihevc_trans_32[3][k]
529
9.43M
                                                    * pi2_tmp[3 * trans_size];
530
9.43M
                }
531
5.34M
                for(k = 0; k < 8; k++)
532
4.75M
                {
533
4.75M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
534
4.75M
                }
535
//                for(k = 0; k < 4; k++)
536
594k
                {
537
594k
                    eeo[0] = 0;
538
594k
                    eeo[1] = 0;
539
594k
                    eeo[2] = 0;
540
594k
                    eeo[3] = 0;
541
594k
                }
542
594k
                eeeo[0] = 0;
543
594k
                eeeo[1] = 0;
544
594k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
545
594k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
546
547
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
548
594k
                eee[0] = eeee[0] + eeeo[0];
549
594k
                eee[3] = eeee[0] - eeeo[0];
550
594k
                eee[1] = eeee[1] + eeeo[1];
551
594k
                eee[2] = eeee[1] - eeeo[1];
552
2.97M
                for(k = 0; k < 4; k++)
553
2.38M
                {
554
2.38M
                    ee[k] = eee[k] + eeo[k];
555
2.38M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
556
2.38M
                }
557
5.40M
                for(k = 0; k < 8; k++)
558
4.80M
                {
559
4.80M
                    e[k] = ee[k] + eo[k];
560
4.80M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
561
4.80M
                }
562
10.0M
                for(k = 0; k < 16; k++)
563
9.41M
                {
564
9.41M
                    WORD32 itrans_out;
565
9.41M
                    itrans_out =
566
9.41M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
567
9.41M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
568
9.41M
                    itrans_out =
569
9.41M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
570
9.41M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
571
9.41M
                }
572
594k
                pi2_tmp++;
573
594k
                pu1_pred += pred_strd;
574
594k
                pu1_dst += dst_strd;
575
594k
            }
576
19.1k
        }
577
31.8k
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
578
19.8k
        {
579
635k
            for(j = 0; j < trans_size; j++)
580
615k
            {
581
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
582
10.4M
                for(k = 0; k < 16; k++)
583
9.83M
                {
584
9.83M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
585
9.83M
                                    + g_ai2_ihevc_trans_32[3][k]
586
9.83M
                                                    * pi2_tmp[3 * trans_size]
587
9.83M
                                    + g_ai2_ihevc_trans_32[5][k]
588
9.83M
                                                    * pi2_tmp[5 * trans_size]
589
9.83M
                                    + g_ai2_ihevc_trans_32[7][k]
590
9.83M
                                                    * pi2_tmp[7 * trans_size];
591
9.83M
                }
592
5.48M
                for(k = 0; k < 8; k++)
593
4.86M
                {
594
4.86M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
595
4.86M
                                    + g_ai2_ihevc_trans_32[6][k]
596
4.86M
                                                    * pi2_tmp[6 * trans_size];
597
4.86M
                }
598
3.07M
                for(k = 0; k < 4; k++)
599
2.46M
                {
600
2.46M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
601
2.46M
                }
602
615k
                eeeo[0] = 0;
603
615k
                eeeo[1] = 0;
604
615k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
605
615k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
606
607
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
608
615k
                eee[0] = eeee[0] + eeeo[0];
609
615k
                eee[3] = eeee[0] - eeeo[0];
610
615k
                eee[1] = eeee[1] + eeeo[1];
611
615k
                eee[2] = eeee[1] - eeeo[1];
612
3.06M
                for(k = 0; k < 4; k++)
613
2.45M
                {
614
2.45M
                    ee[k] = eee[k] + eeo[k];
615
2.45M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
616
2.45M
                }
617
5.50M
                for(k = 0; k < 8; k++)
618
4.89M
                {
619
4.89M
                    e[k] = ee[k] + eo[k];
620
4.89M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
621
4.89M
                }
622
10.1M
                for(k = 0; k < 16; k++)
623
9.50M
                {
624
9.50M
                    WORD32 itrans_out;
625
9.50M
                    itrans_out =
626
9.50M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
627
9.50M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
628
9.50M
                    itrans_out =
629
9.50M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
630
9.50M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
631
9.50M
                }
632
615k
                pi2_tmp++;
633
615k
                pu1_pred += pred_strd;
634
615k
                pu1_dst += dst_strd;
635
615k
            }
636
19.8k
        }
637
11.9k
        else /* All rows of output of 1st stage are non-zero */
638
11.9k
        {
639
392k
            for(j = 0; j < trans_size; j++)
640
380k
            {
641
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
642
6.45M
                for(k = 0; k < 16; k++)
643
6.07M
                {
644
6.07M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
645
6.07M
                                    + g_ai2_ihevc_trans_32[3][k]
646
6.07M
                                                    * pi2_tmp[3 * trans_size]
647
6.07M
                                    + g_ai2_ihevc_trans_32[5][k]
648
6.07M
                                                    * pi2_tmp[5 * trans_size]
649
6.07M
                                    + g_ai2_ihevc_trans_32[7][k]
650
6.07M
                                                    * pi2_tmp[7 * trans_size]
651
6.07M
                                    + g_ai2_ihevc_trans_32[9][k]
652
6.07M
                                                    * pi2_tmp[9 * trans_size]
653
6.07M
                                    + g_ai2_ihevc_trans_32[11][k]
654
6.07M
                                                    * pi2_tmp[11 * trans_size]
655
6.07M
                                    + g_ai2_ihevc_trans_32[13][k]
656
6.07M
                                                    * pi2_tmp[13 * trans_size]
657
6.07M
                                    + g_ai2_ihevc_trans_32[15][k]
658
6.07M
                                                    * pi2_tmp[15 * trans_size]
659
6.07M
                                    + g_ai2_ihevc_trans_32[17][k]
660
6.07M
                                                    * pi2_tmp[17 * trans_size]
661
6.07M
                                    + g_ai2_ihevc_trans_32[19][k]
662
6.07M
                                                    * pi2_tmp[19 * trans_size]
663
6.07M
                                    + g_ai2_ihevc_trans_32[21][k]
664
6.07M
                                                    * pi2_tmp[21 * trans_size]
665
6.07M
                                    + g_ai2_ihevc_trans_32[23][k]
666
6.07M
                                                    * pi2_tmp[23 * trans_size]
667
6.07M
                                    + g_ai2_ihevc_trans_32[25][k]
668
6.07M
                                                    * pi2_tmp[25 * trans_size]
669
6.07M
                                    + g_ai2_ihevc_trans_32[27][k]
670
6.07M
                                                    * pi2_tmp[27 * trans_size]
671
6.07M
                                    + g_ai2_ihevc_trans_32[29][k]
672
6.07M
                                                    * pi2_tmp[29 * trans_size]
673
6.07M
                                    + g_ai2_ihevc_trans_32[31][k]
674
6.07M
                                                    * pi2_tmp[31 * trans_size];
675
6.07M
                }
676
3.43M
                for(k = 0; k < 8; k++)
677
3.05M
                {
678
3.05M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
679
3.05M
                                    + g_ai2_ihevc_trans_32[6][k]
680
3.05M
                                                    * pi2_tmp[6 * trans_size]
681
3.05M
                                    + g_ai2_ihevc_trans_32[10][k]
682
3.05M
                                                    * pi2_tmp[10 * trans_size]
683
3.05M
                                    + g_ai2_ihevc_trans_32[14][k]
684
3.05M
                                                    * pi2_tmp[14 * trans_size]
685
3.05M
                                    + g_ai2_ihevc_trans_32[18][k]
686
3.05M
                                                    * pi2_tmp[18 * trans_size]
687
3.05M
                                    + g_ai2_ihevc_trans_32[22][k]
688
3.05M
                                                    * pi2_tmp[22 * trans_size]
689
3.05M
                                    + g_ai2_ihevc_trans_32[26][k]
690
3.05M
                                                    * pi2_tmp[26 * trans_size]
691
3.05M
                                    + g_ai2_ihevc_trans_32[30][k]
692
3.05M
                                                    * pi2_tmp[30 * trans_size];
693
3.05M
                }
694
1.90M
                for(k = 0; k < 4; k++)
695
1.52M
                {
696
1.52M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
697
1.52M
                                    + g_ai2_ihevc_trans_32[12][k]
698
1.52M
                                                    * pi2_tmp[12 * trans_size]
699
1.52M
                                    + g_ai2_ihevc_trans_32[20][k]
700
1.52M
                                                    * pi2_tmp[20 * trans_size]
701
1.52M
                                    + g_ai2_ihevc_trans_32[28][k]
702
1.52M
                                                    * pi2_tmp[28 * trans_size];
703
1.52M
                }
704
380k
                eeeo[0] =
705
380k
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
706
380k
                                                + g_ai2_ihevc_trans_32[24][0]
707
380k
                                                                * pi2_tmp[24
708
380k
                                                                                * trans_size];
709
380k
                eeeo[1] =
710
380k
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
711
380k
                                                + g_ai2_ihevc_trans_32[24][1]
712
380k
                                                                * pi2_tmp[24
713
380k
                                                                                * trans_size];
714
380k
                eeee[0] =
715
380k
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
716
380k
                                                + g_ai2_ihevc_trans_32[16][0]
717
380k
                                                                * pi2_tmp[16
718
380k
                                                                                * trans_size];
719
380k
                eeee[1] =
720
380k
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
721
380k
                                                + g_ai2_ihevc_trans_32[16][1]
722
380k
                                                                * pi2_tmp[16
723
380k
                                                                                * trans_size];
724
725
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
726
380k
                eee[0] = eeee[0] + eeeo[0];
727
380k
                eee[3] = eeee[0] - eeeo[0];
728
380k
                eee[1] = eeee[1] + eeeo[1];
729
380k
                eee[2] = eeee[1] - eeeo[1];
730
1.90M
                for(k = 0; k < 4; k++)
731
1.52M
                {
732
1.52M
                    ee[k] = eee[k] + eeo[k];
733
1.52M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
734
1.52M
                }
735
3.43M
                for(k = 0; k < 8; k++)
736
3.05M
                {
737
3.05M
                    e[k] = ee[k] + eo[k];
738
3.05M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
739
3.05M
                }
740
6.46M
                for(k = 0; k < 16; k++)
741
6.08M
                {
742
6.08M
                    WORD32 itrans_out;
743
6.08M
                    itrans_out =
744
6.08M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
745
6.08M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
746
6.08M
                    itrans_out =
747
6.08M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
748
6.08M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
749
6.08M
                }
750
380k
                pi2_tmp++;
751
380k
                pu1_pred += pred_strd;
752
380k
                pu1_dst += dst_strd;
753
380k
            }
754
11.9k
        }
755
        /************************************************************************************************/
756
        /************************************END - IT_RECON_32x32****************************************/
757
        /************************************************************************************************/
758
50.9k
    }
759
165k
    else  /* All rows of input are non-zero */
760
165k
    {
761
        /************************************************************************************************/
762
        /**********************************START - IT_RECON_32x32****************************************/
763
        /************************************************************************************************/
764
        /* Inverse Transform 1st stage */
765
165k
        shift = IT_SHIFT_STAGE_1;
766
165k
        add = 1 << (shift - 1);
767
768
4.43M
        for(j = 0; j < row_limit_2nd_stage; j++)
769
4.26M
        {
770
            /* Checking for Zero Cols */
771
4.26M
            if((zero_cols & 1) == 1)
772
491k
            {
773
491k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
774
491k
            }
775
3.77M
            else
776
3.77M
            {
777
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
778
64.2M
                for(k = 0; k < 16; k++)
779
60.4M
                {
780
60.4M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
781
60.4M
                                    + g_ai2_ihevc_trans_32[3][k]
782
60.4M
                                                    * pi2_src[3 * src_strd]
783
60.4M
                                    + g_ai2_ihevc_trans_32[5][k]
784
60.4M
                                                    * pi2_src[5 * src_strd]
785
60.4M
                                    + g_ai2_ihevc_trans_32[7][k]
786
60.4M
                                                    * pi2_src[7 * src_strd]
787
60.4M
                                    + g_ai2_ihevc_trans_32[9][k]
788
60.4M
                                                    * pi2_src[9 * src_strd]
789
60.4M
                                    + g_ai2_ihevc_trans_32[11][k]
790
60.4M
                                                    * pi2_src[11 * src_strd]
791
60.4M
                                    + g_ai2_ihevc_trans_32[13][k]
792
60.4M
                                                    * pi2_src[13 * src_strd]
793
60.4M
                                    + g_ai2_ihevc_trans_32[15][k]
794
60.4M
                                                    * pi2_src[15 * src_strd]
795
60.4M
                                    + g_ai2_ihevc_trans_32[17][k]
796
60.4M
                                                    * pi2_src[17 * src_strd]
797
60.4M
                                    + g_ai2_ihevc_trans_32[19][k]
798
60.4M
                                                    * pi2_src[19 * src_strd]
799
60.4M
                                    + g_ai2_ihevc_trans_32[21][k]
800
60.4M
                                                    * pi2_src[21 * src_strd]
801
60.4M
                                    + g_ai2_ihevc_trans_32[23][k]
802
60.4M
                                                    * pi2_src[23 * src_strd]
803
60.4M
                                    + g_ai2_ihevc_trans_32[25][k]
804
60.4M
                                                    * pi2_src[25 * src_strd]
805
60.4M
                                    + g_ai2_ihevc_trans_32[27][k]
806
60.4M
                                                    * pi2_src[27 * src_strd]
807
60.4M
                                    + g_ai2_ihevc_trans_32[29][k]
808
60.4M
                                                    * pi2_src[29 * src_strd]
809
60.4M
                                    + g_ai2_ihevc_trans_32[31][k]
810
60.4M
                                                    * pi2_src[31 * src_strd];
811
60.4M
                }
812
34.0M
                for(k = 0; k < 8; k++)
813
30.2M
                {
814
30.2M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd]
815
30.2M
                                    + g_ai2_ihevc_trans_32[6][k]
816
30.2M
                                                    * pi2_src[6 * src_strd]
817
30.2M
                                    + g_ai2_ihevc_trans_32[10][k]
818
30.2M
                                                    * pi2_src[10 * src_strd]
819
30.2M
                                    + g_ai2_ihevc_trans_32[14][k]
820
30.2M
                                                    * pi2_src[14 * src_strd]
821
30.2M
                                    + g_ai2_ihevc_trans_32[18][k]
822
30.2M
                                                    * pi2_src[18 * src_strd]
823
30.2M
                                    + g_ai2_ihevc_trans_32[22][k]
824
30.2M
                                                    * pi2_src[22 * src_strd]
825
30.2M
                                    + g_ai2_ihevc_trans_32[26][k]
826
30.2M
                                                    * pi2_src[26 * src_strd]
827
30.2M
                                    + g_ai2_ihevc_trans_32[30][k]
828
30.2M
                                                    * pi2_src[30 * src_strd];
829
30.2M
                }
830
18.8M
                for(k = 0; k < 4; k++)
831
15.1M
                {
832
15.1M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd]
833
15.1M
                                    + g_ai2_ihevc_trans_32[12][k]
834
15.1M
                                                    * pi2_src[12 * src_strd]
835
15.1M
                                    + g_ai2_ihevc_trans_32[20][k]
836
15.1M
                                                    * pi2_src[20 * src_strd]
837
15.1M
                                    + g_ai2_ihevc_trans_32[28][k]
838
15.1M
                                                    * pi2_src[28 * src_strd];
839
15.1M
                }
840
3.77M
                eeeo[0] = g_ai2_ihevc_trans_32[8][0] * pi2_src[8 * src_strd]
841
3.77M
                                + g_ai2_ihevc_trans_32[24][0]
842
3.77M
                                                * pi2_src[24 * src_strd];
843
3.77M
                eeeo[1] = g_ai2_ihevc_trans_32[8][1] * pi2_src[8 * src_strd]
844
3.77M
                                + g_ai2_ihevc_trans_32[24][1]
845
3.77M
                                                * pi2_src[24 * src_strd];
846
3.77M
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0]
847
3.77M
                                + g_ai2_ihevc_trans_32[16][0]
848
3.77M
                                                * pi2_src[16 * src_strd];
849
3.77M
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0]
850
3.77M
                                + g_ai2_ihevc_trans_32[16][1]
851
3.77M
                                                * pi2_src[16 * src_strd];
852
853
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
854
3.77M
                eee[0] = eeee[0] + eeeo[0];
855
3.77M
                eee[3] = eeee[0] - eeeo[0];
856
3.77M
                eee[1] = eeee[1] + eeeo[1];
857
3.77M
                eee[2] = eeee[1] - eeeo[1];
858
18.8M
                for(k = 0; k < 4; k++)
859
15.1M
                {
860
15.1M
                    ee[k] = eee[k] + eeo[k];
861
15.1M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
862
15.1M
                }
863
34.0M
                for(k = 0; k < 8; k++)
864
30.2M
                {
865
30.2M
                    e[k] = ee[k] + eo[k];
866
30.2M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
867
30.2M
                }
868
64.2M
                for(k = 0; k < 16; k++)
869
60.4M
                {
870
60.4M
                    pi2_tmp[k] =
871
60.4M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
872
60.4M
                    pi2_tmp[k + 16] =
873
60.4M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
874
60.4M
                }
875
3.77M
            }
876
4.26M
            pi2_src++;
877
4.26M
            pi2_tmp += trans_size;
878
4.26M
            zero_cols = zero_cols >> 1;
879
4.26M
        }
880
881
165k
        pi2_tmp = pi2_tmp_orig;
882
883
        /* Inverse Transform 2nd stage */
884
165k
        shift = IT_SHIFT_STAGE_2;
885
165k
        add = 1 << (shift - 1);
886
165k
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
887
25.0k
        {
888
813k
            for(j = 0; j < trans_size; j++)
889
788k
            {
890
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
891
13.3M
                for(k = 0; k < 16; k++)
892
12.5M
                {
893
12.5M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
894
12.5M
                                    + g_ai2_ihevc_trans_32[3][k]
895
12.5M
                                                    * pi2_tmp[3 * trans_size];
896
12.5M
                }
897
7.09M
                for(k = 0; k < 8; k++)
898
6.31M
                {
899
6.31M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
900
6.31M
                }
901
//                for(k = 0; k < 4; k++)
902
788k
                {
903
788k
                    eeo[0] = 0;
904
788k
                    eeo[1] = 0;
905
788k
                    eeo[2] = 0;
906
788k
                    eeo[3] = 0;
907
788k
                }
908
788k
                eeeo[0] = 0;
909
788k
                eeeo[1] = 0;
910
788k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
911
788k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
912
913
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
914
788k
                eee[0] = eeee[0] + eeeo[0];
915
788k
                eee[3] = eeee[0] - eeeo[0];
916
788k
                eee[1] = eeee[1] + eeeo[1];
917
788k
                eee[2] = eeee[1] - eeeo[1];
918
3.94M
                for(k = 0; k < 4; k++)
919
3.15M
                {
920
3.15M
                    ee[k] = eee[k] + eeo[k];
921
3.15M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
922
3.15M
                }
923
7.09M
                for(k = 0; k < 8; k++)
924
6.30M
                {
925
6.30M
                    e[k] = ee[k] + eo[k];
926
6.30M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
927
6.30M
                }
928
13.2M
                for(k = 0; k < 16; k++)
929
12.4M
                {
930
12.4M
                    WORD32 itrans_out;
931
12.4M
                    itrans_out =
932
12.4M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
933
12.4M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
934
12.4M
                    itrans_out =
935
12.4M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
936
12.4M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
937
12.4M
                }
938
788k
                pi2_tmp++;
939
788k
                pu1_pred += pred_strd;
940
788k
                pu1_dst += dst_strd;
941
788k
            }
942
25.0k
        }
943
140k
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
944
13.2k
        {
945
423k
            for(j = 0; j < trans_size; j++)
946
410k
            {
947
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
948
6.91M
                for(k = 0; k < 16; k++)
949
6.50M
                {
950
6.50M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
951
6.50M
                                    + g_ai2_ihevc_trans_32[3][k]
952
6.50M
                                                    * pi2_tmp[3 * trans_size]
953
6.50M
                                    + g_ai2_ihevc_trans_32[5][k]
954
6.50M
                                                    * pi2_tmp[5 * trans_size]
955
6.50M
                                    + g_ai2_ihevc_trans_32[7][k]
956
6.50M
                                                    * pi2_tmp[7 * trans_size];
957
6.50M
                }
958
3.71M
                for(k = 0; k < 8; k++)
959
3.30M
                {
960
3.30M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
961
3.30M
                                    + g_ai2_ihevc_trans_32[6][k]
962
3.30M
                                                    * pi2_tmp[6 * trans_size];
963
3.30M
                }
964
2.07M
                for(k = 0; k < 4; k++)
965
1.66M
                {
966
1.66M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
967
1.66M
                }
968
410k
                eeeo[0] = 0;
969
410k
                eeeo[1] = 0;
970
410k
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
971
410k
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
972
973
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
974
410k
                eee[0] = eeee[0] + eeeo[0];
975
410k
                eee[3] = eeee[0] - eeeo[0];
976
410k
                eee[1] = eeee[1] + eeeo[1];
977
410k
                eee[2] = eeee[1] - eeeo[1];
978
2.07M
                for(k = 0; k < 4; k++)
979
1.66M
                {
980
1.66M
                    ee[k] = eee[k] + eeo[k];
981
1.66M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
982
1.66M
                }
983
3.71M
                for(k = 0; k < 8; k++)
984
3.30M
                {
985
3.30M
                    e[k] = ee[k] + eo[k];
986
3.30M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
987
3.30M
                }
988
6.85M
                for(k = 0; k < 16; k++)
989
6.44M
                {
990
6.44M
                    WORD32 itrans_out;
991
6.44M
                    itrans_out =
992
6.44M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
993
6.44M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
994
6.44M
                    itrans_out =
995
6.44M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
996
6.44M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
997
6.44M
                }
998
410k
                pi2_tmp++;
999
410k
                pu1_pred += pred_strd;
1000
410k
                pu1_dst += dst_strd;
1001
410k
            }
1002
13.2k
        }
1003
126k
        else /* All rows of output of 1st stage are non-zero */
1004
126k
        {
1005
4.17M
            for(j = 0; j < trans_size; j++)
1006
4.05M
            {
1007
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1008
68.8M
                for(k = 0; k < 16; k++)
1009
64.7M
                {
1010
64.7M
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1011
64.7M
                                    + g_ai2_ihevc_trans_32[3][k]
1012
64.7M
                                                    * pi2_tmp[3 * trans_size]
1013
64.7M
                                    + g_ai2_ihevc_trans_32[5][k]
1014
64.7M
                                                    * pi2_tmp[5 * trans_size]
1015
64.7M
                                    + g_ai2_ihevc_trans_32[7][k]
1016
64.7M
                                                    * pi2_tmp[7 * trans_size]
1017
64.7M
                                    + g_ai2_ihevc_trans_32[9][k]
1018
64.7M
                                                    * pi2_tmp[9 * trans_size]
1019
64.7M
                                    + g_ai2_ihevc_trans_32[11][k]
1020
64.7M
                                                    * pi2_tmp[11 * trans_size]
1021
64.7M
                                    + g_ai2_ihevc_trans_32[13][k]
1022
64.7M
                                                    * pi2_tmp[13 * trans_size]
1023
64.7M
                                    + g_ai2_ihevc_trans_32[15][k]
1024
64.7M
                                                    * pi2_tmp[15 * trans_size]
1025
64.7M
                                    + g_ai2_ihevc_trans_32[17][k]
1026
64.7M
                                                    * pi2_tmp[17 * trans_size]
1027
64.7M
                                    + g_ai2_ihevc_trans_32[19][k]
1028
64.7M
                                                    * pi2_tmp[19 * trans_size]
1029
64.7M
                                    + g_ai2_ihevc_trans_32[21][k]
1030
64.7M
                                                    * pi2_tmp[21 * trans_size]
1031
64.7M
                                    + g_ai2_ihevc_trans_32[23][k]
1032
64.7M
                                                    * pi2_tmp[23 * trans_size]
1033
64.7M
                                    + g_ai2_ihevc_trans_32[25][k]
1034
64.7M
                                                    * pi2_tmp[25 * trans_size]
1035
64.7M
                                    + g_ai2_ihevc_trans_32[27][k]
1036
64.7M
                                                    * pi2_tmp[27 * trans_size]
1037
64.7M
                                    + g_ai2_ihevc_trans_32[29][k]
1038
64.7M
                                                    * pi2_tmp[29 * trans_size]
1039
64.7M
                                    + g_ai2_ihevc_trans_32[31][k]
1040
64.7M
                                                    * pi2_tmp[31 * trans_size];
1041
64.7M
                }
1042
36.4M
                for(k = 0; k < 8; k++)
1043
32.4M
                {
1044
32.4M
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
1045
32.4M
                                    + g_ai2_ihevc_trans_32[6][k]
1046
32.4M
                                                    * pi2_tmp[6 * trans_size]
1047
32.4M
                                    + g_ai2_ihevc_trans_32[10][k]
1048
32.4M
                                                    * pi2_tmp[10 * trans_size]
1049
32.4M
                                    + g_ai2_ihevc_trans_32[14][k]
1050
32.4M
                                                    * pi2_tmp[14 * trans_size]
1051
32.4M
                                    + g_ai2_ihevc_trans_32[18][k]
1052
32.4M
                                                    * pi2_tmp[18 * trans_size]
1053
32.4M
                                    + g_ai2_ihevc_trans_32[22][k]
1054
32.4M
                                                    * pi2_tmp[22 * trans_size]
1055
32.4M
                                    + g_ai2_ihevc_trans_32[26][k]
1056
32.4M
                                                    * pi2_tmp[26 * trans_size]
1057
32.4M
                                    + g_ai2_ihevc_trans_32[30][k]
1058
32.4M
                                                    * pi2_tmp[30 * trans_size];
1059
32.4M
                }
1060
20.2M
                for(k = 0; k < 4; k++)
1061
16.2M
                {
1062
16.2M
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
1063
16.2M
                                    + g_ai2_ihevc_trans_32[12][k]
1064
16.2M
                                                    * pi2_tmp[12 * trans_size]
1065
16.2M
                                    + g_ai2_ihevc_trans_32[20][k]
1066
16.2M
                                                    * pi2_tmp[20 * trans_size]
1067
16.2M
                                    + g_ai2_ihevc_trans_32[28][k]
1068
16.2M
                                                    * pi2_tmp[28 * trans_size];
1069
16.2M
                }
1070
4.05M
                eeeo[0] =
1071
4.05M
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
1072
4.05M
                                                + g_ai2_ihevc_trans_32[24][0]
1073
4.05M
                                                                * pi2_tmp[24
1074
4.05M
                                                                                * trans_size];
1075
4.05M
                eeeo[1] =
1076
4.05M
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
1077
4.05M
                                                + g_ai2_ihevc_trans_32[24][1]
1078
4.05M
                                                                * pi2_tmp[24
1079
4.05M
                                                                                * trans_size];
1080
4.05M
                eeee[0] =
1081
4.05M
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
1082
4.05M
                                                + g_ai2_ihevc_trans_32[16][0]
1083
4.05M
                                                                * pi2_tmp[16
1084
4.05M
                                                                                * trans_size];
1085
4.05M
                eeee[1] =
1086
4.05M
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
1087
4.05M
                                                + g_ai2_ihevc_trans_32[16][1]
1088
4.05M
                                                                * pi2_tmp[16
1089
4.05M
                                                                                * trans_size];
1090
1091
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1092
4.05M
                eee[0] = eeee[0] + eeeo[0];
1093
4.05M
                eee[3] = eeee[0] - eeeo[0];
1094
4.05M
                eee[1] = eeee[1] + eeeo[1];
1095
4.05M
                eee[2] = eeee[1] - eeeo[1];
1096
20.2M
                for(k = 0; k < 4; k++)
1097
16.2M
                {
1098
16.2M
                    ee[k] = eee[k] + eeo[k];
1099
16.2M
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1100
16.2M
                }
1101
36.5M
                for(k = 0; k < 8; k++)
1102
32.4M
                {
1103
32.4M
                    e[k] = ee[k] + eo[k];
1104
32.4M
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1105
32.4M
                }
1106
68.8M
                for(k = 0; k < 16; k++)
1107
64.7M
                {
1108
64.7M
                    WORD32 itrans_out;
1109
64.7M
                    itrans_out =
1110
64.7M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1111
64.7M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
1112
64.7M
                    itrans_out =
1113
64.7M
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1114
64.7M
                    pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16]));
1115
64.7M
                }
1116
4.05M
                pi2_tmp++;
1117
4.05M
                pu1_pred += pred_strd;
1118
4.05M
                pu1_dst += dst_strd;
1119
4.05M
            }
1120
126k
        }
1121
        /************************************************************************************************/
1122
        /************************************END - IT_RECON_32x32****************************************/
1123
        /************************************************************************************************/
1124
165k
    }
1125
299k
}
1126