Coverage Report

Created: 2026-08-31 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/common/ihevc_resi_trans.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2018 The Android Open Source Project
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
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
/**
21
 *******************************************************************************
22
 * @file
23
 *  ihevc_resi_trans.c
24
 *
25
 * @brief
26
 *  Contains function definitions for residual and  forward transform
27
 *
28
 * @author
29
 *  100470
30
 *
31
 * @par List of Functions:
32
 *  - ihevc_resi_trans_4x4_ttype1()
33
 *  - ihevc_resi_trans_4x4()
34
 *  - ihevc_resi_trans_8x8()
35
 *  - ihevc_resi_trans_16x16()
36
 *  - ihevc_resi_trans_32x32()
37
 *
38
 * @remarks
39
 *  None
40
 *
41
 *******************************************************************************
42
 */
43
#include <stdio.h>
44
#include <string.h>
45
#include <stdlib.h>
46
#include "ihevc_typedefs.h"
47
#include "ihevc_macros.h"
48
#include "ihevc_platform_macros.h"
49
#include "ihevc_defs.h"
50
#include "ihevc_trans_tables.h"
51
#include "ihevc_resi_trans.h"
52
#include "ihevc_trans_macros.h"
53
54
/**
55
 *******************************************************************************
56
 *
57
 * @brief
58
 *  This function performs residue calculation and forward  transform type 1
59
 * on input pixels
60
 *
61
 * @par Description:
62
 *  Performs residue calculation by subtracting source and  prediction and
63
 * followed by forward transform
64
 *
65
 * @param[in] pu1_src
66
 *  Input 4x4 pixels
67
 *
68
 * @param[in] pu1_pred
69
 *  Prediction data
70
 *
71
 * @param[in] pi2_tmp
72
 *  Temporary buffer of size 4x4
73
 *
74
 * @param[out] pi2_dst
75
 *  Output 4x4 coefficients
76
 *
77
 * @param[in] src_strd
78
 *  Input stride
79
 *
80
 * @param[in] pred_strd
81
 *  Prediction Stride
82
 *
83
 * @param[in] dst_strd
84
 *  Output Stride
85
 *
86
 * @param[in] e_chroma_plane
87
 *  Enum singalling chroma plane
88
 *
89
 *
90
 * @returns  Void
91
 *
92
 * @remarks
93
 *  None
94
 *
95
 *******************************************************************************
96
 */
97
98
UWORD32 ihevc_resi_trans_4x4_ttype1(UWORD8 *pu1_src,
99
                                 UWORD8 *pu1_pred,
100
                                    WORD32 *pi4_temp,
101
                                 WORD16 *pi2_dst,
102
                                 WORD32 src_strd,
103
                                 WORD32 pred_strd,
104
                                 WORD32 dst_strd,
105
                                 CHROMA_PLANE_ID_T e_chroma_plane)
106
7.23M
{
107
7.23M
    WORD32 i, c[4];
108
7.23M
    WORD32 add, shift;
109
7.23M
    WORD32 trans_size;
110
7.23M
    WORD32 *pi4_tmp_orig;
111
7.23M
    WORD16 *pi2_dst_orig;
112
7.23M
    UWORD32  u4_blk_sad = 0;
113
7.23M
    UNUSED(e_chroma_plane);
114
115
7.23M
    pi2_dst_orig = pi2_dst;
116
7.23M
    pi4_tmp_orig = pi4_temp;
117
7.23M
    trans_size = TRANS_SIZE_4;
118
119
    /* Residue + Forward Transform 1st stage */
120
7.23M
    shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement
121
7.23M
    add = 1 << (shift - 1);
122
123
36.1M
    for(i = 0; i < trans_size; i++)
124
28.9M
    {
125
28.9M
        WORD32 resi_tmp_1, resi_tmp_2, resi_tmp_3;
126
127
        // Intermediate Variables
128
28.9M
        resi_tmp_1 = pu1_src[0] - pu1_pred[0];
129
28.9M
        resi_tmp_2 = pu1_src[3] - pu1_pred[3];
130
28.9M
        c[0] = resi_tmp_1 + resi_tmp_2;
131
28.9M
        u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2);
132
133
28.9M
        resi_tmp_1 = pu1_src[1] - pu1_pred[1];
134
28.9M
        resi_tmp_2 = pu1_src[3] - pu1_pred[3];
135
28.9M
        c[1] = resi_tmp_1 + resi_tmp_2;
136
28.9M
        u4_blk_sad += abs(resi_tmp_1);
137
138
28.9M
        resi_tmp_1 = pu1_src[0] - pu1_pred[0];
139
28.9M
        resi_tmp_2 = pu1_src[1] - pu1_pred[1];
140
28.9M
        c[2] = resi_tmp_1 - resi_tmp_2;
141
142
28.9M
        resi_tmp_1 = pu1_src[2] - pu1_pred[2];
143
28.9M
        c[3] = 74 * resi_tmp_1;
144
28.9M
        u4_blk_sad += abs(resi_tmp_1);
145
146
28.9M
        pi4_temp[0] = (29 * c[0] + 55 * c[1] + c[3] + add) >> shift;
147
148
28.9M
        resi_tmp_1 = pu1_src[0] - pu1_pred[0];
149
28.9M
        resi_tmp_2 = pu1_src[1] - pu1_pred[1];
150
28.9M
        resi_tmp_3 = pu1_src[3] - pu1_pred[3];
151
28.9M
        pi4_temp[trans_size] =
152
28.9M
                        (74 * (resi_tmp_1 + resi_tmp_2 - resi_tmp_3) + add)
153
28.9M
                                        >> shift;
154
28.9M
        pi4_temp[2 * trans_size] = (29 * c[2] + 55 * c[0] - c[3] + add) >> shift;
155
28.9M
        pi4_temp[3 * trans_size] = (55 * c[2] - 29 * c[1] + c[3] + add) >> shift;
156
157
28.9M
        pu1_src += src_strd;
158
28.9M
        pu1_pred += pred_strd;
159
28.9M
        pi4_temp++;
160
28.9M
    }
161
162
7.23M
    pi4_temp = pi4_tmp_orig;
163
164
    /* Forward transform 2nd stage */
165
7.23M
    shift = 8; // log2(iHeight) + 6
166
7.23M
    add = 1 << (shift - 1);
167
168
36.1M
    for(i = 0; i < TRANS_SIZE_4; i++)
169
28.9M
    {
170
        // Intermediate Variables
171
28.9M
        c[0] = pi4_temp[0] + pi4_temp[3];
172
28.9M
        c[1] = pi4_temp[1] + pi4_temp[3];
173
28.9M
        c[2] = pi4_temp[0] - pi4_temp[1];
174
28.9M
        c[3] = 74 * pi4_temp[2];
175
176
28.9M
        pi2_dst[0] = (29 * c[0] + 55 * c[1] + c[3] + add) >> shift;
177
28.9M
        pi2_dst[dst_strd] = (74 * (pi4_temp[0] + pi4_temp[1] - pi4_temp[3]) + add)
178
28.9M
                        >> shift;
179
28.9M
        pi2_dst[2 * dst_strd] = (29 * c[2] + 55 * c[0] - c[3] + add) >> shift;
180
28.9M
        pi2_dst[3 * dst_strd] = (55 * c[2] - 29 * c[1] + c[3] + add) >> shift;
181
182
28.9M
        pi4_temp += trans_size;
183
28.9M
        pi2_dst++;
184
28.9M
    }
185
186
7.23M
    return u4_blk_sad;
187
7.23M
}
188
189
/**
190
 *******************************************************************************
191
 *
192
 * @brief
193
 *  This function performs residue calculation and forward  transform on
194
 * input pixels
195
 *
196
 * @par Description:
197
 *  Performs residue calculation by subtracting source and  prediction and
198
 * followed by forward transform
199
 *
200
 * @param[in] pu1_src
201
 *  Input 4x4 pixels
202
 *
203
 * @param[in] pu1_pred
204
 *  Prediction data
205
 *
206
 * @param[in] pi2_tmp
207
 *  Temporary buffer of size 4x4
208
 *
209
 * @param[out] pi2_dst
210
 *  Output 4x4 coefficients
211
 *
212
 * @param[in] src_strd
213
 *  Input stride
214
 *
215
 * @param[in] pred_strd
216
 *  Prediction Stride
217
 *
218
 * @param[in] dst_strd
219
 *  Output Stride
220
 *
221
 * @param[in] e_chroma_plane
222
 *  Enum singalling chroma plane
223
 *
224
 * @returns  Void
225
 *
226
 * @remarks
227
 *  None
228
 *
229
 *******************************************************************************
230
 */
231
232
UWORD32 ihevc_resi_trans_4x4(UWORD8 *pu1_src,
233
                          UWORD8 *pu1_pred,
234
                          WORD32 *pi4_temp,
235
                          WORD16 *pi2_dst,
236
                          WORD32 src_strd,
237
                          WORD32 pred_strd,
238
                          WORD32 dst_strd,
239
                          CHROMA_PLANE_ID_T e_chroma_plane)
