Coverage Report

Created: 2026-09-04 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/common/ihevc_itrans_res.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_res.c
22
 *
23
 * @brief
24
 *  Contains function definitions for inverse transform
25
 *
26
 * @author
27
 *  100470
28
 *
29
 * @par List of Functions:
30
 *  - ihevc_itrans_res_4x4_ttype1()
31
 *  - ihevc_itrans_res_4x4()
32
 *  - ihevc_itrans_res_dc()
33
 *  - ihevc_itrans_res_8x8()
34
 *  - ihevc_itrans_res_16x16()
35
 *  - ihevc_itrans_res_32x32()
36
 *  - ihevc_res_4x4_rotate()
37
 *  - ihevc_res_nxn_copy()
38
 *  - ihevc_res_nxn_rdpcm_horz()
39
 *  - ihevc_res_nxn_rdpcm_vert()
40
 *
41
 * @remarks
42
 *  None
43
 *
44
 *******************************************************************************
45
 */
46
47
#include <stdio.h>
48
#include <string.h>
49
50
#include "ihevc_typedefs.h"
51
#include "ihevc_macros.h"
52
#include "ihevc_platform_macros.h"
53
#include "ihevc_defs.h"
54
#include "ihevc_trans_tables.h"
55
#include "ihevc_trans_macros.h"
56
#include "ihevc_itrans_res.h"
57
58
59
void ihevc_itrans_res_4x4_ttype1(WORD16 *pi2_src,
60
                                 WORD16 *pi2_tmp,
61
                                 WORD16 *pi2_dst,
62
                                 WORD32 src_strd,
63
                                 WORD32 dst_strd,
64
                                 WORD32 zero_cols,
65
                                 WORD32 zero_rows)
66
0
{
67
0
    WORD32 i, c[4];
68
0
    WORD32 add;
69
0
    WORD32 shift;
70
0
    WORD16 *pi2_tmp_orig;
71
0
    WORD32 trans_size;
72
0
    UNUSED(zero_rows);
73
0
    trans_size = TRANS_SIZE_4;
74
75
0
    pi2_tmp_orig = pi2_tmp;
76
77
    /* Inverse Transform 1st stage */
78
0
    shift = IT_SHIFT_STAGE_1;
79
0
    add = 1 << (shift - 1);
80
81
0
    for(i = 0; i < trans_size; i++)
82
0
    {
83
        /* Checking for Zero Cols */
84
0
        if((zero_cols & 1) == 1)
85
0
        {
86
0
            memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
87
0
        }
88
0
        else
89
0
        {
90
            // Intermediate Variables
91
0
            c[0] = pi2_src[0] + pi2_src[2 * src_strd];
92
0
            c[1] = pi2_src[2 * src_strd] + pi2_src[3 * src_strd];
93
0
            c[2] = pi2_src[0] - pi2_src[3 * src_strd];
94
0
            c[3] = 74 * pi2_src[src_strd];
95
96
0
            pi2_tmp[0] =
97
0
                            CLIP_S16((29 * c[0] + 55 * c[1] + c[3] + add) >> shift);
98
0
            pi2_tmp[1] =
99
0
                            CLIP_S16((55 * c[2] - 29 * c[1] + c[3] + add) >> shift);
100
0
            pi2_tmp[2] =
101
0
                            CLIP_S16((74 * (pi2_src[0] - pi2_src[2 * src_strd] + pi2_src[3 * src_strd]) + add) >> shift);
102
0
            pi2_tmp[3] =
103
0
                            CLIP_S16((55 * c[0] + 29 * c[2] - c[3] + add) >> shift);
104
0
        }
105
0
        pi2_src++;
106
0
        pi2_tmp += trans_size;
107
0
        zero_cols = zero_cols >> 1;
108
0
    }
109
110
0
    pi2_tmp = pi2_tmp_orig;
111
112
    /* Inverse Transform 2nd stage */
113
0
    shift = IT_SHIFT_STAGE_2;
114
0
    add = 1 << (shift - 1);
115
116
0
    for(i = 0; i < trans_size; i++)
117
0
    {
118
0
        WORD32 itrans_out;
119
        // Intermediate Variables
120
0
        c[0] = pi2_tmp[0] + pi2_tmp[2 * trans_size];
121
0
        c[1] = pi2_tmp[2 * trans_size] + pi2_tmp[3 * trans_size];
122
0
        c[2] = pi2_tmp[0] - pi2_tmp[3 * trans_size];
123
0
        c[3] = 74 * pi2_tmp[trans_size];
124
125
0
        pi2_dst[0] =
126
0
                        CLIP_S16((29 * c[0] + 55 * c[1] + c[3] + add) >> shift);
127
128
0
        pi2_dst[1] =
129
0
                        CLIP_S16((55 * c[2] - 29 * c[1] + c[3] + add) >> shift);
130
131
0
        pi2_dst[2] =
132
0
                        CLIP_S16((74 * (pi2_tmp[0] - pi2_tmp[2 * trans_size] + pi2_tmp[3 * trans_size]) + add) >> shift);
133
134
0
        pi2_dst[3] =
135
0
                        CLIP_S16((55 * c[0] + 29 * c[2] - c[3] + add) >> shift);
136
137
0
        pi2_tmp++;
138
0
        pi2_dst += dst_strd;
139
0
    }
140
0
}
141
142
143
void ihevc_itrans_res_4x4(WORD16 *pi2_src,
144
                          WORD16 *pi2_tmp,
145
                          WORD16 *pi2_dst,
146
                          WORD32 src_strd,
147
                          WORD32 dst_strd,
148
                          WORD32 zero_cols,
149
                          WORD32 zero_rows)
150
151
0
{
152
0
    WORD32 j;
153
0
    WORD32 e[2], o[2];
154
0
    WORD32 add;
155
0
    WORD32 shift;
156
0
    WORD16 *pi2_tmp_orig;
157
0
    WORD32 trans_size;
158
0
    UNUSED(zero_rows);
159
0
    trans_size = TRANS_SIZE_4;
160
161
0
    pi2_tmp_orig = pi2_tmp;
162
163
    /* Inverse Transform 1st stage */
164
0
    shift = IT_SHIFT_STAGE_1;
165
0
    add = 1 << (shift - 1);
166
167
0
    for(j = 0; j < trans_size; j++)
168
0
    {
169
        /* Checking for Zero Cols */
170
0
        if((zero_cols & 1) == 1)
171
0
        {
172
0
            memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
173
0
        }
174
0
        else
175
0
        {
176
177
            /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
178
0
            o[0] = g_ai2_ihevc_trans_4[1][0] * pi2_src[src_strd]
179
0
                            + g_ai2_ihevc_trans_4[3][0] * pi2_src[3 * src_strd];
180
0
            o[1] = g_ai2_ihevc_trans_4[1][1] * pi2_src[src_strd]
181
0
                            + g_ai2_ihevc_trans_4[3][1] * pi2_src[3 * src_strd];
182
0
            e[0] = g_ai2_ihevc_trans_4[0][0] * pi2_src[0]
183
0
                            + g_ai2_ihevc_trans_4[2][0] * pi2_src[2 * src_strd];
184
0
            e[1] = g_ai2_ihevc_trans_4[0][1] * pi2_src[0]
185
0
                            + g_ai2_ihevc_trans_4[2][1] * pi2_src[2 * src_strd];
186
187
0
            pi2_tmp[0] =
188
0
                            CLIP_S16(((e[0] + o[0] + add) >> shift));
189
0
            pi2_tmp[1] =
190
0
                            CLIP_S16(((e[1] + o[1] + add) >> shift));
191
0
            pi2_tmp[2] =
192
0
                            CLIP_S16(((e[1] - o[1] + add) >> shift));
193
0
            pi2_tmp[3] =
194
0
                            CLIP_S16(((e[0] - o[0] + add) >> shift));
195
196
0
        }
197
0
        pi2_src++;
198
0
        pi2_tmp += trans_size;
199
0
        zero_cols = zero_cols >> 1;
200
0
    }
201
202
0
    pi2_tmp = pi2_tmp_orig;
203
204
    /* Inverse Transform 2nd stage */
205
0
    shift = IT_SHIFT_STAGE_2;
206
0
    add = 1 << (shift - 1);
207
208
0
    for(j = 0; j < trans_size; j++)
209
0
    {
210
0
        WORD32 itrans_out;
211
        /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
212
0
        o[0] = g_ai2_ihevc_trans_4[1][0] * pi2_tmp[trans_size]
213
0
                        + g_ai2_ihevc_trans_4[3][0] * pi2_tmp[3 * trans_size];
214
0
        o[1] = g_ai2_ihevc_trans_4[1][1] * pi2_tmp[trans_size]
215
0
                        + g_ai2_ihevc_trans_4[3][1] * pi2_tmp[3 * trans_size];
216
0
        e[0] = g_ai2_ihevc_trans_4[0][0] * pi2_tmp[0]
217
0
                        + g_ai2_ihevc_trans_4[2][0] * pi2_tmp[2 * trans_size];
218
0
        e[1] = g_ai2_ihevc_trans_4[0][1] * pi2_tmp[0]
219
0
                        + g_ai2_ihevc_trans_4[2][1] * pi2_tmp[2 * trans_size];
220
221
0
        pi2_dst[0] =
222
0
                        CLIP_S16(((e[0] + o[0] + add) >> shift));
223
224
0
        pi2_dst[1] =
225
0
                        CLIP_S16(((e[1] + o[1] + add) >> shift));
226
227
0
        pi2_dst[2] =
228
0
                        CLIP_S16(((e[1] - o[1] + add) >> shift));
229
230
0
        pi2_dst[3] =
231
0
                        CLIP_S16(((e[0] - o[0] + add) >> shift));
232
233
0
        pi2_tmp++;
234
0
        pi2_dst += dst_strd;
235
236
0
    }
237
0
}
238
239
240
void ihevc_itrans_res_dc(WORD16 *pi2_dst,
241
                          WORD32 dst_strd,
242
                          WORD32 log2_trans_size,
243
                          WORD16 i2_coeff_value)
244
0
{
245
0
    WORD32 row, col;
246
0
    WORD32 add, shift;
247
0
    WORD32 dc_value, quant_out;
248
0
    WORD32 trans_size;
249
250
0
    trans_size = (1 << log2_trans_size);
251
252
0
    quant_out = i2_coeff_value;
253
254
0
    shift = IT_SHIFT_STAGE_1;
255
0
    add = 1 << (shift - 1);
256
0
    dc_value = CLIP_S16((quant_out * 64 + add) >> shift);
257
0
    shift = IT_SHIFT_STAGE_2;
258
0
    add = 1 << (shift - 1);
259
0
    dc_value = CLIP_S16((dc_value * 64 + add) >> shift);
260
261
0
    for(row = 0; row < trans_size; row++)
262
0
        for(col = 0; col < trans_size; col++)
263
0
            pi2_dst[row * dst_strd + col] = dc_value;
264
265
0
}
266
267
268
void ihevc_itrans_res_8x8(WORD16 *pi2_src,
269
                          WORD16 *pi2_tmp,
270
                          WORD16 *pi2_dst,
271
                          WORD32 src_strd,
272
                          WORD32 dst_strd,
273
                          WORD32 zero_cols,
274
                          WORD32 zero_rows)
