Coverage Report

Created: 2026-08-13 06:16

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
67.2k
{
107
67.2k
    WORD32 j, k;
108
67.2k
    WORD32 e[8], o[8];
109
67.2k
    WORD32 ee[4], eo[4];
110
67.2k
    WORD32 eee[2], eeo[2];
111
67.2k
    WORD32 add;
112
67.2k
    WORD32 shift;
113
67.2k
    WORD16 *pi2_tmp_orig;
114
67.2k
    WORD32 trans_size;
115
67.2k
    WORD32 zero_rows_2nd_stage = zero_cols;
116
67.2k
    WORD32 row_limit_2nd_stage;
117
118
67.2k
    if((zero_cols & 0xFFF0) == 0xFFF0)
119
3.17k
        row_limit_2nd_stage = 4;
120
64.0k
    else if((zero_cols & 0xFF00) == 0xFF00)
121
1.98k
        row_limit_2nd_stage = 8;
122
62.0k
    else
123
62.0k
        row_limit_2nd_stage = TRANS_SIZE_16;
124
125
67.2k
    trans_size = TRANS_SIZE_16;
126
67.2k
    pi2_tmp_orig = pi2_tmp;
127
67.2k
    if((zero_rows & 0xFFF0) == 0xFFF0)  /* First 4 rows of input are non-zero */
128
6.33k
    {
129
        /* Inverse Transform 1st stage */
130
        /************************************************************************************************/
131
        /**********************************START - IT_RECON_16x16****************************************/
132
        /************************************************************************************************/
133
134
6.33k
        shift = IT_SHIFT_STAGE_1;
135
6.33k
        add = 1 << (shift - 1);
136
137
97.4k
        for(j = 0; j < row_limit_2nd_stage; j++)
138
91.1k
        {
139
            /* Checking for Zero Cols */
140
91.1k
            if((zero_cols & 1) == 1)
141
1.03k
            {
142
1.03k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
143
1.03k
            }
144
90.1k
            else
145
90.1k
            {
146
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
147
810k
                for(k = 0; k < 8; k++)
148
720k
                {
149
720k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
150
720k
                                    + g_ai2_ihevc_trans_16[3][k]
151
720k
                                                    * pi2_src[3 * src_strd];
152
720k
                }
153
450k
                for(k = 0; k < 4; k++)
154
360k
                {
155
360k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd];
156
360k
                }
157
90.1k
                eeo[0] = 0;
158
90.1k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
159
90.1k
                eeo[1] = 0;
160
90.1k
                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
270k
                for(k = 0; k < 2; k++)
164
180k
                {
165
180k
                    ee[k] = eee[k] + eeo[k];
166
180k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
167
180k
                }
168
450k
                for(k = 0; k < 4; k++)
169
360k
                {
170
360k
                    e[k] = ee[k] + eo[k];
171
360k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
172
360k
                }
173
810k
                for(k = 0; k < 8; k++)
174
720k
                {
175
720k
                    pi2_tmp[k] =
176
720k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
177
720k
                    pi2_tmp[k + 8] =
178
720k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
179
720k
                }
180
90.1k
            }
181
91.1k
            pi2_src++;
182
91.1k
            pi2_tmp += trans_size;
183
91.1k
            zero_cols = zero_cols >> 1;
184
91.1k
        }
185
186
6.33k
        pi2_tmp = pi2_tmp_orig;
187
188
        /* Inverse Transform 2nd stage */
189
6.33k
        shift = IT_SHIFT_STAGE_2;
190
6.33k
        add = 1 << (shift - 1);
191
192
6.33k
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
193
753
        {
194
12.8k
            for(j = 0; j < trans_size; j++)
195
12.0k
            {
196
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
197
108k
                for(k = 0; k < 8; k++)
198
96.3k
                {
199
96.3k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
200
96.3k
                                    + g_ai2_ihevc_trans_16[3][k]
201
96.3k
                                                    * pi2_tmp[3 * trans_size];
202
96.3k
                }
203
60.2k
                for(k = 0; k < 4; k++)
204
48.1k
                {
205
48.1k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
206
48.1k
                }
207
12.0k
                eeo[0] = 0;
208
12.0k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
209
12.0k
                eeo[1] = 0;
210
12.0k
                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
36.1k
                for(k = 0; k < 2; k++)
214
24.0k
                {
215
24.0k
                    ee[k] = eee[k] + eeo[k];
216
24.0k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
217
24.0k
                }
218
60.2k
                for(k = 0; k < 4; k++)
219
48.1k
                {
220
48.1k
                    e[k] = ee[k] + eo[k];
221
48.1k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
222
48.1k
                }
223
108k
                for(k = 0; k < 8; k++)
224
96.3k
                {
225
96.3k
                    WORD32 itrans_out;
226
96.3k
                    itrans_out =
227
96.3k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
228
96.3k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
229
96.3k
                    itrans_out =
230
96.3k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
231
96.3k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
232
96.3k
                }
233
12.0k
                pi2_tmp++;
234
12.0k
                pu1_pred += pred_strd;
235
12.0k
                pu1_dst += dst_strd;
236
12.0k
            }
237
753
        }
238
5.57k
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
239
142
        {
240
2.41k
            for(j = 0; j < trans_size; j++)
241
2.27k
            {
242
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
243
20.4k
                for(k = 0; k < 8; k++)
244
18.1k
                {
245
18.1k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
246
18.1k
                                    + g_ai2_ihevc_trans_16[3][k]
247
18.1k
                                                    * pi2_tmp[3 * trans_size]
248
18.1k
                                    + g_ai2_ihevc_trans_16[5][k]
249
18.1k
                                                    * pi2_tmp[5 * trans_size]
250
18.1k
                                    + g_ai2_ihevc_trans_16[7][k]
251
18.1k
                                                    * pi2_tmp[7 * trans_size];
252
18.1k
                }
253
11.3k
                for(k = 0; k < 4; k++)
254
9.08k
                {
255
9.08k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
256
9.08k
                                    + g_ai2_ihevc_trans_16[6][k]
257
9.08k
                                                    * pi2_tmp[6 * trans_size];
258
9.08k
                }
259
2.27k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
260
2.27k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
261
2.27k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
262
2.27k
                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
6.81k
                for(k = 0; k < 2; k++)
266
4.54k
                {
267
4.54k
                    ee[k] = eee[k] + eeo[k];
268
4.54k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
269
4.54k
                }
270
11.3k
                for(k = 0; k < 4; k++)
271
9.08k
                {
272
9.08k
                    e[k] = ee[k] + eo[k];
273
9.08k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
274
9.08k
                }
275
20.4k
                for(k = 0; k < 8; k++)
276
18.1k
                {
277
18.1k
                    WORD32 itrans_out;
278
18.1k
                    itrans_out =
279
18.1k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
280
18.1k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
281
18.1k
                    itrans_out =
282
18.1k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
283
18.1k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
284
18.1k
                }
285
2.27k
                pi2_tmp++;
286
2.27k
                pu1_pred += pred_strd;
287
2.27k
                pu1_dst += dst_strd;
288
2.27k
            }
289
142
        }
290
5.43k
        else /* All rows of output of 1st stage are non-zero */
291
5.43k
        {
292
92.4k
            for(j = 0; j < trans_size; j++)
293
86.9k
            {
294
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
295
782k
                for(k = 0; k < 8; k++)
296
695k
                {
297
695k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
298
695k
                                    + g_ai2_ihevc_trans_16[3][k]
299
695k
                                                    * pi2_tmp[3 * trans_size]
300
695k
                                    + g_ai2_ihevc_trans_16[5][k]
301
695k
                                                    * pi2_tmp[5 * trans_size]
302
695k
                                    + g_ai2_ihevc_trans_16[7][k]
303
695k
                                                    * pi2_tmp[7 * trans_size]
304
695k
                                    + g_ai2_ihevc_trans_16[9][k]
305
695k
                                                    * pi2_tmp[9 * trans_size]
306
695k
                                    + g_ai2_ihevc_trans_16[11][k]
307
695k
                                                    * pi2_tmp[11 * trans_size]
308
695k
                                    + g_ai2_ihevc_trans_16[13][k]
309
695k
                                                    * pi2_tmp[13 * trans_size]
310
695k
                                    + g_ai2_ihevc_trans_16[15][k]
311
695k
                                                    * pi2_tmp[15 * trans_size];
312
695k
                }
313
434k
                for(k = 0; k < 4; k++)
314
347k
                {
315
347k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
316
347k
                                    + g_ai2_ihevc_trans_16[6][k]
317
347k
                                                    * pi2_tmp[6 * trans_size]
318
347k
                                    + g_ai2_ihevc_trans_16[10][k]
319
347k
                                                    * pi2_tmp[10 * trans_size]
320
347k
                                    + g_ai2_ihevc_trans_16[14][k]
321
347k
                                                    * pi2_tmp[14 * trans_size];
322
347k
                }
323
86.9k
                eeo[0] =
324
86.9k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
325
86.9k
                                                + g_ai2_ihevc_trans_16[12][0]
326
86.9k
                                                                * pi2_tmp[12
327
86.9k
                                                                                * trans_size];
328
86.9k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
329
86.9k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
330
86.9k
                eeo[1] =
331
86.9k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
332
86.9k
                                                + g_ai2_ihevc_trans_16[12][1]
333
86.9k
                                                                * pi2_tmp[12
334
86.9k
                                                                                * trans_size];
335
86.9k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
336
86.9k
                                + 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
260k
                for(k = 0; k < 2; k++)
340
173k
                {
341
173k
                    ee[k] = eee[k] + eeo[k];
342
173k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
343
173k
                }
344
434k
                for(k = 0; k < 4; k++)
345
347k
                {
346
347k
                    e[k] = ee[k] + eo[k];
347
347k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
348
347k
                }
349
782k
                for(k = 0; k < 8; k++)
350
695k
                {
351
695k
                    WORD32 itrans_out;
352
695k
                    itrans_out =
353
695k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
354
695k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
355
695k
                    itrans_out =
356
695k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
357
695k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
358
695k
                }
359
86.9k
                pi2_tmp++;
360
86.9k
                pu1_pred += pred_strd;
361
86.9k
                pu1_dst += dst_strd;
362
86.9k
            }
363
5.43k
        }
364
        /************************************************************************************************/
365
        /************************************END - IT_RECON_16x16****************************************/
366
        /************************************************************************************************/
367
6.33k
    }
