Coverage Report

Created: 2026-07-15 06:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/common/ihevc_chroma_itrans_recon_16x16.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_chroma_itrans_recon_16x16.c
22
 *
23
 * @brief
24
 *  Contains function definitions for 16x16 inverse transform  and reconstruction
25
 * of chroma interleaved data.
26
 *
27
 * @author
28
 *  100470
29
 *
30
 * @par List of Functions:
31
 *  - ihevc_chroma_itrans_recon_16x16()
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_func_selector.h"
48
#include "ihevc_trans_macros.h"
49
50
/* All the functions work one component(U or V) of interleaved data depending upon pointers passed to it */
51
/* Data visualization */
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
/* U V U V U V U V */
56
/* If the pointer points to first byte of above stream (U) , functions will operate on U component */
57
/* If the pointer points to second byte of above stream (V) , functions will operate on V component */
58
59
60
/**
61
 *******************************************************************************
62
 *
63
 * @brief
64
 *  This function performs Inverse transform  and reconstruction for 16x16
65
 * input block
66
 *
67
 * @par Description:
68
 *  Performs inverse transform and adds the prediction  data and clips output
69
 * to 8 bit
70
 *
71
 * @param[in] pi2_src
72
 *  Input 16x16 coefficients
73
 *
74
 * @param[in] pi2_tmp
75
 *  Temporary 16x16 buffer for storing inverse transform
76
 *  1st stage output
77
 *
78
 * @param[in] pu1_pred
79
 *  Prediction 16x16 block
80
 *
81
 * @param[out] pu1_dst
82
 *  Output 16x16 block
83
 *
84
 * @param[in] src_strd
85
 *  Input stride
86
 *
87
 * @param[in] pred_strd
88
 *  Prediction stride
89
 *
90
 * @param[in] dst_strd
91
 *  Output Stride
92
 *
93
 * @param[in] shift
94
 *  Output shift
95
 *
96
 * @param[in] zero_cols
97
 *  Zero columns in pi2_src
98
 *
99
 * @returns  Void
100
 *
101
 * @remarks
102
 *  None
103
 *
104
 *******************************************************************************
105
 */
106
107
108
void ihevc_chroma_itrans_recon_16x16(WORD16 *pi2_src,
109
                                     WORD16 *pi2_tmp,
110
                                     UWORD8 *pu1_pred,
111
                                     UWORD8 *pu1_dst,
112
                                     WORD32 src_strd,
113
                                     WORD32 pred_strd,
114
                                     WORD32 dst_strd,
115
                                     WORD32 zero_cols,
116
                                     WORD32 zero_rows)
117
19.4k
{
118
19.4k
    WORD32 j, k;
119
19.4k
    WORD32 e[8], o[8];
120
19.4k
    WORD32 ee[4], eo[4];
121
19.4k
    WORD32 eee[2], eeo[2];
122
19.4k
    WORD32 add;
123
19.4k
    WORD32 shift;
124
19.4k
    WORD16 *pi2_tmp_orig;
125
19.4k
    WORD32 trans_size;
126
19.4k
    WORD32 row_limit_2nd_stage, zero_rows_2nd_stage = zero_cols;
127
128
19.4k
    trans_size = TRANS_SIZE_16;
129
19.4k
    pi2_tmp_orig = pi2_tmp;
130
131
19.4k
    if((zero_cols & 0xFFF0) == 0xFFF0)
132
1.78k
        row_limit_2nd_stage = 4;
133
17.6k
    else if((zero_cols & 0xFF00) == 0xFF00)
134
363
        row_limit_2nd_stage = 8;
135
17.3k
    else
136
17.3k
        row_limit_2nd_stage = TRANS_SIZE_16;
137
138
19.4k
    if((zero_rows & 0xFFF0) == 0xFFF0) /* First 4 rows of input are non-zero */
139
6.95k
    {
140
        /************************************************************************************************/
141
        /**********************************START - IT_RECON_16x16****************************************/
142
        /************************************************************************************************/
143
144
        /* Inverse Transform 1st stage */
145
6.95k
        shift = IT_SHIFT_STAGE_1;
146
6.95k
        add = 1 << (shift - 1);
147
148
112k
        for(j = 0; j < row_limit_2nd_stage; j++)
149
105k
        {
150
            /* Checking for Zero Cols */
151
105k
            if((zero_cols & 1) == 1)
152
688
            {
153
688
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
154
688
            }
155
104k
            else
156
104k
            {
157
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
158
943k
                for(k = 0; k < 8; k++)
159
838k
                {
160
838k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
161
838k
                                    + g_ai2_ihevc_trans_16[3][k]
162
838k
                                                    * pi2_src[3 * src_strd];
163
838k
                }
164
524k
                for(k = 0; k < 4; k++)
165
419k
                {
166
419k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd];
167
419k
                }
168
104k
                eeo[0] = 0;
169
104k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
170
104k
                eeo[1] = 0;
171
104k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0];
172
173
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
174
314k
                for(k = 0; k < 2; k++)
175
209k
                {
176
209k
                    ee[k] = eee[k] + eeo[k];
177
209k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
178
209k
                }
179
524k
                for(k = 0; k < 4; k++)
180
419k
                {
181
419k
                    e[k] = ee[k] + eo[k];
182
419k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
183
419k
                }
184
943k
                for(k = 0; k < 8; k++)
185
838k
                {
186
838k
                    pi2_tmp[k] =
187
838k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
188
838k
                    pi2_tmp[k + 8] =
189
838k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
190
838k
                }
191
104k
            }
192
105k
            pi2_src++;
193
105k
            pi2_tmp += trans_size;
194
105k
            zero_cols = zero_cols >> 1;
195
105k
        }