275
0
{
276
0
    WORD32 j, k;
277
0
    WORD32 e[4], o[4];
278
0
    WORD32 ee[2], eo[2];
279
0
    WORD32 add;
280
0
    WORD32 shift;
281
0
    WORD16 *pi2_tmp_orig;
282
0
    WORD32 trans_size;
283
0
    WORD32 zero_rows_2nd_stage = zero_cols;
284
0
    WORD32 row_limit_2nd_stage;
285
286
0
    trans_size = TRANS_SIZE_8;
287
288
0
    pi2_tmp_orig = pi2_tmp;
289
290
0
    if((zero_cols & 0xF0) == 0xF0)
291
0
        row_limit_2nd_stage = 4;
292
0
    else
293
0
        row_limit_2nd_stage = TRANS_SIZE_8;
294
295
296
0
    if((zero_rows & 0xF0) == 0xF0) /* First 4 rows of input are non-zero */
297
0
    {
298
        /************************************************************************************************/
299
        /**********************************START - IT_RECON_8x8******************************************/
300
        /************************************************************************************************/
301
302
        /* Inverse Transform 1st stage */
303
0
        shift = IT_SHIFT_STAGE_1;
304
0
        add = 1 << (shift - 1);
305
306
0
        for(j = 0; j < row_limit_2nd_stage; j++)
307
0
        {
308
            /* Checking for Zero Cols */
309
0
            if((zero_cols & 1) == 1)
310
0
            {
311
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
312
0
            }
313
0
            else
314
0
            {
315
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
316
0
                for(k = 0; k < 4; k++)
317
0
                {
318
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_src[src_strd]
319
0
                                    + g_ai2_ihevc_trans_8[3][k]
320
0
                                                    * pi2_src[3 * src_strd];
321
0
                }
322
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_src[2 * src_strd];
323
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_src[2 * src_strd];
324
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_src[0];
325
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_src[0];
326
327
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
328
0
                e[0] = ee[0] + eo[0];
329
0
                e[3] = ee[0] - eo[0];
330
0
                e[1] = ee[1] + eo[1];
331
0
                e[2] = ee[1] - eo[1];
332
0
                for(k = 0; k < 4; k++)
333
0
                {
334
0
                    pi2_tmp[k] =
335
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
336
0
                    pi2_tmp[k + 4] =
337
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
338
0
                }
339
0
            }
340
0
            pi2_src++;
341
0
            pi2_tmp += trans_size;
342
0
            zero_cols = zero_cols >> 1;
343
0
        }
344
345
0
        pi2_tmp = pi2_tmp_orig;
346
347
        /* Inverse Transform 2nd stage */
348
0
        shift = IT_SHIFT_STAGE_2;
349
0
        add = 1 << (shift - 1);
350
0
        if((zero_rows_2nd_stage & 0xF0) == 0xF0) /* First 4 rows of output of 1st stage are non-zero */
351
0
        {
352
0
            for(j = 0; j < trans_size; j++)
353
0
            {
354
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
355
0
                for(k = 0; k < 4; k++)
356
0
                {
357
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_tmp[trans_size]
358
0
                                    + g_ai2_ihevc_trans_8[3][k] * pi2_tmp[3 * trans_size];
359
0
                }
360
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_tmp[2 * trans_size];
361
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_tmp[2 * trans_size];
362
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_tmp[0];
363
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_tmp[0];
364
365
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
366
0
                e[0] = ee[0] + eo[0];
367
0
                e[3] = ee[0] - eo[0];
368
0
                e[1] = ee[1] + eo[1];
369
0
                e[2] = ee[1] - eo[1];
370
0
                for(k = 0; k < 4; k++)
371
0
                {
372
0
                    pi2_dst[k] =
373
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
374
375
0
                    pi2_dst[k + 4] =
376
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
377
0
                }
378
0
                pi2_tmp++;
379
0
                pi2_dst += dst_strd;
380
0
            }
381
0
        }
382
0
        else /* All rows of output of 1st stage are non-zero */
383
0
        {
384
0
            for(j = 0; j < trans_size; j++)
385
0
            {
386
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
387
0
                for(k = 0; k < 4; k++)
388
0
                {
389
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_tmp[trans_size]
390
0
                                    + g_ai2_ihevc_trans_8[3][k]
391
0
                                                    * pi2_tmp[3 * trans_size]
392
0
                                    + g_ai2_ihevc_trans_8[5][k]
393
0
                                                    * pi2_tmp[5 * trans_size]
394
0
                                    + g_ai2_ihevc_trans_8[7][k]
395
0
                                                    * pi2_tmp[7 * trans_size];
396
0
                }
397
398
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_tmp[2 * trans_size]
399
0
                                + g_ai2_ihevc_trans_8[6][0] * pi2_tmp[6 * trans_size];
400
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_tmp[2 * trans_size]
401
0
                                + g_ai2_ihevc_trans_8[6][1] * pi2_tmp[6 * trans_size];
402
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_tmp[0]
403
0
                                + g_ai2_ihevc_trans_8[4][0] * pi2_tmp[4 * trans_size];
404
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_tmp[0]
405
0
                                + g_ai2_ihevc_trans_8[4][1] * pi2_tmp[4 * trans_size];
406
407
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
408
0
                e[0] = ee[0] + eo[0];
409
0
                e[3] = ee[0] - eo[0];
410
0
                e[1] = ee[1] + eo[1];
411
0
                e[2] = ee[1] - eo[1];
412
0
                for(k = 0; k < 4; k++)
413
0
                {
414
0
                    pi2_dst[k] =
415
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
416
417
0
                    pi2_dst[k + 4] =
418
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
419
0
                }
420
0
                pi2_tmp++;
421
0
                pi2_dst += dst_strd;
422
0
            }
423
0
        }
424
        /************************************************************************************************/
425
        /************************************END - IT_RECON_8x8******************************************/
426
        /************************************************************************************************/
427
0
    }
428
0
    else /* All rows of input are non-zero */
429
0
    {
430
        /************************************************************************************************/
431
        /**********************************START - IT_RECON_8x8******************************************/
432
        /************************************************************************************************/
433
434
        /* Inverse Transform 1st stage */
435
0
        shift = IT_SHIFT_STAGE_1;
436
0
        add = 1 << (shift - 1);
437
438
0
        for(j = 0; j < row_limit_2nd_stage; j++)
439
0
        {
440
            /* Checking for Zero Cols */
441
0
            if((zero_cols & 1) == 1)
442
0
            {
443
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
444
0
            }
445
0
            else
446
0
            {
447
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
448
0
                for(k = 0; k < 4; k++)
449
0
                {
450
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_src[src_strd]
451
0
                                    + g_ai2_ihevc_trans_8[3][k]
452
0
                                                    * pi2_src[3 * src_strd]
453
0
                                    + g_ai2_ihevc_trans_8[5][k]
454
0
                                                    * pi2_src[5 * src_strd]
455
0
                                    + g_ai2_ihevc_trans_8[7][k]
456
0
                                                    * pi2_src[7 * src_strd];
457
0
                }
458
459
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_src[2 * src_strd]
460
0
                                + g_ai2_ihevc_trans_8[6][0] * pi2_src[6 * src_strd];
461
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_src[2 * src_strd]
462
0
                                + g_ai2_ihevc_trans_8[6][1] * pi2_src[6 * src_strd];
463
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_src[0]
464
0
                                + g_ai2_ihevc_trans_8[4][0] * pi2_src[4 * src_strd];
465
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_src[0]
466
0
                                + g_ai2_ihevc_trans_8[4][1] * pi2_src[4 * src_strd];
467
468
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
469
0
                e[0] = ee[0] + eo[0];
470
0
                e[3] = ee[0] - eo[0];
471
0
                e[1] = ee[1] + eo[1];
472
0
                e[2] = ee[1] - eo[1];
473
0
                for(k = 0; k < 4; k++)
474
0
                {
475
0
                    pi2_tmp[k] =
476
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
477
0
                    pi2_tmp[k + 4] =
478
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
479
0
                }
480
0
            }
481
0
            pi2_src++;
482
0
            pi2_tmp += trans_size;
483
0
            zero_cols = zero_cols >> 1;
484
0
        }
485
486
0
        pi2_tmp = pi2_tmp_orig;
487
488
        /* Inverse Transform 2nd stage */
489
0
        shift = IT_SHIFT_STAGE_2;
490
0
        add = 1 << (shift - 1);
491
0
        if((zero_rows_2nd_stage & 0xF0) == 0xF0) /* First 4 rows of output of 1st stage are non-zero */
492
0
        {
493
0
            for(j = 0; j < trans_size; j++)
494
0
            {
495
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
496
0
                for(k = 0; k < 4; k++)
497
0
                {
498
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_tmp[trans_size]
499
0
                                    + g_ai2_ihevc_trans_8[3][k] * pi2_tmp[3 * trans_size];
500
0
                }
501
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_tmp[2 * trans_size];
502
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_tmp[2 * trans_size];
503
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_tmp[0];
504
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_tmp[0];
505
506
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
507
0
                e[0] = ee[0] + eo[0];
508
0
                e[3] = ee[0] - eo[0];
509
0
                e[1] = ee[1] + eo[1];
510
0
                e[2] = ee[1] - eo[1];
511
0
                for(k = 0; k < 4; k++)
512
0
                {
513
0
                    pi2_dst[k] =
514
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
515
516
0
                    pi2_dst[k + 4] =
517
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
518
0
                }
519
0
                pi2_tmp++;
520
0
                pi2_dst += dst_strd;
521
0
            }
522
0
        }
523
0
        else /* All rows of output of 1st stage are non-zero */
524
0
        {
525
0
            for(j = 0; j < trans_size; j++)
526
0
            {
527
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
528
0
                for(k = 0; k < 4; k++)
529
0
                {
530
0
                    o[k] = g_ai2_ihevc_trans_8[1][k] * pi2_tmp[trans_size]
531
0
                                    + g_ai2_ihevc_trans_8[3][k]
532
0
                                                    * pi2_tmp[3 * trans_size]
533
0
                                    + g_ai2_ihevc_trans_8[5][k]
534
0
                                                    * pi2_tmp[5 * trans_size]
535
0
                                    + g_ai2_ihevc_trans_8[7][k]
536
0
                                                    * pi2_tmp[7 * trans_size];
537
0
                }
538
539
0
                eo[0] = g_ai2_ihevc_trans_8[2][0] * pi2_tmp[2 * trans_size]
540
0
                                + g_ai2_ihevc_trans_8[6][0] * pi2_tmp[6 * trans_size];
541
0
                eo[1] = g_ai2_ihevc_trans_8[2][1] * pi2_tmp[2 * trans_size]
542
0
                                + g_ai2_ihevc_trans_8[6][1] * pi2_tmp[6 * trans_size];
543
0
                ee[0] = g_ai2_ihevc_trans_8[0][0] * pi2_tmp[0]
544
0
                                + g_ai2_ihevc_trans_8[4][0] * pi2_tmp[4 * trans_size];
545
0
                ee[1] = g_ai2_ihevc_trans_8[0][1] * pi2_tmp[0]
546
0
                                + g_ai2_ihevc_trans_8[4][1] * pi2_tmp[4 * trans_size];
547
548
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
549
0
                e[0] = ee[0] + eo[0];
550
0
                e[3] = ee[0] - eo[0];
551
0
                e[1] = ee[1] + eo[1];
552
0
                e[2] = ee[1] - eo[1];
553
0
                for(k = 0; k < 4; k++)
554
0
                {
555
0
                    pi2_dst[k] =
556
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
557
558
0
                    pi2_dst[k + 4] =
559
0
                                    CLIP_S16(((e[3 - k] - o[3 - k] + add) >> shift));
560
0
                }
561
0
                pi2_tmp++;
562
0
                pi2_dst += dst_strd;
563
0
            }
564
0
        }
565
        /************************************************************************************************/
566
        /************************************END - IT_RECON_8x8******************************************/
567
        /************************************************************************************************/
568
0
    }
569
0
}
570
571
572
void ihevc_itrans_res_16x16(WORD16 *pi2_src,
573
                            WORD16 *pi2_tmp,
574
                            WORD16 *pi2_dst,
575
                            WORD32 src_strd,
576
                            WORD32 dst_strd,
577
                            WORD32 zero_cols,
578
                            WORD32 zero_rows)
579
0
{
580
0
    WORD32 j, k;
581
0
    WORD32 e[8], o[8];
582
0
    WORD32 ee[4], eo[4];
583
0
    WORD32 eee[2], eeo[2];
584
0
    WORD32 add;
585
0
    WORD32 shift;
586
0
    WORD16 *pi2_tmp_orig;
587
0
    WORD32 trans_size;
588
0
    WORD32 zero_rows_2nd_stage = zero_cols;
589
0
    WORD32 row_limit_2nd_stage;
590
591
0
    if((zero_cols & 0xFFF0) == 0xFFF0)
592
0
        row_limit_2nd_stage = 4;
593
0
    else if((zero_cols & 0xFF00) == 0xFF00)
594
0
        row_limit_2nd_stage = 8;
595
0
    else
596
0
        row_limit_2nd_stage = TRANS_SIZE_16;
597
598
0
    trans_size = TRANS_SIZE_16;
599
0
    pi2_tmp_orig = pi2_tmp;
600
0
    if((zero_rows & 0xFFF0) == 0xFFF0)  /* First 4 rows of input are non-zero */
601
0
    {
602
        /* Inverse Transform 1st stage */
603
        /************************************************************************************************/
604
        /**********************************START - IT_RECON_16x16****************************************/
605
        /************************************************************************************************/
606
607
0
        shift = IT_SHIFT_STAGE_1;
608
0
        add = 1 << (shift - 1);
609
610
0
        for(j = 0; j < row_limit_2nd_stage; j++)
611
0
        {
612
            /* Checking for Zero Cols */
613
0
            if((zero_cols & 1) == 1)
614
0
            {
615
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
616
0
            }
617
0
            else
618
0
            {
619
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
620
0
                for(k = 0; k < 8; k++)
621
0
                {
622
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
623
0
                                    + g_ai2_ihevc_trans_16[3][k]
624
0
                                                    * pi2_src[3 * src_strd];
625
0
                }
626
0
                for(k = 0; k < 4; k++)
627
0
                {
628
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd];
629
0
                }
630
0
                eeo[0] = 0;
631
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
632
0
                eeo[1] = 0;
633
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0];
634
635
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
636
0
                for(k = 0; k < 2; k++)
637
0
                {
638
0
                    ee[k] = eee[k] + eeo[k];
639
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
640
0
                }
641
0
                for(k = 0; k < 4; k++)
642
0
                {
643
0
                    e[k] = ee[k] + eo[k];
644
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
645
0
                }
646
0
                for(k = 0; k < 8; k++)
647
0
                {
648
0
                    pi2_tmp[k] =
649
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
650
0
                    pi2_tmp[k + 8] =
651
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
652
0
                }
653
0
            }
654
0
            pi2_src++;
655
0
            pi2_tmp += trans_size;
656
0
            zero_cols = zero_cols >> 1;
657
0
        }