368
60.9k
    else if((zero_rows & 0xFF00) == 0xFF00)  /* First 8 rows of input are non-zero */
369
3.65k
    {
370
        /* Inverse Transform 1st stage */
371
        /************************************************************************************************/
372
        /**********************************START - IT_RECON_16x16****************************************/
373
        /************************************************************************************************/
374
375
3.65k
        shift = IT_SHIFT_STAGE_1;
376
3.65k
        add = 1 << (shift - 1);
377
378
54.9k
        for(j = 0; j < row_limit_2nd_stage; j++)
379
51.3k
        {
380
            /* Checking for Zero Cols */
381
51.3k
            if((zero_cols & 1) == 1)
382
3.58k
            {
383
3.58k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
384
3.58k
            }
385
47.7k
            else
386
47.7k
            {
387
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
388
429k
                for(k = 0; k < 8; k++)
389
381k
                {
390
381k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
391
381k
                                    + g_ai2_ihevc_trans_16[3][k]
392
381k
                                                    * pi2_src[3 * src_strd]
393
381k
                                    + g_ai2_ihevc_trans_16[5][k]
394
381k
                                                    * pi2_src[5 * src_strd]
395
381k
                                    + g_ai2_ihevc_trans_16[7][k]
396
381k
                                                    * pi2_src[7 * src_strd];
397
381k
                }
398
238k
                for(k = 0; k < 4; k++)
399
190k
                {
400
190k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
401
190k
                                    + g_ai2_ihevc_trans_16[6][k]
402
190k
                                                    * pi2_src[6 * src_strd];
403
190k
                }
404
47.7k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd];
405
47.7k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
406
47.7k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd];
407
47.7k
                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
143k
                for(k = 0; k < 2; k++)
411
95.4k
                {
412
95.4k
                    ee[k] = eee[k] + eeo[k];
413
95.4k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
414
95.4k
                }
415
238k
                for(k = 0; k < 4; k++)
416
190k
                {
417
190k
                    e[k] = ee[k] + eo[k];
418
190k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
419
190k
                }
420
429k
                for(k = 0; k < 8; k++)
421
381k
                {
422
381k
                    pi2_tmp[k] =
423
381k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
424
381k
                    pi2_tmp[k + 8] =
425
381k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
426
381k
                }
427
47.7k
            }