196
197
6.95k
        pi2_tmp = pi2_tmp_orig;
198
199
        /* Inverse Transform 2nd stage */
200
6.95k
        shift = IT_SHIFT_STAGE_2;
201
6.95k
        add = 1 << (shift - 1);
202
6.95k
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
203
438
        {
204
7.44k
            for(j = 0; j < trans_size; j++)
205
7.00k
            {
206
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
207
63.0k
                for(k = 0; k < 8; k++)
208
56.0k
                {
209
56.0k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
210
56.0k
                                    + g_ai2_ihevc_trans_16[3][k]
211
56.0k
                                                    * pi2_tmp[3 * trans_size];
212
56.0k
                }
213
35.0k
                for(k = 0; k < 4; k++)
214
28.0k
                {
215
28.0k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
216
28.0k
                }
217
7.00k
                eeo[0] = 0;
218
7.00k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
219
7.00k
                eeo[1] = 0;
220
7.00k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
221
222
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
223
21.0k
                for(k = 0; k < 2; k++)
224
14.0k
                {
225
14.0k
                    ee[k] = eee[k] + eeo[k];
226
14.0k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
227
14.0k
                }
228
35.0k
                for(k = 0; k < 4; k++)
229
28.0k
                {
230
28.0k
                    e[k] = ee[k] + eo[k];
231
28.0k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
232
28.0k
                }
233
63.0k
                for(k = 0; k < 8; k++)
234
56.0k
                {
235
56.0k
                    WORD32 itrans_out;
236
56.0k
                    itrans_out =
237
56.0k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
238
56.0k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
239
56.0k
                    itrans_out =
240
56.0k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
241
56.0k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
242
56.0k
                }
243
7.00k
                pi2_tmp++;
244
7.00k
                pu1_pred += pred_strd;
245
7.00k
                pu1_dst += dst_strd;
246
7.00k
            }
247
438
        }
248
6.51k
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 8 rows of output of 1st stage are non-zero */
249
61
        {
250
1.03k
            for(j = 0; j < trans_size; j++)
251
976
            {
252
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
253
8.78k
                for(k = 0; k < 8; k++)
254
7.80k
                {
255
7.80k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
256
7.80k
                                    + g_ai2_ihevc_trans_16[3][k]
257
7.80k
                                                    * pi2_tmp[3 * trans_size]
258
7.80k
                                    + g_ai2_ihevc_trans_16[5][k]
259
7.80k
                                                    * pi2_tmp[5 * trans_size]
260
7.80k
                                    + g_ai2_ihevc_trans_16[7][k]
261
7.80k
                                                    * pi2_tmp[7 * trans_size];
262
7.80k
                }
263
4.88k
                for(k = 0; k < 4; k++)
264
3.90k
                {
265
3.90k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
266
3.90k
                                    + g_ai2_ihevc_trans_16[6][k]
267
3.90k
                                                    * pi2_tmp[6 * trans_size];
268
3.90k
                }
269
976
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
270
976
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
271
976
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
272
976
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
273
274
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
275
2.92k
                for(k = 0; k < 2; k++)
276
1.95k
                {
277
1.95k
                    ee[k] = eee[k] + eeo[k];
278
1.95k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
279
1.95k
                }
280
4.88k
                for(k = 0; k < 4; k++)
281
3.90k
                {
282
3.90k
                    e[k] = ee[k] + eo[k];
283
3.90k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
284
3.90k
                }
285
8.78k
                for(k = 0; k < 8; k++)
286
7.80k
                {
287
7.80k
                    WORD32 itrans_out;
288
7.80k
                    itrans_out =
289
7.80k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
290
7.80k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
291
7.80k
                    itrans_out =
292
7.80k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
293
7.80k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
294
7.80k
                }
295
976
                pi2_tmp++;
296
976
                pu1_pred += pred_strd;
297
976
                pu1_dst += dst_strd;
298
976
            }
299
61
        }