658
659
0
        pi2_tmp = pi2_tmp_orig;
660
661
        /* Inverse Transform 2nd stage */
662
0
        shift = IT_SHIFT_STAGE_2;
663
0
        add = 1 << (shift - 1);
664
665
0
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
666
0
        {
667
0
            for(j = 0; j < trans_size; j++)
668
0
            {
669
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
670
0
                for(k = 0; k < 8; k++)
671
0
                {
672
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
673
0
                                    + g_ai2_ihevc_trans_16[3][k]
674
0
                                                    * pi2_tmp[3 * trans_size];
675
0
                }
676
0
                for(k = 0; k < 4; k++)
677
0
                {
678
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
679
0
                }
680
0
                eeo[0] = 0;
681
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
682
0
                eeo[1] = 0;
683
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
684
685
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
686
0
                for(k = 0; k < 2; k++)
687
0
                {
688
0
                    ee[k] = eee[k] + eeo[k];
689
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
690
0
                }
691
0
                for(k = 0; k < 4; k++)
692
0
                {
693
0
                    e[k] = ee[k] + eo[k];
694
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
695
0
                }
696
0
                for(k = 0; k < 8; k++)
697
0
                {
698
0
                    pi2_dst[k] =
699
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
700
701
0
                    pi2_dst[k + 8] =
702
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
703
0
                }
704
0
                pi2_tmp++;
705
0
                pi2_dst += dst_strd;
706
0
            }
707
0
        }
708
0
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
709
0
        {
710
0
            for(j = 0; j < trans_size; j++)
711
0
            {
712
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
713
0
                for(k = 0; k < 8; k++)
714
0
                {
715
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
716
0
                                    + g_ai2_ihevc_trans_16[3][k]
717
0
                                                    * pi2_tmp[3 * trans_size]
718
0
                                    + g_ai2_ihevc_trans_16[5][k]
719
0
                                                    * pi2_tmp[5 * trans_size]
720
0
                                    + g_ai2_ihevc_trans_16[7][k]
721
0
                                                    * pi2_tmp[7 * trans_size];
722
0
                }
723
0
                for(k = 0; k < 4; k++)
724
0
                {
725
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
726
0
                                    + g_ai2_ihevc_trans_16[6][k]
727
0
                                                    * pi2_tmp[6 * trans_size];
728
0
                }
729
0
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
730
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
731
0
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
732
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
733
734
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
735
0
                for(k = 0; k < 2; k++)
736
0
                {
737
0
                    ee[k] = eee[k] + eeo[k];
738
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
739
0
                }
740
0
                for(k = 0; k < 4; k++)
741
0
                {
742
0
                    e[k] = ee[k] + eo[k];
743
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
744
0
                }
745
0
                for(k = 0; k < 8; k++)
746
0
                {
747
0
                    pi2_dst[k] =
748
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
749
750
0
                    pi2_dst[k + 8] =
751
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
752
0
                }
753
0
                pi2_tmp++;
754
0
                pi2_dst += dst_strd;
755
0
            }
756
0
        }
757
0
        else /* All rows of output of 1st stage are non-zero */
758
0
        {
759
0
            for(j = 0; j < trans_size; j++)
760
0
            {
761
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
762
0
                for(k = 0; k < 8; k++)
763
0
                {
764
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
765
0
                                    + g_ai2_ihevc_trans_16[3][k]
766
0
                                                    * pi2_tmp[3 * trans_size]
767
0
                                    + g_ai2_ihevc_trans_16[5][k]
768
0
                                                    * pi2_tmp[5 * trans_size]
769
0
                                    + g_ai2_ihevc_trans_16[7][k]
770
0
                                                    * pi2_tmp[7 * trans_size]
771
0
                                    + g_ai2_ihevc_trans_16[9][k]
772
0
                                                    * pi2_tmp[9 * trans_size]
773
0
                                    + g_ai2_ihevc_trans_16[11][k]
774
0
                                                    * pi2_tmp[11 * trans_size]
775
0
                                    + g_ai2_ihevc_trans_16[13][k]
776
0
                                                    * pi2_tmp[13 * trans_size]
777
0
                                    + g_ai2_ihevc_trans_16[15][k]
778
0
                                                    * pi2_tmp[15 * trans_size];
779
0
                }
780
0
                for(k = 0; k < 4; k++)
781
0
                {
782
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
783
0
                                    + g_ai2_ihevc_trans_16[6][k]
784
0
                                                    * pi2_tmp[6 * trans_size]
785
0
                                    + g_ai2_ihevc_trans_16[10][k]
786
0
                                                    * pi2_tmp[10 * trans_size]
787
0
                                    + g_ai2_ihevc_trans_16[14][k]
788
0
                                                    * pi2_tmp[14 * trans_size];
789
0
                }
790
0
                eeo[0] =
791
0
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
792
0
                                                + g_ai2_ihevc_trans_16[12][0]
793
0
                                                                * pi2_tmp[12
794
0
                                                                                * trans_size];
795
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
796
0
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
797
0
                eeo[1] =
798
0
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
799
0
                                                + g_ai2_ihevc_trans_16[12][1]
800
0
                                                                * pi2_tmp[12
801
0
                                                                                * trans_size];
802
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
803
0
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
804
805
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
806
0
                for(k = 0; k < 2; k++)
807
0
                {
808
0
                    ee[k] = eee[k] + eeo[k];
809
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
810
0
                }
811
0
                for(k = 0; k < 4; k++)
812
0
                {
813
0
                    e[k] = ee[k] + eo[k];
814
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
815
0
                }
816
0
                for(k = 0; k < 8; k++)
817
0
                {
818
0
                    pi2_dst[k] =
819
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
820
821
0
                    pi2_dst[k + 8] =
822
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
823
0
                }
824
0
                pi2_tmp++;
825
0
                pi2_dst += dst_strd;
826
0
            }
827
0
        }
828
        /************************************************************************************************/
829
        /************************************END - IT_RECON_16x16****************************************/
830
        /************************************************************************************************/
831
0
    }
832
0
    else if((zero_rows & 0xFF00) == 0xFF00)  /* First 8 rows of input are non-zero */
833
0
    {
834
        /* Inverse Transform 1st stage */
835
        /************************************************************************************************/
836
        /**********************************START - IT_RECON_16x16****************************************/
837
        /************************************************************************************************/
838
839
0
        shift = IT_SHIFT_STAGE_1;
840
0
        add = 1 << (shift - 1);
841
842
0
        for(j = 0; j < row_limit_2nd_stage; j++)
843
0
        {
844
            /* Checking for Zero Cols */
845
0
            if((zero_cols & 1) == 1)
846
0
            {
847
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
848
0
            }
849
0
            else
850
0
            {
851
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
852
0
                for(k = 0; k < 8; k++)
853
0
                {
854
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
855
0
                                    + g_ai2_ihevc_trans_16[3][k]
856
0
                                                    * pi2_src[3 * src_strd]
857
0
                                    + g_ai2_ihevc_trans_16[5][k]
858
0
                                                    * pi2_src[5 * src_strd]
859
0
                                    + g_ai2_ihevc_trans_16[7][k]
860
0
                                                    * pi2_src[7 * src_strd];
861
0
                }
862
0
                for(k = 0; k < 4; k++)
863
0
                {
864
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
865
0
                                    + g_ai2_ihevc_trans_16[6][k]
866
0
                                                    * pi2_src[6 * src_strd];
867
0
                }
868
0
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd];
869
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0];
870
0
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd];
871
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0];
872
873
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
874
0
                for(k = 0; k < 2; k++)
875
0
                {
876
0
                    ee[k] = eee[k] + eeo[k];
877
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
878
0
                }
879
0
                for(k = 0; k < 4; k++)
880
0
                {
881
0
                    e[k] = ee[k] + eo[k];
882
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
883
0
                }
884
0
                for(k = 0; k < 8; k++)
885
0
                {
886
0
                    pi2_tmp[k] =
887
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
888
0
                    pi2_tmp[k + 8] =
889
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
890
0
                }
891
0
            }
892
0
            pi2_src++;
893
0
            pi2_tmp += trans_size;
894
0
            zero_cols = zero_cols >> 1;
895
0
        }
896
897
0
        pi2_tmp = pi2_tmp_orig;
898
899
        /* Inverse Transform 2nd stage */
900
0
        shift = IT_SHIFT_STAGE_2;
901
0
        add = 1 << (shift - 1);
902
903
0
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
904
0
        {
905
0
            for(j = 0; j < trans_size; j++)
906
0
            {
907
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
908
0
                for(k = 0; k < 8; k++)
909
0
                {
910
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
911
0
                                    + g_ai2_ihevc_trans_16[3][k]
912
0
                                                    * pi2_tmp[3 * trans_size];
913
0
                }
914
0
                for(k = 0; k < 4; k++)
915
0
                {
916
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
917
0
                }
918
0
                eeo[0] = 0;
919
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
920
0
                eeo[1] = 0;
921
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
922
923
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
924
0
                for(k = 0; k < 2; k++)
925
0
                {
926
0
                    ee[k] = eee[k] + eeo[k];
927
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
928
0
                }
929
0
                for(k = 0; k < 4; k++)
930
0
                {
931
0
                    e[k] = ee[k] + eo[k];
932
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
933
0
                }
934
0
                for(k = 0; k < 8; k++)
935
0
                {
936
0
                    pi2_dst[k] =
937
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
938
939
0
                    pi2_dst[k + 8] =
940
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
941
0
                }
942
0
                pi2_tmp++;
943
0
                pi2_dst += dst_strd;
944
0
            }
945
0
        }
946
0
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
947
0
        {
948
0
            for(j = 0; j < trans_size; j++)
949
0
            {
950
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
951
0
                for(k = 0; k < 8; k++)
952
0
                {
953
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
954
0
                                    + g_ai2_ihevc_trans_16[3][k]
955
0
                                                    * pi2_tmp[3 * trans_size]
956
0
                                    + g_ai2_ihevc_trans_16[5][k]
957
0
                                                    * pi2_tmp[5 * trans_size]
958
0
                                    + g_ai2_ihevc_trans_16[7][k]
959
0
                                                    * pi2_tmp[7 * trans_size];
960
0
                }
961
0
                for(k = 0; k < 4; k++)
962
0
                {
963
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
964
0
                                    + g_ai2_ihevc_trans_16[6][k]
965
0
                                                    * pi2_tmp[6 * trans_size];
966
0
                }
967
0
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
968
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
969
0
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
970
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
971
972
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
973
0
                for(k = 0; k < 2; k++)
974
0
                {
975
0
                    ee[k] = eee[k] + eeo[k];
976
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
977
0
                }
978
0
                for(k = 0; k < 4; k++)
979
0
                {
980
0
                    e[k] = ee[k] + eo[k];
981
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
982
0
                }
983
0
                for(k = 0; k < 8; k++)
984
0
                {
985
0
                    pi2_dst[k] =
986
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
987
988
0
                    pi2_dst[k + 8] =
989
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
990
0
                }
991
0
                pi2_tmp++;
992
0
                pi2_dst += dst_strd;
993
0
            }
994
0
        }
995
0
        else /* All rows of output of 1st stage are non-zero */