428
51.3k
            pi2_src++;
429
51.3k
            pi2_tmp += trans_size;
430
51.3k
            zero_cols = zero_cols >> 1;
431
51.3k
        }
432
433
3.65k
        pi2_tmp = pi2_tmp_orig;
434
435
        /* Inverse Transform 2nd stage */
436
3.65k
        shift = IT_SHIFT_STAGE_2;
437
3.65k
        add = 1 << (shift - 1);
438
439
3.65k
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
440
419
        {
441
7.12k
            for(j = 0; j < trans_size; j++)
442
6.70k
            {
443
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
444
60.3k
                for(k = 0; k < 8; k++)
445
53.6k
                {
446
53.6k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
447
53.6k
                                    + g_ai2_ihevc_trans_16[3][k]
448
53.6k
                                                    * pi2_tmp[3 * trans_size];
449
53.6k
                }
450
33.5k
                for(k = 0; k < 4; k++)
451
26.8k
                {
452
26.8k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
453
26.8k
                }
454
6.70k
                eeo[0] = 0;
455
6.70k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
456
6.70k
                eeo[1] = 0;
457
6.70k
                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
20.1k
                for(k = 0; k < 2; k++)
461
13.4k
                {
462
13.4k
                    ee[k] = eee[k] + eeo[k];
463
13.4k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
464
13.4k
                }
465
33.5k
                for(k = 0; k < 4; k++)
466
26.8k
                {
467
26.8k
                    e[k] = ee[k] + eo[k];
468
26.8k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
469
26.8k
                }
470
60.3k
                for(k = 0; k < 8; k++)
471
53.6k
                {
472
53.6k
                    WORD32 itrans_out;
473
53.6k
                    itrans_out =
474
53.6k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
475
53.6k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
476
53.6k
                    itrans_out =
477
53.6k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
478
53.6k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
479
53.6k
                }
480
6.70k
                pi2_tmp++;
481
6.70k
                pu1_pred += pred_strd;
482
6.70k
                pu1_dst += dst_strd;
483
6.70k
            }
484
419
        }