300
6.45k
        else /* All rows of output of 1st stage are non-zero */
301
6.45k
        {
302
109k
            for(j = 0; j < trans_size; j++)
303
103k
            {
304
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
305
929k
                for(k = 0; k < 8; k++)
306
826k
                {
307
826k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
308
826k
                                    + g_ai2_ihevc_trans_16[3][k]
309
826k
                                                    * pi2_tmp[3 * trans_size]
310
826k
                                    + g_ai2_ihevc_trans_16[5][k]
311
826k
                                                    * pi2_tmp[5 * trans_size]
312
826k
                                    + g_ai2_ihevc_trans_16[7][k]
313
826k
                                                    * pi2_tmp[7 * trans_size]
314
826k
                                    + g_ai2_ihevc_trans_16[9][k]
315
826k
                                                    * pi2_tmp[9 * trans_size]
316
826k
                                    + g_ai2_ihevc_trans_16[11][k]
317
826k
                                                    * pi2_tmp[11 * trans_size]
318
826k
                                    + g_ai2_ihevc_trans_16[13][k]
319
826k
                                                    * pi2_tmp[13 * trans_size]
320
826k
                                    + g_ai2_ihevc_trans_16[15][k]
321
826k
                                                    * pi2_tmp[15 * trans_size];
322
826k
                }
323
516k
                for(k = 0; k < 4; k++)
324
413k
                {
325
413k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
326
413k
                                    + g_ai2_ihevc_trans_16[6][k]
327
413k
                                                    * pi2_tmp[6 * trans_size]
328
413k
                                    + g_ai2_ihevc_trans_16[10][k]
329
413k
                                                    * pi2_tmp[10 * trans_size]
330
413k
                                    + g_ai2_ihevc_trans_16[14][k]
331
413k
                                                    * pi2_tmp[14 * trans_size];
332
413k
                }
333
103k
                eeo[0] =
334
103k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
335
103k
                                                + g_ai2_ihevc_trans_16[12][0]
336
103k
                                                                * pi2_tmp[12
337
103k
                                                                                * trans_size];
338
103k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
339
103k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
340
103k
                eeo[1] =
341
103k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
342
103k
                                                + g_ai2_ihevc_trans_16[12][1]
343
103k
                                                                * pi2_tmp[12
344
103k
                                                                                * trans_size];
345
103k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
346
103k
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
347
348
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
349
309k
                for(k = 0; k < 2; k++)
350
206k
                {
351
206k
                    ee[k] = eee[k] + eeo[k];
352
206k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
353
206k
                }
354
516k
                for(k = 0; k < 4; k++)
355
413k
                {
356
413k
                    e[k] = ee[k] + eo[k];
357
413k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
358
413k
                }
359
929k
                for(k = 0; k < 8; k++)
360
826k
                {
361
826k
                    WORD32 itrans_out;
362
826k
                    itrans_out =
363
826k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
364
826k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
365
826k
                    itrans_out =
366
826k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
367
826k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
368
826k
                }
369
103k
                pi2_tmp++;
370
103k
                pu1_pred += pred_strd;
371
103k
                pu1_dst += dst_strd;
372
103k
            }
373
6.45k
        }
374
        /************************************************************************************************/
375
        /************************************END - IT_RECON_16x16****************************************/
376
        /************************************************************************************************/
377
6.95k
    }
378
12.5k
    else if((zero_rows & 0xFF00) == 0xFF00) /* First 8 rows of input are non-zero */