996
0
        {
997
0
            for(j = 0; j < trans_size; j++)
998
0
            {
999
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1000
0
                for(k = 0; k < 8; k++)
1001
0
                {
1002
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
1003
0
                                    + g_ai2_ihevc_trans_16[3][k]
1004
0
                                                    * pi2_tmp[3 * trans_size]
1005
0
                                    + g_ai2_ihevc_trans_16[5][k]
1006
0
                                                    * pi2_tmp[5 * trans_size]
1007
0
                                    + g_ai2_ihevc_trans_16[7][k]
1008
0
                                                    * pi2_tmp[7 * trans_size]
1009
0
                                    + g_ai2_ihevc_trans_16[9][k]
1010
0
                                                    * pi2_tmp[9 * trans_size]
1011
0
                                    + g_ai2_ihevc_trans_16[11][k]
1012
0
                                                    * pi2_tmp[11 * trans_size]
1013
0
                                    + g_ai2_ihevc_trans_16[13][k]
1014
0
                                                    * pi2_tmp[13 * trans_size]
1015
0
                                    + g_ai2_ihevc_trans_16[15][k]
1016
0
                                                    * pi2_tmp[15 * trans_size];
1017
0
                }
1018
0
                for(k = 0; k < 4; k++)
1019
0
                {
1020
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
1021
0
                                    + g_ai2_ihevc_trans_16[6][k]
1022
0
                                                    * pi2_tmp[6 * trans_size]
1023
0
                                    + g_ai2_ihevc_trans_16[10][k]
1024
0
                                                    * pi2_tmp[10 * trans_size]
1025
0
                                    + g_ai2_ihevc_trans_16[14][k]
1026
0
                                                    * pi2_tmp[14 * trans_size];
1027
0
                }
1028
0
                eeo[0] =
1029
0
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
1030
0
                                                + g_ai2_ihevc_trans_16[12][0]
1031
0
                                                                * pi2_tmp[12
1032
0
                                                                                * trans_size];
1033
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
1034
0
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
1035
0
                eeo[1] =
1036
0
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
1037
0
                                                + g_ai2_ihevc_trans_16[12][1]
1038
0
                                                                * pi2_tmp[12
1039
0
                                                                                * trans_size];
1040
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
1041
0
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
1042
1043
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1044
0
                for(k = 0; k < 2; k++)
1045
0
                {
1046
0
                    ee[k] = eee[k] + eeo[k];
1047
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
1048
0
                }
1049
0
                for(k = 0; k < 4; k++)
1050
0
                {
1051
0
                    e[k] = ee[k] + eo[k];
1052
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
1053
0
                }
1054
0
                for(k = 0; k < 8; k++)
1055
0
                {
1056
0
                    pi2_dst[k] =
1057
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1058
1059
0
                    pi2_dst[k + 8] =
1060
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
1061
0
                }
1062
0
                pi2_tmp++;
1063
0
                pi2_dst += dst_strd;
1064
0
            }
1065
0
        }
1066
        /************************************************************************************************/
1067
        /************************************END - IT_RECON_16x16****************************************/
1068
        /************************************************************************************************/
1069
0
    }
1070
0
    else  /* All rows of input are non-zero */
1071
0
    {
1072
        /* Inverse Transform 1st stage */
1073
        /************************************************************************************************/
1074
        /**********************************START - IT_RECON_16x16****************************************/
1075
        /************************************************************************************************/
1076
1077
0
        shift = IT_SHIFT_STAGE_1;
1078
0
        add = 1 << (shift - 1);
1079
1080
0
        for(j = 0; j < row_limit_2nd_stage; j++)
1081
0
        {
1082
            /* Checking for Zero Cols */
1083
0
            if((zero_cols & 1) == 1)
1084
0
            {
1085
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1086
0
            }
1087
0
            else
1088
0
            {
1089
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1090
0
                for(k = 0; k < 8; k++)
1091
0
                {
1092
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd]
1093
0
                                    + g_ai2_ihevc_trans_16[3][k]
1094
0
                                                    * pi2_src[3 * src_strd]
1095
0
                                    + g_ai2_ihevc_trans_16[5][k]
1096
0
                                                    * pi2_src[5 * src_strd]
1097
0
                                    + g_ai2_ihevc_trans_16[7][k]
1098
0
                                                    * pi2_src[7 * src_strd]
1099
0
                                    + g_ai2_ihevc_trans_16[9][k]
1100
0
                                                    * pi2_src[9 * src_strd]
1101
0
                                    + g_ai2_ihevc_trans_16[11][k]
1102
0
                                                    * pi2_src[11 * src_strd]
1103
0
                                    + g_ai2_ihevc_trans_16[13][k]
1104
0
                                                    * pi2_src[13 * src_strd]
1105
0
                                    + g_ai2_ihevc_trans_16[15][k]
1106
0
                                                    * pi2_src[15 * src_strd];
1107
0
                }
1108
0
                for(k = 0; k < 4; k++)
1109
0
                {
1110
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]
1111
0
                                    + g_ai2_ihevc_trans_16[6][k]
1112
0
                                                    * pi2_src[6 * src_strd]
1113
0
                                    + g_ai2_ihevc_trans_16[10][k]
1114
0
                                                    * pi2_src[10 * src_strd]
1115
0
                                    + g_ai2_ihevc_trans_16[14][k]
1116
0
                                                    * pi2_src[14 * src_strd];
1117
0
                }
1118
0
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd]
1119
0
                                + g_ai2_ihevc_trans_16[12][0]
1120
0
                                                * pi2_src[12 * src_strd];
1121
0
                eee[0] =
1122
0
                                g_ai2_ihevc_trans_16[0][0] * pi2_src[0]
1123
0
                                                + g_ai2_ihevc_trans_16[8][0]
1124
0
                                                                * pi2_src[8
1125
0
                                                                                * src_strd];
1126
0
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd]
1127
0
                                + g_ai2_ihevc_trans_16[12][1]
1128
0
                                                * pi2_src[12 * src_strd];
1129
0
                eee[1] =
1130
0
                                g_ai2_ihevc_trans_16[0][1] * pi2_src[0]
1131
0
                                                + g_ai2_ihevc_trans_16[8][1]
1132
0
                                                                * pi2_src[8
1133
0
                                                                                * src_strd];
1134
1135
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1136
0
                for(k = 0; k < 2; k++)
1137
0
                {
1138
0
                    ee[k] = eee[k] + eeo[k];
1139
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
1140
0
                }
1141
0
                for(k = 0; k < 4; k++)
1142
0
                {
1143
0
                    e[k] = ee[k] + eo[k];
1144
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
1145
0
                }
1146
0
                for(k = 0; k < 8; k++)
1147
0
                {
1148
0
                    pi2_tmp[k] =
1149
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1150
0
                    pi2_tmp[k + 8] =
1151
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
1152
0
                }
1153
0
            }
1154
0
            pi2_src++;
1155
0
            pi2_tmp += trans_size;
1156
0
            zero_cols = zero_cols >> 1;
1157
0
        }
1158
1159
0
        pi2_tmp = pi2_tmp_orig;
1160
1161
        /* Inverse Transform 2nd stage */
1162
0
        shift = IT_SHIFT_STAGE_2;
1163
0
        add = 1 << (shift - 1);
1164
1165
0
        if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */
1166
0
        {
1167
0
            for(j = 0; j < trans_size; j++)
1168
0
            {
1169
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1170
0
                for(k = 0; k < 8; k++)
1171
0
                {
1172
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
1173
0
                                    + g_ai2_ihevc_trans_16[3][k]
1174
0
                                                    * pi2_tmp[3 * trans_size];
1175
0
                }
1176
0
                for(k = 0; k < 4; k++)
1177
0
                {
1178
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size];
1179
0
                }
1180
0
                eeo[0] = 0;
1181
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
1182
0
                eeo[1] = 0;
1183
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
1184
1185
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1186
0
                for(k = 0; k < 2; k++)
1187
0
                {
1188
0
                    ee[k] = eee[k] + eeo[k];
1189
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
1190
0
                }
1191
0
                for(k = 0; k < 4; k++)
1192
0
                {
1193
0
                    e[k] = ee[k] + eo[k];
1194
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
1195
0
                }
1196
0
                for(k = 0; k < 8; k++)
1197
0
                {
1198
0
                    pi2_dst[k] =
1199
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1200
1201
0
                    pi2_dst[k + 8] =
1202
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
1203
0
                }
1204
0
                pi2_tmp++;
1205
0
                pi2_dst += dst_strd;
1206
0
            }
1207
0
        }
1208
0
        else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */
1209
0
        {
1210
0
            for(j = 0; j < trans_size; j++)
1211
0
            {
1212
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1213
0
                for(k = 0; k < 8; k++)
1214
0
                {
1215
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
1216
0
                                    + g_ai2_ihevc_trans_16[3][k]
1217
0
                                                    * pi2_tmp[3 * trans_size]
1218
0
                                    + g_ai2_ihevc_trans_16[5][k]
1219
0
                                                    * pi2_tmp[5 * trans_size]
1220
0
                                    + g_ai2_ihevc_trans_16[7][k]
1221
0
                                                    * pi2_tmp[7 * trans_size];
1222
0
                }
1223
0
                for(k = 0; k < 4; k++)
1224
0
                {
1225
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
1226
0
                                    + g_ai2_ihevc_trans_16[6][k]
1227
0
                                                    * pi2_tmp[6 * trans_size];
1228
0
                }
1229
0
                eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size];
1230
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0];
1231
0
                eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size];
1232
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0];
1233
1234
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1235
0
                for(k = 0; k < 2; k++)
1236
0
                {
1237
0
                    ee[k] = eee[k] + eeo[k];
1238
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
1239
0
                }
1240
0
                for(k = 0; k < 4; k++)
1241
0
                {
1242
0
                    e[k] = ee[k] + eo[k];
1243
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
1244
0
                }
1245
0
                for(k = 0; k < 8; k++)
1246
0
                {
1247
0
                    pi2_dst[k] =
1248
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1249
1250
0
                    pi2_dst[k + 8] =
1251
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
1252
0
                }
1253
0
                pi2_tmp++;
1254
0
                pi2_dst += dst_strd;
1255
0
            }
1256
0
        }
1257
0
        else /* All rows of output of 1st stage are non-zero */
1258
0
        {
1259
0
            for(j = 0; j < trans_size; j++)
1260
0
            {
1261
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1262
0
                for(k = 0; k < 8; k++)
1263
0
                {
1264
0
                    o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size]
1265
0
                                    + g_ai2_ihevc_trans_16[3][k]
1266
0
                                                    * pi2_tmp[3 * trans_size]
1267
0
                                    + g_ai2_ihevc_trans_16[5][k]
1268
0
                                                    * pi2_tmp[5 * trans_size]
1269
0
                                    + g_ai2_ihevc_trans_16[7][k]
1270
0
                                                    * pi2_tmp[7 * trans_size]
1271
0
                                    + g_ai2_ihevc_trans_16[9][k]
1272
0
                                                    * pi2_tmp[9 * trans_size]
1273
0
                                    + g_ai2_ihevc_trans_16[11][k]
1274
0
                                                    * pi2_tmp[11 * trans_size]
1275
0
                                    + g_ai2_ihevc_trans_16[13][k]
1276
0
                                                    * pi2_tmp[13 * trans_size]
1277
0
                                    + g_ai2_ihevc_trans_16[15][k]
1278
0
                                                    * pi2_tmp[15 * trans_size];
1279
0
                }
1280
0
                for(k = 0; k < 4; k++)
1281
0
                {
1282
0
                    eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]
1283
0
                                    + g_ai2_ihevc_trans_16[6][k]
1284
0
                                                    * pi2_tmp[6 * trans_size]
1285
0
                                    + g_ai2_ihevc_trans_16[10][k]
1286
0
                                                    * pi2_tmp[10 * trans_size]
1287
0
                                    + g_ai2_ihevc_trans_16[14][k]
1288
0
                                                    * pi2_tmp[14 * trans_size];
1289
0
                }
1290
0
                eeo[0] =
1291
0
                                g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]
1292
0
                                                + g_ai2_ihevc_trans_16[12][0]
1293
0
                                                                * pi2_tmp[12
1294
0
                                                                                * trans_size];
1295
0
                eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]
1296
0
                                + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size];
1297
0
                eeo[1] =
1298
0
                                g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]
1299
0
                                                + g_ai2_ihevc_trans_16[12][1]
1300
0
                                                                * pi2_tmp[12
1301
0
                                                                                * trans_size];
1302
0
                eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]
1303
0
                                + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size];
1304
1305
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1306
0
                for(k = 0; k < 2; k++)
1307
0
                {
1308
0
                    ee[k] = eee[k] + eeo[k];
1309
0
                    ee[k + 2] = eee[1 - k] - eeo[1 - k];
1310
0
                }