485
3.23k
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
486
258
        {
487
4.38k
            for(j = 0; j < trans_size; j++)
488
4.12k
            {
489
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
490
37.1k
                for(k = 0; k < 8; k++)
491
33.0k
                {
492
33.0k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
493
33.0k
                                    + g_ai2_ihevc_trans_16[3][k]
494
33.0k
                                                    * pi2_tmp[3 * trans_size]
495
33.0k
                                    + g_ai2_ihevc_trans_16[5][k]
496
33.0k
                                                    * pi2_tmp[5 * trans_size]
497
33.0k
                                    + g_ai2_ihevc_trans_16[7][k]
498
33.0k
                                                    * pi2_tmp[7 * trans_size];
499
33.0k
                }
500
20.6k
                for(k = 0; k < 4; k++)
501
16.5k
                {
502
16.5k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
503
16.5k
                                    + g_ai2_ihevc_trans_16[6][k]
504
16.5k
                                                    * pi2_tmp[6 * trans_size];
505
16.5k
                }
506
4.12k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
507
4.12k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
508
4.12k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
509
4.12k
                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
12.3k
                for(k = 0; k < 2; k++)
513
8.25k
                {
514
8.25k
                    ee[k] = eee[k] + eeo[k];
515
8.25k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
516
8.25k
                }
517
20.6k
                for(k = 0; k < 4; k++)
518
16.5k
                {
519
16.5k
                    e[k] = ee[k] + eo[k];
520
16.5k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
521
16.5k
                }
522
37.1k
                for(k = 0; k < 8; k++)
523
33.0k
                {
524
33.0k
                    WORD32 itrans_out;
525
33.0k
                    itrans_out =
526
33.0k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
527
33.0k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
528
33.0k
                    itrans_out =
529
33.0k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
530
33.0k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
531
33.0k
                }
532
4.12k
                pi2_tmp++;
533
4.12k
                pu1_pred += pred_strd;
534
4.12k
                pu1_dst += dst_strd;
535
4.12k
            }
536
258
        }