240
2.77M
{
241
2.77M
    WORD32 i;
242
2.77M
    WORD32 e[2], o[2];
243
2.77M
    WORD32 add, shift;
244
2.77M
    WORD32 trans_size;
245
2.77M
    WORD32 *pi4_tmp_orig;
246
2.77M
    WORD16 *pi2_dst_orig;
247
2.77M
    UWORD32 u4_blk_sad=0;
248
2.77M
    WORD32 chroma_flag = 0;
249
250
2.77M
    if (e_chroma_plane != NULL_PLANE)
251
2.20M
    {
252
2.20M
        chroma_flag = 1;
253
2.20M
        pu1_src += e_chroma_plane;
254
2.20M
        pu1_pred += e_chroma_plane;
255
2.20M
    }
256
257
2.77M
    pi2_dst_orig = pi2_dst;
258
2.77M
    pi4_tmp_orig = pi4_temp;
259
2.77M
    trans_size = TRANS_SIZE_4;
260
261
    /* Residue + Forward Transform 1st stage */
262
2.77M
    shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement
263
2.77M
    add = 1 << (shift - 1);
264
265
13.8M
    for(i = 0; i < trans_size; i++)
266
11.1M
    {
267
11.1M
        WORD32 resi_tmp_1, resi_tmp_2;
268
269
        /* e and o */
270
11.1M
        resi_tmp_1 = pu1_src[0 + 0*chroma_flag] - pu1_pred[0 + 0*chroma_flag];
271
11.1M
        resi_tmp_2 = pu1_src[3 + 3*chroma_flag] - pu1_pred[3 + 3*chroma_flag];
272
11.1M
        e[0] = resi_tmp_1 + resi_tmp_2;
273
11.1M
        o[0] = resi_tmp_1 - resi_tmp_2;
274
11.1M
        u4_blk_sad += abs(resi_tmp_1);
275
11.1M
        u4_blk_sad += abs(resi_tmp_2);
276
277
11.1M
        resi_tmp_1 = pu1_src[1 + 1*chroma_flag] - pu1_pred[1 + 1*chroma_flag];
278
11.1M
        resi_tmp_2 = pu1_src[2 + 2*chroma_flag] - pu1_pred[2 + 2*chroma_flag];
279
11.1M
        e[1] = resi_tmp_1 + resi_tmp_2;
280
11.1M
        o[1] = resi_tmp_1 - resi_tmp_2;
281
11.1M
        u4_blk_sad += abs(resi_tmp_1);
282
11.1M
        u4_blk_sad += abs(resi_tmp_2);
283
284
11.1M
        pi4_temp[0] = (g_ai2_ihevc_trans_4[0][0] * e[0]
285
11.1M
                        + g_ai2_ihevc_trans_4[0][1] * e[1]);// + add) >> shift;
286
11.1M
        pi4_temp[2 * trans_size] = (g_ai2_ihevc_trans_4[2][0] * e[0]
287
11.1M
                        + g_ai2_ihevc_trans_4[2][1] * e[1]);// + add) >> shift;
288
11.1M
        pi4_temp[trans_size] = (g_ai2_ihevc_trans_4[1][0] * o[0]
289
11.1M
                        + g_ai2_ihevc_trans_4[1][1] * o[1]);// + add) >> shift;
290
11.1M
        pi4_temp[3 * trans_size] = (g_ai2_ihevc_trans_4[3][0] * o[0]
291
11.1M
                        + g_ai2_ihevc_trans_4[3][1] * o[1]);// + add) >> shift;
292
293
11.1M
        pu1_src += src_strd;
294
11.1M
        pu1_pred += pred_strd;
295
11.1M
        pi4_temp++;
296
11.1M
    }
297
298
2.77M
    pi4_temp = pi4_tmp_orig;
299
    /* Forward Transform 2nd stage */
300
2.77M
    shift = 9; // log2(iHeight) + 6
301
2.77M
    add = 1 << (shift - 1);
302
303
13.8M
    for(i = 0; i < trans_size; i++)
304
11.1M
    {
305
306
        /* e and o */
307
11.1M
        e[0] = pi4_temp[0] + pi4_temp[3];
308
11.1M
        o[0] = pi4_temp[0] - pi4_temp[3];
309
11.1M
        e[1] = pi4_temp[1] + pi4_temp[2];
310
11.1M
        o[1] = pi4_temp[1] - pi4_temp[2];
311
312
11.1M
        pi2_dst[0] = (g_ai2_ihevc_trans_4[0][0] * e[0]
313
11.1M
                        + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift;
314
11.1M
        pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_4[2][0] * e[0]
315
11.1M
                        + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift;
316
11.1M
        pi2_dst[dst_strd] = (g_ai2_ihevc_trans_4[1][0] * o[0]
317
11.1M
                        + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift;
318
11.1M
        pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_4[3][0] * o[0]
319
11.1M
                        + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift;
320
321
11.1M
        pi4_temp += trans_size;
322
11.1M
        pi2_dst++;
323
11.1M
    }
324
325
2.77M
    return u4_blk_sad;
326
2.77M
}
327
328
void ihevc_resi_trans_4x4_16bit(WORD16 *pi2_src,
329
                          UWORD8 *pu1_pred,
330
                          WORD16 *pi2_tmp,
331
                          WORD16 *pi2_dst,
332
                          WORD32 src_strd,
333
                          WORD32 pred_strd,
334
                          WORD32 dst_strd)
335
0
{
336
0
    WORD32 i;
337
0
    WORD32 e[2], o[2];
338
0
    WORD32 add, shift;
339
0
    WORD32 trans_size;
340
0
    WORD16 *pi2_tmp_orig;
341
0
    WORD16 *pi2_dst_orig;
342
343
0
    pi2_dst_orig = pi2_dst;
344
0
    pi2_tmp_orig = pi2_tmp;
345
0
    trans_size = TRANS_SIZE_4;
346
347
    /* Residue + Forward Transform 1st stage */
348
0
    shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement
349
0
    add = 1 << (shift - 1);
350
351
0
    for(i = 0; i < trans_size; i++)
352
0
    {
353
0
        WORD32 resi_tmp_1, resi_tmp_2;
354
355
        /* e and o */
356
0
        resi_tmp_1 = pi2_src[0] - pu1_pred[0];
357
0
        resi_tmp_2 = pi2_src[3] - pu1_pred[3];
358
0
        e[0] = resi_tmp_1 + resi_tmp_2;
359
0
        o[0] = resi_tmp_1 - resi_tmp_2;
360
361
0
        resi_tmp_1 = pi2_src[1] - pu1_pred[1];
362
0
        resi_tmp_2 = pi2_src[2] - pu1_pred[2];
363
0
        e[1] = resi_tmp_1 + resi_tmp_2;
364
0
        o[1] = resi_tmp_1 - resi_tmp_2;
365
366
0
        pi2_tmp[0] = (g_ai2_ihevc_trans_4[0][0] * e[0]
367
0
                        + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift;
368
0
        pi2_tmp[2 * trans_size] = (g_ai2_ihevc_trans_4[2][0] * e[0]
369
0
                        + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift;
370
0
        pi2_tmp[trans_size] = (g_ai2_ihevc_trans_4[1][0] * o[0]
371
0
                        + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift;
372
0
        pi2_tmp[3 * trans_size] = (g_ai2_ihevc_trans_4[3][0] * o[0]
373
0
                        + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift;
374
375
0
        pi2_src += src_strd;
376
0
        pu1_pred += pred_strd;
377
0
        pi2_tmp++;
378
0
    }
379
380
0
    pi2_tmp = pi2_tmp_orig;
381
    /* Forward Transform 2nd stage */
382
0
    shift = 8; // log2(iHeight) + 6
383
0
    add = 1 << (shift - 1);
384
385
0
    for(i = 0; i < trans_size; i++)
386
0
    {
387
388
        /* e and o */
389
0
        e[0] = pi2_tmp[0] + pi2_tmp[3];
390
0
        o[0] = pi2_tmp[0] - pi2_tmp[3];
391
0
        e[1] = pi2_tmp[1] + pi2_tmp[2];
392
0
        o[1] = pi2_tmp[1] - pi2_tmp[2];
393
394
0
        pi2_dst[0] = (g_ai2_ihevc_trans_4[0][0] * e[0]
395
0
                        + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift;
396
0
        pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_4[2][0] * e[0]
397
0
                        + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift;
398
0
        pi2_dst[dst_strd] = (g_ai2_ihevc_trans_4[1][0] * o[0]
399
0
                        + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift;
400
0
        pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_4[3][0] * o[0]
401
0
                        + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift;
402
403
0
        pi2_tmp += trans_size;
404
0
        pi2_dst++;
405
0
    }
406
0
}
407
/**
408
 *******************************************************************************
409
 *
410
 * @brief
411
 *  This function performs residue calculation and forward  transform on
412
 * input pixels
413
 *
414
 * @par Description:
415
 *  Performs residue calculation by subtracting source and  prediction and
416
 * followed by forward transform
417
 *
418
 * @param[in] pu1_src
419
 *  Input 8x8 pixels
420
 *
421
 * @param[in] pu1_pred
422
 *  Prediction data
423
 *
424
 * @param[in] pi2_tmp
425
 *  Temporary buffer of size 8x8
426
 *
427
 * @param[out] pi2_dst
428
 *  Output 8x8 coefficients
429
 *
430
 * @param[in] src_strd
431
 *  Input stride
432
 *
433
 * @param[in] pred_strd
434
 *  Prediction Stride
435
 *
436
 * @param[in] dst_strd
437
 *  Output Stride
438
 *
439
 * @param[in] e_chroma_plane
440
 *  Enum singalling chroma plane
441
 *
442
 * @returns  Void
443
 *
444
 * @remarks
445
 *  None
446
 *
447
 *******************************************************************************
448
 */
449
450
UWORD32 ihevc_resi_trans_8x8(UWORD8 *pu1_src,
451
                          UWORD8 *pu1_pred,
452
                          WORD32 *pi4_temp,
453
                          WORD16 *pi2_dst,
454
                          WORD32 src_strd,
455
                          WORD32 pred_strd,
456
                          WORD32 dst_strd,
457
                          CHROMA_PLANE_ID_T e_chroma_plane)
458
1.55M
{
459
1.55M
    WORD32 i, k;
460
1.55M
    WORD32 e[4], o[4];
461
1.55M
    WORD32 ee[2], eo[2];
462
1.55M
    WORD32 add, shift;
463
1.55M
    WORD32 trans_size;
464
1.55M
    WORD32 *pi4_tmp_orig;
465
//    WORD16 *pi2_tmp;
466
1.55M
    WORD16 *pi2_dst_orig;
467
1.55M
    UWORD32 u4_blk_sad=0;
468
1.55M
    WORD32 chroma_flag = 0;
469
470
1.55M
    if (e_chroma_plane != NULL_PLANE)
471
461k
    {
472
461k
        chroma_flag = 1;
473
461k
        pu1_src += e_chroma_plane;
474
461k
        pu1_pred += e_chroma_plane;
475
461k
    }
476
477
1.55M
    pi2_dst_orig = pi2_dst;
478
1.55M
    pi4_tmp_orig = pi4_temp;
479
1.55M
    trans_size = TRANS_SIZE_8;
480
    /* Residue + Forward Transform 1st stage */
481
1.55M
    shift = 2; // log2(iWidth) - 1 + g_uiBitIncrement
482
1.55M
    add = 1 << (shift - 1);
483
484
14.0M
    for(i = 0; i < trans_size; i++)
485
12.4M
    {
486
12.4M
        WORD32 resi_tmp_1, resi_tmp_2;
487
488
        /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
489
        /* e and o*/
490
62.2M
        for(k = 0; k < 4; k++)
491
49.8M
        {
492
49.8M
            resi_tmp_1 = pu1_src[k*(1+chroma_flag)] - pu1_pred[k*(1+chroma_flag)];
493
49.8M
            resi_tmp_2 = pu1_src[(7-k)*(1+chroma_flag)] - pu1_pred[(7-k)*(1+chroma_flag)];
494
49.8M
            e[k] = resi_tmp_1 + resi_tmp_2;
495
49.8M
            o[k] = resi_tmp_1 - resi_tmp_2;
496
49.8M
            u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2);
497
49.8M
        }
498
        /* ee and eo */
499
12.4M
        ee[0] = e[0] + e[3];
500
12.4M
        eo[0] = e[0] - e[3];
501
12.4M
        ee[1] = e[1] + e[2];
502
12.4M
        eo[1] = e[1] - e[2];
503
504
12.4M
        pi4_temp[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0]
505
12.4M
                        + g_ai2_ihevc_trans_8[0][1] * ee[1]);// + add) >> shift;
506
12.4M
        pi4_temp[4 * trans_size] = (g_ai2_ihevc_trans_8[4][0] * ee[0]
507
12.4M
                        + g_ai2_ihevc_trans_8[4][1] * ee[1]);// + add) >> shift;
508
12.4M
        pi4_temp[2 * trans_size] = (g_ai2_ihevc_trans_8[2][0] * eo[0]
509
12.4M
                        + g_ai2_ihevc_trans_8[2][1] * eo[1]);// + add) >> shift;
510
12.4M
        pi4_temp[6 * trans_size] = (g_ai2_ihevc_trans_8[6][0] * eo[0]
511
12.4M
                        + g_ai2_ihevc_trans_8[6][1] * eo[1]);// + add) >> shift;
512
513
12.4M
        pi4_temp[trans_size] = (g_ai2_ihevc_trans_8[1][0] * o[0]
514
12.4M
                        + g_ai2_ihevc_trans_8[1][1] * o[1]
515
12.4M
                        + g_ai2_ihevc_trans_8[1][2] * o[2]
516
12.4M
                        + g_ai2_ihevc_trans_8[1][3] * o[3]);// + add) >> shift;
517
12.4M
        pi4_temp[3 * trans_size] = (g_ai2_ihevc_trans_8[3][0] * o[0]
518
12.4M
                        + g_ai2_ihevc_trans_8[3][1] * o[1]
519
12.4M
                        + g_ai2_ihevc_trans_8[3][2] * o[2]
520
12.4M
                        + g_ai2_ihevc_trans_8[3][3] * o[3]);// + add) >> shift;
521
12.4M
        pi4_temp[5 * trans_size] = (g_ai2_ihevc_trans_8[5][0] * o[0]
522
12.4M
                        + g_ai2_ihevc_trans_8[5][1] * o[1]
523
12.4M
                        + g_ai2_ihevc_trans_8[5][2] * o[2]
524
12.4M
                        + g_ai2_ihevc_trans_8[5][3] * o[3]);// + add) >> shift;
525
12.4M
        pi4_temp[7 * trans_size] = (g_ai2_ihevc_trans_8[7][0] * o[0]
526
12.4M
                        + g_ai2_ihevc_trans_8[7][1] * o[1]
527
12.4M
                        + g_ai2_ihevc_trans_8[7][2] * o[2]
528
12.4M
                        + g_ai2_ihevc_trans_8[7][3] * o[3]);// + add) >> shift;
529
530
12.4M
        pu1_src += src_strd;
531
12.4M
        pu1_pred += pred_strd;
532
12.4M
        pi4_temp++;
533
12.4M
    }
534
535
1.55M
    pi4_temp = pi4_tmp_orig;
536
    /* Forward Transform 2nd stage */
537
1.55M
    shift = 11; // log2(iHeight) + 6
538
1.55M
    add = 1 << (shift - 1);
539
540
14.0M
    for(i = 0; i < trans_size; i++)
541
12.4M
    {
542
        /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
543
        /* e and o*/
544
62.2M
        for(k = 0; k < 4; k++)
545
49.8M
        {
546
49.8M
            e[k] = pi4_temp[k] + pi4_temp[7 - k];
547
49.8M
            o[k] = pi4_temp[k] - pi4_temp[7 - k];
548
49.8M
        }
549
        /* ee and eo */
550
12.4M
        ee[0] = e[0] + e[3];
551
12.4M
        eo[0] = e[0] - e[3];
552
12.4M
        ee[1] = e[1] + e[2];
553
12.4M
        eo[1] = e[1] - e[2];
554
555
12.4M
        pi2_dst[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0]
556
12.4M
                        + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift;
557
12.4M
        pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_8[4][0] * ee[0]
558
12.4M
                        + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift;
559
12.4M
        pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_8[2][0] * eo[0]
560
12.4M
                        + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift;
561
12.4M
        pi2_dst[6 * dst_strd] = (g_ai2_ihevc_trans_8[6][0] * eo[0]
562
12.4M
                        + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift;
563
564
12.4M
        pi2_dst[dst_strd] = (g_ai2_ihevc_trans_8[1][0] * o[0]
565
12.4M
                        + g_ai2_ihevc_trans_8[1][1] * o[1]
566
12.4M
                        + g_ai2_ihevc_trans_8[1][2] * o[2]
567
12.4M
                        + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift;
568
12.4M
        pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_8[3][0] * o[0]
569
12.4M
                        + g_ai2_ihevc_trans_8[3][1] * o[1]
570
12.4M
                        + g_ai2_ihevc_trans_8[3][2] * o[2]
571
12.4M
                        + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift;
572
12.4M
        pi2_dst[5 * dst_strd] = (g_ai2_ihevc_trans_8[5][0] * o[0]
573
12.4M
                        + g_ai2_ihevc_trans_8[5][1] * o[1]
574
12.4M
                        + g_ai2_ihevc_trans_8[5][2] * o[2]
575
12.4M
                        + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift;
576
12.4M
        pi2_dst[7 * dst_strd] = (g_ai2_ihevc_trans_8[7][0] * o[0]
577
12.4M
                        + g_ai2_ihevc_trans_8[7][1] * o[1]
578
12.4M
                        + g_ai2_ihevc_trans_8[7][2] * o[2]
579
12.4M
                        + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift;
580
581
12.4M
        pi4_temp += trans_size;
582
12.4M
        pi2_dst++;
583
12.4M
    }
584
585
1.55M
    return u4_blk_sad;
586
1.55M
}
587
588
void ihevc_resi_trans_8x8_16bit(WORD16 *pi2_src,
589
                          UWORD8 *pu1_pred,
590
                          WORD16 *pi2_tmp,
591
                          WORD16 *pi2_dst,
592
                          WORD32 src_strd,
593
                          WORD32 pred_strd,
594
                          WORD32 dst_strd)
595
0
{
596
0
    WORD32 i, k;
597
0
    WORD32 e[4], o[4];
598
0
    WORD32 ee[2], eo[2];
599
0
    WORD32 add, shift;
600
0
    WORD32 trans_size;
601
0
    WORD16 *pi2_tmp_orig;
602
0
    WORD16 *pi2_dst_orig;
603
604
0
    pi2_dst_orig = pi2_dst;
605
0
    pi2_tmp_orig = pi2_tmp;
606
0
    trans_size = TRANS_SIZE_8;
607
    /* Residue + Forward Transform 1st stage */
608
0
    shift = 2; // log2(iWidth) - 1 + g_uiBitIncrement
609
0
    add = 1 << (shift - 1);
610
611
0
    for(i = 0; i < trans_size; i++)
612
0
    {
613
0
        WORD32 resi_tmp_1, resi_tmp_2;
614
615
        /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
616
        /* e and o*/
617
0
        for(k = 0; k < 4; k++)
618
0
        {
619
0
            resi_tmp_1 = pi2_src[k] - pu1_pred[k];
620
0
            resi_tmp_2 = pi2_src[7 - k] - pu1_pred[7 - k];
621
0
            e[k] = resi_tmp_1 + resi_tmp_2;
622
0
            o[k] = resi_tmp_1 - resi_tmp_2;
623
0
        }
624
        /* ee and eo */
625
0
        ee[0] = e[0] + e[3];
626
0
        eo[0] = e[0] - e[3];
627
0
        ee[1] = e[1] + e[2];
628
0
        eo[1] = e[1] - e[2];
629
630
0
        pi2_tmp[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0]
631
0
                        + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift;
632
0
        pi2_tmp[4 * trans_size] = (g_ai2_ihevc_trans_8[4][0] * ee[0]
633
0
                        + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift;
634
0
        pi2_tmp[2 * trans_size] = (g_ai2_ihevc_trans_8[2][0] * eo[0]
635
0
                        + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift;
636
0
        pi2_tmp[6 * trans_size] = (g_ai2_ihevc_trans_8[6][0] * eo[0]
637
0
                        + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift;
638
639
0
        pi2_tmp[trans_size] = (g_ai2_ihevc_trans_8[1][0] * o[0]
640
0
                        + g_ai2_ihevc_trans_8[1][1] * o[1]
641
0
                        + g_ai2_ihevc_trans_8[1][2] * o[2]
642
0
                        + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift;
643
0
        pi2_tmp[3 * trans_size] = (g_ai2_ihevc_trans_8[3][0] * o[0]
644
0
                        + g_ai2_ihevc_trans_8[3][1] * o[1]
645
0
                        + g_ai2_ihevc_trans_8[3][2] * o[2]
646
0
                        + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift;
647
0
        pi2_tmp[5 * trans_size] = (g_ai2_ihevc_trans_8[5][0] * o[0]
648
0
                        + g_ai2_ihevc_trans_8[5][1] * o[1]
649
0
                        + g_ai2_ihevc_trans_8[5][2] * o[2]
650
0
                        + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift;
651
0
        pi2_tmp[7 * trans_size] = (g_ai2_ihevc_trans_8[7][0] * o[0]
652
0
                        + g_ai2_ihevc_trans_8[7][1] * o[1]
653
0
                        + g_ai2_ihevc_trans_8[7][2] * o[2]
654
0
                        + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift;
655
656
0
        pi2_src += src_strd;
657
0
        pu1_pred += pred_strd;
658
0
        pi2_tmp++;
659
0
    }
660
661
0
    pi2_tmp = pi2_tmp_orig;
662
    /* Forward Transform 2nd stage */
663
0
    shift = 9; // log2(iHeight) + 6
664
0
    add = 1 << (shift - 1);
665
666
0
    for(i = 0; i < trans_size; i++)
667
0
    {
668
        /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
669
        /* e and o*/
670
0
        for(k = 0; k < 4; k++)
671
0
        {
672
0
            e[k] = pi2_tmp[k] + pi2_tmp[7 - k];
673
0
            o[k] = pi2_tmp[k] - pi2_tmp[7 - k];
674
0
        }
675
        /* ee and eo */
676
0
        ee[0] = e[0] + e[3];
677
0
        eo[0] = e[0] - e[3];
678
0
        ee[1] = e[1] + e[2];
679
0
        eo[1] = e[1] - e[2];
680
681
0
        pi2_dst[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0]
682
0
                        + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift;
683
0
        pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_8[4][0] * ee[0]
684
0
                        + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift;
685
0
        pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_8[2][0] * eo[0]
686
0
                        + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift;
687
0
        pi2_dst[6 * dst_strd] = (g_ai2_ihevc_trans_8[6][0] * eo[0]
688
0
                        + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift;
689
690
0
        pi2_dst[dst_strd] = (g_ai2_ihevc_trans_8[1][0] * o[0]
691
0
                        + g_ai2_ihevc_trans_8[1][1] * o[1]
692
0
                        + g_ai2_ihevc_trans_8[1][2] * o[2]
693
0
                        + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift;
694
0
        pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_8[3][0] * o[0]
695
0
                        + g_ai2_ihevc_trans_8[3][1] * o[1]
696
0
                        + g_ai2_ihevc_trans_8[3][2] * o[2]
697
0
                        + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift;
698
0
        pi2_dst[5 * dst_strd] = (g_ai2_ihevc_trans_8[5][0] * o[0]
699
0
                        + g_ai2_ihevc_trans_8[5][1] * o[1]
700
0
                        + g_ai2_ihevc_trans_8[5][2] * o[2]
701
0
                        + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift;
702
0
        pi2_dst[7 * dst_strd] = (g_ai2_ihevc_trans_8[7][0] * o[0]
703
0
                        + g_ai2_ihevc_trans_8[7][1] * o[1]
704
0
                        + g_ai2_ihevc_trans_8[7][2] * o[2]
705
0
                        + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift;
706
707
0
        pi2_tmp += trans_size;
708
0
        pi2_dst++;
709
0
    }
710
0
}
711
/**
712
 *******************************************************************************
713
 *
714
 * @brief
715
 *  This function performs residue calculation and forward  transform on
716
 * input pixels
717
 *
718
 * @par Description:
719
 *  Performs residue calculation by subtracting source and  prediction and
720
 * followed by forward transform
721
 *
722
 * @param[in] pu1_src
723
 *  Input 16x16 pixels
724
 *
725
 * @param[in] pu1_pred
726
 *  Prediction data
727
 *
728
 * @param[in] pi2_tmp
729
 *  Temporary buffer of size 16x16
730
 *
731
 * @param[out] pi2_dst
732
 *  Output 16x16 coefficients
733
 *
734
 * @param[in] src_strd
735
 *  Input stride
736
 *
737
 * @param[in] pred_strd
738
 *  Prediction Stride
739
 *
740
 * @param[in] dst_strd
741
 *  Output Stride
742
 *
743
 * @param[in] e_chroma_plane
744
 *  Enum singalling chroma plane
745
 *
746
 * @returns  Void
747
 *
748
 * @remarks
749
 *  None
750
 *
751
 *******************************************************************************
752
 */
753
754
UWORD32 ihevc_resi_trans_16x16(UWORD8 *pu1_src,
755
                            UWORD8 *pu1_pred,
756
                            WORD32 *pi4_temp,
757
                            WORD16 *pi2_dst,
758
                            WORD32 src_strd,
759
                            WORD32 pred_strd,
760
                            WORD32 dst_strd,
761
                            CHROMA_PLANE_ID_T e_chroma_plane)
762
431k
{
763
431k
    WORD32 i, k;
764
431k
    WORD32 e[8], o[8];
765
431k
    WORD32 ee[4], eo[4];
766
431k
    WORD32 eee[2], eeo[2];
767
431k
    WORD32 add, shift;
768
431k
    WORD32 trans_size;
769
431k
    WORD32 *pi4_tmp_orig;
770
431k
    WORD16 *pi2_dst_orig;
771
431k
    UWORD32 u4_blk_sad = 0;
772
431k
    WORD32 chroma_flag = 0;
773
774
431k
    if (e_chroma_plane != NULL_PLANE)
775
125k
    {
776
125k
        chroma_flag = 1;
777
125k
        pu1_src += e_chroma_plane;
778
125k
        pu1_pred += e_chroma_plane;
779
125k
    }
780
781
431k
    pi2_dst_orig = pi2_dst;
782
431k
    pi4_tmp_orig = pi4_temp;
783
431k
    trans_size = TRANS_SIZE_16;
784
    /* Residue + Forward Transform 1st stage */
785
431k
    shift = 3; // log2(iWidth) - 1 + g_uiBitIncrement
786
431k
    add = 1 << (shift - 1);
787
788
7.33M
    for(i = 0; i < trans_size; i++)
789
6.90M
    {
790
6.90M
        WORD32 resi_tmp_1, resi_tmp_2;
791
        /* e and o*/
792
62.1M
        for(k = 0; k < 8; k++)
793
55.2M
        {
794
55.2M
            resi_tmp_1 = pu1_src[k*(1+chroma_flag)] - pu1_pred[k*(1+chroma_flag)];
795
55.2M
            resi_tmp_2 = pu1_src[(15-k)*(1+chroma_flag)] - pu1_pred[(15-k)*(1+chroma_flag)];
796
55.2M
            e[k] = resi_tmp_1 + resi_tmp_2;
797
55.2M
            o[k] = resi_tmp_1 - resi_tmp_2;
798
55.2M
            u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2);
799
55.2M
        }
800
        /* ee and eo */
801
34.5M
        for(k = 0; k < 4; k++)
802
27.6M
        {
803
27.6M
            ee[k] = e[k] + e[7 - k];
804
27.6M
            eo[k] = e[k] - e[7 - k];
805
27.6M
        }
806
        /* eee and eeo */
807
6.90M
        eee[0] = ee[0] + ee[3];
808
6.90M
        eeo[0] = ee[0] - ee[3];
809
6.90M
        eee[1] = ee[1] + ee[2];
810
6.90M
        eeo[1] = ee[1] - ee[2];
811
812
6.90M
        pi4_temp[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0]
813
6.90M
                        + g_ai2_ihevc_trans_16[0][1] * eee[1]);// + add) >> shift;
814
6.90M
        pi4_temp[8 * trans_size] = (g_ai2_ihevc_trans_16[8][0] * eee[0]
815
6.90M
                        + g_ai2_ihevc_trans_16[8][1] * eee[1]);// + add) >> shift;
816
6.90M
        pi4_temp[4 * trans_size] = (g_ai2_ihevc_trans_16[4][0] * eeo[0]
817
6.90M
                        + g_ai2_ihevc_trans_16[4][1] * eeo[1]);// + add) >> shift;
818
6.90M
        pi4_temp[12 * trans_size] = (g_ai2_ihevc_trans_16[12][0] * eeo[0]
819
6.90M
                        + g_ai2_ihevc_trans_16[12][1] * eeo[1]);// + add) >> shift;
820
821
34.5M
        for(k = 2; k < 16; k += 4)
822
27.6M
        {
823
27.6M
            pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * eo[0]
824
27.6M
                            + g_ai2_ihevc_trans_16[k][1] * eo[1]
825
27.6M
                            + g_ai2_ihevc_trans_16[k][2] * eo[2]
826
27.6M
                            + g_ai2_ihevc_trans_16[k][3] * eo[3]);// + add)>> shift;
827
828
27.6M
        }
829
830
62.1M
        for(k = 1; k < 16; k += 2)
831
55.2M
        {
832
55.2M
            pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * o[0]
833
55.2M
                            + g_ai2_ihevc_trans_16[k][1] * o[1]
834
55.2M
                            + g_ai2_ihevc_trans_16[k][2] * o[2]
835
55.2M
                            + g_ai2_ihevc_trans_16[k][3] * o[3]
836
55.2M
                            + g_ai2_ihevc_trans_16[k][4] * o[4]
837
55.2M
                            + g_ai2_ihevc_trans_16[k][5] * o[5]
838
55.2M
                            + g_ai2_ihevc_trans_16[k][6] * o[6]
839
55.2M
                            + g_ai2_ihevc_trans_16[k][7] * o[7]);// + add) >> shift;
840
55.2M
        }
841
6.90M
        pu1_src += src_strd;
842
6.90M
        pu1_pred += pred_strd;
843
6.90M
        pi4_temp++;
844
6.90M
    }
845
846
431k
    pi4_temp = pi4_tmp_orig;
847
    /* Forward Transform 2nd stage */
848
431k
    shift = 13; // log2(iHeight) + 6
849
431k
    add = 1 << (shift - 1);
850
851
7.33M
    for(i = 0; i < TRANS_SIZE_16; i++)
852
6.90M
    {
853
        /* e and o*/
854
62.1M
        for(k = 0; k < 8; k++)
855
55.2M
        {
856
55.2M
            e[k] = pi4_temp[k] + pi4_temp[15 - k];
857
55.2M
            o[k] = pi4_temp[k] - pi4_temp[15 - k];
858
55.2M
        }
859
        /* ee and eo */
860
34.5M
        for(k = 0; k < 4; k++)
861
27.6M
        {
862
27.6M
            ee[k] = e[k] + e[7 - k];
863
27.6M
            eo[k] = e[k] - e[7 - k];
864
27.6M
        }
865
        /* eee and eeo */
866
6.90M
        eee[0] = ee[0] + ee[3];
867
6.90M
        eeo[0] = ee[0] - ee[3];
868
6.90M
        eee[1] = ee[1] + ee[2];
869
6.90M
        eeo[1] = ee[1] - ee[2];
870
871
6.90M
        pi2_dst[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0]
872
6.90M
                        + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift;
873
6.90M
        pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_16[8][0] * eee[0]
874
6.90M
                        + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift;
875
6.90M
        pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_16[4][0] * eeo[0]
876
6.90M
                        + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift;
877
6.90M
        pi2_dst[12 * dst_strd] = (g_ai2_ihevc_trans_16[12][0] * eeo[0]
878
6.90M
                        + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift;
879
880
34.5M
        for(k = 2; k < 16; k += 4)
881
27.6M
        {
882
27.6M
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * eo[0]
883
27.6M
                            + g_ai2_ihevc_trans_16[k][1] * eo[1]
884
27.6M
                            + g_ai2_ihevc_trans_16[k][2] * eo[2]
885
27.6M
                            + g_ai2_ihevc_trans_16[k][3] * eo[3] + add)
886
27.6M
                            >> shift;
887
27.6M
        }
888
889
62.1M
        for(k = 1; k < 16; k += 2)
890
55.2M
        {
891
55.2M
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * o[0]
892
55.2M
                            + g_ai2_ihevc_trans_16[k][1] * o[1]
893
55.2M
                            + g_ai2_ihevc_trans_16[k][2] * o[2]
894
55.2M
                            + g_ai2_ihevc_trans_16[k][3] * o[3]
895
55.2M
                            + g_ai2_ihevc_trans_16[k][4] * o[4]
896
55.2M
                            + g_ai2_ihevc_trans_16[k][5] * o[5]
897
55.2M
                            + g_ai2_ihevc_trans_16[k][6] * o[6]
898
55.2M
                            + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift;
899
55.2M
        }
900
901
6.90M
        pi4_temp += trans_size;
902
6.90M
        pi2_dst++;
903
6.90M
    }
904
905
431k
    return u4_blk_sad;
906
431k
}
907
908
909
void ihevc_resi_trans_16x16_16bit(WORD16 *pi2_src,
910
                            UWORD8 *pu1_pred,
911
                            WORD16 *pi2_tmp,
912
                            WORD16 *pi2_dst,
913
                            WORD32 src_strd,
914
                            WORD32 pred_strd,
915
                            WORD32 dst_strd)
916
0
{
917
0
    WORD32 i, k;
918
0
    WORD32 e[8], o[8];
919
0
    WORD32 ee[4], eo[4];
920
0
    WORD32 eee[2], eeo[2];
921
0
    WORD32 add, shift;
922
0
    WORD32 trans_size;
923
0
    WORD16 *pi2_tmp_orig;
924
0
    WORD16 *pi2_dst_orig;
925
926
0
    pi2_dst_orig = pi2_dst;
927
0
    pi2_tmp_orig = pi2_tmp;
928
0
    trans_size = TRANS_SIZE_16;
929
    /* Residue + Forward Transform 1st stage */
930
0
    shift = 3; // log2(iWidth) - 1 + g_uiBitIncrement
931
0
    add = 1 << (shift - 1);
932
933
0
    for(i = 0; i < trans_size; i++)
934
0
    {
935
0
        WORD32 resi_tmp_1, resi_tmp_2;
936
        /* e and o*/
937
0
        for(k = 0; k < 8; k++)
938
0
        {
939
0
            resi_tmp_1 = pi2_src[k] - pu1_pred[k];
940
0
            resi_tmp_2 = pi2_src[15 - k] - pu1_pred[15 - k];
941
0
            e[k] = resi_tmp_1 + resi_tmp_2;
942
0
            o[k] = resi_tmp_1 - resi_tmp_2;
943
0
        }
944
        /* ee and eo */
945
0
        for(k = 0; k < 4; k++)
946
0
        {
947
0
            ee[k] = e[k] + e[7 - k];
948
0
            eo[k] = e[k] - e[7 - k];
949
0
        }
950
        /* eee and eeo */
951
0
        eee[0] = ee[0] + ee[3];
952
0
        eeo[0] = ee[0] - ee[3];
953
0
        eee[1] = ee[1] + ee[2];
954
0
        eeo[1] = ee[1] - ee[2];
955
956
0
        pi2_tmp[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0]
957
0
                        + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift;
958
0
        pi2_tmp[8 * trans_size] = (g_ai2_ihevc_trans_16[8][0] * eee[0]
959
0
                        + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift;
960
0
        pi2_tmp[4 * trans_size] = (g_ai2_ihevc_trans_16[4][0] * eeo[0]
961
0
                        + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift;
962
0
        pi2_tmp[12 * trans_size] = (g_ai2_ihevc_trans_16[12][0] * eeo[0]
963
0
                        + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift;
964
965
0
        for(k = 2; k < 16; k += 4)
966
0
        {
967
0
            pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * eo[0]
968
0
                            + g_ai2_ihevc_trans_16[k][1] * eo[1]
969
0
                            + g_ai2_ihevc_trans_16[k][2] * eo[2]
970
0
                            + g_ai2_ihevc_trans_16[k][3] * eo[3] + add)
971
0
                            >> shift;
972
0
        }
973
974
0
        for(k = 1; k < 16; k += 2)
975
0
        {
976
0
            pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * o[0]
977
0
                            + g_ai2_ihevc_trans_16[k][1] * o[1]
978
0
                            + g_ai2_ihevc_trans_16[k][2] * o[2]
979
0
                            + g_ai2_ihevc_trans_16[k][3] * o[3]
980
0
                            + g_ai2_ihevc_trans_16[k][4] * o[4]
981
0
                            + g_ai2_ihevc_trans_16[k][5] * o[5]
982
0
                            + g_ai2_ihevc_trans_16[k][6] * o[6]
983
0
                            + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift;
984
0
        }
985
0
        pi2_src += src_strd;
986
0
        pu1_pred += pred_strd;
987
0
        pi2_tmp++;
988
0
    }
989
990
0
    pi2_tmp = pi2_tmp_orig;
991
    /* Forward Transform 2nd stage */
992
0
    shift = 10; // log2(iHeight) + 6
993
0
    add = 1 << (shift - 1);
994
995
0
    for(i = 0; i < TRANS_SIZE_16; i++)
996
0
    {
997
        /* e and o*/
998
0
        for(k = 0; k < 8; k++)
999
0
        {
1000
0
            e[k] = pi2_tmp[k] + pi2_tmp[15 - k];
1001
0
            o[k] = pi2_tmp[k] - pi2_tmp[15 - k];
1002
0
        }
1003
        /* ee and eo */
1004
0
        for(k = 0; k < 4; k++)
1005
0
        {
1006
0
            ee[k] = e[k] + e[7 - k];
1007
0
            eo[k] = e[k] - e[7 - k];
1008
0
        }
1009
        /* eee and eeo */
1010
0
        eee[0] = ee[0] + ee[3];
1011
0
        eeo[0] = ee[0] - ee[3];
1012
0
        eee[1] = ee[1] + ee[2];
1013
0
        eeo[1] = ee[1] - ee[2];
1014
1015
0
        pi2_dst[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0]
1016
0
                        + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift;
1017
0
        pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_16[8][0] * eee[0]
1018
0
                        + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift;
1019
0
        pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_16[4][0] * eeo[0]
1020
0
                        + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift;
1021
0
        pi2_dst[12 * dst_strd] = (g_ai2_ihevc_trans_16[12][0] * eeo[0]
1022
0
                        + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift;
1023
1024
0
        for(k = 2; k < 16; k += 4)
1025
0
        {
1026
0
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * eo[0]
1027
0
                            + g_ai2_ihevc_trans_16[k][1] * eo[1]
1028
0
                            + g_ai2_ihevc_trans_16[k][2] * eo[2]
1029
0
                            + g_ai2_ihevc_trans_16[k][3] * eo[3] + add)
1030
0
                            >> shift;
1031
0
        }
1032
1033
0
        for(k = 1; k < 16; k += 2)
1034
0
        {
1035
0
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * o[0]
1036
0
                            + g_ai2_ihevc_trans_16[k][1] * o[1]
1037
0
                            + g_ai2_ihevc_trans_16[k][2] * o[2]
1038
0
                            + g_ai2_ihevc_trans_16[k][3] * o[3]
1039
0
                            + g_ai2_ihevc_trans_16[k][4] * o[4]
1040
0
                            + g_ai2_ihevc_trans_16[k][5] * o[5]
1041
0
                            + g_ai2_ihevc_trans_16[k][6] * o[6]
1042
0
                            + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift;
1043
0
        }
1044
1045
0
        pi2_tmp += trans_size;
1046
0
        pi2_dst++;
1047
0
    }
1048
0
}
1049
1050
/**
1051
 *******************************************************************************
1052
 *
1053
 * @brief
1054
 *  This function performs residue calculation and forward  transform on
1055
 * input pixels
1056
 *
1057
 * @par Description:
1058
 *  Performs residue calculation by subtracting source and  prediction and
1059
 * followed by forward transform
1060
 *
1061
 * @param[in] pu1_src
1062
 *  Input 32x32 pixels
1063
 *
1064
 * @param[in] pu1_pred
1065
 *  Prediction data
1066
 *
1067
 * @param[in] pi2_tmp
1068
 *  Temporary buffer of size 32x32
1069
 *
1070
 * @param[out] pi2_dst
1071
 *  Output 32x32 coefficients
1072
 *
1073
 * @param[in] src_strd
1074
 *  Input stride
1075
 *
1076
 * @param[in] pred_strd
1077
 *  Prediction Stride
1078
 *
1079
 * @param[in] dst_strd
1080
 *  Output Stride
1081
 *
1082
 * @param[in] e_chroma_plane
1083
 *  Enum singalling chroma plane
1084
 *
1085
 * @returns  Void
1086
 *
1087
 * @remarks
1088
 *  None
1089
 *
1090
 *******************************************************************************
1091
 */
1092
1093
UWORD32 ihevc_resi_trans_32x32(UWORD8 *pu1_src,
1094
                            UWORD8 *pu1_pred,
1095
                            WORD32 *pi4_temp,
1096
                            WORD16 *pi2_dst,
1097
                            WORD32 src_strd,
1098
                            WORD32 pred_strd,
1099
                            WORD32 dst_strd,
1100
                            CHROMA_PLANE_ID_T e_chroma_plane)
1101
77.2k
{
1102
77.2k
    WORD32 i, k;
1103
77.2k
    WORD32 e[16], o[16];
1104
77.2k
    WORD32 ee[8], eo[8];
1105
77.2k
    WORD32 eee[4], eeo[4];
1106
77.2k
    WORD32 eeee[2], eeeo[2];
1107
77.2k
    WORD32 add, shift;
1108
77.2k
    WORD32 trans_size;
1109
77.2k
    WORD32 *pi4_tmp_orig;
1110
77.2k
    WORD16 *pi2_dst_orig;
1111
77.2k
    UWORD32 u4_blk_sad = 0 ;
1112
77.2k
    UNUSED(e_chroma_plane);
1113
1114
77.2k
    pi2_dst_orig = pi2_dst;
1115
77.2k
    pi4_tmp_orig = pi4_temp;
1116
77.2k
    trans_size = TRANS_SIZE_32;
1117
    /* Residue + Forward Transform 1st stage */
1118
    /* Made to zero to match with intrinsics */
1119
77.2k
    shift = 0; // 4 : log2(iWidth) - 1 + g_uiBitIncrement
1120
77.2k
    add = 0 ; //1 << (shift - 1);
1121
1122
2.54M
    for(i = 0; i < trans_size; i++)
1123
2.47M
    {
1124
2.47M
        WORD32 resi_tmp_1, resi_tmp_2;
1125
        /* e and o*/
1126
42.0M
        for(k = 0; k < 16; k++)
1127
39.5M
        {
1128
39.5M
            resi_tmp_1 = pu1_src[k] - pu1_pred[k];
1129
39.5M
            resi_tmp_2 = pu1_src[31 - k] - pu1_pred[31 - k];
1130
39.5M
            e[k] = resi_tmp_1 + resi_tmp_2;
1131
39.5M
            o[k] = resi_tmp_1 - resi_tmp_2;
1132
39.5M
            u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2);
1133
39.5M
        }
1134
        /* ee and eo */
1135
22.2M
        for(k = 0; k < 8; k++)
1136
19.7M
        {
1137
19.7M
            ee[k] = e[k] + e[15 - k];
1138
19.7M
            eo[k] = e[k] - e[15 - k];
1139
19.7M
        }
1140
        /* eee and eeo */
1141
12.3M
        for(k = 0; k < 4; k++)
1142
9.88M
        {
1143
9.88M
            eee[k] = ee[k] + ee[7 - k];
1144
9.88M
            eeo[k] = ee[k] - ee[7 - k];
1145
9.88M
        }
1146
        /* eeee and eeeo */
1147
2.47M
        eeee[0] = eee[0] + eee[3];
1148
2.47M
        eeeo[0] = eee[0] - eee[3];
1149
2.47M
        eeee[1] = eee[1] + eee[2];
1150
2.47M
        eeeo[1] = eee[1] - eee[2];
1151
1152
2.47M
        pi4_temp[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0]
1153
2.47M
                        + g_ai2_ihevc_trans_32[0][1] * eeee[1]);// + add) >> shift;
1154
2.47M
        pi4_temp[16 * trans_size] = (g_ai2_ihevc_trans_32[16][0] * eeee[0]
1155
2.47M
                        + g_ai2_ihevc_trans_32[16][1] * eeee[1]);// + add) >> shift;
1156
2.47M
        pi4_temp[8 * trans_size] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0]
1157
2.47M
                        + g_ai2_ihevc_trans_32[8][1] * eeeo[1]);// + add) >> shift;
1158
2.47M
        pi4_temp[24 * trans_size] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0]
1159
2.47M
                        + g_ai2_ihevc_trans_32[24][1] * eeeo[1]);// + add) >> shift;
1160
12.3M
        for(k = 4; k < 32; k += 8)
1161
9.88M
        {
1162
9.88M
            pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eeo[0]
1163
9.88M
                            + g_ai2_ihevc_trans_32[k][1] * eeo[1]
1164
9.88M
                            + g_ai2_ihevc_trans_32[k][2] * eeo[2]
1165
9.88M
                            + g_ai2_ihevc_trans_32[k][3] * eeo[3]);// + add)>> shift;
1166
9.88M
        }
1167
22.2M
        for(k = 2; k < 32; k += 4)
1168
19.7M
        {
1169
19.7M
            pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eo[0]
1170
19.7M
                            + g_ai2_ihevc_trans_32[k][1] * eo[1]
1171
19.7M
                            + g_ai2_ihevc_trans_32[k][2] * eo[2]
1172
19.7M
                            + g_ai2_ihevc_trans_32[k][3] * eo[3]
1173
19.7M
                            + g_ai2_ihevc_trans_32[k][4] * eo[4]
1174
19.7M
                            + g_ai2_ihevc_trans_32[k][5] * eo[5]
1175
19.7M
                            + g_ai2_ihevc_trans_32[k][6] * eo[6]
1176
19.7M
                            + g_ai2_ihevc_trans_32[k][7] * eo[7]);// + add)>> shift;
1177
19.7M
        }
1178
42.0M
        for(k = 1; k < 32; k += 2)
1179
39.5M
        {
1180
39.5M
            pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * o[0]
1181
39.5M
                            + g_ai2_ihevc_trans_32[k][1] * o[1]
1182
39.5M
                            + g_ai2_ihevc_trans_32[k][2] * o[2]
1183
39.5M
                            + g_ai2_ihevc_trans_32[k][3] * o[3]
1184
39.5M
                            + g_ai2_ihevc_trans_32[k][4] * o[4]
1185
39.5M
                            + g_ai2_ihevc_trans_32[k][5] * o[5]
1186
39.5M
                            + g_ai2_ihevc_trans_32[k][6] * o[6]
1187
39.5M
                            + g_ai2_ihevc_trans_32[k][7] * o[7]
1188
39.5M
                            + g_ai2_ihevc_trans_32[k][8] * o[8]
1189
39.5M
                            + g_ai2_ihevc_trans_32[k][9] * o[9]
1190
39.5M
                            + g_ai2_ihevc_trans_32[k][10] * o[10]
1191
39.5M
                            + g_ai2_ihevc_trans_32[k][11] * o[11]
1192
39.5M
                            + g_ai2_ihevc_trans_32[k][12] * o[12]
1193
39.5M
                            + g_ai2_ihevc_trans_32[k][13] * o[13]
1194
39.5M
                            + g_ai2_ihevc_trans_32[k][14] * o[14]
1195
39.5M
                            + g_ai2_ihevc_trans_32[k][15] * o[15]);// + add) >> shift;
1196
39.5M
        }
1197
2.47M
        pu1_src += src_strd;
1198
2.47M
        pu1_pred += pred_strd;
1199
2.47M
        pi4_temp++;
1200
2.47M
    }
1201
1202
77.2k
    pi4_temp = pi4_tmp_orig;
1203
    /* Forward Transform 2nd stage */
1204
77.2k
    shift = 15; // log2(iHeight) + 6
1205
77.2k
    add = 1 << (shift - 1);
1206
1207
2.54M
    for(i = 0; i < TRANS_SIZE_32; i++)
1208
2.47M
    {
1209
        /* e and o*/
1210
42.0M
        for(k = 0; k < 16; k++)
1211
39.5M
        {
1212
39.5M
            e[k] = pi4_temp[k] + pi4_temp[31 - k];
1213
39.5M
            o[k] = pi4_temp[k] - pi4_temp[31 - k];
1214
39.5M
        }
1215
        /* ee and eo */
1216
22.2M
        for(k = 0; k < 8; k++)
1217
19.7M
        {
1218
19.7M
            ee[k] = e[k] + e[15 - k];
1219
19.7M
            eo[k] = e[k] - e[15 - k];
1220
19.7M
        }
1221
        /* eee and eeo */
1222
12.3M
        for(k = 0; k < 4; k++)
1223
9.88M
        {
1224
9.88M
            eee[k] = ee[k] + ee[7 - k];
1225
9.88M
            eeo[k] = ee[k] - ee[7 - k];
1226
9.88M
        }
1227
        /* eeee and eeeo */
1228
2.47M
        eeee[0] = eee[0] + eee[3];
1229
2.47M
        eeeo[0] = eee[0] - eee[3];
1230
2.47M
        eeee[1] = eee[1] + eee[2];
1231
2.47M
        eeeo[1] = eee[1] - eee[2];
1232
1233
2.47M
        pi2_dst[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0]
1234
2.47M
                        + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift;
1235
2.47M
        pi2_dst[16 * dst_strd] = (g_ai2_ihevc_trans_32[16][0] * eeee[0]
1236
2.47M
                        + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift;
1237
2.47M
        pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0]
1238
2.47M
                        + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift;
1239
2.47M
        pi2_dst[24 * dst_strd] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0]
1240
2.47M
                        + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift;
1241
12.3M
        for(k = 4; k < 32; k += 8)
1242
9.88M
        {
1243
9.88M
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eeo[0]
1244
9.88M
                            + g_ai2_ihevc_trans_32[k][1] * eeo[1]
1245
9.88M
                            + g_ai2_ihevc_trans_32[k][2] * eeo[2]
1246
9.88M
                            + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add)
1247
9.88M
                            >> shift;
1248
9.88M
        }
1249
22.2M
        for(k = 2; k < 32; k += 4)
1250
19.7M
        {
1251
19.7M
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eo[0]
1252
19.7M
                            + g_ai2_ihevc_trans_32[k][1] * eo[1]
1253
19.7M
                            + g_ai2_ihevc_trans_32[k][2] * eo[2]
1254
19.7M
                            + g_ai2_ihevc_trans_32[k][3] * eo[3]
1255
19.7M
                            + g_ai2_ihevc_trans_32[k][4] * eo[4]
1256
19.7M
                            + g_ai2_ihevc_trans_32[k][5] * eo[5]
1257
19.7M
                            + g_ai2_ihevc_trans_32[k][6] * eo[6]
1258
19.7M
                            + g_ai2_ihevc_trans_32[k][7] * eo[7] + add)
1259
19.7M
                            >> shift;
1260
19.7M
        }
1261
42.0M
        for(k = 1; k < 32; k += 2)
1262
39.5M
        {
1263
39.5M
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * o[0]
1264
39.5M
                            + g_ai2_ihevc_trans_32[k][1] * o[1]
1265
39.5M
                            + g_ai2_ihevc_trans_32[k][2] * o[2]
1266
39.5M
                            + g_ai2_ihevc_trans_32[k][3] * o[3]
1267
39.5M
                            + g_ai2_ihevc_trans_32[k][4] * o[4]
1268
39.5M
                            + g_ai2_ihevc_trans_32[k][5] * o[5]
1269
39.5M
                            + g_ai2_ihevc_trans_32[k][6] * o[6]
1270
39.5M
                            + g_ai2_ihevc_trans_32[k][7] * o[7]
1271
39.5M
                            + g_ai2_ihevc_trans_32[k][8] * o[8]
1272
39.5M
                            + g_ai2_ihevc_trans_32[k][9] * o[9]
1273
39.5M
                            + g_ai2_ihevc_trans_32[k][10] * o[10]
1274
39.5M
                            + g_ai2_ihevc_trans_32[k][11] * o[11]
1275
39.5M
                            + g_ai2_ihevc_trans_32[k][12] * o[12]
1276
39.5M
                            + g_ai2_ihevc_trans_32[k][13] * o[13]
1277
39.5M
                            + g_ai2_ihevc_trans_32[k][14] * o[14]
1278
39.5M
                            + g_ai2_ihevc_trans_32[k][15] * o[15] + add)
1279
39.5M
                            >> shift;
1280
39.5M
        }
1281
1282
2.47M
        pi4_temp += trans_size;
1283
2.47M
        pi2_dst++;
1284
2.47M
    }
1285
1286
77.2k
    return u4_blk_sad;
1287
77.2k
}
1288
1289
1290
1291
void ihevc_resi_trans_32x32_16bit(WORD16 *pi2_src,
1292
                            UWORD8 *pu1_pred,
1293
                            WORD16 *pi2_tmp,
1294
                            WORD16 *pi2_dst,
1295
                            WORD32 src_strd,
1296
                            WORD32 pred_strd,
1297
                            WORD32 dst_strd)
1298
0
{
1299
0
    WORD32 i, k;
1300
0
    WORD32 e[16], o[16];
1301
0
    WORD32 ee[8], eo[8];
1302
0
    WORD32 eee[4], eeo[4];
1303
0
    WORD32 eeee[2], eeeo[2];
1304
0
    WORD32 add, shift;
1305
0
    WORD32 trans_size;
1306
0
    WORD16 *pi2_tmp_orig;
1307
0
    WORD16 *pi2_dst_orig;
1308
1309
0
    pi2_dst_orig = pi2_dst;
1310
0
    pi2_tmp_orig = pi2_tmp;
1311
0
    trans_size = TRANS_SIZE_32;
1312
    /* Residue + Forward Transform 1st stage */
1313
0
    shift = 4; // log2(iWidth) - 1 + g_uiBitIncrement
1314
0
    add = 1 << (shift - 1);
1315
1316
0
    for(i = 0; i < trans_size; i++)
1317
0
    {
1318
0
        WORD32 resi_tmp_1, resi_tmp_2;
1319
        /* e and o*/
1320
0
        for(k = 0; k < 16; k++)
1321
0
        {
1322
0
            resi_tmp_1 = pi2_src[k] - pu1_pred[k];
1323
0
            resi_tmp_2 = pi2_src[31 - k] - pu1_pred[31 - k];
1324
0
            e[k] = resi_tmp_1 + resi_tmp_2;
1325
0
            o[k] = resi_tmp_1 - resi_tmp_2;
1326
0
        }
1327
        /* ee and eo */
1328
0
        for(k = 0; k < 8; k++)
1329
0
        {
1330
0
            ee[k] = e[k] + e[15 - k];
1331
0
            eo[k] = e[k] - e[15 - k];
1332
0
        }
1333
        /* eee and eeo */
1334
0
        for(k = 0; k < 4; k++)
1335
0
        {
1336
0
            eee[k] = ee[k] + ee[7 - k];
1337
0
            eeo[k] = ee[k] - ee[7 - k];
1338
0
        }
1339
        /* eeee and eeeo */
1340
0
        eeee[0] = eee[0] + eee[3];
1341
0
        eeeo[0] = eee[0] - eee[3];
1342
0
        eeee[1] = eee[1] + eee[2];
1343
0
        eeeo[1] = eee[1] - eee[2];
1344
1345
0
        pi2_tmp[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0]
1346
0
                        + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift;
1347
0
        pi2_tmp[16 * trans_size] = (g_ai2_ihevc_trans_32[16][0] * eeee[0]
1348
0
                        + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift;
1349
0
        pi2_tmp[8 * trans_size] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0]
1350
0
                        + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift;
1351
0
        pi2_tmp[24 * trans_size] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0]
1352
0
                        + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift;
1353
0
        for(k = 4; k < 32; k += 8)
1354
0
        {
1355
0
            pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eeo[0]
1356
0
                            + g_ai2_ihevc_trans_32[k][1] * eeo[1]
1357
0
                            + g_ai2_ihevc_trans_32[k][2] * eeo[2]
1358
0
                            + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add)
1359
0
                            >> shift;
1360
0
        }
1361
0
        for(k = 2; k < 32; k += 4)
1362
0
        {
1363
0
            pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eo[0]
1364
0
                            + g_ai2_ihevc_trans_32[k][1] * eo[1]
1365
0
                            + g_ai2_ihevc_trans_32[k][2] * eo[2]
1366
0
                            + g_ai2_ihevc_trans_32[k][3] * eo[3]
1367
0
                            + g_ai2_ihevc_trans_32[k][4] * eo[4]
1368
0
                            + g_ai2_ihevc_trans_32[k][5] * eo[5]
1369
0
                            + g_ai2_ihevc_trans_32[k][6] * eo[6]
1370
0
                            + g_ai2_ihevc_trans_32[k][7] * eo[7] + add)
1371
0
                            >> shift;
1372
0
        }
1373
0
        for(k = 1; k < 32; k += 2)
1374
0
        {
1375
0
            pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * o[0]
1376
0
                            + g_ai2_ihevc_trans_32[k][1] * o[1]
1377
0
                            + g_ai2_ihevc_trans_32[k][2] * o[2]
1378
0
                            + g_ai2_ihevc_trans_32[k][3] * o[3]
1379
0
                            + g_ai2_ihevc_trans_32[k][4] * o[4]
1380
0
                            + g_ai2_ihevc_trans_32[k][5] * o[5]
1381
0
                            + g_ai2_ihevc_trans_32[k][6] * o[6]
1382
0
                            + g_ai2_ihevc_trans_32[k][7] * o[7]
1383
0
                            + g_ai2_ihevc_trans_32[k][8] * o[8]
1384
0
                            + g_ai2_ihevc_trans_32[k][9] * o[9]
1385
0
                            + g_ai2_ihevc_trans_32[k][10] * o[10]
1386
0
                            + g_ai2_ihevc_trans_32[k][11] * o[11]
1387
0
                            + g_ai2_ihevc_trans_32[k][12] * o[12]
1388
0
                            + g_ai2_ihevc_trans_32[k][13] * o[13]
1389
0
                            + g_ai2_ihevc_trans_32[k][14] * o[14]
1390
0
                            + g_ai2_ihevc_trans_32[k][15] * o[15] + add)
1391
0
                            >> shift;
1392
0
        }
1393
0
        pi2_src += src_strd;
1394
0
        pu1_pred += pred_strd;
1395
0
        pi2_tmp++;
1396
0
    }
1397
1398
0
    pi2_tmp = pi2_tmp_orig;
1399
    /* Forward Transform 2nd stage */
1400
0
    shift = 11; // log2(iHeight) + 6
1401
0
    add = 1 << (shift - 1);
1402
1403
0
    for(i = 0; i < TRANS_SIZE_32; i++)
1404
0
    {
1405
        /* e and o*/
1406
0
        for(k = 0; k < 16; k++)
1407
0
        {
1408
0
            e[k] = pi2_tmp[k] + pi2_tmp[31 - k];
1409
0
            o[k] = pi2_tmp[k] - pi2_tmp[31 - k];
1410
0
        }
1411
        /* ee and eo */
1412
0
        for(k = 0; k < 8; k++)
1413
0
        {
1414
0
            ee[k] = e[k] + e[15 - k];
1415
0
            eo[k] = e[k] - e[15 - k];
1416
0
        }
1417
        /* eee and eeo */
1418
0
        for(k = 0; k < 4; k++)
1419
0
        {
1420
0
            eee[k] = ee[k] + ee[7 - k];
1421
0
            eeo[k] = ee[k] - ee[7 - k];
1422
0
        }
1423
        /* eeee and eeeo */
1424
0
        eeee[0] = eee[0] + eee[3];
1425
0
        eeeo[0] = eee[0] - eee[3];
1426
0
        eeee[1] = eee[1] + eee[2];
1427
0
        eeeo[1] = eee[1] - eee[2];
1428
1429
0
        pi2_dst[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0]
1430
0
                        + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift;
1431
0
        pi2_dst[16 * dst_strd] = (g_ai2_ihevc_trans_32[16][0] * eeee[0]
1432
0
                        + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift;
1433
0
        pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0]
1434
0
                        + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift;
1435
0
        pi2_dst[24 * dst_strd] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0]
1436
0
                        + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift;
1437
0
        for(k = 4; k < 32; k += 8)
1438
0
        {
1439
0
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eeo[0]
1440
0
                            + g_ai2_ihevc_trans_32[k][1] * eeo[1]
1441
0
                            + g_ai2_ihevc_trans_32[k][2] * eeo[2]
1442
0
                            + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add)
1443
0
                            >> shift;
1444
0
        }
1445
0
        for(k = 2; k < 32; k += 4)
1446
0
        {
1447
0
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eo[0]
1448
0
                            + g_ai2_ihevc_trans_32[k][1] * eo[1]
1449
0
                            + g_ai2_ihevc_trans_32[k][2] * eo[2]
1450
0
                            + g_ai2_ihevc_trans_32[k][3] * eo[3]
1451
0
                            + g_ai2_ihevc_trans_32[k][4] * eo[4]
1452
0
                            + g_ai2_ihevc_trans_32[k][5] * eo[5]
1453
0
                            + g_ai2_ihevc_trans_32[k][6] * eo[6]
1454
0
                            + g_ai2_ihevc_trans_32[k][7] * eo[7] + add)
1455
0
                            >> shift;
1456
0
        }
1457
0
        for(k = 1; k < 32; k += 2)
1458
0
        {
1459
0
            pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * o[0]
1460
0
                            + g_ai2_ihevc_trans_32[k][1] * o[1]
1461
0
                            + g_ai2_ihevc_trans_32[k][2] * o[2]
1462
0
                            + g_ai2_ihevc_trans_32[k][3] * o[3]
1463
0
                            + g_ai2_ihevc_trans_32[k][4] * o[4]
1464
0
                            + g_ai2_ihevc_trans_32[k][5] * o[5]
1465
0
                            + g_ai2_ihevc_trans_32[k][6] * o[6]
1466
0
                            + g_ai2_ihevc_trans_32[k][7] * o[7]
1467
0
                            + g_ai2_ihevc_trans_32[k][8] * o[8]
1468
0
                            + g_ai2_ihevc_trans_32[k][9] * o[9]
1469
0
                            + g_ai2_ihevc_trans_32[k][10] * o[10]
1470
0
                            + g_ai2_ihevc_trans_32[k][11] * o[11]
1471
0
                            + g_ai2_ihevc_trans_32[k][12] * o[12]
1472
0
                            + g_ai2_ihevc_trans_32[k][13] * o[13]
1473
0
                            + g_ai2_ihevc_trans_32[k][14] * o[14]
1474
0
                            + g_ai2_ihevc_trans_32[k][15] * o[15] + add)
1475
0
                            >> shift;
1476
0
        }
1477
1478
0
        pi2_tmp += trans_size;
1479
0
        pi2_dst++;
1480
0
    }
1481
0
}
1482