379
204
    {
380
        /************************************************************************************************/
381
        /**********************************START - IT_RECON_16x16****************************************/
382
        /************************************************************************************************/
383
384
        /* Inverse Transform 1st stage */
385
204
        shift = IT_SHIFT_STAGE_1;
386
204
        add = 1 << (shift - 1);
387
388
2.40k
        for(j = 0; j < row_limit_2nd_stage; j++)
389
2.20k
        {
390
            /* Checking for Zero Cols */
391
2.20k
            if((zero_cols & 1) == 1)
392
100
            {
393
100
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
394
100
            }
395
2.10k
            else
396
2.10k
            {
397
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
398
18.9k
                for(k = 0; k < 8; k++)
399
16.8k
                {
400
16.8k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
401
16.8k
                                    + g_ai2_ihevc_trans_16[3][k]
402
16.8k
                                                    * pi2_src[3 * src_strd]
403
16.8k
                                    + g_ai2_ihevc_trans_16[5][k]
404
16.8k
                                                    * pi2_src[5 * src_strd]
405
16.8k
                                    + g_ai2_ihevc_trans_16[7][k]
406
16.8k
                                                    * pi2_src[7 * src_strd];
407
16.8k
                }
408
10.5k
                for(k = 0; k < 4; k++)
409
8.40k
                {
410
8.40k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
411
8.40k
                                    + g_ai2_ihevc_trans_16[6][k]
412
8.40k
                                                    * pi2_src[6 * src_strd];
413
8.40k
                }
414
2.10k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd];
415
2.10k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
416
2.10k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd];
417
2.10k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0];
418
419
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
420
6.30k
                for(k = 0; k < 2; k++)
421
4.20k
                {
422
4.20k
                    ee[k] = eee[k] + eeo[k];
423
4.20k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
424
4.20k
                }
425
10.5k
                for(k = 0; k < 4; k++)
426
8.40k
                {
427
8.40k
                    e[k] = ee[k] + eo[k];
428
8.40k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
429
8.40k
                }
430
18.9k
                for(k = 0; k < 8; k++)
431
16.8k
                {
432
16.8k
                    pi2_tmp[k] =
433
16.8k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
434
16.8k
                    pi2_tmp[k + 8] =
435
16.8k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
436
16.8k
                }
437
2.10k
            }
438
2.20k
            pi2_src++;
439
2.20k
            pi2_tmp += trans_size;
440
2.20k
            zero_cols = zero_cols >> 1;
441
2.20k
        }
442
443
204
        pi2_tmp = pi2_tmp_orig;
444
445
        /* Inverse Transform 2nd stage */
446
204
        shift = IT_SHIFT_STAGE_2;
447
204
        add = 1 << (shift - 1);
448
204
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
449
72
        {
450
1.22k
            for(j = 0; j < trans_size; j++)
451
1.15k
            {
452
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
453
10.3k
                for(k = 0; k < 8; k++)
454
9.21k
                {
455
9.21k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
456
9.21k
                                    + g_ai2_ihevc_trans_16[3][k]
457
9.21k
                                                    * pi2_tmp[3 * trans_size];
458
9.21k
                }
459
5.76k
                for(k = 0; k < 4; k++)
460
4.60k
                {
461
4.60k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
462
4.60k
                }
463
1.15k
                eeo[0] = 0;
464
1.15k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
465
1.15k
                eeo[1] = 0;
466
1.15k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
467
468
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
469
3.45k
                for(k = 0; k < 2; k++)
470
2.30k
                {
471
2.30k
                    ee[k] = eee[k] + eeo[k];
472
2.30k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
473
2.30k
                }
474
5.76k
                for(k = 0; k < 4; k++)
475
4.60k
                {
476
4.60k
                    e[k] = ee[k] + eo[k];
477
4.60k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
478
4.60k
                }
479
10.3k
                for(k = 0; k < 8; k++)
480
9.21k
                {
481
9.21k
                    WORD32 itrans_out;
482
9.21k
                    itrans_out =
483
9.21k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
484
9.21k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
485
9.21k
                    itrans_out =
486
9.21k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
487
9.21k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
488
9.21k
                }
489
1.15k
                pi2_tmp++;
490
1.15k
                pu1_pred += pred_strd;
491
1.15k
                pu1_dst += dst_strd;
492
1.15k
            }
493
72
        }
