Coverage Report

Created: 2026-09-14 06:39

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