537
2.97k
        else /* All rows of output of 1st stage are non-zero */
538
2.97k
        {
539
50.5k
            for(j = 0; j < trans_size; j++)
540
47.5k
            {
541
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
542
428k
                for(k = 0; k < 8; k++)
543
380k
                {
544
380k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
545
380k
                                    + g_ai2_ihevc_trans_16[3][k]
546
380k
                                                    * pi2_tmp[3 * trans_size]
547
380k
                                    + g_ai2_ihevc_trans_16[5][k]
548
380k
                                                    * pi2_tmp[5 * trans_size]
549
380k
                                    + g_ai2_ihevc_trans_16[7][k]
550
380k
                                                    * pi2_tmp[7 * trans_size]
551
380k
                                    + g_ai2_ihevc_trans_16[9][k]
552
380k
                                                    * pi2_tmp[9 * trans_size]
553
380k
                                    + g_ai2_ihevc_trans_16[11][k]
554
380k
                                                    * pi2_tmp[11 * trans_size]
555
380k
                                    + g_ai2_ihevc_trans_16[13][k]
556
380k
                                                    * pi2_tmp[13 * trans_size]
557
380k
                                    + g_ai2_ihevc_trans_16[15][k]
558
380k
                                                    * pi2_tmp[15 * trans_size];
559
380k
                }
560
237k
                for(k = 0; k < 4; k++)
561
190k
                {
562
190k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
563
190k
                                    + g_ai2_ihevc_trans_16[6][k]
564
190k
                                                    * pi2_tmp[6 * trans_size]
565
190k
                                    + g_ai2_ihevc_trans_16[10][k]
566
190k
                                                    * pi2_tmp[10 * trans_size]
567
190k
                                    + g_ai2_ihevc_trans_16[14][k]
568
190k
                                                    * pi2_tmp[14 * trans_size];
569
190k
                }
570
47.5k
                eeo[0] =
571
47.5k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
572
47.5k
                                                + g_ai2_ihevc_trans_16[12][0]
573
47.5k
                                                                * pi2_tmp[12
574
47.5k
                                                                                * trans_size];
575
47.5k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
576
47.5k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
577
47.5k
                eeo[1] =
578
47.5k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
579
47.5k
                                                + g_ai2_ihevc_trans_16[12][1]
580
47.5k
                                                                * pi2_tmp[12
581
47.5k
                                                                                * trans_size];
582
47.5k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
583
47.5k
                                + 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
142k
                for(k = 0; k < 2; k++)
587
95.1k
                {
588
95.1k
                    ee[k] = eee[k] + eeo[k];
589
95.1k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
590
95.1k
                }
591
237k
                for(k = 0; k < 4; k++)
592
190k
                {
593
190k
                    e[k] = ee[k] + eo[k];
594
190k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
595
190k
                }
596
428k
                for(k = 0; k < 8; k++)
597
380k
                {
598
380k
                    WORD32 itrans_out;
599
380k
                    itrans_out =
600
380k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
601
380k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
602
380k
                    itrans_out =
603
380k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
604
380k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
605
380k
                }
606
47.5k
                pi2_tmp++;
607
47.5k
                pu1_pred += pred_strd;
608
47.5k
                pu1_dst += dst_strd;
609
47.5k
            }
610
2.97k
        }