494
132
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 8 rows of output of 1st stage are non-zero */
495
25
        {
496
425
            for(j = 0; j < trans_size; j++)
497
400
            {
498
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
499
3.60k
                for(k = 0; k < 8; k++)
500
3.20k
                {
501
3.20k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
502
3.20k
                                    + g_ai2_ihevc_trans_16[3][k]
503
3.20k
                                                    * pi2_tmp[3 * trans_size]
504
3.20k
                                    + g_ai2_ihevc_trans_16[5][k]
505
3.20k
                                                    * pi2_tmp[5 * trans_size]
506
3.20k
                                    + g_ai2_ihevc_trans_16[7][k]
507
3.20k
                                                    * pi2_tmp[7 * trans_size];
508
3.20k
                }
509
2.00k
                for(k = 0; k < 4; k++)
510
1.60k
                {
511
1.60k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
512
1.60k
                                    + g_ai2_ihevc_trans_16[6][k]
513
1.60k
                                                    * pi2_tmp[6 * trans_size];
514
1.60k
                }
515
400
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
516
400
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
517
400
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
518
400
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
519
520
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
521
1.20k
                for(k = 0; k < 2; k++)
522
800
                {
523
800
                    ee[k] = eee[k] + eeo[k];
524
800
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
525
800
                }
526
2.00k
                for(k = 0; k < 4; k++)
527
1.60k
                {
528
1.60k
                    e[k] = ee[k] + eo[k];
529
1.60k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
530
1.60k
                }
531
3.60k
                for(k = 0; k < 8; k++)
532
3.20k
                {
533
3.20k
                    WORD32 itrans_out;
534
3.20k
                    itrans_out =
535
3.20k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
536
3.20k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
537
3.20k
                    itrans_out =
538
3.20k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
539
3.20k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
540
3.20k
                }
541
400
                pi2_tmp++;
542
400
                pu1_pred += pred_strd;
543
400
                pu1_dst += dst_strd;
544
400
            }
545
25
        }
546
107
        else /* All rows of output of 1st stage are non-zero */
547
107
        {
548
1.81k
            for(j = 0; j < trans_size; j++)
549
1.71k
            {
550
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
551
15.4k
                for(k = 0; k < 8; k++)
552
13.6k
                {
553
13.6k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
554
13.6k
                                    + g_ai2_ihevc_trans_16[3][k]
555
13.6k
                                                    * pi2_tmp[3 * trans_size]
556
13.6k
                                    + g_ai2_ihevc_trans_16[5][k]
557
13.6k
                                                    * pi2_tmp[5 * trans_size]
558
13.6k
                                    + g_ai2_ihevc_trans_16[7][k]
559
13.6k
                                                    * pi2_tmp[7 * trans_size]
560
13.6k
                                    + g_ai2_ihevc_trans_16[9][k]
561
13.6k
                                                    * pi2_tmp[9 * trans_size]
562
13.6k
                                    + g_ai2_ihevc_trans_16[11][k]
563
13.6k
                                                    * pi2_tmp[11 * trans_size]
564
13.6k
                                    + g_ai2_ihevc_trans_16[13][k]
565
13.6k
                                                    * pi2_tmp[13 * trans_size]
566
13.6k
                                    + g_ai2_ihevc_trans_16[15][k]
567
13.6k
                                                    * pi2_tmp[15 * trans_size];
568
13.6k
                }
569
8.56k
                for(k = 0; k < 4; k++)
570
6.84k
                {
571
6.84k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
572
6.84k
                                    + g_ai2_ihevc_trans_16[6][k]
573
6.84k
                                                    * pi2_tmp[6 * trans_size]
574
6.84k
                                    + g_ai2_ihevc_trans_16[10][k]
575
6.84k
                                                    * pi2_tmp[10 * trans_size]
576
6.84k
                                    + g_ai2_ihevc_trans_16[14][k]
577
6.84k
                                                    * pi2_tmp[14 * trans_size];
578
6.84k
                }
579
1.71k
                eeo[0] =
580
1.71k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
581
1.71k
                                                + g_ai2_ihevc_trans_16[12][0]
582
1.71k
                                                                * pi2_tmp[12
583
1.71k
                                                                                * trans_size];
584
1.71k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
585
1.71k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
586
1.71k
                eeo[1] =
587
1.71k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
588
1.71k
                                                + g_ai2_ihevc_trans_16[12][1]
589
1.71k
                                                                * pi2_tmp[12
590
1.71k
                                                                                * trans_size];
591
1.71k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
592
1.71k
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
593
594
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
595
5.13k
                for(k = 0; k < 2; k++)
596
3.42k
                {
597
3.42k
                    ee[k] = eee[k] + eeo[k];
598
3.42k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
599
3.42k
                }
600
8.56k
                for(k = 0; k < 4; k++)
601
6.84k
                {
602
6.84k
                    e[k] = ee[k] + eo[k];
603
6.84k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
604
6.84k
                }
605
15.4k
                for(k = 0; k < 8; k++)
606
13.6k
                {
607
13.6k
                    WORD32 itrans_out;
608
13.6k
                    itrans_out =
609
13.6k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
610
13.6k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
611
13.6k
                    itrans_out =
612
13.6k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
613
13.6k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
614
13.6k
                }
615
1.71k
                pi2_tmp++;
616
1.71k
                pu1_pred += pred_strd;
617
1.71k
                pu1_dst += dst_strd;
618
1.71k
            }
619
107
        }