1311
0
                for(k = 0; k < 4; k++)
1312
0
                {
1313
0
                    e[k] = ee[k] + eo[k];
1314
0
                    e[k + 4] = ee[3 - k] - eo[3 - k];
1315
0
                }
1316
0
                for(k = 0; k < 8; k++)
1317
0
                {
1318
0
                    pi2_dst[k] =
1319
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1320
1321
0
                    pi2_dst[k + 8] =
1322
0
                                    CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift));
1323
0
                }
1324
0
                pi2_tmp++;
1325
0
                pi2_dst += dst_strd;
1326
0
            }
1327
0
        }
1328
        /************************************************************************************************/
1329
        /************************************END - IT_RECON_16x16****************************************/
1330
        /************************************************************************************************/
1331
0
    }
1332
1333
0
}
1334
1335
1336
void ihevc_itrans_res_32x32(WORD16 *pi2_src,
1337
                            WORD16 *pi2_tmp,
1338
                            WORD16 *pi2_dst,
1339
                            WORD32 src_strd,
1340
                            WORD32 dst_strd,
1341
                            WORD32 zero_cols,
1342
                            WORD32 zero_rows)
1343
0
{
1344
0
    WORD32 j, k;
1345
0
    WORD32 e[16], o[16];
1346
0
    WORD32 ee[8], eo[8];
1347
0
    WORD32 eee[4], eeo[4];
1348
0
    WORD32 eeee[2], eeeo[2];
1349
0
    WORD32 add;
1350
0
    WORD32 shift;
1351
0
    WORD16 *pi2_tmp_orig;
1352
0
    WORD32 trans_size;
1353
0
    WORD32 zero_rows_2nd_stage = zero_cols;
1354
0
    WORD32 row_limit_2nd_stage;
1355
1356
0
    trans_size = TRANS_SIZE_32;
1357
0
    pi2_tmp_orig = pi2_tmp;
1358
1359
0
    if((zero_cols & 0xFFFFFFF0) == 0xFFFFFFF0)
1360
0
        row_limit_2nd_stage = 4;
1361
0
    else if((zero_cols & 0xFFFFFF00) == 0xFFFFFF00)
1362
0
        row_limit_2nd_stage = 8;
1363
0
    else
1364
0
        row_limit_2nd_stage = TRANS_SIZE_32;
1365
1366
0
    if((zero_rows & 0xFFFFFFF0) == 0xFFFFFFF0)  /* First 4 rows of input are non-zero */
1367
0
    {
1368
        /************************************************************************************************/
1369
        /**********************************START - IT_RECON_32x32****************************************/
1370
        /************************************************************************************************/
1371
        /* Inverse Transform 1st stage */
1372
0
        shift = IT_SHIFT_STAGE_1;
1373
0
        add = 1 << (shift - 1);
1374
1375
0
        for(j = 0; j < row_limit_2nd_stage; j++)
1376
0
        {
1377
            /* Checking for Zero Cols */
1378
0
            if((zero_cols & 1) == 1)
1379
0
            {
1380
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1381
0
            }
1382
0
            else
1383
0
            {
1384
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1385
0
                for(k = 0; k < 16; k++)
1386
0
                {
1387
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
1388
0
                                    + g_ai2_ihevc_trans_32[3][k]
1389
0
                                                    * pi2_src[3 * src_strd];
1390
0
                }
1391
0
                for(k = 0; k < 8; k++)
1392
0
                {
1393
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd];
1394
0
                }
1395
//                for(k = 0; k < 4; k++)
1396
0
                {
1397
0
                    eeo[0] = 0;
1398
0
                    eeo[1] = 0;
1399
0
                    eeo[2] = 0;
1400
0
                    eeo[3] = 0;
1401
0
                }
1402
0
                eeeo[0] = 0;
1403
0
                eeeo[1] = 0;
1404
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0];
1405
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0];
1406
1407
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1408
0
                eee[0] = eeee[0] + eeeo[0];
1409
0
                eee[3] = eeee[0] - eeeo[0];
1410
0
                eee[1] = eeee[1] + eeeo[1];
1411
0
                eee[2] = eeee[1] - eeeo[1];
1412
0
                for(k = 0; k < 4; k++)
1413
0
                {
1414
0
                    ee[k] = eee[k] + eeo[k];
1415
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1416
0
                }
1417
0
                for(k = 0; k < 8; k++)
1418
0
                {
1419
0
                    e[k] = ee[k] + eo[k];
1420
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1421
0
                }
1422
0
                for(k = 0; k < 16; k++)
1423
0
                {
1424
0
                    pi2_tmp[k] =
1425
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1426
0
                    pi2_tmp[k + 16] =
1427
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1428
0
                }
1429
0
            }
1430
0
            pi2_src++;
1431
0
            pi2_tmp += trans_size;
1432
0
            zero_cols = zero_cols >> 1;
1433
0
        }
1434
1435
0
        pi2_tmp = pi2_tmp_orig;
1436
1437
        /* Inverse Transform 2nd stage */
1438
0
        shift = IT_SHIFT_STAGE_2;
1439
0
        add = 1 << (shift - 1);
1440
0
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
1441
0
        {
1442
0
            for(j = 0; j < trans_size; j++)
1443
0
            {
1444
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1445
0
                for(k = 0; k < 16; k++)
1446
0
                {
1447
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1448
0
                                    + g_ai2_ihevc_trans_32[3][k]
1449
0
                                                    * pi2_tmp[3 * trans_size];
1450
0
                }
1451
0
                for(k = 0; k < 8; k++)
1452
0
                {
1453
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
1454
0
                }
1455
//                for(k = 0; k < 4; k++)
1456
0
                {
1457
0
                    eeo[0] = 0;
1458
0
                    eeo[1] = 0;
1459
0
                    eeo[2] = 0;
1460
0
                    eeo[3] = 0;
1461
0
                }
1462
0
                eeeo[0] = 0;
1463
0
                eeeo[1] = 0;
1464
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
1465
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
1466
1467
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1468
0
                eee[0] = eeee[0] + eeeo[0];
1469
0
                eee[3] = eeee[0] - eeeo[0];
1470
0
                eee[1] = eeee[1] + eeeo[1];
1471
0
                eee[2] = eeee[1] - eeeo[1];
1472
0
                for(k = 0; k < 4; k++)
1473
0
                {
1474
0
                    ee[k] = eee[k] + eeo[k];
1475
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1476
0
                }
1477
0
                for(k = 0; k < 8; k++)
1478
0
                {
1479
0
                    e[k] = ee[k] + eo[k];
1480
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1481
0
                }
1482
0
                for(k = 0; k < 16; k++)
1483
0
                {
1484
0
                    pi2_dst[k] =
1485
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1486
1487
0
                    pi2_dst[k + 16] =
1488
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1489
0
                }
1490
0
                pi2_tmp++;
1491
0
                pi2_dst += dst_strd;
1492
0
            }
1493
0
        }
1494
0
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
1495
0
        {
1496
0
            for(j = 0; j < trans_size; j++)
1497
0
            {
1498
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1499
0
                for(k = 0; k < 16; k++)
1500
0
                {
1501
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1502
0
                                    + g_ai2_ihevc_trans_32[3][k]
1503
0
                                                    * pi2_tmp[3 * trans_size]
1504
0
                                    + g_ai2_ihevc_trans_32[5][k]
1505
0
                                                    * pi2_tmp[5 * trans_size]
1506
0
                                    + g_ai2_ihevc_trans_32[7][k]
1507
0
                                                    * pi2_tmp[7 * trans_size];
1508
0
                }
1509
0
                for(k = 0; k < 8; k++)
1510
0
                {
1511
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
1512
0
                                    + g_ai2_ihevc_trans_32[6][k]
1513
0
                                                    * pi2_tmp[6 * trans_size];
1514
0
                }
1515
0
                for(k = 0; k < 4; k++)
1516
0
                {
1517
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
1518
0
                }
1519
0
                eeeo[0] = 0;
1520
0
                eeeo[1] = 0;
1521
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
1522
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
1523
1524
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1525
0
                eee[0] = eeee[0] + eeeo[0];
1526
0
                eee[3] = eeee[0] - eeeo[0];
1527
0
                eee[1] = eeee[1] + eeeo[1];
1528
0
                eee[2] = eeee[1] - eeeo[1];
1529
0
                for(k = 0; k < 4; k++)
1530
0
                {
1531
0
                    ee[k] = eee[k] + eeo[k];
1532
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1533
0
                }
1534
0
                for(k = 0; k < 8; k++)
1535
0
                {
1536
0
                    e[k] = ee[k] + eo[k];
1537
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1538
0
                }
1539
0
                for(k = 0; k < 16; k++)
1540
0
                {
1541
0
                    pi2_dst[k] =
1542
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1543
1544
0
                    pi2_dst[k + 16] =
1545
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1546
0
                }
1547
0
                pi2_tmp++;
1548
0
                pi2_dst += dst_strd;
1549
0
            }
1550
0
        }
1551
0
        else /* All rows of output of 1st stage are non-zero */
1552
0
        {
1553
0
            for(j = 0; j < trans_size; j++)
1554
0
            {
1555
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1556
0
                for(k = 0; k < 16; k++)
1557
0
                {
1558
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1559
0
                                    + g_ai2_ihevc_trans_32[3][k]
1560
0
                                                    * pi2_tmp[3 * trans_size]
1561
0
                                    + g_ai2_ihevc_trans_32[5][k]
1562
0
                                                    * pi2_tmp[5 * trans_size]
1563
0
                                    + g_ai2_ihevc_trans_32[7][k]
1564
0
                                                    * pi2_tmp[7 * trans_size]
1565
0
                                    + g_ai2_ihevc_trans_32[9][k]
1566
0
                                                    * pi2_tmp[9 * trans_size]
1567
0
                                    + g_ai2_ihevc_trans_32[11][k]
1568
0
                                                    * pi2_tmp[11 * trans_size]
1569
0
                                    + g_ai2_ihevc_trans_32[13][k]
1570
0
                                                    * pi2_tmp[13 * trans_size]
1571
0
                                    + g_ai2_ihevc_trans_32[15][k]
1572
0
                                                    * pi2_tmp[15 * trans_size]
1573
0
                                    + g_ai2_ihevc_trans_32[17][k]
1574
0
                                                    * pi2_tmp[17 * trans_size]
1575
0
                                    + g_ai2_ihevc_trans_32[19][k]
1576
0
                                                    * pi2_tmp[19 * trans_size]
1577
0
                                    + g_ai2_ihevc_trans_32[21][k]
1578
0
                                                    * pi2_tmp[21 * trans_size]
1579
0
                                    + g_ai2_ihevc_trans_32[23][k]
1580
0
                                                    * pi2_tmp[23 * trans_size]
1581
0
                                    + g_ai2_ihevc_trans_32[25][k]
1582
0
                                                    * pi2_tmp[25 * trans_size]
1583
0
                                    + g_ai2_ihevc_trans_32[27][k]
1584
0
                                                    * pi2_tmp[27 * trans_size]
1585
0
                                    + g_ai2_ihevc_trans_32[29][k]
1586
0
                                                    * pi2_tmp[29 * trans_size]
1587
0
                                    + g_ai2_ihevc_trans_32[31][k]
1588
0
                                                    * pi2_tmp[31 * trans_size];
1589
0
                }
1590
0
                for(k = 0; k < 8; k++)
1591
0
                {
1592
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
1593
0
                                    + g_ai2_ihevc_trans_32[6][k]
1594
0
                                                    * pi2_tmp[6 * trans_size]
1595
0
                                    + g_ai2_ihevc_trans_32[10][k]
1596
0
                                                    * pi2_tmp[10 * trans_size]
1597
0
                                    + g_ai2_ihevc_trans_32[14][k]
1598
0
                                                    * pi2_tmp[14 * trans_size]
1599
0
                                    + g_ai2_ihevc_trans_32[18][k]
1600
0
                                                    * pi2_tmp[18 * trans_size]
1601
0
                                    + g_ai2_ihevc_trans_32[22][k]
1602
0
                                                    * pi2_tmp[22 * trans_size]
1603
0
                                    + g_ai2_ihevc_trans_32[26][k]
1604
0
                                                    * pi2_tmp[26 * trans_size]
1605
0
                                    + g_ai2_ihevc_trans_32[30][k]
1606
0
                                                    * pi2_tmp[30 * trans_size];
1607
0
                }
1608
0
                for(k = 0; k < 4; k++)
1609
0
                {
1610
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
1611
0
                                    + g_ai2_ihevc_trans_32[12][k]
1612
0
                                                    * pi2_tmp[12 * trans_size]
1613
0
                                    + g_ai2_ihevc_trans_32[20][k]
1614
0
                                                    * pi2_tmp[20 * trans_size]
1615
0
                                    + g_ai2_ihevc_trans_32[28][k]
1616
0
                                                    * pi2_tmp[28 * trans_size];
1617
0
                }
1618
0
                eeeo[0] =
1619
0
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
1620
0
                                                + g_ai2_ihevc_trans_32[24][0]
1621
0
                                                                * pi2_tmp[24
1622
0
                                                                                * trans_size];
1623
0
                eeeo[1] =
1624
0
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
1625
0
                                                + g_ai2_ihevc_trans_32[24][1]
1626
0
                                                                * pi2_tmp[24
1627
0
                                                                                * trans_size];
1628
0
                eeee[0] =
1629
0
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
1630
0
                                                + g_ai2_ihevc_trans_32[16][0]
1631
0
                                                                * pi2_tmp[16
1632
0
                                                                                * trans_size];
1633
0
                eeee[1] =
1634
0
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
1635
0
                                                + g_ai2_ihevc_trans_32[16][1]
1636
0
                                                                * pi2_tmp[16
1637
0
                                                                                * trans_size];
1638
1639
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1640
0
                eee[0] = eeee[0] + eeeo[0];
1641
0
                eee[3] = eeee[0] - eeeo[0];
1642
0
                eee[1] = eeee[1] + eeeo[1];
1643
0
                eee[2] = eeee[1] - eeeo[1];
1644
0
                for(k = 0; k < 4; k++)
1645
0
                {
1646
0
                    ee[k] = eee[k] + eeo[k];
1647
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1648
0
                }
1649
0
                for(k = 0; k < 8; k++)
1650
0
                {
1651
0
                    e[k] = ee[k] + eo[k];
1652
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1653
0
                }
1654
0
                for(k = 0; k < 16; k++)
1655
0
                {
1656
0
                    pi2_dst[k] =
1657
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1658
1659
0
                    pi2_dst[k + 16] =
1660
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1661
0
                }
1662
0
                pi2_tmp++;
1663
0
                pi2_dst += dst_strd;
1664
0
            }
1665
0
        }