611
        /************************************************************************************************/
612
        /************************************END - IT_RECON_16x16****************************************/
613
        /************************************************************************************************/
614
3.65k
    }
615
57.2k
    else  /* All rows of input are non-zero */
616
57.2k
    {
617
        /* Inverse Transform 1st stage */
618
        /************************************************************************************************/
619
        /**********************************START - IT_RECON_16x16****************************************/
620
        /************************************************************************************************/
621
622
57.2k
        shift = IT_SHIFT_STAGE_1;
623
57.2k
        add = 1 << (shift - 1);
624
625
936k
        for(j = 0; j < row_limit_2nd_stage; j++)
626
879k
        {
627
            /* Checking for Zero Cols */
628
879k
            if((zero_cols & 1) == 1)
629
10.2k
            {
630
10.2k
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
631
10.2k
            }
632
869k
            else
633
869k
            {
634
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
635
7.82M
                for(k = 0; k < 8; k++)
636
6.95M
                {
637
6.95M
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
638
6.95M
                                    + g_ai2_ihevc_trans_16[3][k]
639
6.95M
                                                    * pi2_src[3 * src_strd]
640
6.95M
                                    + g_ai2_ihevc_trans_16[5][k]
641
6.95M
                                                    * pi2_src[5 * src_strd]
642
6.95M
                                    + g_ai2_ihevc_trans_16[7][k]
643
6.95M
                                                    * pi2_src[7 * src_strd]
644
6.95M
                                    + g_ai2_ihevc_trans_16[9][k]
645
6.95M
                                                    * pi2_src[9 * src_strd]
646
6.95M
                                    + g_ai2_ihevc_trans_16[11][k]
647
6.95M
                                                    * pi2_src[11 * src_strd]
648
6.95M
                                    + g_ai2_ihevc_trans_16[13][k]
649
6.95M
                                                    * pi2_src[13 * src_strd]
650
6.95M
                                    + g_ai2_ihevc_trans_16[15][k]
651
6.95M
                                                    * pi2_src[15 * src_strd];
652
6.95M
                }
653
4.34M
                for(k = 0; k < 4; k++)
654
3.47M
                {
655
3.47M
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
656
3.47M
                                    + g_ai2_ihevc_trans_16[6][k]
657
3.47M
                                                    * pi2_src[6 * src_strd]
658
3.47M
                                    + g_ai2_ihevc_trans_16[10][k]
659
3.47M
                                                    * pi2_src[10 * src_strd]
660
3.47M
                                    + g_ai2_ihevc_trans_16[14][k]
661
3.47M
                                                    * pi2_src[14 * src_strd];
662
3.47M
                }
663
869k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd]
664
869k
                                + g_ai2_ihevc_trans_16[12][0]
665
869k
                                                * pi2_src[12 * src_strd];
666
869k
                eee[0] =
667
869k
                                g_ai2_ihevc_trans_16[0][0] * pi2_src[0]
668
869k
                                                + g_ai2_ihevc_trans_16[8][0]
669
869k
                                                                * pi2_src[8
670
869k
                                                                                * src_strd];
671
869k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd]
672
869k
                                + g_ai2_ihevc_trans_16[12][1]
673
869k
                                                * pi2_src[12 * src_strd];
674
869k
                eee[1] =
675
869k
                                g_ai2_ihevc_trans_16[0][1] * pi2_src[0]
676
869k
                                                + g_ai2_ihevc_trans_16[8][1]
677
869k
                                                                * pi2_src[8
678
869k
                                                                                * src_strd];
679
680
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
681
2.60M
                for(k = 0; k < 2; k++)
682
1.73M
                {
683
1.73M
                    ee[k] = eee[k] + eeo[k];
684
1.73M
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
685
1.73M
                }
686
4.34M
                for(k = 0; k < 4; k++)
687
3.47M
                {
688
3.47M
                    e[k] = ee[k] + eo[k];
689
3.47M
                    e[k + 4] = ee[3 - k] - eo[3 - k];
690
3.47M
                }
691
7.82M
                for(k = 0; k < 8; k++)
692
6.95M
                {
693
6.95M
                    pi2_tmp[k] =
694
6.95M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
695
6.95M
                    pi2_tmp[k + 8] =
696
6.95M
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
697
6.95M
                }
698
869k
            }