620
        /************************************************************************************************/
621
        /************************************END - IT_RECON_16x16****************************************/
622
        /************************************************************************************************/
623
204
    }
624
12.3k
    else /* All rows of input are non-zero */
625
12.3k
    {
626
        /************************************************************************************************/
627
        /**********************************START - IT_RECON_16x16****************************************/
628
        /************************************************************************************************/
629
630
        /* Inverse Transform 1st stage */
631
12.3k
        shift = IT_SHIFT_STAGE_1;
632
12.3k
        add = 1 << (shift - 1);
633
634
191k
        for(j = 0; j < row_limit_2nd_stage; j++)
635
179k
        {
636
            /* Checking for Zero Cols */
637
179k
            if((zero_cols & 1) == 1)
638
10.0k
            {
639
10.0k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
640
10.0k
            }
641
169k
            else
642
169k
            {
643
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
644
1.52M
                for(k = 0; k < 8; k++)
645
1.35M
                {
646
1.35M
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
647
1.35M
                                    + g_ai2_ihevc_trans_16[3][k]
648
1.35M
                                                    * pi2_src[3 * src_strd]
649
1.35M
                                    + g_ai2_ihevc_trans_16[5][k]
650
1.35M
                                                    * pi2_src[5 * src_strd]
651
1.35M
                                    + g_ai2_ihevc_trans_16[7][k]
652
1.35M
                                                    * pi2_src[7 * src_strd]
653
1.35M
                                    + g_ai2_ihevc_trans_16[9][k]
654
1.35M
                                                    * pi2_src[9 * src_strd]
655
1.35M
                                    + g_ai2_ihevc_trans_16[11][k]
656
1.35M
                                                    * pi2_src[11 * src_strd]
657
1.35M
                                    + g_ai2_ihevc_trans_16[13][k]
658
1.35M
                                                    * pi2_src[13 * src_strd]
659
1.35M
                                    + g_ai2_ihevc_trans_16[15][k]
660
1.35M
                                                    * pi2_src[15 * src_strd];
661
1.35M
                }
662
846k
                for(k = 0; k < 4; k++)
663
677k
                {
664
677k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
665
677k
                                    + g_ai2_ihevc_trans_16[6][k]
666
677k
                                                    * pi2_src[6 * src_strd]
667
677k
                                    + g_ai2_ihevc_trans_16[10][k]
668
677k
                                                    * pi2_src[10 * src_strd]
669
677k
                                    + g_ai2_ihevc_trans_16[14][k]
670
677k
                                                    * pi2_src[14 * src_strd];
671
677k
                }
672
169k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd]
673
169k
                                + g_ai2_ihevc_trans_16[12][0]
674
169k
                                                * pi2_src[12 * src_strd];
675
169k
                eee[0] =
676
169k
                                g_ai2_ihevc_trans_16[0][0] * pi2_src[0]
677
169k
                                                + g_ai2_ihevc_trans_16[8][0]
678
169k
                                                                * pi2_src[8
679
169k
                                                                                * src_strd];
680
169k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd]
681
169k
                                + g_ai2_ihevc_trans_16[12][1]
682
169k
                                                * pi2_src[12 * src_strd];
683
169k
                eee[1] =
684
169k
                                g_ai2_ihevc_trans_16[0][1] * pi2_src[0]
685
169k
                                                + g_ai2_ihevc_trans_16[8][1]
686
169k
                                                                * pi2_src[8
687
169k
                                                                                * src_strd];
688
689
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
690
508k
                for(k = 0; k < 2; k++)
691
338k
                {
692
338k
                    ee[k] = eee[k] + eeo[k];
693
338k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
694
338k
                }
695
846k
                for(k = 0; k < 4; k++)
696
677k
                {
697
677k
                    e[k] = ee[k] + eo[k];
698
677k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
699
677k
                }
700
1.52M
                for(k = 0; k < 8; k++)
701
1.35M
                {
702
1.35M
                    pi2_tmp[k] =
703
1.35M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
704
1.35M
                    pi2_tmp[k + 8] =
705
1.35M
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
706
1.35M
                }
707
169k
            }