1666
        /************************************************************************************************/
1667
        /************************************END - IT_RECON_32x32****************************************/
1668
        /************************************************************************************************/
1669
0
    }
1670
0
    else if((zero_rows & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of input are non-zero */
1671
0
    {
1672
        /************************************************************************************************/
1673
        /**********************************START - IT_RECON_32x32****************************************/
1674
        /************************************************************************************************/
1675
        /* Inverse Transform 1st stage */
1676
0
        shift = IT_SHIFT_STAGE_1;
1677
0
        add = 1 << (shift - 1);
1678
1679
0
        for(j = 0; j < row_limit_2nd_stage; j++)
1680
0
        {
1681
            /* Checking for Zero Cols */
1682
0
            if((zero_cols & 1) == 1)
1683
0
            {
1684
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1685
0
            }
1686
0
            else
1687
0
            {
1688
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1689
0
                for(k = 0; k < 16; k++)
1690
0
                {
1691
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
1692
0
                                    + g_ai2_ihevc_trans_32[3][k]
1693
0
                                                    * pi2_src[3 * src_strd]
1694
0
                                    + g_ai2_ihevc_trans_32[5][k]
1695
0
                                                    * pi2_src[5 * src_strd]
1696
0
                                    + g_ai2_ihevc_trans_32[7][k]
1697
0
                                                    * pi2_src[7 * src_strd];
1698
0
                }
1699
0
                for(k = 0; k < 8; k++)
1700
0
                {
1701
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd]
1702
0
                                    + g_ai2_ihevc_trans_32[6][k]
1703
0
                                                    * pi2_src[6 * src_strd];
1704
0
                }
1705
0
                for(k = 0; k < 4; k++)
1706
0
                {
1707
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd];
1708
0
                }
1709
0
                eeeo[0] = 0;
1710
0
                eeeo[1] = 0;
1711
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0];
1712
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0];
1713
1714
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1715
0
                eee[0] = eeee[0] + eeeo[0];
1716
0
                eee[3] = eeee[0] - eeeo[0];
1717
0
                eee[1] = eeee[1] + eeeo[1];
1718
0
                eee[2] = eeee[1] - eeeo[1];
1719
0
                for(k = 0; k < 4; k++)
1720
0
                {
1721
0
                    ee[k] = eee[k] + eeo[k];
1722
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1723
0
                }
1724
0
                for(k = 0; k < 8; k++)
1725
0
                {
1726
0
                    e[k] = ee[k] + eo[k];
1727
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1728
0
                }
1729
0
                for(k = 0; k < 16; k++)
1730
0
                {
1731
0
                    pi2_tmp[k] =
1732
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1733
0
                    pi2_tmp[k + 16] =
1734
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1735
0
                }
1736
0
            }
1737
0
            pi2_src++;
1738
0
            pi2_tmp += trans_size;
1739
0
            zero_cols = zero_cols >> 1;
1740
0
        }
1741
1742
0
        pi2_tmp = pi2_tmp_orig;
1743
1744
        /* Inverse Transform 2nd stage */
1745
0
        shift = IT_SHIFT_STAGE_2;
1746
0
        add = 1 << (shift - 1);
1747
0
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
1748
0
        {
1749
0
            for(j = 0; j < trans_size; j++)
1750
0
            {
1751
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1752
0
                for(k = 0; k < 16; k++)
1753
0
                {
1754
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1755
0
                                    + g_ai2_ihevc_trans_32[3][k]
1756
0
                                                    * pi2_tmp[3 * trans_size];
1757
0
                }
1758
0
                for(k = 0; k < 8; k++)
1759
0
                {
1760
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
1761
0
                }
1762
//                for(k = 0; k < 4; k++)
1763
0
                {
1764
0
                    eeo[0] = 0;
1765
0
                    eeo[1] = 0;
1766
0
                    eeo[2] = 0;
1767
0
                    eeo[3] = 0;
1768
0
                }
1769
0
                eeeo[0] = 0;
1770
0
                eeeo[1] = 0;
1771
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
1772
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
1773
1774
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1775
0
                eee[0] = eeee[0] + eeeo[0];
1776
0
                eee[3] = eeee[0] - eeeo[0];
1777
0
                eee[1] = eeee[1] + eeeo[1];
1778
0
                eee[2] = eeee[1] - eeeo[1];
1779
0
                for(k = 0; k < 4; k++)
1780
0
                {
1781
0
                    ee[k] = eee[k] + eeo[k];
1782
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1783
0
                }
1784
0
                for(k = 0; k < 8; k++)
1785
0
                {
1786
0
                    e[k] = ee[k] + eo[k];
1787
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1788
0
                }
1789
0
                for(k = 0; k < 16; k++)
1790
0
                {
1791
0
                    pi2_dst[k] =
1792
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1793
1794
0
                    pi2_dst[k + 16] =
1795
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1796
0
                }
1797
0
                pi2_tmp++;
1798
0
                pi2_dst += dst_strd;
1799
0
            }
1800
0
        }
1801
0
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
1802
0
        {
1803
0
            for(j = 0; j < trans_size; j++)
1804
0
            {
1805
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1806
0
                for(k = 0; k < 16; k++)
1807
0
                {
1808
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1809
0
                                    + g_ai2_ihevc_trans_32[3][k]
1810
0
                                                    * pi2_tmp[3 * trans_size]
1811
0
                                    + g_ai2_ihevc_trans_32[5][k]
1812
0
                                                    * pi2_tmp[5 * trans_size]
1813
0
                                    + g_ai2_ihevc_trans_32[7][k]
1814
0
                                                    * pi2_tmp[7 * trans_size];
1815
0
                }
1816
0
                for(k = 0; k < 8; k++)
1817
0
                {
1818
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
1819
0
                                    + g_ai2_ihevc_trans_32[6][k]
1820
0
                                                    * pi2_tmp[6 * trans_size];
1821
0
                }
1822
0
                for(k = 0; k < 4; k++)
1823
0
                {
1824
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
1825
0
                }
1826
0
                eeeo[0] = 0;
1827
0
                eeeo[1] = 0;
1828
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
1829
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
1830
1831
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1832
0
                eee[0] = eeee[0] + eeeo[0];
1833
0
                eee[3] = eeee[0] - eeeo[0];
1834
0
                eee[1] = eeee[1] + eeeo[1];
1835
0
                eee[2] = eeee[1] - eeeo[1];
1836
0
                for(k = 0; k < 4; k++)
1837
0
                {
1838
0
                    ee[k] = eee[k] + eeo[k];
1839
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1840
0
                }
1841
0
                for(k = 0; k < 8; k++)
1842
0
                {
1843
0
                    e[k] = ee[k] + eo[k];
1844
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1845
0
                }
1846
0
                for(k = 0; k < 16; k++)
1847
0
                {
1848
0
                    pi2_dst[k] =
1849
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1850
1851
0
                    pi2_dst[k + 16] =
1852
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1853
0
                }
1854
0
                pi2_tmp++;
1855
0
                pi2_dst += dst_strd;
1856
0
            }
1857
0
        }
1858
0
        else /* All rows of output of 1st stage are non-zero */
1859
0
        {
1860
0
            for(j = 0; j < trans_size; j++)
1861
0
            {
1862
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1863
0
                for(k = 0; k < 16; k++)
1864
0
                {
1865
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
1866
0
                                    + g_ai2_ihevc_trans_32[3][k]
1867
0
                                                    * pi2_tmp[3 * trans_size]
1868
0
                                    + g_ai2_ihevc_trans_32[5][k]
1869
0
                                                    * pi2_tmp[5 * trans_size]
1870
0
                                    + g_ai2_ihevc_trans_32[7][k]
1871
0
                                                    * pi2_tmp[7 * trans_size]
1872
0
                                    + g_ai2_ihevc_trans_32[9][k]
1873
0
                                                    * pi2_tmp[9 * trans_size]
1874
0
                                    + g_ai2_ihevc_trans_32[11][k]
1875
0
                                                    * pi2_tmp[11 * trans_size]
1876
0
                                    + g_ai2_ihevc_trans_32[13][k]
1877
0
                                                    * pi2_tmp[13 * trans_size]
1878
0
                                    + g_ai2_ihevc_trans_32[15][k]
1879
0
                                                    * pi2_tmp[15 * trans_size]
1880
0
                                    + g_ai2_ihevc_trans_32[17][k]
1881
0
                                                    * pi2_tmp[17 * trans_size]
1882
0
                                    + g_ai2_ihevc_trans_32[19][k]
1883
0
                                                    * pi2_tmp[19 * trans_size]
1884
0
                                    + g_ai2_ihevc_trans_32[21][k]
1885
0
                                                    * pi2_tmp[21 * trans_size]
1886
0
                                    + g_ai2_ihevc_trans_32[23][k]
1887
0
                                                    * pi2_tmp[23 * trans_size]
1888
0
                                    + g_ai2_ihevc_trans_32[25][k]
1889
0
                                                    * pi2_tmp[25 * trans_size]
1890
0
                                    + g_ai2_ihevc_trans_32[27][k]
1891
0
                                                    * pi2_tmp[27 * trans_size]
1892
0
                                    + g_ai2_ihevc_trans_32[29][k]
1893
0
                                                    * pi2_tmp[29 * trans_size]
1894
0
                                    + g_ai2_ihevc_trans_32[31][k]
1895
0
                                                    * pi2_tmp[31 * trans_size];
1896
0
                }
1897
0
                for(k = 0; k < 8; k++)
1898
0
                {
1899
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
1900
0
                                    + g_ai2_ihevc_trans_32[6][k]
1901
0
                                                    * pi2_tmp[6 * trans_size]
1902
0
                                    + g_ai2_ihevc_trans_32[10][k]
1903
0
                                                    * pi2_tmp[10 * trans_size]
1904
0
                                    + g_ai2_ihevc_trans_32[14][k]
1905
0
                                                    * pi2_tmp[14 * trans_size]
1906
0
                                    + g_ai2_ihevc_trans_32[18][k]
1907
0
                                                    * pi2_tmp[18 * trans_size]
1908
0
                                    + g_ai2_ihevc_trans_32[22][k]
1909
0
                                                    * pi2_tmp[22 * trans_size]
1910
0
                                    + g_ai2_ihevc_trans_32[26][k]
1911
0
                                                    * pi2_tmp[26 * trans_size]
1912
0
                                    + g_ai2_ihevc_trans_32[30][k]
1913
0
                                                    * pi2_tmp[30 * trans_size];
1914
0
                }
1915
0
                for(k = 0; k < 4; k++)
1916
0
                {
1917
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
1918
0
                                    + g_ai2_ihevc_trans_32[12][k]
1919
0
                                                    * pi2_tmp[12 * trans_size]
1920
0
                                    + g_ai2_ihevc_trans_32[20][k]
1921
0
                                                    * pi2_tmp[20 * trans_size]
1922
0
                                    + g_ai2_ihevc_trans_32[28][k]
1923
0
                                                    * pi2_tmp[28 * trans_size];
1924
0
                }
1925
0
                eeeo[0] =
1926
0
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
1927
0
                                                + g_ai2_ihevc_trans_32[24][0]
1928
0
                                                                * pi2_tmp[24
1929
0
                                                                                * trans_size];
1930
0
                eeeo[1] =
1931
0
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
1932
0
                                                + g_ai2_ihevc_trans_32[24][1]
1933
0
                                                                * pi2_tmp[24
1934
0
                                                                                * trans_size];
1935
0
                eeee[0] =
1936
0
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
1937
0
                                                + g_ai2_ihevc_trans_32[16][0]
1938
0
                                                                * pi2_tmp[16
1939
0
                                                                                * trans_size];
1940
0
                eeee[1] =
1941
0
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
1942
0
                                                + g_ai2_ihevc_trans_32[16][1]
1943
0
                                                                * pi2_tmp[16
1944
0
                                                                                * trans_size];
1945
1946
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
1947
0
                eee[0] = eeee[0] + eeeo[0];
1948
0
                eee[3] = eeee[0] - eeeo[0];
1949
0
                eee[1] = eeee[1] + eeeo[1];
1950
0
                eee[2] = eeee[1] - eeeo[1];
1951
0
                for(k = 0; k < 4; k++)
1952
0
                {
1953
0
                    ee[k] = eee[k] + eeo[k];
1954
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
1955
0
                }
1956
0
                for(k = 0; k < 8; k++)
1957
0
                {
1958
0
                    e[k] = ee[k] + eo[k];
1959
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
1960
0
                }
1961
0
                for(k = 0; k < 16; k++)
1962
0
                {
1963
0
                    pi2_dst[k] =
1964
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
1965
1966
0
                    pi2_dst[k + 16] =
1967
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
1968
0
                }
1969
0
                pi2_tmp++;
1970
0
                pi2_dst += dst_strd;
1971
0
            }
1972
0
        }