699
879k
            pi2_src++;
700
879k
            pi2_tmp += trans_size;
701
879k
            zero_cols = zero_cols >> 1;
702
879k
        }
703
704
57.2k
        pi2_tmp = pi2_tmp_orig;
705
706
        /* Inverse Transform 2nd stage */
707
57.2k
        shift = IT_SHIFT_STAGE_2;
708
57.2k
        add = 1 << (shift - 1);
709
710
57.2k
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
711
1.99k
        {
712
33.9k
            for(j = 0; j < trans_size; j++)
713
31.9k
            {
714
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
715
287k
                for(k = 0; k < 8; k++)
716
255k
                {
717
255k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
718
255k
                                    + g_ai2_ihevc_trans_16[3][k]
719
255k
                                                    * pi2_tmp[3 * trans_size];
720
255k
                }
721
159k
                for(k = 0; k < 4; k++)
722
127k
                {
723
127k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
724
127k
                }
725
31.9k
                eeo[0] = 0;
726
31.9k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
727
31.9k
                eeo[1] = 0;
728
31.9k
                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
95.9k
                for(k = 0; k < 2; k++)
732
63.9k
                {
733
63.9k
                    ee[k] = eee[k] + eeo[k];
734
63.9k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
735
63.9k
                }
736
159k
                for(k = 0; k < 4; k++)
737
127k
                {
738
127k
                    e[k] = ee[k] + eo[k];
739
127k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
740
127k
                }
741
287k
                for(k = 0; k < 8; k++)
742
255k
                {
743
255k
                    WORD32 itrans_out;
744
255k
                    itrans_out =
745
255k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
746
255k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
747
255k
                    itrans_out =
748
255k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
749
255k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
750
255k
                }
751
31.9k
                pi2_tmp++;
752
31.9k
                pu1_pred += pred_strd;
753
31.9k
                pu1_dst += dst_strd;
754
31.9k
            }
755
1.99k
        }
756
55.2k
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
757
1.58k
        {
758
26.9k
            for(j = 0; j < trans_size; j++)
759
25.4k
            {
760
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
761
228k
                for(k = 0; k < 8; k++)
762
203k
                {
763
203k
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
764
203k
                                    + g_ai2_ihevc_trans_16[3][k]
765
203k
                                                    * pi2_tmp[3 * trans_size]
766
203k
                                    + g_ai2_ihevc_trans_16[5][k]
767
203k
                                                    * pi2_tmp[5 * trans_size]
768
203k
                                    + g_ai2_ihevc_trans_16[7][k]
769
203k
                                                    * pi2_tmp[7 * trans_size];
770
203k
                }
771
127k
                for(k = 0; k < 4; k++)
772
101k
                {
773
101k
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
774
101k
                                    + g_ai2_ihevc_trans_16[6][k]
775
101k
                                                    * pi2_tmp[6 * trans_size];
776
101k
                }
777
25.4k
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
778
25.4k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
779
25.4k
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
780
25.4k
                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
76.2k
                for(k = 0; k < 2; k++)
784
50.8k
                {
785
50.8k
                    ee[k] = eee[k] + eeo[k];
786
50.8k
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
787
50.8k
                }
788
127k
                for(k = 0; k < 4; k++)
789
101k
                {
790
101k
                    e[k] = ee[k] + eo[k];
791
101k
                    e[k + 4] = ee[3 - k] - eo[3 - k];
792
101k
                }
793
228k
                for(k = 0; k < 8; k++)
794
203k
                {
795
203k
                    WORD32 itrans_out;
796
203k
                    itrans_out =
797
203k
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
798
203k
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
799
203k
                    itrans_out =
800
203k
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
801
203k
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
802
203k
                }
803
25.4k
                pi2_tmp++;
804
25.4k
                pu1_pred += pred_strd;
805
25.4k
                pu1_dst += dst_strd;
806
25.4k
            }
807
1.58k
        }