708
179k
            pi2_src++;
709
179k
            pi2_tmp += trans_size;
710
179k
            zero_cols = zero_cols >> 1;
711
179k
        }
712
713
12.3k
        pi2_tmp = pi2_tmp_orig;
714
715
        /* Inverse Transform 2nd stage */
716
12.3k
        shift = IT_SHIFT_STAGE_2;
717
12.3k
        add = 1 << (shift - 1);
718
12.3k
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
719
1.27k
        {
720
21.7k
            for(j = 0; j < trans_size; j++)
721
20.4k
            {
722
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
723
184k
                for(k = 0; k < 8; k++)
724
163k
                {
725
163k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
726
163k
                                    + g_ai2_ihevc_trans_16[3][k]
727
163k
                                                    * pi2_tmp[3 * trans_size];
728
163k
                }
729
102k
                for(k = 0; k < 4; k++)
730
81.7k
                {
731
81.7k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
732
81.7k
                }
733
20.4k
                eeo[0] = 0;
734
20.4k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
735
20.4k
                eeo[1] = 0;
736
20.4k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
737
738
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
739
61.3k
                for(k = 0; k < 2; k++)
740
40.8k
                {
741
40.8k
                    ee[k] = eee[k] + eeo[k];
742
40.8k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
743
40.8k
                }
744
102k
                for(k = 0; k < 4; k++)
745
81.7k
                {
746
81.7k
                    e[k] = ee[k] + eo[k];
747
81.7k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
748
81.7k
                }
749
184k
                for(k = 0; k < 8; k++)
750
163k
                {
751
163k
                    WORD32 itrans_out;
752
163k
                    itrans_out =
753
163k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
754
163k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
755
163k
                    itrans_out =
756
163k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
757
163k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
758
163k
                }
759
20.4k
                pi2_tmp++;
760
20.4k
                pu1_pred += pred_strd;
761
20.4k
                pu1_dst += dst_strd;
762
20.4k
            }
763
1.27k
        }
764
11.0k
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 8 rows of output of 1st stage are non-zero */
765
277
        {
766
4.70k
            for(j = 0; j < trans_size; j++)
767
4.43k
            {
768
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
769
39.8k
                for(k = 0; k < 8; k++)
770
35.4k
                {
771
35.4k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
772
35.4k
                                    + g_ai2_ihevc_trans_16[3][k]
773
35.4k
                                                    * pi2_tmp[3 * trans_size]
774
35.4k
                                    + g_ai2_ihevc_trans_16[5][k]
775
35.4k
                                                    * pi2_tmp[5 * trans_size]
776
35.4k
                                    + g_ai2_ihevc_trans_16[7][k]
777
35.4k
                                                    * pi2_tmp[7 * trans_size];
778
35.4k
                }
779
22.1k
                for(k = 0; k < 4; k++)
780
17.7k
                {
781
17.7k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
782
17.7k
                                    + g_ai2_ihevc_trans_16[6][k]
783
17.7k
                                                    * pi2_tmp[6 * trans_size];
784
17.7k
                }
785
4.43k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
786
4.43k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
787
4.43k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
788
4.43k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
789
790
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
791
13.2k
                for(k = 0; k < 2; k++)
792
8.86k
                {
793
8.86k
                    ee[k] = eee[k] + eeo[k];
794
8.86k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
795
8.86k
                }
796
22.1k
                for(k = 0; k < 4; k++)
797
17.7k
                {
798
17.7k
                    e[k] = ee[k] + eo[k];
799
17.7k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
800
17.7k
                }
801
39.8k
                for(k = 0; k < 8; k++)
802
35.4k
                {
803
35.4k
                    WORD32 itrans_out;
804
35.4k
                    itrans_out =
805
35.4k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
806
35.4k
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
807
35.4k
                    itrans_out =
808
35.4k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
809
35.4k
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
810
35.4k
                }
811
4.43k
                pi2_tmp++;
812
4.43k
                pu1_pred += pred_strd;
813
4.43k
                pu1_dst += dst_strd;
814
4.43k
            }
815
277
        }
