Coverage Report

Created: 2026-07-15 06:19

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