Coverage Report

Created: 2026-10-28 06:26

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