816
10.7k
        else /* All rows of output of 1st stage are non-zero */
817
10.7k
        {
818
182k
            for(j = 0; j < trans_size; j++)
819
172k
            {
820
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
821
1.54M
                for(k = 0; k < 8; k++)
822
1.37M
                {
823
1.37M
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
824
1.37M
                                    + g_ai2_ihevc_trans_16[3][k]
825
1.37M
                                                    * pi2_tmp[3 * trans_size]
826
1.37M
                                    + g_ai2_ihevc_trans_16[5][k]
827
1.37M
                                                    * pi2_tmp[5 * trans_size]
828
1.37M
                                    + g_ai2_ihevc_trans_16[7][k]
829
1.37M
                                                    * pi2_tmp[7 * trans_size]
830
1.37M
                                    + g_ai2_ihevc_trans_16[9][k]
831
1.37M
                                                    * pi2_tmp[9 * trans_size]
832
1.37M
                                    + g_ai2_ihevc_trans_16[11][k]
833
1.37M
                                                    * pi2_tmp[11 * trans_size]
834
1.37M
                                    + g_ai2_ihevc_trans_16[13][k]
835
1.37M
                                                    * pi2_tmp[13 * trans_size]
836
1.37M
                                    + g_ai2_ihevc_trans_16[15][k]
837
1.37M
                                                    * pi2_tmp[15 * trans_size];
838
1.37M
                }
839
860k
                for(k = 0; k < 4; k++)
840
688k
                {
841
688k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
842
688k
                                    + g_ai2_ihevc_trans_16[6][k]
843
688k
                                                    * pi2_tmp[6 * trans_size]
844
688k
                                    + g_ai2_ihevc_trans_16[10][k]
845
688k
                                                    * pi2_tmp[10 * trans_size]
846
688k
                                    + g_ai2_ihevc_trans_16[14][k]
847
688k
                                                    * pi2_tmp[14 * trans_size];
848
688k
                }
849
172k
                eeo[0] =
850
172k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
851
172k
                                                + g_ai2_ihevc_trans_16[12][0]
852
172k
                                                                * pi2_tmp[12
853
172k
                                                                                * trans_size];
854
172k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
855
172k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
856
172k
                eeo[1] =
857
172k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
858
172k
                                                + g_ai2_ihevc_trans_16[12][1]
859
172k
                                                                * pi2_tmp[12
860
172k
                                                                                * trans_size];
861
172k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
862
172k
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
863
864
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
865
516k
                for(k = 0; k < 2; k++)
866
344k
                {
867
344k
                    ee[k] = eee[k] + eeo[k];
868
344k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
869
344k
                }
870
860k
                for(k = 0; k < 4; k++)
871
688k
                {
872
688k
                    e[k] = ee[k] + eo[k];
873
688k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
874
688k
                }
875
1.54M
                for(k = 0; k < 8; k++)
876
1.37M
                {
877
1.37M
                    WORD32 itrans_out;
878
1.37M
                    itrans_out =
879
1.37M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
880
1.37M
                    pu1_dst[k * 2] = CLIP_U8((itrans_out + pu1_pred[k * 2]));
881
1.37M
                    itrans_out =
882
1.37M
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
883
1.37M
                    pu1_dst[(k + 8) * 2] = CLIP_U8((itrans_out + pu1_pred[(k + 8) * 2]));
884
1.37M
                }
885
172k
                pi2_tmp++;
886
172k
                pu1_pred += pred_strd;
887
172k
                pu1_dst += dst_strd;
888
172k
            }
889
10.7k
        }
890
        /************************************************************************************************/
891
        /************************************END - IT_RECON_16x16****************************************/
892
        /************************************************************************************************/
893
12.3k
    }
894
19.4k
}
895