1973
        /************************************************************************************************/
1974
        /************************************END - IT_RECON_32x32****************************************/
1975
        /************************************************************************************************/
1976
0
    }
1977
0
    else  /* All rows of input are non-zero */
1978
0
    {
1979
        /************************************************************************************************/
1980
        /**********************************START - IT_RECON_32x32****************************************/
1981
        /************************************************************************************************/
1982
        /* Inverse Transform 1st stage */
1983
0
        shift = IT_SHIFT_STAGE_1;
1984
0
        add = 1 << (shift - 1);
1985
1986
0
        for(j = 0; j < row_limit_2nd_stage; j++)
1987
0
        {
1988
            /* Checking for Zero Cols */
1989
0
            if((zero_cols & 1) == 1)
1990
0
            {
1991
0
                memset(pi2_tmp, 0, trans_size * sizeof(WORD16));
1992
0
            }
1993
0
            else
1994
0
            {
1995
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
1996
0
                for(k = 0; k < 16; k++)
1997
0
                {
1998
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd]
1999
0
                                    + g_ai2_ihevc_trans_32[3][k]
2000
0
                                                    * pi2_src[3 * src_strd]
2001
0
                                    + g_ai2_ihevc_trans_32[5][k]
2002
0
                                                    * pi2_src[5 * src_strd]
2003
0
                                    + g_ai2_ihevc_trans_32[7][k]
2004
0
                                                    * pi2_src[7 * src_strd]
2005
0
                                    + g_ai2_ihevc_trans_32[9][k]
2006
0
                                                    * pi2_src[9 * src_strd]
2007
0
                                    + g_ai2_ihevc_trans_32[11][k]
2008
0
                                                    * pi2_src[11 * src_strd]
2009
0
                                    + g_ai2_ihevc_trans_32[13][k]
2010
0
                                                    * pi2_src[13 * src_strd]
2011
0
                                    + g_ai2_ihevc_trans_32[15][k]
2012
0
                                                    * pi2_src[15 * src_strd]
2013
0
                                    + g_ai2_ihevc_trans_32[17][k]
2014
0
                                                    * pi2_src[17 * src_strd]
2015
0
                                    + g_ai2_ihevc_trans_32[19][k]
2016
0
                                                    * pi2_src[19 * src_strd]
2017
0
                                    + g_ai2_ihevc_trans_32[21][k]
2018
0
                                                    * pi2_src[21 * src_strd]
2019
0
                                    + g_ai2_ihevc_trans_32[23][k]
2020
0
                                                    * pi2_src[23 * src_strd]
2021
0
                                    + g_ai2_ihevc_trans_32[25][k]
2022
0
                                                    * pi2_src[25 * src_strd]
2023
0
                                    + g_ai2_ihevc_trans_32[27][k]
2024
0
                                                    * pi2_src[27 * src_strd]
2025
0
                                    + g_ai2_ihevc_trans_32[29][k]
2026
0
                                                    * pi2_src[29 * src_strd]
2027
0
                                    + g_ai2_ihevc_trans_32[31][k]
2028
0
                                                    * pi2_src[31 * src_strd];
2029
0
                }
2030
0
                for(k = 0; k < 8; k++)
2031
0
                {
2032
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd]
2033
0
                                    + g_ai2_ihevc_trans_32[6][k]
2034
0
                                                    * pi2_src[6 * src_strd]
2035
0
                                    + g_ai2_ihevc_trans_32[10][k]
2036
0
                                                    * pi2_src[10 * src_strd]
2037
0
                                    + g_ai2_ihevc_trans_32[14][k]
2038
0
                                                    * pi2_src[14 * src_strd]
2039
0
                                    + g_ai2_ihevc_trans_32[18][k]
2040
0
                                                    * pi2_src[18 * src_strd]
2041
0
                                    + g_ai2_ihevc_trans_32[22][k]
2042
0
                                                    * pi2_src[22 * src_strd]
2043
0
                                    + g_ai2_ihevc_trans_32[26][k]
2044
0
                                                    * pi2_src[26 * src_strd]
2045
0
                                    + g_ai2_ihevc_trans_32[30][k]
2046
0
                                                    * pi2_src[30 * src_strd];
2047
0
                }
2048
0
                for(k = 0; k < 4; k++)
2049
0
                {
2050
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd]
2051
0
                                    + g_ai2_ihevc_trans_32[12][k]
2052
0
                                                    * pi2_src[12 * src_strd]
2053
0
                                    + g_ai2_ihevc_trans_32[20][k]
2054
0
                                                    * pi2_src[20 * src_strd]
2055
0
                                    + g_ai2_ihevc_trans_32[28][k]
2056
0
                                                    * pi2_src[28 * src_strd];
2057
0
                }
2058
0
                eeeo[0] = g_ai2_ihevc_trans_32[8][0] * pi2_src[8 * src_strd]
2059
0
                                + g_ai2_ihevc_trans_32[24][0]
2060
0
                                                * pi2_src[24 * src_strd];
2061
0
                eeeo[1] = g_ai2_ihevc_trans_32[8][1] * pi2_src[8 * src_strd]
2062
0
                                + g_ai2_ihevc_trans_32[24][1]
2063
0
                                                * pi2_src[24 * src_strd];
2064
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0]
2065
0
                                + g_ai2_ihevc_trans_32[16][0]
2066
0
                                                * pi2_src[16 * src_strd];
2067
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0]
2068
0
                                + g_ai2_ihevc_trans_32[16][1]
2069
0
                                                * pi2_src[16 * src_strd];
2070
2071
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
2072
0
                eee[0] = eeee[0] + eeeo[0];
2073
0
                eee[3] = eeee[0] - eeeo[0];
2074
0
                eee[1] = eeee[1] + eeeo[1];
2075
0
                eee[2] = eeee[1] - eeeo[1];
2076
0
                for(k = 0; k < 4; k++)
2077
0
                {
2078
0
                    ee[k] = eee[k] + eeo[k];
2079
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
2080
0
                }
2081
0
                for(k = 0; k < 8; k++)
2082
0
                {
2083
0
                    e[k] = ee[k] + eo[k];
2084
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
2085
0
                }
2086
0
                for(k = 0; k < 16; k++)
2087
0
                {
2088
0
                    pi2_tmp[k] =
2089
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
2090
0
                    pi2_tmp[k + 16] =
2091
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
2092
0
                }
2093
0
            }
2094
0
            pi2_src++;
2095
0
            pi2_tmp += trans_size;
2096
0
            zero_cols = zero_cols >> 1;
2097
0
        }
2098
2099
0
        pi2_tmp = pi2_tmp_orig;
2100
2101
        /* Inverse Transform 2nd stage */
2102
0
        shift = IT_SHIFT_STAGE_2;
2103
0
        add = 1 << (shift - 1);
2104
0
        if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */
2105
0
        {
2106
0
            for(j = 0; j < trans_size; j++)
2107
0
            {
2108
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
2109
0
                for(k = 0; k < 16; k++)
2110
0
                {
2111
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
2112
0
                                    + g_ai2_ihevc_trans_32[3][k]
2113
0
                                                    * pi2_tmp[3 * trans_size];
2114
0
                }
2115
0
                for(k = 0; k < 8; k++)
2116
0
                {
2117
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size];
2118
0
                }
2119
//                for(k = 0; k < 4; k++)
2120
0
                {
2121
0
                    eeo[0] = 0;
2122
0
                    eeo[1] = 0;
2123
0
                    eeo[2] = 0;
2124
0
                    eeo[3] = 0;
2125
0
                }
2126
0
                eeeo[0] = 0;
2127
0
                eeeo[1] = 0;
2128
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
2129
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
2130
2131
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
2132
0
                eee[0] = eeee[0] + eeeo[0];
2133
0
                eee[3] = eeee[0] - eeeo[0];
2134
0
                eee[1] = eeee[1] + eeeo[1];
2135
0
                eee[2] = eeee[1] - eeeo[1];
2136
0
                for(k = 0; k < 4; k++)
2137
0
                {
2138
0
                    ee[k] = eee[k] + eeo[k];
2139
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
2140
0
                }
2141
0
                for(k = 0; k < 8; k++)
2142
0
                {
2143
0
                    e[k] = ee[k] + eo[k];
2144
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
2145
0
                }
2146
0
                for(k = 0; k < 16; k++)
2147
0
                {
2148
0
                    pi2_dst[k] =
2149
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
2150
2151
0
                    pi2_dst[k + 16] =
2152
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
2153
0
                }
2154
0
                pi2_tmp++;
2155
0
                pi2_dst += dst_strd;
2156
0
            }
2157
0
        }
2158
0
        else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */
2159
0
        {
2160
0
            for(j = 0; j < trans_size; j++)
2161
0
            {
2162
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
2163
0
                for(k = 0; k < 16; k++)
2164
0
                {
2165
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
2166
0
                                    + g_ai2_ihevc_trans_32[3][k]
2167
0
                                                    * pi2_tmp[3 * trans_size]
2168
0
                                    + g_ai2_ihevc_trans_32[5][k]
2169
0
                                                    * pi2_tmp[5 * trans_size]
2170
0
                                    + g_ai2_ihevc_trans_32[7][k]
2171
0
                                                    * pi2_tmp[7 * trans_size];
2172
0
                }
2173
0
                for(k = 0; k < 8; k++)
2174
0
                {
2175
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
2176
0
                                    + g_ai2_ihevc_trans_32[6][k]
2177
0
                                                    * pi2_tmp[6 * trans_size];
2178
0
                }
2179
0
                for(k = 0; k < 4; k++)
2180
0
                {
2181
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size];
2182
0
                }
2183
0
                eeeo[0] = 0;
2184
0
                eeeo[1] = 0;
2185
0
                eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0];
2186
0
                eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0];
2187
2188
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
2189
0
                eee[0] = eeee[0] + eeeo[0];
2190
0
                eee[3] = eeee[0] - eeeo[0];
2191
0
                eee[1] = eeee[1] + eeeo[1];
2192
0
                eee[2] = eeee[1] - eeeo[1];
2193
0
                for(k = 0; k < 4; k++)
2194
0
                {
2195
0
                    ee[k] = eee[k] + eeo[k];
2196
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
2197
0
                }