808
53.6k
        else /* All rows of output of 1st stage are non-zero */
809
53.6k
        {
810
912k
            for(j = 0; j < trans_size; j++)
811
858k
            {
812
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
813
7.72M
                for(k = 0; k < 8; k++)
814
6.87M
                {
815
6.87M
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
816
6.87M
                                    + g_ai2_ihevc_trans_16[3][k]
817
6.87M
                                                    * pi2_tmp[3 * trans_size]
818
6.87M
                                    + g_ai2_ihevc_trans_16[5][k]
819
6.87M
                                                    * pi2_tmp[5 * trans_size]
820
6.87M
                                    + g_ai2_ihevc_trans_16[7][k]
821
6.87M
                                                    * pi2_tmp[7 * trans_size]
822
6.87M
                                    + g_ai2_ihevc_trans_16[9][k]
823
6.87M
                                                    * pi2_tmp[9 * trans_size]
824
6.87M
                                    + g_ai2_ihevc_trans_16[11][k]
825
6.87M
                                                    * pi2_tmp[11 * trans_size]
826
6.87M
                                    + g_ai2_ihevc_trans_16[13][k]
827
6.87M
                                                    * pi2_tmp[13 * trans_size]
828
6.87M
                                    + g_ai2_ihevc_trans_16[15][k]
829
6.87M
                                                    * pi2_tmp[15 * trans_size];
830
6.87M
                }
831
4.29M
                for(k = 0; k < 4; k++)
832
3.43M
                {
833
3.43M
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
834
3.43M
                                    + g_ai2_ihevc_trans_16[6][k]
835
3.43M
                                                    * pi2_tmp[6 * trans_size]
836
3.43M
                                    + g_ai2_ihevc_trans_16[10][k]
837
3.43M
                                                    * pi2_tmp[10 * trans_size]
838
3.43M
                                    + g_ai2_ihevc_trans_16[14][k]
839
3.43M
                                                    * pi2_tmp[14 * trans_size];
840
3.43M
                }
841
858k
                eeo[0] =
842
858k
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
843
858k
                                                + g_ai2_ihevc_trans_16[12][0]
844
858k
                                                                * pi2_tmp[12
845
858k
                                                                                * trans_size];
846
858k
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
847
858k
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
848
858k
                eeo[1] =
849
858k
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
850
858k
                                                + g_ai2_ihevc_trans_16[12][1]
851
858k
                                                                * pi2_tmp[12
852
858k
                                                                                * trans_size];
853
858k
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
854
858k
                                + 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
2.57M
                for(k = 0; k < 2; k++)
858
1.71M
                {
859
1.71M
                    ee[k] = eee[k] + eeo[k];
860
1.71M
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
861
1.71M
                }
862
4.29M
                for(k = 0; k < 4; k++)
863
3.43M
                {
864
3.43M
                    e[k] = ee[k] + eo[k];
865
3.43M
                    e[k + 4] = ee[3 - k] - eo[3 - k];
866
3.43M
                }
867
7.72M
                for(k = 0; k < 8; k++)
868
6.87M
                {
869
6.87M
                    WORD32 itrans_out;
870
6.87M
                    itrans_out =
871
6.87M
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
872
6.87M
                    pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k]));
873
6.87M
                    itrans_out =
874
6.87M
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
875
6.87M
                    pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8]));
876
6.87M
                }
877
858k
                pi2_tmp++;
878
858k
                pu1_pred += pred_strd;
879
858k
                pu1_dst += dst_strd;
880
858k
            }
881
53.6k
        }
882
        /************************************************************************************************/
883
        /************************************END - IT_RECON_16x16****************************************/
884
        /************************************************************************************************/
885
57.2k
    }
886
887
67.2k
}
888