2198
0
                for(k = 0; k < 8; k++)
2199
0
                {
2200
0
                    e[k] = ee[k] + eo[k];
2201
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
2202
0
                }
2203
0
                for(k = 0; k < 16; k++)
2204
0
                {
2205
0
                    pi2_dst[k] =
2206
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
2207
2208
0
                    pi2_dst[k + 16] =
2209
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
2210
0
                }
2211
0
                pi2_tmp++;
2212
0
                pi2_dst += dst_strd;
2213
0
            }
2214
0
        }
2215
0
        else /* All rows of output of 1st stage are non-zero */
2216
0
        {
2217
0
            for(j = 0; j < trans_size; j++)
2218
0
            {
2219
                /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
2220
0
                for(k = 0; k < 16; k++)
2221
0
                {
2222
0
                    o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size]
2223
0
                                    + g_ai2_ihevc_trans_32[3][k]
2224
0
                                                    * pi2_tmp[3 * trans_size]
2225
0
                                    + g_ai2_ihevc_trans_32[5][k]
2226
0
                                                    * pi2_tmp[5 * trans_size]
2227
0
                                    + g_ai2_ihevc_trans_32[7][k]
2228
0
                                                    * pi2_tmp[7 * trans_size]
2229
0
                                    + g_ai2_ihevc_trans_32[9][k]
2230
0
                                                    * pi2_tmp[9 * trans_size]
2231
0
                                    + g_ai2_ihevc_trans_32[11][k]
2232
0
                                                    * pi2_tmp[11 * trans_size]
2233
0
                                    + g_ai2_ihevc_trans_32[13][k]
2234
0
                                                    * pi2_tmp[13 * trans_size]
2235
0
                                    + g_ai2_ihevc_trans_32[15][k]
2236
0
                                                    * pi2_tmp[15 * trans_size]
2237
0
                                    + g_ai2_ihevc_trans_32[17][k]
2238
0
                                                    * pi2_tmp[17 * trans_size]
2239
0
                                    + g_ai2_ihevc_trans_32[19][k]
2240
0
                                                    * pi2_tmp[19 * trans_size]
2241
0
                                    + g_ai2_ihevc_trans_32[21][k]
2242
0
                                                    * pi2_tmp[21 * trans_size]
2243
0
                                    + g_ai2_ihevc_trans_32[23][k]
2244
0
                                                    * pi2_tmp[23 * trans_size]
2245
0
                                    + g_ai2_ihevc_trans_32[25][k]
2246
0
                                                    * pi2_tmp[25 * trans_size]
2247
0
                                    + g_ai2_ihevc_trans_32[27][k]
2248
0
                                                    * pi2_tmp[27 * trans_size]
2249
0
                                    + g_ai2_ihevc_trans_32[29][k]
2250
0
                                                    * pi2_tmp[29 * trans_size]
2251
0
                                    + g_ai2_ihevc_trans_32[31][k]
2252
0
                                                    * pi2_tmp[31 * trans_size];
2253
0
                }
2254
0
                for(k = 0; k < 8; k++)
2255
0
                {
2256
0
                    eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]
2257
0
                                    + g_ai2_ihevc_trans_32[6][k]
2258
0
                                                    * pi2_tmp[6 * trans_size]
2259
0
                                    + g_ai2_ihevc_trans_32[10][k]
2260
0
                                                    * pi2_tmp[10 * trans_size]
2261
0
                                    + g_ai2_ihevc_trans_32[14][k]
2262
0
                                                    * pi2_tmp[14 * trans_size]
2263
0
                                    + g_ai2_ihevc_trans_32[18][k]
2264
0
                                                    * pi2_tmp[18 * trans_size]
2265
0
                                    + g_ai2_ihevc_trans_32[22][k]
2266
0
                                                    * pi2_tmp[22 * trans_size]
2267
0
                                    + g_ai2_ihevc_trans_32[26][k]
2268
0
                                                    * pi2_tmp[26 * trans_size]
2269
0
                                    + g_ai2_ihevc_trans_32[30][k]
2270
0
                                                    * pi2_tmp[30 * trans_size];
2271
0
                }
2272
0
                for(k = 0; k < 4; k++)
2273
0
                {
2274
0
                    eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]
2275
0
                                    + g_ai2_ihevc_trans_32[12][k]
2276
0
                                                    * pi2_tmp[12 * trans_size]
2277
0
                                    + g_ai2_ihevc_trans_32[20][k]
2278
0
                                                    * pi2_tmp[20 * trans_size]
2279
0
                                    + g_ai2_ihevc_trans_32[28][k]
2280
0
                                                    * pi2_tmp[28 * trans_size];
2281
0
                }
2282
0
                eeeo[0] =
2283
0
                                g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size]
2284
0
                                                + g_ai2_ihevc_trans_32[24][0]
2285
0
                                                                * pi2_tmp[24
2286
0
                                                                                * trans_size];
2287
0
                eeeo[1] =
2288
0
                                g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size]
2289
0
                                                + g_ai2_ihevc_trans_32[24][1]
2290
0
                                                                * pi2_tmp[24
2291
0
                                                                                * trans_size];
2292
0
                eeee[0] =
2293
0
                                g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]
2294
0
                                                + g_ai2_ihevc_trans_32[16][0]
2295
0
                                                                * pi2_tmp[16
2296
0
                                                                                * trans_size];
2297
0
                eeee[1] =
2298
0
                                g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]
2299
0
                                                + g_ai2_ihevc_trans_32[16][1]
2300
0
                                                                * pi2_tmp[16
2301
0
                                                                                * trans_size];
2302
2303
                /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */
2304
0
                eee[0] = eeee[0] + eeeo[0];
2305
0
                eee[3] = eeee[0] - eeeo[0];
2306
0
                eee[1] = eeee[1] + eeeo[1];
2307
0
                eee[2] = eeee[1] - eeeo[1];
2308
0
                for(k = 0; k < 4; k++)
2309
0
                {
2310
0
                    ee[k] = eee[k] + eeo[k];
2311
0
                    ee[k + 4] = eee[3 - k] - eeo[3 - k];
2312
0
                }
2313
0
                for(k = 0; k < 8; k++)
2314
0
                {
2315
0
                    e[k] = ee[k] + eo[k];
2316
0
                    e[k + 8] = ee[7 - k] - eo[7 - k];
2317
0
                }
2318
0
                for(k = 0; k < 16; k++)
2319
0
                {
2320
0
                    pi2_dst[k] =
2321
0
                                    CLIP_S16(((e[k] + o[k] + add) >> shift));
2322
2323
0
                    pi2_dst[k + 16] =
2324
0
                                    CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift));
2325
0
                }
2326
0
                pi2_tmp++;
2327
0
                pi2_dst += dst_strd;
2328
0
            }
2329
0
        }
2330
        /************************************************************************************************/
2331
        /************************************END - IT_RECON_32x32****************************************/
2332
        /************************************************************************************************/
2333
0
    }
2334
0
}
2335
2336
2337
void ihevc_res_4x4_rotate(WORD16 *pi2_src,
2338
                          WORD16 *pi2_dst,
2339
                          WORD32 src_strd,
2340
                          WORD32 dst_strd,
2341
                          WORD32 zero_cols)
2342
0
{
2343
0
    WORD32 i, j;
2344
0
    WORD32 trans_size;
2345
2346
0
    trans_size = TRANS_SIZE_4;
2347
2348
0
    WORD32 offset = trans_size * src_strd - 1;
2349
2350
0
    zero_cols = gau4_ihevcd_4_bit_reverse[zero_cols & 0xF];
2351
2352
0
    for(i = 0; i < trans_size; i++)
2353
0
    {
2354
        /* Checking for Zero Cols */
2355
0
        if((zero_cols & 1) == 1)
2356
0
        {
2357
0
            for(j = 0; j < trans_size; j++)
2358
0
            {
2359
0
                pi2_dst[j * dst_strd] = 0;
2360
0
            }
2361
0
        }
2362
0
        else
2363
0
        {
2364
0
            for(j = 0; j < trans_size; j++)
2365
0
            {
2366
0
                pi2_dst[j * dst_strd] = pi2_src[offset - (j * src_strd + i)];
2367
0
            }
2368
0
        }
2369
0
        pi2_dst++;
2370
0
        zero_cols = zero_cols >> 1;
2371
0
    }
2372
0
}
2373
2374
2375
void ihevc_res_nxn_copy(WORD16 *pi2_src,
2376
                        WORD16 *pi2_dst,
2377
                        WORD32 src_strd,
2378
                        WORD32 dst_strd,
2379
                        WORD32 trans_size,
2380
                        WORD32 zero_cols)
2381
0
{
2382
2383
0
    WORD32 i, j;
2384
2385
0
    for(i = 0; i < trans_size; i++)
2386
0
    {
2387
        /* Checking for Zero Cols */
2388
0
        if((zero_cols & 1) == 1)
2389
0
        {
2390
0
            for(j = 0; j < trans_size; j++)
2391
0
            {
2392
0
                pi2_dst[j * dst_strd] = 0;
2393
0
            }
2394
0
        }
2395
0
        else
2396
0
        {
2397
0
            for(j = 0; j < trans_size; j++)
2398
0
            {
2399
0
                pi2_dst[j * dst_strd] = pi2_src[(j * src_strd + i)];
2400
0
            }
2401
0
        }
2402
0
        pi2_dst++;
2403
0
        zero_cols = zero_cols >> 1;
2404
0
    }
2405
0
}
2406
2407
2408
void ihevc_res_nxn_rdpcm_horz(WORD16 *pi2_src,
2409
                              WORD16 *pi2_dst,
2410
                              WORD32 src_strd,
2411
                              WORD32 dst_strd,
2412
                              WORD32 trans_size,
2413
                              WORD32 zero_cols)
2414
0
{
2415
0
    WORD32 i, j;
2416
2417
    /* Checking for Zero Cols */
2418
0
    if((zero_cols & 1) == 1)
2419
0
    {
2420
0
        for(j = 0; j < trans_size; j++)
2421
0
        {
2422
0
            pi2_dst[j * dst_strd] = 0;
2423
0
        }
2424
0
    }
2425
0
    else
2426
0
    {
2427
0
        for(j = 0; j < trans_size; j++)
2428
0
        {
2429
0
            pi2_dst[j * dst_strd] = pi2_src[j * src_strd];
2430
0
        }
2431
0
    }
2432
0
    pi2_dst++;
2433
0
    zero_cols >>= 1;
2434
2435
0
    for(i = 1; i < trans_size; i++)
2436
0
    {
2437
        /* Checking for Zero Cols */
2438
0
        if((zero_cols & 1) == 1)
2439
0
        {
2440
0
            for(j = 0; j < trans_size; j++)
2441
0
            {
2442
0
                pi2_dst[j * dst_strd] = pi2_dst[j * dst_strd - 1];
2443
0
            }
2444
0
        }
2445
0
        else
2446
0
        {
2447
0
            for(j = 0; j < trans_size; j++)
2448
0
            {
2449
0
                pi2_dst[j * dst_strd] = pi2_src[j * src_strd + i] + pi2_dst[j * dst_strd - 1];
2450
0
            }
2451
0
        }
2452
0
        pi2_dst++;
2453
0
        zero_cols >>= 1;
2454
0
    }
2455
0
}
2456
2457
2458
void ihevc_res_nxn_rdpcm_vert(WORD16 *pi2_src,
2459
                              WORD16 *pi2_dst,
2460
                              WORD32 src_strd,
2461
                              WORD32 dst_strd,
2462
                              WORD32 trans_size,
2463
                              WORD32 zero_cols)
2464
0
{
2465
0
    WORD32 i, j;
2466
2467
0
    for(i = 0; i < trans_size; i++)
2468
0
    {
2469
        /* Checking for Zero Cols */
2470
0
        if((zero_cols & 1) == 1)
2471
0
        {
2472
0
            for(j = 0; j < trans_size; j++)
2473
0
            {
2474
0
                pi2_dst[j * dst_strd] = 0;
2475
0
            }
2476
0
        }
2477
0
        else
2478
0
        {
2479
0
            WORD16 acc = pi2_src[i];
2480
2481
0
            pi2_dst[0] = acc;
2482
0
            for(j = 1; j < trans_size; j++)
2483
0
            {
2484
0
                acc += pi2_src[j * src_strd + i];
2485
0
                pi2_dst[j * dst_strd] = acc;
2486
0
            }
2487
0
        }
2488
0
        pi2_dst++;
2489
0
        zero_cols = zero_cols >> 1;
2490
0
    }
2491
0
}
2492