Coverage Report

Created: 2026-07-16 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/svt-av1/Source/Lib/Codec/transforms.c
Line
Count
Source
1
/*
2
* Copyright(c) 2019 Intel Corporation
3
* Copyright (c) 2016, Alliance for Open Media. All rights reserved
4
*
5
* This source code is subject to the terms of the BSD 2 Clause License and
6
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
7
* was not distributed with this source code in the LICENSE file, you can
8
* obtain it at https://www.aomedia.org/license/software-license. If the Alliance for Open
9
* Media Patent License 1.0 was not distributed with this source code in the
10
* PATENTS file, you can obtain it at https://www.aomedia.org/license/patent-license.
11
*/
12
13
#include <stdlib.h>
14
#include "transforms.h"
15
#include "aom_dsp_rtcd.h"
16
17
const int8_t fwd_cos_bit_col[MAX_TXWH_IDX /*txw_idx*/][MAX_TXWH_IDX /*txh_idx*/] = {
18
    {13, 13, 13, 0, 0}, {13, 13, 13, 12, 0}, {13, 13, 13, 12, 13}, {0, 13, 13, 12, 13}, {0, 0, 13, 12, 13}};
19
const int8_t fwd_cos_bit_row[MAX_TXWH_IDX /*txw_idx*/][MAX_TXWH_IDX /*txh_idx*/] = {
20
    {13, 13, 12, 0, 0}, {13, 13, 13, 12, 0}, {13, 13, 12, 13, 12}, {0, 12, 13, 12, 11}, {0, 0, 12, 11, 10}};
21
22
const uint8_t tx_blocks_per_depth[BLOCK_SIZES_ALL][MAX_VARTX_DEPTH + 1] = {
23
    {1, 1, 1}, // BLOCK_4X4
24
    {1, 1, 1}, // BLOCK_4X8
25
    {1, 1, 1}, // BLOCK_8X4
26
    {1, 4, 4}, // BLOCK_8X8
27
    {1, 2, 8}, // BLOCK_8X16
28
    {1, 2, 8}, // BLOCK_16X8
29
    {1, 4, 16}, // BLOCK_16X16
30
    {1, 2, 8}, // BLOCK_16X32
31
    {1, 2, 8}, // BLOCK_32X16
32
    {1, 4, 16}, // BLOCK_32X32
33
    {1, 2, 8}, // BLOCK_32X64
34
    {1, 2, 8}, // BLOCK_64X32
35
    {1, 4, 16}, // BLOCK_64X64
36
    {2, 2, 2}, // BLOCK_64X128
37
    {2, 2, 2}, // BLOCK_128X64
38
    {4, 4, 4}, // BLOCK_128X128
39
    {1, 2, 4}, // BLOCK_4X16
40
    {1, 2, 4}, // BLOCK_16X4
41
    {1, 2, 4}, // BLOCK_8X32
42
    {1, 2, 4}, // BLOCK_32X8
43
    {1, 2, 4}, // BLOCK_16X64
44
    {1, 2, 4} // BLOCK_64X16
45
};
46
47
// origin is block - separate tables for INTRA (idx 0) and INTER (idx 1) needed b/c of tx depth 2
48
const Position tx_org[BLOCK_SIZES_ALL][2 /*is_inter*/][MAX_VARTX_DEPTH + 1][MAX_TXB_COUNT] = {
49
    {// BLOCK_4X4
50
     {// intra
51
      {// tx_depth 0
52
       {0, 0}},
53
      {// tx_depth 1
54
       {0, 0}},
55
      {// tx_depth 2
56
       {0, 0}}},
57
     {// inter
58
      {// tx_depth 0
59
       {0, 0}},
60
      {// tx_depth 1
61
       {0, 0}},
62
      {// tx_depth 2
63
       {0, 0}}}},
64
    {// BLOCK_4X8
65
     {// intra
66
      {// tx_depth 0
67
       {0, 0}},
68
      {// tx_depth 1
69
       {0, 0}},
70
      {// tx_depth 2
71
       {0, 0}}},
72
     {// inter
73
      {// tx_depth 0
74
       {0, 0}},
75
      {// tx_depth 1
76
       {0, 0}},
77
      {// tx_depth 2
78
       {0, 0}}}},
79
    {// BLOCK_8X4
80
     {// intra
81
      {// tx_depth 0
82
       {0, 0}},
83
      {// tx_depth 1
84
       {0, 0}},
85
      {// tx_depth 2
86
       {0, 0}}},
87
     {// inter
88
      {// tx_depth 0
89
       {0, 0}},
90
      {// tx_depth 1
91
       {0, 0}},
92
      {// tx_depth 2
93
       {0, 0}}}},
94
    {// BLOCK_8X8
95
     {// intra
96
      {// tx_depth 0
97
       {0, 0}},
98
      {// tx_depth 1
99
       {0, 0},
100
       {4, 0},
101
       {0, 4},
102
       {4, 4}},
103
      {
104
          // tx_depth 2
105
          {0, 0} // not allowed
106
      }},
107
     {// inter
108
      {// tx_depth 0
109
       {0, 0}},
110
      {// tx_depth 1
111
       {0, 0},
112
       {4, 0},
113
       {0, 4},
114
       {4, 4}},
115
      {
116
          // tx_depth 2
117
          {0, 0} // not allowed
118
      }}},
119
    {// BLOCK_8X16
120
     {// intra
121
      {// tx_depth 0
122
       {0, 0}},
123
      {// tx_depth 1
124
       {0, 0},
125
       {0, 8}},
126
      {// tx_depth 2
127
       {0, 0},
128
       {4, 0},
129
       {0, 4},
130
       {4, 4},
131
       {0, 8},
132
       {4, 8},
133
       {0, 12},
134
       {4, 12}}},
135
     {// inter
136
      {// tx_depth 0
137
       {0, 0}},
138
      {// tx_depth 1
139
       {0, 0},
140
       {0, 8}},
141
      {// tx_depth 2
142
       {0, 0},
143
       {4, 0},
144
       {0, 4},
145
       {4, 4},
146
       {0, 8},
147
       {4, 8},
148
       {0, 12},
149
       {4, 12}}}},
150
    {// BLOCK_16X8
151
     {// intra
152
      {// tx_depth 0
153
       {0, 0}},
154
      {// tx_depth 1
155
       {0, 0},
156
       {8, 0}},
157
      {// tx_depth 2
158
       {0, 0},
159
       {4, 0},
160
       {8, 0},
161
       {12, 0},
162
       {0, 4},
163
       {4, 4},
164
       {8, 4},
165
       {12, 4}}},
166
     {// inter
167
      {// tx_depth 0
168
       {0, 0}},
169
      {// tx_depth 1
170
       {0, 0},
171
       {8, 0}},
172
      {// tx_depth 2
173
       {0, 0},
174
       {4, 0},
175
       {0, 4},
176
       {4, 4},
177
       {8, 0},
178
       {12, 0},
179
       {8, 4},
180
       {12, 4}}}},
181
    {// BLOCK_16X16
182
     {// intra
183
      {// tx_depth 0
184
       {0, 0}},
185
      {// tx_depth 1
186
       {0, 0},
187
       {8, 0},
188
       {0, 8},
189
       {8, 8}},
190
      {// tx_depth 2
191
       {0, 0},
192
       {4, 0},
193
       {8, 0},
194
       {12, 0},
195
       {0, 4},
196
       {4, 4},
197
       {8, 4},
198
       {12, 4},
199
       {0, 8},
200
       {4, 8},
201
       {8, 8},
202
       {12, 8},
203
       {0, 12},
204
       {4, 12},
205
       {8, 12},
206
       {12, 12}}},
207
     {// inter
208
      {// tx_depth 0
209
       {0, 0}},
210
      {// tx_depth 1
211
       {0, 0},
212
       {8, 0},
213
       {0, 8},
214
       {8, 8}},
215
      {// tx_depth 2
216
       {0, 0},
217
       {4, 0},
218
       {0, 4},
219
       {4, 4},
220
       {8, 0},
221
       {12, 0},
222
       {8, 4},
223
       {12, 4},
224
       {0, 8},
225
       {4, 8},
226
       {0, 12},
227
       {4, 12},
228
       {8, 8},
229
       {12, 8},
230
       {8, 12},
231
       {12, 12}}}},
232
    {// BLOCK_16X32
233
     {// intra
234
      {// tx_depth 0
235
       {0, 0}},
236
      {// tx_depth 1
237
       {0, 0},
238
       {0, 16}},
239
      {// tx_depth 2
240
       {0, 0},
241
       {8, 0},
242
       {0, 8},
243
       {8, 8},
244
       {0, 16},
245
       {8, 16},
246
       {0, 24},
247
       {8, 24}}},
248
     {// inter
249
      {// tx_depth 0
250
       {0, 0}},
251
      {// tx_depth 1
252
       {0, 0},
253
       {0, 16}},
254
      {// tx_depth 2
255
       {0, 0},
256
       {8, 0},
257
       {0, 8},
258
       {8, 8},
259
       {0, 16},
260
       {8, 16},
261
       {0, 24},
262
       {8, 24}}}},
263
    {// BLOCK_32X16
264
     {// intra
265
      {// tx_depth 0
266
       {0, 0}},
267
      {// tx_depth 1
268
       {0, 0},
269
       {16, 0}},
270
      {// tx_depth 2
271
       {0, 0},
272
       {8, 0},
273
       {16, 0},
274
       {24, 0},
275
       {0, 8},
276
       {8, 8},
277
       {16, 8},
278
       {24, 8}}},
279
     {// inter
280
      {// tx_depth 0
281
       {0, 0}},
282
      {// tx_depth 1
283
       {0, 0},
284
       {16, 0}},
285
      {// tx_depth 2
286
       {0, 0},
287
       {8, 0},
288
       {0, 8},
289
       {8, 8},
290
       {16, 0},
291
       {24, 0},
292
       {16, 8},
293
       {24, 8}}}},
294
    {// BLOCK_32X32
295
     {// intra
296
      {// tx_depth 0
297
       {0, 0}},
298
      {// tx_depth 1
299
       {0, 0},
300
       {16, 0},
301
       {0, 16},
302
       {16, 16}},
303
      {// tx_depth 2
304
       {0, 0},
305
       {8, 0},
306
       {16, 0},
307
       {24, 0},
308
       {0, 8},
309
       {8, 8},
310
       {16, 8},
311
       {24, 8},
312
       {0, 16},
313
       {8, 16},
314
       {16, 16},
315
       {24, 16},
316
       {0, 24},
317
       {8, 24},
318
       {16, 24},
319
       {24, 24}}},
320
     {// inter
321
      {// tx_depth 0
322
       {0, 0}},
323
      {// tx_depth 1
324
       {0, 0},
325
       {16, 0},
326
       {0, 16},
327
       {16, 16}},
328
      {// tx_depth 2
329
       {0, 0},
330
       {8, 0},
331
       {0, 8},
332
       {8, 8},
333
       {16, 0},
334
       {24, 0},
335
       {16, 8},
336
       {24, 8},
337
       {0, 16},
338
       {8, 16},
339
       {0, 24},
340
       {8, 24},
341
       {16, 16},
342
       {24, 16},
343
       {16, 24},
344
       {24, 24}}}},
345
    {// BLOCK_32X64
346
     {// intra
347
      {// tx_depth 0
348
       {0, 0}},
349
      {// tx_depth 1
350
       {0, 0},
351
       {0, 32}},
352
      {// tx_depth 2
353
       {0, 0},
354
       {16, 0},
355
       {0, 16},
356
       {16, 16},
357
       {0, 32},
358
       {16, 32},
359
       {0, 48},
360
       {16, 48}}},
361
     {// inter
362
      {// tx_depth 0
363
       {0, 0}},
364
      {// tx_depth 1
365
       {0, 0},
366
       {0, 32}},
367
      {// tx_depth 2
368
       {0, 0},
369
       {16, 0},
370
       {0, 16},
371
       {16, 16},
372
       {0, 32},
373
       {16, 32},
374
       {0, 48},
375
       {16, 48}}}},
376
    {// BLOCK_64X32
377
     {// intra
378
      {// tx_depth 0
379
       {0, 0}},
380
      {// tx_depth 1
381
       {0, 0},
382
       {32, 0}},
383
      {// tx_depth 2
384
       {0, 0},
385
       {16, 0},
386
       {32, 0},
387
       {48, 0},
388
       {0, 16},
389
       {16, 16},
390
       {32, 16},
391
       {48, 16}}},
392
     {// inter
393
      {// tx_depth 0
394
       {0, 0}},
395
      {// tx_depth 1
396
       {0, 0},
397
       {32, 0}},
398
      {// tx_depth 2
399
       {0, 0},
400
       {16, 0},
401
       {0, 16},
402
       {16, 16},
403
       {32, 0},
404
       {48, 0},
405
       {32, 16},
406
       {48, 16}}}},
407
    {// BLOCK_64X64
408
     {// intra
409
      {// tx_depth 0
410
       {0, 0}},
411
      {// tx_depth 1
412
       {0, 0},
413
       {32, 0},
414
       {0, 32},
415
       {32, 32}},
416
      {// tx_depth 2
417
       {0, 0},
418
       {16, 0},
419
       {32, 0},
420
       {48, 0},
421
       {0, 16},
422
       {16, 16},
423
       {32, 16},
424
       {48, 16},
425
       {0, 32},
426
       {16, 32},
427
       {32, 32},
428
       {48, 32},
429
       {0, 48},
430
       {16, 48},
431
       {32, 48},
432
       {48, 48}}},
433
     {// inter
434
      {// tx_depth 0
435
       {0, 0}},
436
      {// tx_depth 1
437
       {0, 0},
438
       {32, 0},
439
       {0, 32},
440
       {32, 32}},
441
      {// tx_depth 2
442
       {0, 0},
443
       {16, 0},
444
       {0, 16},
445
       {16, 16},
446
       {32, 0},
447
       {48, 0},
448
       {32, 16},
449
       {48, 16},
450
       {0, 32},
451
       {16, 32},
452
       {0, 48},
453
       {16, 48},
454
       {32, 32},
455
       {48, 32},
456
       {32, 48},
457
       {48, 48}}}},
458
    {// BLOCK_64X128
459
     {// intra
460
      {// tx_depth 0
461
       {0, 0},
462
       {0, 64}},
463
      {// tx_depth 1
464
       {0, 0},
465
       {0, 64}},
466
      {// tx_depth 2
467
       {0, 0},
468
       {0, 64}}},
469
     {// inter
470
      {// tx_depth 0
471
       {0, 0},
472
       {0, 64}},
473
      {// tx_depth 1
474
       {0, 0},
475
       {0, 64}},
476
      {// tx_depth 2
477
       {0, 0},
478
       {0, 64}}}},
479
    {// BLOCK_128X64
480
     {// intra
481
      {// tx_depth 0
482
       {0, 0},
483
       {64, 0}},
484
      {// tx_depth 1
485
       {0, 0},
486
       {64, 0}},
487
      {// tx_depth 2
488
       {0, 0},
489
       {64, 0}}},
490
     {// inter
491
      {// tx_depth 0
492
       {0, 0},
493
       {64, 0}},
494
      {// tx_depth 1
495
       {0, 0},
496
       {64, 0}},
497
      {// tx_depth 2
498
       {0, 0},
499
       {64, 0}}}},
500
    {// BLOCK_128X128
501
     {// intra
502
      {// tx_depth 0
503
       {0, 0},
504
       {64, 0},
505
       {0, 64},
506
       {64, 64}},
507
      {// tx_depth 1
508
       {0, 0},
509
       {64, 0},
510
       {0, 64},
511
       {64, 64}},
512
      {// tx_depth 2
513
       {0, 0},
514
       {64, 0},
515
       {0, 64},
516
       {64, 64}}},
517
     {// inter
518
      {// tx_depth 0
519
       {0, 0},
520
       {64, 0},
521
       {0, 64},
522
       {64, 64}},
523
      {// tx_depth 1
524
       {0, 0},
525
       {64, 0},
526
       {0, 64},
527
       {64, 64}},
528
      {// tx_depth 2
529
       {0, 0},
530
       {64, 0},
531
       {0, 64},
532
       {64, 64}}}},
533
    {// BLOCK_4X16
534
     {// intra
535
      {// tx_depth 0
536
       {0, 0}},
537
      {// tx_depth 1
538
       {0, 0},
539
       {0, 8}},
540
      {// tx_depth 2
541
       {0, 0},
542
       {0, 4},
543
       {0, 8},
544
       {0, 12}}},
545
     {// inter
546
      {// tx_depth 0
547
       {0, 0}},
548
      {// tx_depth 1
549
       {0, 0},
550
       {0, 8}},
551
      {// tx_depth 2
552
       {0, 0},
553
       {0, 4},
554
       {0, 8},
555
       {0, 12}}}},
556
    {// BLOCK_16X4
557
     {// intra
558
      {// tx_depth 0
559
       {0, 0}},
560
      {// tx_depth 1
561
       {0, 0},
562
       {8, 0}},
563
      {// tx_depth 2
564
       {0, 0},
565
       {4, 0},
566
       {8, 0},
567
       {12, 0}}},
568
     {// inter
569
      {// tx_depth 0
570
       {0, 0}},
571
      {// tx_depth 1
572
       {0, 0},
573
       {8, 0}},
574
      {// tx_depth 2
575
       {0, 0},
576
       {4, 0},
577
       {8, 0},
578
       {12, 0}}}},
579
    {// BLOCK_8X32
580
     {// intra
581
      {// tx_depth 0
582
       {0, 0}},
583
      {// tx_depth 1
584
       {0, 0},
585
       {0, 16}},
586
      {// tx_depth 2
587
       {0, 0},
588
       {0, 8},
589
       {0, 16},
590
       {0, 24}}},
591
     {// inter
592
      {// tx_depth 0
593
       {0, 0}},
594
      {// tx_depth 1
595
       {0, 0},
596
       {0, 16}},
597
      {// tx_depth 2
598
       {0, 0},
599
       {0, 8},
600
       {0, 16},
601
       {0, 24}}}},
602
    {// BLOCK_32X8
603
     {// intra
604
      {// tx_depth 0
605
       {0, 0}},
606
      {// tx_depth 1
607
       {0, 0},
608
       {16, 0}},
609
      {// tx_depth 2
610
       {0, 0},
611
       {8, 0},
612
       {16, 0},
613
       {24, 0}}},
614
     {// inter
615
      {// tx_depth 0
616
       {0, 0}},
617
      {// tx_depth 1
618
       {0, 0},
619
       {16, 0}},
620
      {// tx_depth 2
621
       {0, 0},
622
       {8, 0},
623
       {16, 0},
624
       {24, 0}}}},
625
    {// BLOCK_16X64
626
     {// intra
627
      {// tx_depth 0
628
       {0, 0}},
629
      {// tx_depth 1
630
       {0, 0},
631
       {0, 32}},
632
      {// tx_depth 2
633
       {0, 0},
634
       {0, 16},
635
       {0, 32},
636
       {0, 48}}},
637
     {// inter
638
      {// tx_depth 0
639
       {0, 0}},
640
      {// tx_depth 1
641
       {0, 0},
642
       {0, 32}},
643
      {// tx_depth 2
644
       {0, 0},
645
       {0, 16},
646
       {0, 32},
647
       {0, 48}}}},
648
    {// BLOCK_64X16
649
     {// intra
650
      {// tx_depth 0
651
       {0, 0}},
652
      {// tx_depth 1
653
       {0, 0},
654
       {32, 0}},
655
      {// tx_depth 2
656
       {0, 0},
657
       {16, 0},
658
       {32, 0},
659
       {48, 0}}},
660
     {// inter
661
      {// tx_depth 0
662
       {0, 0}},
663
      {// tx_depth 1
664
       {0, 0},
665
       {32, 0}},
666
      {// tx_depth 2
667
       {0, 0},
668
       {16, 0},
669
       {32, 0},
670
       {48, 0}}}}};
671
672
static const int8_t fdct4_range_mult2[4]    = {0, 2, 3, 3};
673
static const int8_t fdct8_range_mult2[6]    = {0, 2, 4, 5, 5, 5};
674
static const int8_t fdct16_range_mult2[8]   = {0, 2, 4, 6, 7, 7, 7, 7};
675
static const int8_t fdct32_range_mult2[10]  = {0, 2, 4, 6, 8, 9, 9, 9, 9, 9};
676
static const int8_t fdct64_range_mult2[12]  = {0, 2, 4, 6, 8, 10, 11, 11, 11, 11, 11, 11};
677
static const int8_t fadst4_range_mult2[7]   = {0, 2, 4, 3, 3, 3, 3};
678
static const int8_t fadst8_range_mult2[8]   = {0, 0, 1, 3, 3, 5, 5, 5};
679
static const int8_t fadst16_range_mult2[10] = {0, 0, 1, 3, 3, 5, 5, 7, 7, 7};
680
static const int8_t fadst32_range_mult2[12] = {0, 0, 1, 3, 3, 5, 5, 7, 7, 9, 9, 9};
681
static const int8_t fidtx4_range_mult2[1]   = {1};
682
static const int8_t fidtx8_range_mult2[1]   = {2};
683
static const int8_t fidtx16_range_mult2[1]  = {3};
684
static const int8_t fidtx32_range_mult2[1]  = {4};
685
static const int8_t fidtx64_range_mult2[1]  = {5};
686
687
static const int8_t* fwd_txfm_range_mult2_list[TXFM_TYPES] = {fdct4_range_mult2,
688
                                                              fdct8_range_mult2,
689
                                                              fdct16_range_mult2,
690
                                                              fdct32_range_mult2,
691
                                                              fdct64_range_mult2,
692
                                                              fadst4_range_mult2,
693
                                                              fadst8_range_mult2,
694
                                                              fadst16_range_mult2,
695
                                                              fadst32_range_mult2,
696
                                                              fidtx4_range_mult2,
697
                                                              fidtx8_range_mult2,
698
                                                              fidtx16_range_mult2,
699
                                                              fidtx32_range_mult2,
700
                                                              fidtx64_range_mult2};
701
702
static const int8_t fwd_shift_4x4[3]   = {2, 0, 0};
703
static const int8_t fwd_shift_8x8[3]   = {2, -1, 0};
704
static const int8_t fwd_shift_16x16[3] = {2, -2, 0};
705
static const int8_t fwd_shift_32x32[3] = {2, -4, 0};
706
static const int8_t fwd_shift_64x64[3] = {0, -2, -2};
707
static const int8_t fwd_shift_4x8[3]   = {2, -1, 0};
708
static const int8_t fwd_shift_8x4[3]   = {2, -1, 0};
709
static const int8_t fwd_shift_8x16[3]  = {2, -2, 0};
710
static const int8_t fwd_shift_16x8[3]  = {2, -2, 0};
711
static const int8_t fwd_shift_16x32[3] = {2, -4, 0};
712
static const int8_t fwd_shift_32x16[3] = {2, -4, 0};
713
static const int8_t fwd_shift_32x64[3] = {0, -2, -2};
714
static const int8_t fwd_shift_64x32[3] = {2, -4, -2};
715
static const int8_t fwd_shift_4x16[3]  = {2, -1, 0};
716
static const int8_t fwd_shift_16x4[3]  = {2, -1, 0};
717
static const int8_t fwd_shift_8x32[3]  = {2, -2, 0};
718
static const int8_t fwd_shift_32x8[3]  = {2, -2, 0};
719
static const int8_t fwd_shift_16x64[3] = {0, -2, 0};
720
static const int8_t fwd_shift_64x16[3] = {2, -4, 0};
721
722
const int8_t* fwd_txfm_shift_ls[TX_SIZES_ALL] = {
723
    fwd_shift_4x4,  fwd_shift_8x8,  fwd_shift_16x16, fwd_shift_32x32, fwd_shift_64x64, fwd_shift_4x8,   fwd_shift_8x4,
724
    fwd_shift_8x16, fwd_shift_16x8, fwd_shift_16x32, fwd_shift_32x16, fwd_shift_32x64, fwd_shift_64x32, fwd_shift_4x16,
725
    fwd_shift_16x4, fwd_shift_8x32, fwd_shift_32x8,  fwd_shift_16x64, fwd_shift_64x16,
726
};
727
728
void svt_av1_gen_fwd_stage_range(int8_t* stage_range_col, int8_t* stage_range_row, const Txfm2dFlipCfg* cfg,
729
160k
                                 int32_t bd) {
730
    // Take the shift from the larger dimension in the rectangular case.
731
160k
    const int8_t* shift = cfg->shift;
732
    // i < MAX_TXFM_STAGE_NUM will mute above array bounds warning
733
1.17M
    for (int32_t i = 0; i < cfg->stage_num_col && i < MAX_TXFM_STAGE_NUM; ++i) {
734
1.00M
        stage_range_col[i] = (int8_t)(cfg->stage_range_col[i] + shift[0] + bd + 1);
735
1.00M
    }
736
    // i < MAX_TXFM_STAGE_NUM will mute above array bounds warning
737
1.17M
    for (int32_t i = 0; i < cfg->stage_num_row && i < MAX_TXFM_STAGE_NUM; ++i) {
738
1.01M
        stage_range_row[i] = (int8_t)(cfg->stage_range_row[i] + shift[0] + shift[1] + bd + 1);
739
1.01M
    }
740
160k
}
741
742
40.1k
void svt_av1_fdct4_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
743
40.1k
    (void)stage_range;
744
40.1k
    const int32_t* cospi;
745
746
40.1k
    int32_t *bf0, *bf1;
747
40.1k
    int32_t  step[4];
748
749
    // stage 0;
750
751
    // stage 1;
752
40.1k
    bf1    = output;
753
40.1k
    bf1[0] = input[0] + input[3];
754
40.1k
    bf1[1] = input[1] + input[2];
755
40.1k
    bf1[2] = -input[2] + input[1];
756
40.1k
    bf1[3] = -input[3] + input[0];
757
758
    // stage 2
759
40.1k
    cospi  = cospi_arr(cos_bit);
760
40.1k
    bf0    = output;
761
40.1k
    bf1    = step;
762
40.1k
    bf1[0] = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
763
40.1k
    bf1[1] = half_btf(-cospi[32], bf0[1], cospi[32], bf0[0], cos_bit);
764
40.1k
    bf1[2] = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
765
40.1k
    bf1[3] = half_btf(cospi[48], bf0[3], -cospi[16], bf0[2], cos_bit);
766
767
    // stage 3
768
40.1k
    bf0    = step;
769
40.1k
    bf1    = output;
770
40.1k
    bf1[0] = bf0[0];
771
40.1k
    bf1[1] = bf0[2];
772
40.1k
    bf1[2] = bf0[1];
773
40.1k
    bf1[3] = bf0[3];
774
40.1k
}
775
776
2.24M
void svt_av1_fdct8_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
777
2.24M
    (void)stage_range;
778
2.24M
    const int32_t* cospi;
779
780
2.24M
    int32_t *bf0, *bf1;
781
2.24M
    int32_t  step[8];
782
783
    // stage 0;
784
785
    // stage 1;
786
2.24M
    bf1    = output;
787
2.24M
    bf1[0] = input[0] + input[7];
788
2.24M
    bf1[1] = input[1] + input[6];
789
2.24M
    bf1[2] = input[2] + input[5];
790
2.24M
    bf1[3] = input[3] + input[4];
791
2.24M
    bf1[4] = -input[4] + input[3];
792
2.24M
    bf1[5] = -input[5] + input[2];
793
2.24M
    bf1[6] = -input[6] + input[1];
794
2.24M
    bf1[7] = -input[7] + input[0];
795
796
    // stage 2
797
2.24M
    cospi  = cospi_arr(cos_bit);
798
2.24M
    bf0    = output;
799
2.24M
    bf1    = step;
800
2.24M
    bf1[0] = bf0[0] + bf0[3];
801
2.24M
    bf1[1] = bf0[1] + bf0[2];
802
2.24M
    bf1[2] = -bf0[2] + bf0[1];
803
2.24M
    bf1[3] = -bf0[3] + bf0[0];
804
2.24M
    bf1[4] = bf0[4];
805
2.24M
    bf1[5] = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
806
2.24M
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
807
2.24M
    bf1[7] = bf0[7];
808
809
    // stage 3
810
2.24M
    cospi  = cospi_arr(cos_bit);
811
2.24M
    bf0    = step;
812
2.24M
    bf1    = output;
813
2.24M
    bf1[0] = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
814
2.24M
    bf1[1] = half_btf(-cospi[32], bf0[1], cospi[32], bf0[0], cos_bit);
815
2.24M
    bf1[2] = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
816
2.24M
    bf1[3] = half_btf(cospi[48], bf0[3], -cospi[16], bf0[2], cos_bit);
817
2.24M
    bf1[4] = bf0[4] + bf0[5];
818
2.24M
    bf1[5] = -bf0[5] + bf0[4];
819
2.24M
    bf1[6] = -bf0[6] + bf0[7];
820
2.24M
    bf1[7] = bf0[7] + bf0[6];
821
822
    // stage 4
823
2.24M
    cospi  = cospi_arr(cos_bit);
824
2.24M
    bf0    = output;
825
2.24M
    bf1    = step;
826
2.24M
    bf1[0] = bf0[0];
827
2.24M
    bf1[1] = bf0[1];
828
2.24M
    bf1[2] = bf0[2];
829
2.24M
    bf1[3] = bf0[3];
830
2.24M
    bf1[4] = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
831
2.24M
    bf1[5] = half_btf(cospi[24], bf0[5], cospi[40], bf0[6], cos_bit);
832
2.24M
    bf1[6] = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
833
2.24M
    bf1[7] = half_btf(cospi[56], bf0[7], -cospi[8], bf0[4], cos_bit);
834
835
    // stage 5
836
2.24M
    bf0    = step;
837
2.24M
    bf1    = output;
838
2.24M
    bf1[0] = bf0[0];
839
2.24M
    bf1[1] = bf0[4];
840
2.24M
    bf1[2] = bf0[2];
841
2.24M
    bf1[3] = bf0[6];
842
2.24M
    bf1[4] = bf0[1];
843
2.24M
    bf1[5] = bf0[5];
844
2.24M
    bf1[6] = bf0[3];
845
2.24M
    bf1[7] = bf0[7];
846
2.24M
}
847
848
112k
void svt_av1_fdct16_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
849
112k
    (void)stage_range;
850
112k
    const int32_t* cospi;
851
852
112k
    int32_t *bf0, *bf1;
853
112k
    int32_t  step[16];
854
855
    // stage 0;
856
857
    // stage 1;
858
112k
    bf1     = output;
859
112k
    bf1[0]  = input[0] + input[15];
860
112k
    bf1[1]  = input[1] + input[14];
861
112k
    bf1[2]  = input[2] + input[13];
862
112k
    bf1[3]  = input[3] + input[12];
863
112k
    bf1[4]  = input[4] + input[11];
864
112k
    bf1[5]  = input[5] + input[10];
865
112k
    bf1[6]  = input[6] + input[9];
866
112k
    bf1[7]  = input[7] + input[8];
867
112k
    bf1[8]  = -input[8] + input[7];
868
112k
    bf1[9]  = -input[9] + input[6];
869
112k
    bf1[10] = -input[10] + input[5];
870
112k
    bf1[11] = -input[11] + input[4];
871
112k
    bf1[12] = -input[12] + input[3];
872
112k
    bf1[13] = -input[13] + input[2];
873
112k
    bf1[14] = -input[14] + input[1];
874
112k
    bf1[15] = -input[15] + input[0];
875
876
    // stage 2
877
112k
    cospi   = cospi_arr(cos_bit);
878
112k
    bf0     = output;
879
112k
    bf1     = step;
880
112k
    bf1[0]  = bf0[0] + bf0[7];
881
112k
    bf1[1]  = bf0[1] + bf0[6];
882
112k
    bf1[2]  = bf0[2] + bf0[5];
883
112k
    bf1[3]  = bf0[3] + bf0[4];
884
112k
    bf1[4]  = -bf0[4] + bf0[3];
885
112k
    bf1[5]  = -bf0[5] + bf0[2];
886
112k
    bf1[6]  = -bf0[6] + bf0[1];
887
112k
    bf1[7]  = -bf0[7] + bf0[0];
888
112k
    bf1[8]  = bf0[8];
889
112k
    bf1[9]  = bf0[9];
890
112k
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
891
112k
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
892
112k
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
893
112k
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
894
112k
    bf1[14] = bf0[14];
895
112k
    bf1[15] = bf0[15];
896
897
    // stage 3
898
112k
    cospi   = cospi_arr(cos_bit);
899
112k
    bf0     = step;
900
112k
    bf1     = output;
901
112k
    bf1[0]  = bf0[0] + bf0[3];
902
112k
    bf1[1]  = bf0[1] + bf0[2];
903
112k
    bf1[2]  = -bf0[2] + bf0[1];
904
112k
    bf1[3]  = -bf0[3] + bf0[0];
905
112k
    bf1[4]  = bf0[4];
906
112k
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
907
112k
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
908
112k
    bf1[7]  = bf0[7];
909
112k
    bf1[8]  = bf0[8] + bf0[11];
910
112k
    bf1[9]  = bf0[9] + bf0[10];
911
112k
    bf1[10] = -bf0[10] + bf0[9];
912
112k
    bf1[11] = -bf0[11] + bf0[8];
913
112k
    bf1[12] = -bf0[12] + bf0[15];
914
112k
    bf1[13] = -bf0[13] + bf0[14];
915
112k
    bf1[14] = bf0[14] + bf0[13];
916
112k
    bf1[15] = bf0[15] + bf0[12];
917
918
    // stage 4
919
112k
    cospi   = cospi_arr(cos_bit);
920
112k
    bf0     = output;
921
112k
    bf1     = step;
922
112k
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
923
112k
    bf1[1]  = half_btf(-cospi[32], bf0[1], cospi[32], bf0[0], cos_bit);
924
112k
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
925
112k
    bf1[3]  = half_btf(cospi[48], bf0[3], -cospi[16], bf0[2], cos_bit);
926
112k
    bf1[4]  = bf0[4] + bf0[5];
927
112k
    bf1[5]  = -bf0[5] + bf0[4];
928
112k
    bf1[6]  = -bf0[6] + bf0[7];
929
112k
    bf1[7]  = bf0[7] + bf0[6];
930
112k
    bf1[8]  = bf0[8];
931
112k
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
932
112k
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
933
112k
    bf1[11] = bf0[11];
934
112k
    bf1[12] = bf0[12];
935
112k
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
936
112k
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
937
112k
    bf1[15] = bf0[15];
938
939
    // stage 5
940
112k
    cospi   = cospi_arr(cos_bit);
941
112k
    bf0     = step;
942
112k
    bf1     = output;
943
112k
    bf1[0]  = bf0[0];
944
112k
    bf1[1]  = bf0[1];
945
112k
    bf1[2]  = bf0[2];
946
112k
    bf1[3]  = bf0[3];
947
112k
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
948
112k
    bf1[5]  = half_btf(cospi[24], bf0[5], cospi[40], bf0[6], cos_bit);
949
112k
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
950
112k
    bf1[7]  = half_btf(cospi[56], bf0[7], -cospi[8], bf0[4], cos_bit);
951
112k
    bf1[8]  = bf0[8] + bf0[9];
952
112k
    bf1[9]  = -bf0[9] + bf0[8];
953
112k
    bf1[10] = -bf0[10] + bf0[11];
954
112k
    bf1[11] = bf0[11] + bf0[10];
955
112k
    bf1[12] = bf0[12] + bf0[13];
956
112k
    bf1[13] = -bf0[13] + bf0[12];
957
112k
    bf1[14] = -bf0[14] + bf0[15];
958
112k
    bf1[15] = bf0[15] + bf0[14];
959
960
    // stage 6
961
112k
    cospi   = cospi_arr(cos_bit);
962
112k
    bf0     = output;
963
112k
    bf1     = step;
964
112k
    bf1[0]  = bf0[0];
965
112k
    bf1[1]  = bf0[1];
966
112k
    bf1[2]  = bf0[2];
967
112k
    bf1[3]  = bf0[3];
968
112k
    bf1[4]  = bf0[4];
969
112k
    bf1[5]  = bf0[5];
970
112k
    bf1[6]  = bf0[6];
971
112k
    bf1[7]  = bf0[7];
972
112k
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
973
112k
    bf1[9]  = half_btf(cospi[28], bf0[9], cospi[36], bf0[14], cos_bit);
974
112k
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
975
112k
    bf1[11] = half_btf(cospi[12], bf0[11], cospi[52], bf0[12], cos_bit);
976
112k
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
977
112k
    bf1[13] = half_btf(cospi[44], bf0[13], -cospi[20], bf0[10], cos_bit);
978
112k
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
979
112k
    bf1[15] = half_btf(cospi[60], bf0[15], -cospi[4], bf0[8], cos_bit);
980
981
    // stage 7
982
112k
    bf0     = step;
983
112k
    bf1     = output;
984
112k
    bf1[0]  = bf0[0];
985
112k
    bf1[1]  = bf0[8];
986
112k
    bf1[2]  = bf0[4];
987
112k
    bf1[3]  = bf0[12];
988
112k
    bf1[4]  = bf0[2];
989
112k
    bf1[5]  = bf0[10];
990
112k
    bf1[6]  = bf0[6];
991
112k
    bf1[7]  = bf0[14];
992
112k
    bf1[8]  = bf0[1];
993
112k
    bf1[9]  = bf0[9];
994
112k
    bf1[10] = bf0[5];
995
112k
    bf1[11] = bf0[13];
996
112k
    bf1[12] = bf0[3];
997
112k
    bf1[13] = bf0[11];
998
112k
    bf1[14] = bf0[7];
999
112k
    bf1[15] = bf0[15];
1000
112k
}
1001
1002
508k
void svt_av1_fdct32_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
1003
508k
    (void)stage_range;
1004
508k
    const int32_t* cospi;
1005
1006
508k
    int32_t *bf0, *bf1;
1007
508k
    int32_t  step[32];
1008
1009
    // stage 0;
1010
1011
    // stage 1;
1012
508k
    bf1     = output;
1013
508k
    bf1[0]  = input[0] + input[31];
1014
508k
    bf1[1]  = input[1] + input[30];
1015
508k
    bf1[2]  = input[2] + input[29];
1016
508k
    bf1[3]  = input[3] + input[28];
1017
508k
    bf1[4]  = input[4] + input[27];
1018
508k
    bf1[5]  = input[5] + input[26];
1019
508k
    bf1[6]  = input[6] + input[25];
1020
508k
    bf1[7]  = input[7] + input[24];
1021
508k
    bf1[8]  = input[8] + input[23];
1022
508k
    bf1[9]  = input[9] + input[22];
1023
508k
    bf1[10] = input[10] + input[21];
1024
508k
    bf1[11] = input[11] + input[20];
1025
508k
    bf1[12] = input[12] + input[19];
1026
508k
    bf1[13] = input[13] + input[18];
1027
508k
    bf1[14] = input[14] + input[17];
1028
508k
    bf1[15] = input[15] + input[16];
1029
508k
    bf1[16] = -input[16] + input[15];
1030
508k
    bf1[17] = -input[17] + input[14];
1031
508k
    bf1[18] = -input[18] + input[13];
1032
508k
    bf1[19] = -input[19] + input[12];
1033
508k
    bf1[20] = -input[20] + input[11];
1034
508k
    bf1[21] = -input[21] + input[10];
1035
508k
    bf1[22] = -input[22] + input[9];
1036
508k
    bf1[23] = -input[23] + input[8];
1037
508k
    bf1[24] = -input[24] + input[7];
1038
508k
    bf1[25] = -input[25] + input[6];
1039
508k
    bf1[26] = -input[26] + input[5];
1040
508k
    bf1[27] = -input[27] + input[4];
1041
508k
    bf1[28] = -input[28] + input[3];
1042
508k
    bf1[29] = -input[29] + input[2];
1043
508k
    bf1[30] = -input[30] + input[1];
1044
508k
    bf1[31] = -input[31] + input[0];
1045
1046
    // stage 2
1047
508k
    cospi   = cospi_arr(cos_bit);
1048
508k
    bf0     = output;
1049
508k
    bf1     = step;
1050
508k
    bf1[0]  = bf0[0] + bf0[15];
1051
508k
    bf1[1]  = bf0[1] + bf0[14];
1052
508k
    bf1[2]  = bf0[2] + bf0[13];
1053
508k
    bf1[3]  = bf0[3] + bf0[12];
1054
508k
    bf1[4]  = bf0[4] + bf0[11];
1055
508k
    bf1[5]  = bf0[5] + bf0[10];
1056
508k
    bf1[6]  = bf0[6] + bf0[9];
1057
508k
    bf1[7]  = bf0[7] + bf0[8];
1058
508k
    bf1[8]  = -bf0[8] + bf0[7];
1059
508k
    bf1[9]  = -bf0[9] + bf0[6];
1060
508k
    bf1[10] = -bf0[10] + bf0[5];
1061
508k
    bf1[11] = -bf0[11] + bf0[4];
1062
508k
    bf1[12] = -bf0[12] + bf0[3];
1063
508k
    bf1[13] = -bf0[13] + bf0[2];
1064
508k
    bf1[14] = -bf0[14] + bf0[1];
1065
508k
    bf1[15] = -bf0[15] + bf0[0];
1066
508k
    bf1[16] = bf0[16];
1067
508k
    bf1[17] = bf0[17];
1068
508k
    bf1[18] = bf0[18];
1069
508k
    bf1[19] = bf0[19];
1070
508k
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
1071
508k
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
1072
508k
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
1073
508k
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
1074
508k
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
1075
508k
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
1076
508k
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
1077
508k
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
1078
508k
    bf1[28] = bf0[28];
1079
508k
    bf1[29] = bf0[29];
1080
508k
    bf1[30] = bf0[30];
1081
508k
    bf1[31] = bf0[31];
1082
1083
    // stage 3
1084
508k
    cospi   = cospi_arr(cos_bit);
1085
508k
    bf0     = step;
1086
508k
    bf1     = output;
1087
508k
    bf1[0]  = bf0[0] + bf0[7];
1088
508k
    bf1[1]  = bf0[1] + bf0[6];
1089
508k
    bf1[2]  = bf0[2] + bf0[5];
1090
508k
    bf1[3]  = bf0[3] + bf0[4];
1091
508k
    bf1[4]  = -bf0[4] + bf0[3];
1092
508k
    bf1[5]  = -bf0[5] + bf0[2];
1093
508k
    bf1[6]  = -bf0[6] + bf0[1];
1094
508k
    bf1[7]  = -bf0[7] + bf0[0];
1095
508k
    bf1[8]  = bf0[8];
1096
508k
    bf1[9]  = bf0[9];
1097
508k
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
1098
508k
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
1099
508k
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
1100
508k
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
1101
508k
    bf1[14] = bf0[14];
1102
508k
    bf1[15] = bf0[15];
1103
508k
    bf1[16] = bf0[16] + bf0[23];
1104
508k
    bf1[17] = bf0[17] + bf0[22];
1105
508k
    bf1[18] = bf0[18] + bf0[21];
1106
508k
    bf1[19] = bf0[19] + bf0[20];
1107
508k
    bf1[20] = -bf0[20] + bf0[19];
1108
508k
    bf1[21] = -bf0[21] + bf0[18];
1109
508k
    bf1[22] = -bf0[22] + bf0[17];
1110
508k
    bf1[23] = -bf0[23] + bf0[16];
1111
508k
    bf1[24] = -bf0[24] + bf0[31];
1112
508k
    bf1[25] = -bf0[25] + bf0[30];
1113
508k
    bf1[26] = -bf0[26] + bf0[29];
1114
508k
    bf1[27] = -bf0[27] + bf0[28];
1115
508k
    bf1[28] = bf0[28] + bf0[27];
1116
508k
    bf1[29] = bf0[29] + bf0[26];
1117
508k
    bf1[30] = bf0[30] + bf0[25];
1118
508k
    bf1[31] = bf0[31] + bf0[24];
1119
1120
    // stage 4
1121
508k
    cospi   = cospi_arr(cos_bit);
1122
508k
    bf0     = output;
1123
508k
    bf1     = step;
1124
508k
    bf1[0]  = bf0[0] + bf0[3];
1125
508k
    bf1[1]  = bf0[1] + bf0[2];
1126
508k
    bf1[2]  = -bf0[2] + bf0[1];
1127
508k
    bf1[3]  = -bf0[3] + bf0[0];
1128
508k
    bf1[4]  = bf0[4];
1129
508k
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
1130
508k
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
1131
508k
    bf1[7]  = bf0[7];
1132
508k
    bf1[8]  = bf0[8] + bf0[11];
1133
508k
    bf1[9]  = bf0[9] + bf0[10];
1134
508k
    bf1[10] = -bf0[10] + bf0[9];
1135
508k
    bf1[11] = -bf0[11] + bf0[8];
1136
508k
    bf1[12] = -bf0[12] + bf0[15];
1137
508k
    bf1[13] = -bf0[13] + bf0[14];
1138
508k
    bf1[14] = bf0[14] + bf0[13];
1139
508k
    bf1[15] = bf0[15] + bf0[12];
1140
508k
    bf1[16] = bf0[16];
1141
508k
    bf1[17] = bf0[17];
1142
508k
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
1143
508k
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
1144
508k
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
1145
508k
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
1146
508k
    bf1[22] = bf0[22];
1147
508k
    bf1[23] = bf0[23];
1148
508k
    bf1[24] = bf0[24];
1149
508k
    bf1[25] = bf0[25];
1150
508k
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
1151
508k
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
1152
508k
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
1153
508k
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
1154
508k
    bf1[30] = bf0[30];
1155
508k
    bf1[31] = bf0[31];
1156
1157
    // stage 5
1158
508k
    cospi   = cospi_arr(cos_bit);
1159
508k
    bf0     = step;
1160
508k
    bf1     = output;
1161
508k
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
1162
508k
    bf1[1]  = half_btf(-cospi[32], bf0[1], cospi[32], bf0[0], cos_bit);
1163
508k
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
1164
508k
    bf1[3]  = half_btf(cospi[48], bf0[3], -cospi[16], bf0[2], cos_bit);
1165
508k
    bf1[4]  = bf0[4] + bf0[5];
1166
508k
    bf1[5]  = -bf0[5] + bf0[4];
1167
508k
    bf1[6]  = -bf0[6] + bf0[7];
1168
508k
    bf1[7]  = bf0[7] + bf0[6];
1169
508k
    bf1[8]  = bf0[8];
1170
508k
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
1171
508k
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
1172
508k
    bf1[11] = bf0[11];
1173
508k
    bf1[12] = bf0[12];
1174
508k
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
1175
508k
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
1176
508k
    bf1[15] = bf0[15];
1177
508k
    bf1[16] = bf0[16] + bf0[19];
1178
508k
    bf1[17] = bf0[17] + bf0[18];
1179
508k
    bf1[18] = -bf0[18] + bf0[17];
1180
508k
    bf1[19] = -bf0[19] + bf0[16];
1181
508k
    bf1[20] = -bf0[20] + bf0[23];
1182
508k
    bf1[21] = -bf0[21] + bf0[22];
1183
508k
    bf1[22] = bf0[22] + bf0[21];
1184
508k
    bf1[23] = bf0[23] + bf0[20];
1185
508k
    bf1[24] = bf0[24] + bf0[27];
1186
508k
    bf1[25] = bf0[25] + bf0[26];
1187
508k
    bf1[26] = -bf0[26] + bf0[25];
1188
508k
    bf1[27] = -bf0[27] + bf0[24];
1189
508k
    bf1[28] = -bf0[28] + bf0[31];
1190
508k
    bf1[29] = -bf0[29] + bf0[30];
1191
508k
    bf1[30] = bf0[30] + bf0[29];
1192
508k
    bf1[31] = bf0[31] + bf0[28];
1193
1194
    // stage 6
1195
508k
    cospi   = cospi_arr(cos_bit);
1196
508k
    bf0     = output;
1197
508k
    bf1     = step;
1198
508k
    bf1[0]  = bf0[0];
1199
508k
    bf1[1]  = bf0[1];
1200
508k
    bf1[2]  = bf0[2];
1201
508k
    bf1[3]  = bf0[3];
1202
508k
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
1203
508k
    bf1[5]  = half_btf(cospi[24], bf0[5], cospi[40], bf0[6], cos_bit);
1204
508k
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
1205
508k
    bf1[7]  = half_btf(cospi[56], bf0[7], -cospi[8], bf0[4], cos_bit);
1206
508k
    bf1[8]  = bf0[8] + bf0[9];
1207
508k
    bf1[9]  = -bf0[9] + bf0[8];
1208
508k
    bf1[10] = -bf0[10] + bf0[11];
1209
508k
    bf1[11] = bf0[11] + bf0[10];
1210
508k
    bf1[12] = bf0[12] + bf0[13];
1211
508k
    bf1[13] = -bf0[13] + bf0[12];
1212
508k
    bf1[14] = -bf0[14] + bf0[15];
1213
508k
    bf1[15] = bf0[15] + bf0[14];
1214
508k
    bf1[16] = bf0[16];
1215
508k
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
1216
508k
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
1217
508k
    bf1[19] = bf0[19];
1218
508k
    bf1[20] = bf0[20];
1219
508k
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
1220
508k
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
1221
508k
    bf1[23] = bf0[23];
1222
508k
    bf1[24] = bf0[24];
1223
508k
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
1224
508k
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
1225
508k
    bf1[27] = bf0[27];
1226
508k
    bf1[28] = bf0[28];
1227
508k
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
1228
508k
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
1229
508k
    bf1[31] = bf0[31];
1230
1231
    // stage 7
1232
508k
    cospi   = cospi_arr(cos_bit);
1233
508k
    bf0     = step;
1234
508k
    bf1     = output;
1235
508k
    bf1[0]  = bf0[0];
1236
508k
    bf1[1]  = bf0[1];
1237
508k
    bf1[2]  = bf0[2];
1238
508k
    bf1[3]  = bf0[3];
1239
508k
    bf1[4]  = bf0[4];
1240
508k
    bf1[5]  = bf0[5];
1241
508k
    bf1[6]  = bf0[6];
1242
508k
    bf1[7]  = bf0[7];
1243
508k
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
1244
508k
    bf1[9]  = half_btf(cospi[28], bf0[9], cospi[36], bf0[14], cos_bit);
1245
508k
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
1246
508k
    bf1[11] = half_btf(cospi[12], bf0[11], cospi[52], bf0[12], cos_bit);
1247
508k
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
1248
508k
    bf1[13] = half_btf(cospi[44], bf0[13], -cospi[20], bf0[10], cos_bit);
1249
508k
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
1250
508k
    bf1[15] = half_btf(cospi[60], bf0[15], -cospi[4], bf0[8], cos_bit);
1251
508k
    bf1[16] = bf0[16] + bf0[17];
1252
508k
    bf1[17] = -bf0[17] + bf0[16];
1253
508k
    bf1[18] = -bf0[18] + bf0[19];
1254
508k
    bf1[19] = bf0[19] + bf0[18];
1255
508k
    bf1[20] = bf0[20] + bf0[21];
1256
508k
    bf1[21] = -bf0[21] + bf0[20];
1257
508k
    bf1[22] = -bf0[22] + bf0[23];
1258
508k
    bf1[23] = bf0[23] + bf0[22];
1259
508k
    bf1[24] = bf0[24] + bf0[25];
1260
508k
    bf1[25] = -bf0[25] + bf0[24];
1261
508k
    bf1[26] = -bf0[26] + bf0[27];
1262
508k
    bf1[27] = bf0[27] + bf0[26];
1263
508k
    bf1[28] = bf0[28] + bf0[29];
1264
508k
    bf1[29] = -bf0[29] + bf0[28];
1265
508k
    bf1[30] = -bf0[30] + bf0[31];
1266
508k
    bf1[31] = bf0[31] + bf0[30];
1267
1268
    // stage 8
1269
508k
    cospi   = cospi_arr(cos_bit);
1270
508k
    bf0     = output;
1271
508k
    bf1     = step;
1272
508k
    bf1[0]  = bf0[0];
1273
508k
    bf1[1]  = bf0[1];
1274
508k
    bf1[2]  = bf0[2];
1275
508k
    bf1[3]  = bf0[3];
1276
508k
    bf1[4]  = bf0[4];
1277
508k
    bf1[5]  = bf0[5];
1278
508k
    bf1[6]  = bf0[6];
1279
508k
    bf1[7]  = bf0[7];
1280
508k
    bf1[8]  = bf0[8];
1281
508k
    bf1[9]  = bf0[9];
1282
508k
    bf1[10] = bf0[10];
1283
508k
    bf1[11] = bf0[11];
1284
508k
    bf1[12] = bf0[12];
1285
508k
    bf1[13] = bf0[13];
1286
508k
    bf1[14] = bf0[14];
1287
508k
    bf1[15] = bf0[15];
1288
508k
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
1289
508k
    bf1[17] = half_btf(cospi[30], bf0[17], cospi[34], bf0[30], cos_bit);
1290
508k
    bf1[18] = half_btf(cospi[46], bf0[18], cospi[18], bf0[29], cos_bit);
1291
508k
    bf1[19] = half_btf(cospi[14], bf0[19], cospi[50], bf0[28], cos_bit);
1292
508k
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
1293
508k
    bf1[21] = half_btf(cospi[22], bf0[21], cospi[42], bf0[26], cos_bit);
1294
508k
    bf1[22] = half_btf(cospi[38], bf0[22], cospi[26], bf0[25], cos_bit);
1295
508k
    bf1[23] = half_btf(cospi[6], bf0[23], cospi[58], bf0[24], cos_bit);
1296
508k
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
1297
508k
    bf1[25] = half_btf(cospi[38], bf0[25], -cospi[26], bf0[22], cos_bit);
1298
508k
    bf1[26] = half_btf(cospi[22], bf0[26], -cospi[42], bf0[21], cos_bit);
1299
508k
    bf1[27] = half_btf(cospi[54], bf0[27], -cospi[10], bf0[20], cos_bit);
1300
508k
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
1301
508k
    bf1[29] = half_btf(cospi[46], bf0[29], -cospi[18], bf0[18], cos_bit);
1302
508k
    bf1[30] = half_btf(cospi[30], bf0[30], -cospi[34], bf0[17], cos_bit);
1303
508k
    bf1[31] = half_btf(cospi[62], bf0[31], -cospi[2], bf0[16], cos_bit);
1304
1305
    // stage 9
1306
508k
    bf0     = step;
1307
508k
    bf1     = output;
1308
508k
    bf1[0]  = bf0[0];
1309
508k
    bf1[1]  = bf0[16];
1310
508k
    bf1[2]  = bf0[8];
1311
508k
    bf1[3]  = bf0[24];
1312
508k
    bf1[4]  = bf0[4];
1313
508k
    bf1[5]  = bf0[20];
1314
508k
    bf1[6]  = bf0[12];
1315
508k
    bf1[7]  = bf0[28];
1316
508k
    bf1[8]  = bf0[2];
1317
508k
    bf1[9]  = bf0[18];
1318
508k
    bf1[10] = bf0[10];
1319
508k
    bf1[11] = bf0[26];
1320
508k
    bf1[12] = bf0[6];
1321
508k
    bf1[13] = bf0[22];
1322
508k
    bf1[14] = bf0[14];
1323
508k
    bf1[15] = bf0[30];
1324
508k
    bf1[16] = bf0[1];
1325
508k
    bf1[17] = bf0[17];
1326
508k
    bf1[18] = bf0[9];
1327
508k
    bf1[19] = bf0[25];
1328
508k
    bf1[20] = bf0[5];
1329
508k
    bf1[21] = bf0[21];
1330
508k
    bf1[22] = bf0[13];
1331
508k
    bf1[23] = bf0[29];
1332
508k
    bf1[24] = bf0[3];
1333
508k
    bf1[25] = bf0[19];
1334
508k
    bf1[26] = bf0[11];
1335
508k
    bf1[27] = bf0[27];
1336
508k
    bf1[28] = bf0[7];
1337
508k
    bf1[29] = bf0[23];
1338
508k
    bf1[30] = bf0[15];
1339
508k
    bf1[31] = bf0[31];
1340
508k
}
1341
1342
408k
void svt_av1_fdct64_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
1343
408k
    (void)stage_range;
1344
408k
    const int32_t* cospi;
1345
1346
408k
    int32_t *bf0, *bf1;
1347
408k
    int32_t  step[64];
1348
1349
    // stage 0;
1350
1351
    // stage 1;
1352
408k
    bf1     = output;
1353
408k
    bf1[0]  = input[0] + input[63];
1354
408k
    bf1[1]  = input[1] + input[62];
1355
408k
    bf1[2]  = input[2] + input[61];
1356
408k
    bf1[3]  = input[3] + input[60];
1357
408k
    bf1[4]  = input[4] + input[59];
1358
408k
    bf1[5]  = input[5] + input[58];
1359
408k
    bf1[6]  = input[6] + input[57];
1360
408k
    bf1[7]  = input[7] + input[56];
1361
408k
    bf1[8]  = input[8] + input[55];
1362
408k
    bf1[9]  = input[9] + input[54];
1363
408k
    bf1[10] = input[10] + input[53];
1364
408k
    bf1[11] = input[11] + input[52];
1365
408k
    bf1[12] = input[12] + input[51];
1366
408k
    bf1[13] = input[13] + input[50];
1367
408k
    bf1[14] = input[14] + input[49];
1368
408k
    bf1[15] = input[15] + input[48];
1369
408k
    bf1[16] = input[16] + input[47];
1370
408k
    bf1[17] = input[17] + input[46];
1371
408k
    bf1[18] = input[18] + input[45];
1372
408k
    bf1[19] = input[19] + input[44];
1373
408k
    bf1[20] = input[20] + input[43];
1374
408k
    bf1[21] = input[21] + input[42];
1375
408k
    bf1[22] = input[22] + input[41];
1376
408k
    bf1[23] = input[23] + input[40];
1377
408k
    bf1[24] = input[24] + input[39];
1378
408k
    bf1[25] = input[25] + input[38];
1379
408k
    bf1[26] = input[26] + input[37];
1380
408k
    bf1[27] = input[27] + input[36];
1381
408k
    bf1[28] = input[28] + input[35];
1382
408k
    bf1[29] = input[29] + input[34];
1383
408k
    bf1[30] = input[30] + input[33];
1384
408k
    bf1[31] = input[31] + input[32];
1385
408k
    bf1[32] = -input[32] + input[31];
1386
408k
    bf1[33] = -input[33] + input[30];
1387
408k
    bf1[34] = -input[34] + input[29];
1388
408k
    bf1[35] = -input[35] + input[28];
1389
408k
    bf1[36] = -input[36] + input[27];
1390
408k
    bf1[37] = -input[37] + input[26];
1391
408k
    bf1[38] = -input[38] + input[25];
1392
408k
    bf1[39] = -input[39] + input[24];
1393
408k
    bf1[40] = -input[40] + input[23];
1394
408k
    bf1[41] = -input[41] + input[22];
1395
408k
    bf1[42] = -input[42] + input[21];
1396
408k
    bf1[43] = -input[43] + input[20];
1397
408k
    bf1[44] = -input[44] + input[19];
1398
408k
    bf1[45] = -input[45] + input[18];
1399
408k
    bf1[46] = -input[46] + input[17];
1400
408k
    bf1[47] = -input[47] + input[16];
1401
408k
    bf1[48] = -input[48] + input[15];
1402
408k
    bf1[49] = -input[49] + input[14];
1403
408k
    bf1[50] = -input[50] + input[13];
1404
408k
    bf1[51] = -input[51] + input[12];
1405
408k
    bf1[52] = -input[52] + input[11];
1406
408k
    bf1[53] = -input[53] + input[10];
1407
408k
    bf1[54] = -input[54] + input[9];
1408
408k
    bf1[55] = -input[55] + input[8];
1409
408k
    bf1[56] = -input[56] + input[7];
1410
408k
    bf1[57] = -input[57] + input[6];
1411
408k
    bf1[58] = -input[58] + input[5];
1412
408k
    bf1[59] = -input[59] + input[4];
1413
408k
    bf1[60] = -input[60] + input[3];
1414
408k
    bf1[61] = -input[61] + input[2];
1415
408k
    bf1[62] = -input[62] + input[1];
1416
408k
    bf1[63] = -input[63] + input[0];
1417
1418
    // stage 2
1419
408k
    cospi   = cospi_arr(cos_bit);
1420
408k
    bf0     = output;
1421
408k
    bf1     = step;
1422
408k
    bf1[0]  = bf0[0] + bf0[31];
1423
408k
    bf1[1]  = bf0[1] + bf0[30];
1424
408k
    bf1[2]  = bf0[2] + bf0[29];
1425
408k
    bf1[3]  = bf0[3] + bf0[28];
1426
408k
    bf1[4]  = bf0[4] + bf0[27];
1427
408k
    bf1[5]  = bf0[5] + bf0[26];
1428
408k
    bf1[6]  = bf0[6] + bf0[25];
1429
408k
    bf1[7]  = bf0[7] + bf0[24];
1430
408k
    bf1[8]  = bf0[8] + bf0[23];
1431
408k
    bf1[9]  = bf0[9] + bf0[22];
1432
408k
    bf1[10] = bf0[10] + bf0[21];
1433
408k
    bf1[11] = bf0[11] + bf0[20];
1434
408k
    bf1[12] = bf0[12] + bf0[19];
1435
408k
    bf1[13] = bf0[13] + bf0[18];
1436
408k
    bf1[14] = bf0[14] + bf0[17];
1437
408k
    bf1[15] = bf0[15] + bf0[16];
1438
408k
    bf1[16] = -bf0[16] + bf0[15];
1439
408k
    bf1[17] = -bf0[17] + bf0[14];
1440
408k
    bf1[18] = -bf0[18] + bf0[13];
1441
408k
    bf1[19] = -bf0[19] + bf0[12];
1442
408k
    bf1[20] = -bf0[20] + bf0[11];
1443
408k
    bf1[21] = -bf0[21] + bf0[10];
1444
408k
    bf1[22] = -bf0[22] + bf0[9];
1445
408k
    bf1[23] = -bf0[23] + bf0[8];
1446
408k
    bf1[24] = -bf0[24] + bf0[7];
1447
408k
    bf1[25] = -bf0[25] + bf0[6];
1448
408k
    bf1[26] = -bf0[26] + bf0[5];
1449
408k
    bf1[27] = -bf0[27] + bf0[4];
1450
408k
    bf1[28] = -bf0[28] + bf0[3];
1451
408k
    bf1[29] = -bf0[29] + bf0[2];
1452
408k
    bf1[30] = -bf0[30] + bf0[1];
1453
408k
    bf1[31] = -bf0[31] + bf0[0];
1454
408k
    bf1[32] = bf0[32];
1455
408k
    bf1[33] = bf0[33];
1456
408k
    bf1[34] = bf0[34];
1457
408k
    bf1[35] = bf0[35];
1458
408k
    bf1[36] = bf0[36];
1459
408k
    bf1[37] = bf0[37];
1460
408k
    bf1[38] = bf0[38];
1461
408k
    bf1[39] = bf0[39];
1462
408k
    bf1[40] = half_btf(-cospi[32], bf0[40], cospi[32], bf0[55], cos_bit);
1463
408k
    bf1[41] = half_btf(-cospi[32], bf0[41], cospi[32], bf0[54], cos_bit);
1464
408k
    bf1[42] = half_btf(-cospi[32], bf0[42], cospi[32], bf0[53], cos_bit);
1465
408k
    bf1[43] = half_btf(-cospi[32], bf0[43], cospi[32], bf0[52], cos_bit);
1466
408k
    bf1[44] = half_btf(-cospi[32], bf0[44], cospi[32], bf0[51], cos_bit);
1467
408k
    bf1[45] = half_btf(-cospi[32], bf0[45], cospi[32], bf0[50], cos_bit);
1468
408k
    bf1[46] = half_btf(-cospi[32], bf0[46], cospi[32], bf0[49], cos_bit);
1469
408k
    bf1[47] = half_btf(-cospi[32], bf0[47], cospi[32], bf0[48], cos_bit);
1470
408k
    bf1[48] = half_btf(cospi[32], bf0[48], cospi[32], bf0[47], cos_bit);
1471
408k
    bf1[49] = half_btf(cospi[32], bf0[49], cospi[32], bf0[46], cos_bit);
1472
408k
    bf1[50] = half_btf(cospi[32], bf0[50], cospi[32], bf0[45], cos_bit);
1473
408k
    bf1[51] = half_btf(cospi[32], bf0[51], cospi[32], bf0[44], cos_bit);
1474
408k
    bf1[52] = half_btf(cospi[32], bf0[52], cospi[32], bf0[43], cos_bit);
1475
408k
    bf1[53] = half_btf(cospi[32], bf0[53], cospi[32], bf0[42], cos_bit);
1476
408k
    bf1[54] = half_btf(cospi[32], bf0[54], cospi[32], bf0[41], cos_bit);
1477
408k
    bf1[55] = half_btf(cospi[32], bf0[55], cospi[32], bf0[40], cos_bit);
1478
408k
    bf1[56] = bf0[56];
1479
408k
    bf1[57] = bf0[57];
1480
408k
    bf1[58] = bf0[58];
1481
408k
    bf1[59] = bf0[59];
1482
408k
    bf1[60] = bf0[60];
1483
408k
    bf1[61] = bf0[61];
1484
408k
    bf1[62] = bf0[62];
1485
408k
    bf1[63] = bf0[63];
1486
1487
    // stage 3
1488
408k
    cospi   = cospi_arr(cos_bit);
1489
408k
    bf0     = step;
1490
408k
    bf1     = output;
1491
408k
    bf1[0]  = bf0[0] + bf0[15];
1492
408k
    bf1[1]  = bf0[1] + bf0[14];
1493
408k
    bf1[2]  = bf0[2] + bf0[13];
1494
408k
    bf1[3]  = bf0[3] + bf0[12];
1495
408k
    bf1[4]  = bf0[4] + bf0[11];
1496
408k
    bf1[5]  = bf0[5] + bf0[10];
1497
408k
    bf1[6]  = bf0[6] + bf0[9];
1498
408k
    bf1[7]  = bf0[7] + bf0[8];
1499
408k
    bf1[8]  = -bf0[8] + bf0[7];
1500
408k
    bf1[9]  = -bf0[9] + bf0[6];
1501
408k
    bf1[10] = -bf0[10] + bf0[5];
1502
408k
    bf1[11] = -bf0[11] + bf0[4];
1503
408k
    bf1[12] = -bf0[12] + bf0[3];
1504
408k
    bf1[13] = -bf0[13] + bf0[2];
1505
408k
    bf1[14] = -bf0[14] + bf0[1];
1506
408k
    bf1[15] = -bf0[15] + bf0[0];
1507
408k
    bf1[16] = bf0[16];
1508
408k
    bf1[17] = bf0[17];
1509
408k
    bf1[18] = bf0[18];
1510
408k
    bf1[19] = bf0[19];
1511
408k
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
1512
408k
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
1513
408k
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
1514
408k
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
1515
408k
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
1516
408k
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
1517
408k
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
1518
408k
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
1519
408k
    bf1[28] = bf0[28];
1520
408k
    bf1[29] = bf0[29];
1521
408k
    bf1[30] = bf0[30];
1522
408k
    bf1[31] = bf0[31];
1523
408k
    bf1[32] = bf0[32] + bf0[47];
1524
408k
    bf1[33] = bf0[33] + bf0[46];
1525
408k
    bf1[34] = bf0[34] + bf0[45];
1526
408k
    bf1[35] = bf0[35] + bf0[44];
1527
408k
    bf1[36] = bf0[36] + bf0[43];
1528
408k
    bf1[37] = bf0[37] + bf0[42];
1529
408k
    bf1[38] = bf0[38] + bf0[41];
1530
408k
    bf1[39] = bf0[39] + bf0[40];
1531
408k
    bf1[40] = -bf0[40] + bf0[39];
1532
408k
    bf1[41] = -bf0[41] + bf0[38];
1533
408k
    bf1[42] = -bf0[42] + bf0[37];
1534
408k
    bf1[43] = -bf0[43] + bf0[36];
1535
408k
    bf1[44] = -bf0[44] + bf0[35];
1536
408k
    bf1[45] = -bf0[45] + bf0[34];
1537
408k
    bf1[46] = -bf0[46] + bf0[33];
1538
408k
    bf1[47] = -bf0[47] + bf0[32];
1539
408k
    bf1[48] = -bf0[48] + bf0[63];
1540
408k
    bf1[49] = -bf0[49] + bf0[62];
1541
408k
    bf1[50] = -bf0[50] + bf0[61];
1542
408k
    bf1[51] = -bf0[51] + bf0[60];
1543
408k
    bf1[52] = -bf0[52] + bf0[59];
1544
408k
    bf1[53] = -bf0[53] + bf0[58];
1545
408k
    bf1[54] = -bf0[54] + bf0[57];
1546
408k
    bf1[55] = -bf0[55] + bf0[56];
1547
408k
    bf1[56] = bf0[56] + bf0[55];
1548
408k
    bf1[57] = bf0[57] + bf0[54];
1549
408k
    bf1[58] = bf0[58] + bf0[53];
1550
408k
    bf1[59] = bf0[59] + bf0[52];
1551
408k
    bf1[60] = bf0[60] + bf0[51];
1552
408k
    bf1[61] = bf0[61] + bf0[50];
1553
408k
    bf1[62] = bf0[62] + bf0[49];
1554
408k
    bf1[63] = bf0[63] + bf0[48];
1555
1556
    // stage 4
1557
408k
    cospi   = cospi_arr(cos_bit);
1558
408k
    bf0     = output;
1559
408k
    bf1     = step;
1560
408k
    bf1[0]  = bf0[0] + bf0[7];
1561
408k
    bf1[1]  = bf0[1] + bf0[6];
1562
408k
    bf1[2]  = bf0[2] + bf0[5];
1563
408k
    bf1[3]  = bf0[3] + bf0[4];
1564
408k
    bf1[4]  = -bf0[4] + bf0[3];
1565
408k
    bf1[5]  = -bf0[5] + bf0[2];
1566
408k
    bf1[6]  = -bf0[6] + bf0[1];
1567
408k
    bf1[7]  = -bf0[7] + bf0[0];
1568
408k
    bf1[8]  = bf0[8];
1569
408k
    bf1[9]  = bf0[9];
1570
408k
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
1571
408k
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
1572
408k
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
1573
408k
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
1574
408k
    bf1[14] = bf0[14];
1575
408k
    bf1[15] = bf0[15];
1576
408k
    bf1[16] = bf0[16] + bf0[23];
1577
408k
    bf1[17] = bf0[17] + bf0[22];
1578
408k
    bf1[18] = bf0[18] + bf0[21];
1579
408k
    bf1[19] = bf0[19] + bf0[20];
1580
408k
    bf1[20] = -bf0[20] + bf0[19];
1581
408k
    bf1[21] = -bf0[21] + bf0[18];
1582
408k
    bf1[22] = -bf0[22] + bf0[17];
1583
408k
    bf1[23] = -bf0[23] + bf0[16];
1584
408k
    bf1[24] = -bf0[24] + bf0[31];
1585
408k
    bf1[25] = -bf0[25] + bf0[30];
1586
408k
    bf1[26] = -bf0[26] + bf0[29];
1587
408k
    bf1[27] = -bf0[27] + bf0[28];
1588
408k
    bf1[28] = bf0[28] + bf0[27];
1589
408k
    bf1[29] = bf0[29] + bf0[26];
1590
408k
    bf1[30] = bf0[30] + bf0[25];
1591
408k
    bf1[31] = bf0[31] + bf0[24];
1592
408k
    bf1[32] = bf0[32];
1593
408k
    bf1[33] = bf0[33];
1594
408k
    bf1[34] = bf0[34];
1595
408k
    bf1[35] = bf0[35];
1596
408k
    bf1[36] = half_btf(-cospi[16], bf0[36], cospi[48], bf0[59], cos_bit);
1597
408k
    bf1[37] = half_btf(-cospi[16], bf0[37], cospi[48], bf0[58], cos_bit);
1598
408k
    bf1[38] = half_btf(-cospi[16], bf0[38], cospi[48], bf0[57], cos_bit);
1599
408k
    bf1[39] = half_btf(-cospi[16], bf0[39], cospi[48], bf0[56], cos_bit);
1600
408k
    bf1[40] = half_btf(-cospi[48], bf0[40], -cospi[16], bf0[55], cos_bit);
1601
408k
    bf1[41] = half_btf(-cospi[48], bf0[41], -cospi[16], bf0[54], cos_bit);
1602
408k
    bf1[42] = half_btf(-cospi[48], bf0[42], -cospi[16], bf0[53], cos_bit);
1603
408k
    bf1[43] = half_btf(-cospi[48], bf0[43], -cospi[16], bf0[52], cos_bit);
1604
408k
    bf1[44] = bf0[44];
1605
408k
    bf1[45] = bf0[45];
1606
408k
    bf1[46] = bf0[46];
1607
408k
    bf1[47] = bf0[47];
1608
408k
    bf1[48] = bf0[48];
1609
408k
    bf1[49] = bf0[49];
1610
408k
    bf1[50] = bf0[50];
1611
408k
    bf1[51] = bf0[51];
1612
408k
    bf1[52] = half_btf(cospi[48], bf0[52], -cospi[16], bf0[43], cos_bit);
1613
408k
    bf1[53] = half_btf(cospi[48], bf0[53], -cospi[16], bf0[42], cos_bit);
1614
408k
    bf1[54] = half_btf(cospi[48], bf0[54], -cospi[16], bf0[41], cos_bit);
1615
408k
    bf1[55] = half_btf(cospi[48], bf0[55], -cospi[16], bf0[40], cos_bit);
1616
408k
    bf1[56] = half_btf(cospi[16], bf0[56], cospi[48], bf0[39], cos_bit);
1617
408k
    bf1[57] = half_btf(cospi[16], bf0[57], cospi[48], bf0[38], cos_bit);
1618
408k
    bf1[58] = half_btf(cospi[16], bf0[58], cospi[48], bf0[37], cos_bit);
1619
408k
    bf1[59] = half_btf(cospi[16], bf0[59], cospi[48], bf0[36], cos_bit);
1620
408k
    bf1[60] = bf0[60];
1621
408k
    bf1[61] = bf0[61];
1622
408k
    bf1[62] = bf0[62];
1623
408k
    bf1[63] = bf0[63];
1624
1625
    // stage 5
1626
408k
    cospi   = cospi_arr(cos_bit);
1627
408k
    bf0     = step;
1628
408k
    bf1     = output;
1629
408k
    bf1[0]  = bf0[0] + bf0[3];
1630
408k
    bf1[1]  = bf0[1] + bf0[2];
1631
408k
    bf1[2]  = -bf0[2] + bf0[1];
1632
408k
    bf1[3]  = -bf0[3] + bf0[0];
1633
408k
    bf1[4]  = bf0[4];
1634
408k
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
1635
408k
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
1636
408k
    bf1[7]  = bf0[7];
1637
408k
    bf1[8]  = bf0[8] + bf0[11];
1638
408k
    bf1[9]  = bf0[9] + bf0[10];
1639
408k
    bf1[10] = -bf0[10] + bf0[9];
1640
408k
    bf1[11] = -bf0[11] + bf0[8];
1641
408k
    bf1[12] = -bf0[12] + bf0[15];
1642
408k
    bf1[13] = -bf0[13] + bf0[14];
1643
408k
    bf1[14] = bf0[14] + bf0[13];
1644
408k
    bf1[15] = bf0[15] + bf0[12];
1645
408k
    bf1[16] = bf0[16];
1646
408k
    bf1[17] = bf0[17];
1647
408k
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
1648
408k
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
1649
408k
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
1650
408k
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
1651
408k
    bf1[22] = bf0[22];
1652
408k
    bf1[23] = bf0[23];
1653
408k
    bf1[24] = bf0[24];
1654
408k
    bf1[25] = bf0[25];
1655
408k
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
1656
408k
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
1657
408k
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
1658
408k
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
1659
408k
    bf1[30] = bf0[30];
1660
408k
    bf1[31] = bf0[31];
1661
408k
    bf1[32] = bf0[32] + bf0[39];
1662
408k
    bf1[33] = bf0[33] + bf0[38];
1663
408k
    bf1[34] = bf0[34] + bf0[37];
1664
408k
    bf1[35] = bf0[35] + bf0[36];
1665
408k
    bf1[36] = -bf0[36] + bf0[35];
1666
408k
    bf1[37] = -bf0[37] + bf0[34];
1667
408k
    bf1[38] = -bf0[38] + bf0[33];
1668
408k
    bf1[39] = -bf0[39] + bf0[32];
1669
408k
    bf1[40] = -bf0[40] + bf0[47];
1670
408k
    bf1[41] = -bf0[41] + bf0[46];
1671
408k
    bf1[42] = -bf0[42] + bf0[45];
1672
408k
    bf1[43] = -bf0[43] + bf0[44];
1673
408k
    bf1[44] = bf0[44] + bf0[43];
1674
408k
    bf1[45] = bf0[45] + bf0[42];
1675
408k
    bf1[46] = bf0[46] + bf0[41];
1676
408k
    bf1[47] = bf0[47] + bf0[40];
1677
408k
    bf1[48] = bf0[48] + bf0[55];
1678
408k
    bf1[49] = bf0[49] + bf0[54];
1679
408k
    bf1[50] = bf0[50] + bf0[53];
1680
408k
    bf1[51] = bf0[51] + bf0[52];
1681
408k
    bf1[52] = -bf0[52] + bf0[51];
1682
408k
    bf1[53] = -bf0[53] + bf0[50];
1683
408k
    bf1[54] = -bf0[54] + bf0[49];
1684
408k
    bf1[55] = -bf0[55] + bf0[48];
1685
408k
    bf1[56] = -bf0[56] + bf0[63];
1686
408k
    bf1[57] = -bf0[57] + bf0[62];
1687
408k
    bf1[58] = -bf0[58] + bf0[61];
1688
408k
    bf1[59] = -bf0[59] + bf0[60];
1689
408k
    bf1[60] = bf0[60] + bf0[59];
1690
408k
    bf1[61] = bf0[61] + bf0[58];
1691
408k
    bf1[62] = bf0[62] + bf0[57];
1692
408k
    bf1[63] = bf0[63] + bf0[56];
1693
1694
    // stage 6
1695
408k
    cospi   = cospi_arr(cos_bit);
1696
408k
    bf0     = output;
1697
408k
    bf1     = step;
1698
408k
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
1699
408k
    bf1[1]  = half_btf(-cospi[32], bf0[1], cospi[32], bf0[0], cos_bit);
1700
408k
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
1701
408k
    bf1[3]  = half_btf(cospi[48], bf0[3], -cospi[16], bf0[2], cos_bit);
1702
408k
    bf1[4]  = bf0[4] + bf0[5];
1703
408k
    bf1[5]  = -bf0[5] + bf0[4];
1704
408k
    bf1[6]  = -bf0[6] + bf0[7];
1705
408k
    bf1[7]  = bf0[7] + bf0[6];
1706
408k
    bf1[8]  = bf0[8];
1707
408k
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
1708
408k
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
1709
408k
    bf1[11] = bf0[11];
1710
408k
    bf1[12] = bf0[12];
1711
408k
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
1712
408k
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
1713
408k
    bf1[15] = bf0[15];
1714
408k
    bf1[16] = bf0[16] + bf0[19];
1715
408k
    bf1[17] = bf0[17] + bf0[18];
1716
408k
    bf1[18] = -bf0[18] + bf0[17];
1717
408k
    bf1[19] = -bf0[19] + bf0[16];
1718
408k
    bf1[20] = -bf0[20] + bf0[23];
1719
408k
    bf1[21] = -bf0[21] + bf0[22];
1720
408k
    bf1[22] = bf0[22] + bf0[21];
1721
408k
    bf1[23] = bf0[23] + bf0[20];
1722
408k
    bf1[24] = bf0[24] + bf0[27];
1723
408k
    bf1[25] = bf0[25] + bf0[26];
1724
408k
    bf1[26] = -bf0[26] + bf0[25];
1725
408k
    bf1[27] = -bf0[27] + bf0[24];
1726
408k
    bf1[28] = -bf0[28] + bf0[31];
1727
408k
    bf1[29] = -bf0[29] + bf0[30];
1728
408k
    bf1[30] = bf0[30] + bf0[29];
1729
408k
    bf1[31] = bf0[31] + bf0[28];
1730
408k
    bf1[32] = bf0[32];
1731
408k
    bf1[33] = bf0[33];
1732
408k
    bf1[34] = half_btf(-cospi[8], bf0[34], cospi[56], bf0[61], cos_bit);
1733
408k
    bf1[35] = half_btf(-cospi[8], bf0[35], cospi[56], bf0[60], cos_bit);
1734
408k
    bf1[36] = half_btf(-cospi[56], bf0[36], -cospi[8], bf0[59], cos_bit);
1735
408k
    bf1[37] = half_btf(-cospi[56], bf0[37], -cospi[8], bf0[58], cos_bit);
1736
408k
    bf1[38] = bf0[38];
1737
408k
    bf1[39] = bf0[39];
1738
408k
    bf1[40] = bf0[40];
1739
408k
    bf1[41] = bf0[41];
1740
408k
    bf1[42] = half_btf(-cospi[40], bf0[42], cospi[24], bf0[53], cos_bit);
1741
408k
    bf1[43] = half_btf(-cospi[40], bf0[43], cospi[24], bf0[52], cos_bit);
1742
408k
    bf1[44] = half_btf(-cospi[24], bf0[44], -cospi[40], bf0[51], cos_bit);
1743
408k
    bf1[45] = half_btf(-cospi[24], bf0[45], -cospi[40], bf0[50], cos_bit);
1744
408k
    bf1[46] = bf0[46];
1745
408k
    bf1[47] = bf0[47];
1746
408k
    bf1[48] = bf0[48];
1747
408k
    bf1[49] = bf0[49];
1748
408k
    bf1[50] = half_btf(cospi[24], bf0[50], -cospi[40], bf0[45], cos_bit);
1749
408k
    bf1[51] = half_btf(cospi[24], bf0[51], -cospi[40], bf0[44], cos_bit);
1750
408k
    bf1[52] = half_btf(cospi[40], bf0[52], cospi[24], bf0[43], cos_bit);
1751
408k
    bf1[53] = half_btf(cospi[40], bf0[53], cospi[24], bf0[42], cos_bit);
1752
408k
    bf1[54] = bf0[54];
1753
408k
    bf1[55] = bf0[55];
1754
408k
    bf1[56] = bf0[56];
1755
408k
    bf1[57] = bf0[57];
1756
408k
    bf1[58] = half_btf(cospi[56], bf0[58], -cospi[8], bf0[37], cos_bit);
1757
408k
    bf1[59] = half_btf(cospi[56], bf0[59], -cospi[8], bf0[36], cos_bit);
1758
408k
    bf1[60] = half_btf(cospi[8], bf0[60], cospi[56], bf0[35], cos_bit);
1759
408k
    bf1[61] = half_btf(cospi[8], bf0[61], cospi[56], bf0[34], cos_bit);
1760
408k
    bf1[62] = bf0[62];
1761
408k
    bf1[63] = bf0[63];
1762
1763
    // stage 7
1764
408k
    cospi   = cospi_arr(cos_bit);
1765
408k
    bf0     = step;
1766
408k
    bf1     = output;
1767
408k
    bf1[0]  = bf0[0];
1768
408k
    bf1[1]  = bf0[1];
1769
408k
    bf1[2]  = bf0[2];
1770
408k
    bf1[3]  = bf0[3];
1771
408k
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
1772
408k
    bf1[5]  = half_btf(cospi[24], bf0[5], cospi[40], bf0[6], cos_bit);
1773
408k
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
1774
408k
    bf1[7]  = half_btf(cospi[56], bf0[7], -cospi[8], bf0[4], cos_bit);
1775
408k
    bf1[8]  = bf0[8] + bf0[9];
1776
408k
    bf1[9]  = -bf0[9] + bf0[8];
1777
408k
    bf1[10] = -bf0[10] + bf0[11];
1778
408k
    bf1[11] = bf0[11] + bf0[10];
1779
408k
    bf1[12] = bf0[12] + bf0[13];
1780
408k
    bf1[13] = -bf0[13] + bf0[12];
1781
408k
    bf1[14] = -bf0[14] + bf0[15];
1782
408k
    bf1[15] = bf0[15] + bf0[14];
1783
408k
    bf1[16] = bf0[16];
1784
408k
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
1785
408k
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
1786
408k
    bf1[19] = bf0[19];
1787
408k
    bf1[20] = bf0[20];
1788
408k
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
1789
408k
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
1790
408k
    bf1[23] = bf0[23];
1791
408k
    bf1[24] = bf0[24];
1792
408k
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
1793
408k
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
1794
408k
    bf1[27] = bf0[27];
1795
408k
    bf1[28] = bf0[28];
1796
408k
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
1797
408k
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
1798
408k
    bf1[31] = bf0[31];
1799
408k
    bf1[32] = bf0[32] + bf0[35];
1800
408k
    bf1[33] = bf0[33] + bf0[34];
1801
408k
    bf1[34] = -bf0[34] + bf0[33];
1802
408k
    bf1[35] = -bf0[35] + bf0[32];
1803
408k
    bf1[36] = -bf0[36] + bf0[39];
1804
408k
    bf1[37] = -bf0[37] + bf0[38];
1805
408k
    bf1[38] = bf0[38] + bf0[37];
1806
408k
    bf1[39] = bf0[39] + bf0[36];
1807
408k
    bf1[40] = bf0[40] + bf0[43];
1808
408k
    bf1[41] = bf0[41] + bf0[42];
1809
408k
    bf1[42] = -bf0[42] + bf0[41];
1810
408k
    bf1[43] = -bf0[43] + bf0[40];
1811
408k
    bf1[44] = -bf0[44] + bf0[47];
1812
408k
    bf1[45] = -bf0[45] + bf0[46];
1813
408k
    bf1[46] = bf0[46] + bf0[45];
1814
408k
    bf1[47] = bf0[47] + bf0[44];
1815
408k
    bf1[48] = bf0[48] + bf0[51];
1816
408k
    bf1[49] = bf0[49] + bf0[50];
1817
408k
    bf1[50] = -bf0[50] + bf0[49];
1818
408k
    bf1[51] = -bf0[51] + bf0[48];
1819
408k
    bf1[52] = -bf0[52] + bf0[55];
1820
408k
    bf1[53] = -bf0[53] + bf0[54];
1821
408k
    bf1[54] = bf0[54] + bf0[53];
1822
408k
    bf1[55] = bf0[55] + bf0[52];
1823
408k
    bf1[56] = bf0[56] + bf0[59];
1824
408k
    bf1[57] = bf0[57] + bf0[58];
1825
408k
    bf1[58] = -bf0[58] + bf0[57];
1826
408k
    bf1[59] = -bf0[59] + bf0[56];
1827
408k
    bf1[60] = -bf0[60] + bf0[63];
1828
408k
    bf1[61] = -bf0[61] + bf0[62];
1829
408k
    bf1[62] = bf0[62] + bf0[61];
1830
408k
    bf1[63] = bf0[63] + bf0[60];
1831
1832
    // stage 8
1833
408k
    cospi   = cospi_arr(cos_bit);
1834
408k
    bf0     = output;
1835
408k
    bf1     = step;
1836
408k
    bf1[0]  = bf0[0];
1837
408k
    bf1[1]  = bf0[1];
1838
408k
    bf1[2]  = bf0[2];
1839
408k
    bf1[3]  = bf0[3];
1840
408k
    bf1[4]  = bf0[4];
1841
408k
    bf1[5]  = bf0[5];
1842
408k
    bf1[6]  = bf0[6];
1843
408k
    bf1[7]  = bf0[7];
1844
408k
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
1845
408k
    bf1[9]  = half_btf(cospi[28], bf0[9], cospi[36], bf0[14], cos_bit);
1846
408k
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
1847
408k
    bf1[11] = half_btf(cospi[12], bf0[11], cospi[52], bf0[12], cos_bit);
1848
408k
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
1849
408k
    bf1[13] = half_btf(cospi[44], bf0[13], -cospi[20], bf0[10], cos_bit);
1850
408k
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
1851
408k
    bf1[15] = half_btf(cospi[60], bf0[15], -cospi[4], bf0[8], cos_bit);
1852
408k
    bf1[16] = bf0[16] + bf0[17];
1853
408k
    bf1[17] = -bf0[17] + bf0[16];
1854
408k
    bf1[18] = -bf0[18] + bf0[19];
1855
408k
    bf1[19] = bf0[19] + bf0[18];
1856
408k
    bf1[20] = bf0[20] + bf0[21];
1857
408k
    bf1[21] = -bf0[21] + bf0[20];
1858
408k
    bf1[22] = -bf0[22] + bf0[23];
1859
408k
    bf1[23] = bf0[23] + bf0[22];
1860
408k
    bf1[24] = bf0[24] + bf0[25];
1861
408k
    bf1[25] = -bf0[25] + bf0[24];
1862
408k
    bf1[26] = -bf0[26] + bf0[27];
1863
408k
    bf1[27] = bf0[27] + bf0[26];
1864
408k
    bf1[28] = bf0[28] + bf0[29];
1865
408k
    bf1[29] = -bf0[29] + bf0[28];
1866
408k
    bf1[30] = -bf0[30] + bf0[31];
1867
408k
    bf1[31] = bf0[31] + bf0[30];
1868
408k
    bf1[32] = bf0[32];
1869
408k
    bf1[33] = half_btf(-cospi[4], bf0[33], cospi[60], bf0[62], cos_bit);
1870
408k
    bf1[34] = half_btf(-cospi[60], bf0[34], -cospi[4], bf0[61], cos_bit);
1871
408k
    bf1[35] = bf0[35];
1872
408k
    bf1[36] = bf0[36];
1873
408k
    bf1[37] = half_btf(-cospi[36], bf0[37], cospi[28], bf0[58], cos_bit);
1874
408k
    bf1[38] = half_btf(-cospi[28], bf0[38], -cospi[36], bf0[57], cos_bit);
1875
408k
    bf1[39] = bf0[39];
1876
408k
    bf1[40] = bf0[40];
1877
408k
    bf1[41] = half_btf(-cospi[20], bf0[41], cospi[44], bf0[54], cos_bit);
1878
408k
    bf1[42] = half_btf(-cospi[44], bf0[42], -cospi[20], bf0[53], cos_bit);
1879
408k
    bf1[43] = bf0[43];
1880
408k
    bf1[44] = bf0[44];
1881
408k
    bf1[45] = half_btf(-cospi[52], bf0[45], cospi[12], bf0[50], cos_bit);
1882
408k
    bf1[46] = half_btf(-cospi[12], bf0[46], -cospi[52], bf0[49], cos_bit);
1883
408k
    bf1[47] = bf0[47];
1884
408k
    bf1[48] = bf0[48];
1885
408k
    bf1[49] = half_btf(cospi[12], bf0[49], -cospi[52], bf0[46], cos_bit);
1886
408k
    bf1[50] = half_btf(cospi[52], bf0[50], cospi[12], bf0[45], cos_bit);
1887
408k
    bf1[51] = bf0[51];
1888
408k
    bf1[52] = bf0[52];
1889
408k
    bf1[53] = half_btf(cospi[44], bf0[53], -cospi[20], bf0[42], cos_bit);
1890
408k
    bf1[54] = half_btf(cospi[20], bf0[54], cospi[44], bf0[41], cos_bit);
1891
408k
    bf1[55] = bf0[55];
1892
408k
    bf1[56] = bf0[56];
1893
408k
    bf1[57] = half_btf(cospi[28], bf0[57], -cospi[36], bf0[38], cos_bit);
1894
408k
    bf1[58] = half_btf(cospi[36], bf0[58], cospi[28], bf0[37], cos_bit);
1895
408k
    bf1[59] = bf0[59];
1896
408k
    bf1[60] = bf0[60];
1897
408k
    bf1[61] = half_btf(cospi[60], bf0[61], -cospi[4], bf0[34], cos_bit);
1898
408k
    bf1[62] = half_btf(cospi[4], bf0[62], cospi[60], bf0[33], cos_bit);
1899
408k
    bf1[63] = bf0[63];
1900
1901
    // stage 9
1902
408k
    cospi   = cospi_arr(cos_bit);
1903
408k
    bf0     = step;
1904
408k
    bf1     = output;
1905
408k
    bf1[0]  = bf0[0];
1906
408k
    bf1[1]  = bf0[1];
1907
408k
    bf1[2]  = bf0[2];
1908
408k
    bf1[3]  = bf0[3];
1909
408k
    bf1[4]  = bf0[4];
1910
408k
    bf1[5]  = bf0[5];
1911
408k
    bf1[6]  = bf0[6];
1912
408k
    bf1[7]  = bf0[7];
1913
408k
    bf1[8]  = bf0[8];
1914
408k
    bf1[9]  = bf0[9];
1915
408k
    bf1[10] = bf0[10];
1916
408k
    bf1[11] = bf0[11];
1917
408k
    bf1[12] = bf0[12];
1918
408k
    bf1[13] = bf0[13];
1919
408k
    bf1[14] = bf0[14];
1920
408k
    bf1[15] = bf0[15];
1921
408k
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
1922
408k
    bf1[17] = half_btf(cospi[30], bf0[17], cospi[34], bf0[30], cos_bit);
1923
408k
    bf1[18] = half_btf(cospi[46], bf0[18], cospi[18], bf0[29], cos_bit);
1924
408k
    bf1[19] = half_btf(cospi[14], bf0[19], cospi[50], bf0[28], cos_bit);
1925
408k
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
1926
408k
    bf1[21] = half_btf(cospi[22], bf0[21], cospi[42], bf0[26], cos_bit);
1927
408k
    bf1[22] = half_btf(cospi[38], bf0[22], cospi[26], bf0[25], cos_bit);
1928
408k
    bf1[23] = half_btf(cospi[6], bf0[23], cospi[58], bf0[24], cos_bit);
1929
408k
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
1930
408k
    bf1[25] = half_btf(cospi[38], bf0[25], -cospi[26], bf0[22], cos_bit);
1931
408k
    bf1[26] = half_btf(cospi[22], bf0[26], -cospi[42], bf0[21], cos_bit);
1932
408k
    bf1[27] = half_btf(cospi[54], bf0[27], -cospi[10], bf0[20], cos_bit);
1933
408k
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
1934
408k
    bf1[29] = half_btf(cospi[46], bf0[29], -cospi[18], bf0[18], cos_bit);
1935
408k
    bf1[30] = half_btf(cospi[30], bf0[30], -cospi[34], bf0[17], cos_bit);
1936
408k
    bf1[31] = half_btf(cospi[62], bf0[31], -cospi[2], bf0[16], cos_bit);
1937
408k
    bf1[32] = bf0[32] + bf0[33];
1938
408k
    bf1[33] = -bf0[33] + bf0[32];
1939
408k
    bf1[34] = -bf0[34] + bf0[35];
1940
408k
    bf1[35] = bf0[35] + bf0[34];
1941
408k
    bf1[36] = bf0[36] + bf0[37];
1942
408k
    bf1[37] = -bf0[37] + bf0[36];
1943
408k
    bf1[38] = -bf0[38] + bf0[39];
1944
408k
    bf1[39] = bf0[39] + bf0[38];
1945
408k
    bf1[40] = bf0[40] + bf0[41];
1946
408k
    bf1[41] = -bf0[41] + bf0[40];
1947
408k
    bf1[42] = -bf0[42] + bf0[43];
1948
408k
    bf1[43] = bf0[43] + bf0[42];
1949
408k
    bf1[44] = bf0[44] + bf0[45];
1950
408k
    bf1[45] = -bf0[45] + bf0[44];
1951
408k
    bf1[46] = -bf0[46] + bf0[47];
1952
408k
    bf1[47] = bf0[47] + bf0[46];
1953
408k
    bf1[48] = bf0[48] + bf0[49];
1954
408k
    bf1[49] = -bf0[49] + bf0[48];
1955
408k
    bf1[50] = -bf0[50] + bf0[51];
1956
408k
    bf1[51] = bf0[51] + bf0[50];
1957
408k
    bf1[52] = bf0[52] + bf0[53];
1958
408k
    bf1[53] = -bf0[53] + bf0[52];
1959
408k
    bf1[54] = -bf0[54] + bf0[55];
1960
408k
    bf1[55] = bf0[55] + bf0[54];
1961
408k
    bf1[56] = bf0[56] + bf0[57];
1962
408k
    bf1[57] = -bf0[57] + bf0[56];
1963
408k
    bf1[58] = -bf0[58] + bf0[59];
1964
408k
    bf1[59] = bf0[59] + bf0[58];
1965
408k
    bf1[60] = bf0[60] + bf0[61];
1966
408k
    bf1[61] = -bf0[61] + bf0[60];
1967
408k
    bf1[62] = -bf0[62] + bf0[63];
1968
408k
    bf1[63] = bf0[63] + bf0[62];
1969
1970
    // stage 10
1971
408k
    cospi   = cospi_arr(cos_bit);
1972
408k
    bf0     = output;
1973
408k
    bf1     = step;
1974
408k
    bf1[0]  = bf0[0];
1975
408k
    bf1[1]  = bf0[1];
1976
408k
    bf1[2]  = bf0[2];
1977
408k
    bf1[3]  = bf0[3];
1978
408k
    bf1[4]  = bf0[4];
1979
408k
    bf1[5]  = bf0[5];
1980
408k
    bf1[6]  = bf0[6];
1981
408k
    bf1[7]  = bf0[7];
1982
408k
    bf1[8]  = bf0[8];
1983
408k
    bf1[9]  = bf0[9];
1984
408k
    bf1[10] = bf0[10];
1985
408k
    bf1[11] = bf0[11];
1986
408k
    bf1[12] = bf0[12];
1987
408k
    bf1[13] = bf0[13];
1988
408k
    bf1[14] = bf0[14];
1989
408k
    bf1[15] = bf0[15];
1990
408k
    bf1[16] = bf0[16];
1991
408k
    bf1[17] = bf0[17];
1992
408k
    bf1[18] = bf0[18];
1993
408k
    bf1[19] = bf0[19];
1994
408k
    bf1[20] = bf0[20];
1995
408k
    bf1[21] = bf0[21];
1996
408k
    bf1[22] = bf0[22];
1997
408k
    bf1[23] = bf0[23];
1998
408k
    bf1[24] = bf0[24];
1999
408k
    bf1[25] = bf0[25];
2000
408k
    bf1[26] = bf0[26];
2001
408k
    bf1[27] = bf0[27];
2002
408k
    bf1[28] = bf0[28];
2003
408k
    bf1[29] = bf0[29];
2004
408k
    bf1[30] = bf0[30];
2005
408k
    bf1[31] = bf0[31];
2006
408k
    bf1[32] = half_btf(cospi[63], bf0[32], cospi[1], bf0[63], cos_bit);
2007
408k
    bf1[33] = half_btf(cospi[31], bf0[33], cospi[33], bf0[62], cos_bit);
2008
408k
    bf1[34] = half_btf(cospi[47], bf0[34], cospi[17], bf0[61], cos_bit);
2009
408k
    bf1[35] = half_btf(cospi[15], bf0[35], cospi[49], bf0[60], cos_bit);
2010
408k
    bf1[36] = half_btf(cospi[55], bf0[36], cospi[9], bf0[59], cos_bit);
2011
408k
    bf1[37] = half_btf(cospi[23], bf0[37], cospi[41], bf0[58], cos_bit);
2012
408k
    bf1[38] = half_btf(cospi[39], bf0[38], cospi[25], bf0[57], cos_bit);
2013
408k
    bf1[39] = half_btf(cospi[7], bf0[39], cospi[57], bf0[56], cos_bit);
2014
408k
    bf1[40] = half_btf(cospi[59], bf0[40], cospi[5], bf0[55], cos_bit);
2015
408k
    bf1[41] = half_btf(cospi[27], bf0[41], cospi[37], bf0[54], cos_bit);
2016
408k
    bf1[42] = half_btf(cospi[43], bf0[42], cospi[21], bf0[53], cos_bit);
2017
408k
    bf1[43] = half_btf(cospi[11], bf0[43], cospi[53], bf0[52], cos_bit);
2018
408k
    bf1[44] = half_btf(cospi[51], bf0[44], cospi[13], bf0[51], cos_bit);
2019
408k
    bf1[45] = half_btf(cospi[19], bf0[45], cospi[45], bf0[50], cos_bit);
2020
408k
    bf1[46] = half_btf(cospi[35], bf0[46], cospi[29], bf0[49], cos_bit);
2021
408k
    bf1[47] = half_btf(cospi[3], bf0[47], cospi[61], bf0[48], cos_bit);
2022
408k
    bf1[48] = half_btf(cospi[3], bf0[48], -cospi[61], bf0[47], cos_bit);
2023
408k
    bf1[49] = half_btf(cospi[35], bf0[49], -cospi[29], bf0[46], cos_bit);
2024
408k
    bf1[50] = half_btf(cospi[19], bf0[50], -cospi[45], bf0[45], cos_bit);
2025
408k
    bf1[51] = half_btf(cospi[51], bf0[51], -cospi[13], bf0[44], cos_bit);
2026
408k
    bf1[52] = half_btf(cospi[11], bf0[52], -cospi[53], bf0[43], cos_bit);
2027
408k
    bf1[53] = half_btf(cospi[43], bf0[53], -cospi[21], bf0[42], cos_bit);
2028
408k
    bf1[54] = half_btf(cospi[27], bf0[54], -cospi[37], bf0[41], cos_bit);
2029
408k
    bf1[55] = half_btf(cospi[59], bf0[55], -cospi[5], bf0[40], cos_bit);
2030
408k
    bf1[56] = half_btf(cospi[7], bf0[56], -cospi[57], bf0[39], cos_bit);
2031
408k
    bf1[57] = half_btf(cospi[39], bf0[57], -cospi[25], bf0[38], cos_bit);
2032
408k
    bf1[58] = half_btf(cospi[23], bf0[58], -cospi[41], bf0[37], cos_bit);
2033
408k
    bf1[59] = half_btf(cospi[55], bf0[59], -cospi[9], bf0[36], cos_bit);
2034
408k
    bf1[60] = half_btf(cospi[15], bf0[60], -cospi[49], bf0[35], cos_bit);
2035
408k
    bf1[61] = half_btf(cospi[47], bf0[61], -cospi[17], bf0[34], cos_bit);
2036
408k
    bf1[62] = half_btf(cospi[31], bf0[62], -cospi[33], bf0[33], cos_bit);
2037
408k
    bf1[63] = half_btf(cospi[63], bf0[63], -cospi[1], bf0[32], cos_bit);
2038
2039
    // stage 11
2040
408k
    bf0     = step;
2041
408k
    bf1     = output;
2042
408k
    bf1[0]  = bf0[0];
2043
408k
    bf1[1]  = bf0[32];
2044
408k
    bf1[2]  = bf0[16];
2045
408k
    bf1[3]  = bf0[48];
2046
408k
    bf1[4]  = bf0[8];
2047
408k
    bf1[5]  = bf0[40];
2048
408k
    bf1[6]  = bf0[24];
2049
408k
    bf1[7]  = bf0[56];
2050
408k
    bf1[8]  = bf0[4];
2051
408k
    bf1[9]  = bf0[36];
2052
408k
    bf1[10] = bf0[20];
2053
408k
    bf1[11] = bf0[52];
2054
408k
    bf1[12] = bf0[12];
2055
408k
    bf1[13] = bf0[44];
2056
408k
    bf1[14] = bf0[28];
2057
408k
    bf1[15] = bf0[60];
2058
408k
    bf1[16] = bf0[2];
2059
408k
    bf1[17] = bf0[34];
2060
408k
    bf1[18] = bf0[18];
2061
408k
    bf1[19] = bf0[50];
2062
408k
    bf1[20] = bf0[10];
2063
408k
    bf1[21] = bf0[42];
2064
408k
    bf1[22] = bf0[26];
2065
408k
    bf1[23] = bf0[58];
2066
408k
    bf1[24] = bf0[6];
2067
408k
    bf1[25] = bf0[38];
2068
408k
    bf1[26] = bf0[22];
2069
408k
    bf1[27] = bf0[54];
2070
408k
    bf1[28] = bf0[14];
2071
408k
    bf1[29] = bf0[46];
2072
408k
    bf1[30] = bf0[30];
2073
408k
    bf1[31] = bf0[62];
2074
408k
    bf1[32] = bf0[1];
2075
408k
    bf1[33] = bf0[33];
2076
408k
    bf1[34] = bf0[17];
2077
408k
    bf1[35] = bf0[49];
2078
408k
    bf1[36] = bf0[9];
2079
408k
    bf1[37] = bf0[41];
2080
408k
    bf1[38] = bf0[25];
2081
408k
    bf1[39] = bf0[57];
2082
408k
    bf1[40] = bf0[5];
2083
408k
    bf1[41] = bf0[37];
2084
408k
    bf1[42] = bf0[21];
2085
408k
    bf1[43] = bf0[53];
2086
408k
    bf1[44] = bf0[13];
2087
408k
    bf1[45] = bf0[45];
2088
408k
    bf1[46] = bf0[29];
2089
408k
    bf1[47] = bf0[61];
2090
408k
    bf1[48] = bf0[3];
2091
408k
    bf1[49] = bf0[35];
2092
408k
    bf1[50] = bf0[19];
2093
408k
    bf1[51] = bf0[51];
2094
408k
    bf1[52] = bf0[11];
2095
408k
    bf1[53] = bf0[43];
2096
408k
    bf1[54] = bf0[27];
2097
408k
    bf1[55] = bf0[59];
2098
408k
    bf1[56] = bf0[7];
2099
408k
    bf1[57] = bf0[39];
2100
408k
    bf1[58] = bf0[23];
2101
408k
    bf1[59] = bf0[55];
2102
408k
    bf1[60] = bf0[15];
2103
408k
    bf1[61] = bf0[47];
2104
408k
    bf1[62] = bf0[31];
2105
408k
    bf1[63] = bf0[63];
2106
408k
}
2107
2108
0
void svt_av1_fadst4_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2109
0
    (void)stage_range;
2110
0
    int32_t        bit   = cos_bit;
2111
0
    const int32_t* sinpi = sinpi_arr(bit);
2112
0
    int32_t        x0, x1, x2, x3;
2113
0
    int32_t        s0, s1, s2, s3, s4, s5, s6, s7;
2114
2115
    // stage 0
2116
0
    x0 = input[0];
2117
0
    x1 = input[1];
2118
0
    x2 = input[2];
2119
0
    x3 = input[3];
2120
2121
0
    if (!(x0 | x1 | x2 | x3)) {
2122
0
        output[0] = output[1] = output[2] = output[3] = 0;
2123
0
        return;
2124
0
    }
2125
2126
    //// stage 1
2127
    //s0 = range_check_value(sinpi[1] * x0, bit + stage_range[1]);
2128
    //s1 = range_check_value(sinpi[4] * x0, bit + stage_range[1]);
2129
    //s2 = range_check_value(sinpi[2] * x1, bit + stage_range[1]);
2130
    //s3 = range_check_value(sinpi[1] * x1, bit + stage_range[1]);
2131
    //s4 = range_check_value(sinpi[3] * x2, bit + stage_range[1]);
2132
    //s5 = range_check_value(sinpi[4] * x3, bit + stage_range[1]);
2133
    //s6 = range_check_value(sinpi[2] * x3, bit + stage_range[1]);
2134
    //s7 = range_check_value(x0 + x1, stage_range[1]);
2135
2136
    //// stage 2
2137
    //s7 = range_check_value(s7 - x3, stage_range[2]);
2138
2139
    //// stage 3
2140
    //x0 = range_check_value(s0 + s2, bit + stage_range[3]);
2141
    //x1 = range_check_value(sinpi[3] * s7, bit + stage_range[3]);
2142
    //x2 = range_check_value(s1 - s3, bit + stage_range[3]);
2143
    //x3 = range_check_value(s4, bit + stage_range[3]);
2144
2145
    //// stage 4
2146
    //x0 = range_check_value(x0 + s5, bit + stage_range[4]);
2147
    //x2 = range_check_value(x2 + s6, bit + stage_range[4]);
2148
2149
    //// stage 5
2150
    //s0 = range_check_value(x0 + x3, bit + stage_range[5]);
2151
    //s1 = range_check_value(x1, bit + stage_range[5]);
2152
    //s2 = range_check_value(x2 - x3, bit + stage_range[5]);
2153
    //s3 = range_check_value(x2 - x0, bit + stage_range[5]);
2154
2155
    //// stage 6
2156
    //s3 = range_check_value(s3 + x3, bit + stage_range[6]);
2157
2158
    // stage 1
2159
0
    s0 = sinpi[1] * x0;
2160
0
    s1 = sinpi[4] * x0;
2161
0
    s2 = sinpi[2] * x1;
2162
0
    s3 = sinpi[1] * x1;
2163
0
    s4 = sinpi[3] * x2;
2164
0
    s5 = sinpi[4] * x3;
2165
0
    s6 = sinpi[2] * x3;
2166
0
    s7 = x0 + x1;
2167
2168
    // stage 2
2169
0
    s7 = s7 - x3;
2170
2171
    // stage 3
2172
0
    x0 = s0 + s2;
2173
0
    x1 = sinpi[3] * s7;
2174
0
    x2 = s1 - s3;
2175
0
    x3 = s4;
2176
2177
    // stage 4
2178
0
    x0 = x0 + s5;
2179
0
    x2 = x2 + s6;
2180
2181
    // stage 5
2182
0
    s0 = x0 + x3;
2183
0
    s1 = x1;
2184
0
    s2 = x2 - x3;
2185
0
    s3 = x2 - x0;
2186
2187
    // stage 6
2188
0
    s3 = s3 + x3;
2189
2190
    // 1-D transform scaling factor is sqrt(2).
2191
0
    output[0] = round_shift(s0, bit);
2192
0
    output[1] = round_shift(s1, bit);
2193
0
    output[2] = round_shift(s2, bit);
2194
0
    output[3] = round_shift(s3, bit);
2195
0
}
2196
2197
0
void svt_av1_fadst8_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2198
0
    (void)stage_range;
2199
0
    const int32_t* cospi;
2200
2201
0
    int32_t *bf0, *bf1;
2202
0
    int32_t  step[8];
2203
2204
    // stage 0;
2205
2206
    // stage 1;
2207
0
    assert(output != input);
2208
0
    bf1    = output;
2209
0
    bf1[0] = input[0];
2210
0
    bf1[1] = -input[7];
2211
0
    bf1[2] = -input[3];
2212
0
    bf1[3] = input[4];
2213
0
    bf1[4] = -input[1];
2214
0
    bf1[5] = input[6];
2215
0
    bf1[6] = input[2];
2216
0
    bf1[7] = -input[5];
2217
2218
    // stage 2
2219
0
    cospi  = cospi_arr(cos_bit);
2220
0
    bf0    = output;
2221
0
    bf1    = step;
2222
0
    bf1[0] = bf0[0];
2223
0
    bf1[1] = bf0[1];
2224
0
    bf1[2] = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
2225
0
    bf1[3] = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
2226
0
    bf1[4] = bf0[4];
2227
0
    bf1[5] = bf0[5];
2228
0
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
2229
0
    bf1[7] = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
2230
2231
    // stage 3
2232
0
    bf0    = step;
2233
0
    bf1    = output;
2234
0
    bf1[0] = bf0[0] + bf0[2];
2235
0
    bf1[1] = bf0[1] + bf0[3];
2236
0
    bf1[2] = bf0[0] - bf0[2];
2237
0
    bf1[3] = bf0[1] - bf0[3];
2238
0
    bf1[4] = bf0[4] + bf0[6];
2239
0
    bf1[5] = bf0[5] + bf0[7];
2240
0
    bf1[6] = bf0[4] - bf0[6];
2241
0
    bf1[7] = bf0[5] - bf0[7];
2242
2243
    // stage 4
2244
0
    cospi  = cospi_arr(cos_bit);
2245
0
    bf0    = output;
2246
0
    bf1    = step;
2247
0
    bf1[0] = bf0[0];
2248
0
    bf1[1] = bf0[1];
2249
0
    bf1[2] = bf0[2];
2250
0
    bf1[3] = bf0[3];
2251
0
    bf1[4] = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
2252
0
    bf1[5] = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
2253
0
    bf1[6] = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
2254
0
    bf1[7] = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
2255
2256
    // stage 5
2257
0
    bf0    = step;
2258
0
    bf1    = output;
2259
0
    bf1[0] = bf0[0] + bf0[4];
2260
0
    bf1[1] = bf0[1] + bf0[5];
2261
0
    bf1[2] = bf0[2] + bf0[6];
2262
0
    bf1[3] = bf0[3] + bf0[7];
2263
0
    bf1[4] = bf0[0] - bf0[4];
2264
0
    bf1[5] = bf0[1] - bf0[5];
2265
0
    bf1[6] = bf0[2] - bf0[6];
2266
0
    bf1[7] = bf0[3] - bf0[7];
2267
2268
    // stage 6
2269
0
    cospi  = cospi_arr(cos_bit);
2270
0
    bf0    = output;
2271
0
    bf1    = step;
2272
0
    bf1[0] = half_btf(cospi[4], bf0[0], cospi[60], bf0[1], cos_bit);
2273
0
    bf1[1] = half_btf(cospi[60], bf0[0], -cospi[4], bf0[1], cos_bit);
2274
0
    bf1[2] = half_btf(cospi[20], bf0[2], cospi[44], bf0[3], cos_bit);
2275
0
    bf1[3] = half_btf(cospi[44], bf0[2], -cospi[20], bf0[3], cos_bit);
2276
0
    bf1[4] = half_btf(cospi[36], bf0[4], cospi[28], bf0[5], cos_bit);
2277
0
    bf1[5] = half_btf(cospi[28], bf0[4], -cospi[36], bf0[5], cos_bit);
2278
0
    bf1[6] = half_btf(cospi[52], bf0[6], cospi[12], bf0[7], cos_bit);
2279
0
    bf1[7] = half_btf(cospi[12], bf0[6], -cospi[52], bf0[7], cos_bit);
2280
2281
    // stage 7
2282
0
    bf0    = step;
2283
0
    bf1    = output;
2284
0
    bf1[0] = bf0[1];
2285
0
    bf1[1] = bf0[6];
2286
0
    bf1[2] = bf0[3];
2287
0
    bf1[3] = bf0[4];
2288
0
    bf1[4] = bf0[5];
2289
0
    bf1[5] = bf0[2];
2290
0
    bf1[6] = bf0[7];
2291
0
    bf1[7] = bf0[0];
2292
0
}
2293
2294
0
void svt_av1_fadst16_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2295
0
    (void)stage_range;
2296
0
    const int32_t* cospi;
2297
2298
0
    int32_t *bf0, *bf1;
2299
0
    int32_t  step[16];
2300
2301
    // stage 0;
2302
2303
    // stage 1;
2304
0
    assert(output != input);
2305
0
    bf1     = output;
2306
0
    bf1[0]  = input[0];
2307
0
    bf1[1]  = -input[15];
2308
0
    bf1[2]  = -input[7];
2309
0
    bf1[3]  = input[8];
2310
0
    bf1[4]  = -input[3];
2311
0
    bf1[5]  = input[12];
2312
0
    bf1[6]  = input[4];
2313
0
    bf1[7]  = -input[11];
2314
0
    bf1[8]  = -input[1];
2315
0
    bf1[9]  = input[14];
2316
0
    bf1[10] = input[6];
2317
0
    bf1[11] = -input[9];
2318
0
    bf1[12] = input[2];
2319
0
    bf1[13] = -input[13];
2320
0
    bf1[14] = -input[5];
2321
0
    bf1[15] = input[10];
2322
2323
    // stage 2
2324
0
    cospi   = cospi_arr(cos_bit);
2325
0
    bf0     = output;
2326
0
    bf1     = step;
2327
0
    bf1[0]  = bf0[0];
2328
0
    bf1[1]  = bf0[1];
2329
0
    bf1[2]  = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
2330
0
    bf1[3]  = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
2331
0
    bf1[4]  = bf0[4];
2332
0
    bf1[5]  = bf0[5];
2333
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
2334
0
    bf1[7]  = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
2335
0
    bf1[8]  = bf0[8];
2336
0
    bf1[9]  = bf0[9];
2337
0
    bf1[10] = half_btf(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
2338
0
    bf1[11] = half_btf(cospi[32], bf0[10], -cospi[32], bf0[11], cos_bit);
2339
0
    bf1[12] = bf0[12];
2340
0
    bf1[13] = bf0[13];
2341
0
    bf1[14] = half_btf(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
2342
0
    bf1[15] = half_btf(cospi[32], bf0[14], -cospi[32], bf0[15], cos_bit);
2343
2344
    // stage 3
2345
0
    bf0     = step;
2346
0
    bf1     = output;
2347
0
    bf1[0]  = bf0[0] + bf0[2];
2348
0
    bf1[1]  = bf0[1] + bf0[3];
2349
0
    bf1[2]  = bf0[0] - bf0[2];
2350
0
    bf1[3]  = bf0[1] - bf0[3];
2351
0
    bf1[4]  = bf0[4] + bf0[6];
2352
0
    bf1[5]  = bf0[5] + bf0[7];
2353
0
    bf1[6]  = bf0[4] - bf0[6];
2354
0
    bf1[7]  = bf0[5] - bf0[7];
2355
0
    bf1[8]  = bf0[8] + bf0[10];
2356
0
    bf1[9]  = bf0[9] + bf0[11];
2357
0
    bf1[10] = bf0[8] - bf0[10];
2358
0
    bf1[11] = bf0[9] - bf0[11];
2359
0
    bf1[12] = bf0[12] + bf0[14];
2360
0
    bf1[13] = bf0[13] + bf0[15];
2361
0
    bf1[14] = bf0[12] - bf0[14];
2362
0
    bf1[15] = bf0[13] - bf0[15];
2363
2364
    // stage 4
2365
0
    cospi   = cospi_arr(cos_bit);
2366
0
    bf0     = output;
2367
0
    bf1     = step;
2368
0
    bf1[0]  = bf0[0];
2369
0
    bf1[1]  = bf0[1];
2370
0
    bf1[2]  = bf0[2];
2371
0
    bf1[3]  = bf0[3];
2372
0
    bf1[4]  = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
2373
0
    bf1[5]  = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
2374
0
    bf1[6]  = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
2375
0
    bf1[7]  = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
2376
0
    bf1[8]  = bf0[8];
2377
0
    bf1[9]  = bf0[9];
2378
0
    bf1[10] = bf0[10];
2379
0
    bf1[11] = bf0[11];
2380
0
    bf1[12] = half_btf(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
2381
0
    bf1[13] = half_btf(cospi[48], bf0[12], -cospi[16], bf0[13], cos_bit);
2382
0
    bf1[14] = half_btf(-cospi[48], bf0[14], cospi[16], bf0[15], cos_bit);
2383
0
    bf1[15] = half_btf(cospi[16], bf0[14], cospi[48], bf0[15], cos_bit);
2384
2385
    // stage 5
2386
0
    bf0     = step;
2387
0
    bf1     = output;
2388
0
    bf1[0]  = bf0[0] + bf0[4];
2389
0
    bf1[1]  = bf0[1] + bf0[5];
2390
0
    bf1[2]  = bf0[2] + bf0[6];
2391
0
    bf1[3]  = bf0[3] + bf0[7];
2392
0
    bf1[4]  = bf0[0] - bf0[4];
2393
0
    bf1[5]  = bf0[1] - bf0[5];
2394
0
    bf1[6]  = bf0[2] - bf0[6];
2395
0
    bf1[7]  = bf0[3] - bf0[7];
2396
0
    bf1[8]  = bf0[8] + bf0[12];
2397
0
    bf1[9]  = bf0[9] + bf0[13];
2398
0
    bf1[10] = bf0[10] + bf0[14];
2399
0
    bf1[11] = bf0[11] + bf0[15];
2400
0
    bf1[12] = bf0[8] - bf0[12];
2401
0
    bf1[13] = bf0[9] - bf0[13];
2402
0
    bf1[14] = bf0[10] - bf0[14];
2403
0
    bf1[15] = bf0[11] - bf0[15];
2404
2405
    // stage 6
2406
0
    cospi   = cospi_arr(cos_bit);
2407
0
    bf0     = output;
2408
0
    bf1     = step;
2409
0
    bf1[0]  = bf0[0];
2410
0
    bf1[1]  = bf0[1];
2411
0
    bf1[2]  = bf0[2];
2412
0
    bf1[3]  = bf0[3];
2413
0
    bf1[4]  = bf0[4];
2414
0
    bf1[5]  = bf0[5];
2415
0
    bf1[6]  = bf0[6];
2416
0
    bf1[7]  = bf0[7];
2417
0
    bf1[8]  = half_btf(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
2418
0
    bf1[9]  = half_btf(cospi[56], bf0[8], -cospi[8], bf0[9], cos_bit);
2419
0
    bf1[10] = half_btf(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
2420
0
    bf1[11] = half_btf(cospi[24], bf0[10], -cospi[40], bf0[11], cos_bit);
2421
0
    bf1[12] = half_btf(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
2422
0
    bf1[13] = half_btf(cospi[8], bf0[12], cospi[56], bf0[13], cos_bit);
2423
0
    bf1[14] = half_btf(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
2424
0
    bf1[15] = half_btf(cospi[40], bf0[14], cospi[24], bf0[15], cos_bit);
2425
2426
    // stage 7
2427
0
    bf0     = step;
2428
0
    bf1     = output;
2429
0
    bf1[0]  = bf0[0] + bf0[8];
2430
0
    bf1[1]  = bf0[1] + bf0[9];
2431
0
    bf1[2]  = bf0[2] + bf0[10];
2432
0
    bf1[3]  = bf0[3] + bf0[11];
2433
0
    bf1[4]  = bf0[4] + bf0[12];
2434
0
    bf1[5]  = bf0[5] + bf0[13];
2435
0
    bf1[6]  = bf0[6] + bf0[14];
2436
0
    bf1[7]  = bf0[7] + bf0[15];
2437
0
    bf1[8]  = bf0[0] - bf0[8];
2438
0
    bf1[9]  = bf0[1] - bf0[9];
2439
0
    bf1[10] = bf0[2] - bf0[10];
2440
0
    bf1[11] = bf0[3] - bf0[11];
2441
0
    bf1[12] = bf0[4] - bf0[12];
2442
0
    bf1[13] = bf0[5] - bf0[13];
2443
0
    bf1[14] = bf0[6] - bf0[14];
2444
0
    bf1[15] = bf0[7] - bf0[15];
2445
2446
    // stage 8
2447
0
    cospi   = cospi_arr(cos_bit);
2448
0
    bf0     = output;
2449
0
    bf1     = step;
2450
0
    bf1[0]  = half_btf(cospi[2], bf0[0], cospi[62], bf0[1], cos_bit);
2451
0
    bf1[1]  = half_btf(cospi[62], bf0[0], -cospi[2], bf0[1], cos_bit);
2452
0
    bf1[2]  = half_btf(cospi[10], bf0[2], cospi[54], bf0[3], cos_bit);
2453
0
    bf1[3]  = half_btf(cospi[54], bf0[2], -cospi[10], bf0[3], cos_bit);
2454
0
    bf1[4]  = half_btf(cospi[18], bf0[4], cospi[46], bf0[5], cos_bit);
2455
0
    bf1[5]  = half_btf(cospi[46], bf0[4], -cospi[18], bf0[5], cos_bit);
2456
0
    bf1[6]  = half_btf(cospi[26], bf0[6], cospi[38], bf0[7], cos_bit);
2457
0
    bf1[7]  = half_btf(cospi[38], bf0[6], -cospi[26], bf0[7], cos_bit);
2458
0
    bf1[8]  = half_btf(cospi[34], bf0[8], cospi[30], bf0[9], cos_bit);
2459
0
    bf1[9]  = half_btf(cospi[30], bf0[8], -cospi[34], bf0[9], cos_bit);
2460
0
    bf1[10] = half_btf(cospi[42], bf0[10], cospi[22], bf0[11], cos_bit);
2461
0
    bf1[11] = half_btf(cospi[22], bf0[10], -cospi[42], bf0[11], cos_bit);
2462
0
    bf1[12] = half_btf(cospi[50], bf0[12], cospi[14], bf0[13], cos_bit);
2463
0
    bf1[13] = half_btf(cospi[14], bf0[12], -cospi[50], bf0[13], cos_bit);
2464
0
    bf1[14] = half_btf(cospi[58], bf0[14], cospi[6], bf0[15], cos_bit);
2465
0
    bf1[15] = half_btf(cospi[6], bf0[14], -cospi[58], bf0[15], cos_bit);
2466
2467
    // stage 9
2468
0
    bf0     = step;
2469
0
    bf1     = output;
2470
0
    bf1[0]  = bf0[1];
2471
0
    bf1[1]  = bf0[14];
2472
0
    bf1[2]  = bf0[3];
2473
0
    bf1[3]  = bf0[12];
2474
0
    bf1[4]  = bf0[5];
2475
0
    bf1[5]  = bf0[10];
2476
0
    bf1[6]  = bf0[7];
2477
0
    bf1[7]  = bf0[8];
2478
0
    bf1[8]  = bf0[9];
2479
0
    bf1[9]  = bf0[6];
2480
0
    bf1[10] = bf0[11];
2481
0
    bf1[11] = bf0[4];
2482
0
    bf1[12] = bf0[13];
2483
0
    bf1[13] = bf0[2];
2484
0
    bf1[14] = bf0[15];
2485
0
    bf1[15] = bf0[0];
2486
0
}
2487
2488
0
static void av1_fadst32_new(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2489
0
    (void)stage_range;
2490
0
    const int32_t* cospi;
2491
2492
0
    int32_t *bf0, *bf1;
2493
0
    int32_t  step[32];
2494
2495
    // stage 0;
2496
2497
    // stage 1;
2498
0
    bf1     = output;
2499
0
    bf1[0]  = input[31];
2500
0
    bf1[1]  = input[0];
2501
0
    bf1[2]  = input[29];
2502
0
    bf1[3]  = input[2];
2503
0
    bf1[4]  = input[27];
2504
0
    bf1[5]  = input[4];
2505
0
    bf1[6]  = input[25];
2506
0
    bf1[7]  = input[6];
2507
0
    bf1[8]  = input[23];
2508
0
    bf1[9]  = input[8];
2509
0
    bf1[10] = input[21];
2510
0
    bf1[11] = input[10];
2511
0
    bf1[12] = input[19];
2512
0
    bf1[13] = input[12];
2513
0
    bf1[14] = input[17];
2514
0
    bf1[15] = input[14];
2515
0
    bf1[16] = input[15];
2516
0
    bf1[17] = input[16];
2517
0
    bf1[18] = input[13];
2518
0
    bf1[19] = input[18];
2519
0
    bf1[20] = input[11];
2520
0
    bf1[21] = input[20];
2521
0
    bf1[22] = input[9];
2522
0
    bf1[23] = input[22];
2523
0
    bf1[24] = input[7];
2524
0
    bf1[25] = input[24];
2525
0
    bf1[26] = input[5];
2526
0
    bf1[27] = input[26];
2527
0
    bf1[28] = input[3];
2528
0
    bf1[29] = input[28];
2529
0
    bf1[30] = input[1];
2530
0
    bf1[31] = input[30];
2531
2532
    // stage 2
2533
0
    cospi   = cospi_arr(cos_bit);
2534
0
    bf0     = output;
2535
0
    bf1     = step;
2536
0
    bf1[0]  = half_btf(cospi[1], bf0[0], cospi[63], bf0[1], cos_bit);
2537
0
    bf1[1]  = half_btf(-cospi[1], bf0[1], cospi[63], bf0[0], cos_bit);
2538
0
    bf1[2]  = half_btf(cospi[5], bf0[2], cospi[59], bf0[3], cos_bit);
2539
0
    bf1[3]  = half_btf(-cospi[5], bf0[3], cospi[59], bf0[2], cos_bit);
2540
0
    bf1[4]  = half_btf(cospi[9], bf0[4], cospi[55], bf0[5], cos_bit);
2541
0
    bf1[5]  = half_btf(-cospi[9], bf0[5], cospi[55], bf0[4], cos_bit);
2542
0
    bf1[6]  = half_btf(cospi[13], bf0[6], cospi[51], bf0[7], cos_bit);
2543
0
    bf1[7]  = half_btf(-cospi[13], bf0[7], cospi[51], bf0[6], cos_bit);
2544
0
    bf1[8]  = half_btf(cospi[17], bf0[8], cospi[47], bf0[9], cos_bit);
2545
0
    bf1[9]  = half_btf(-cospi[17], bf0[9], cospi[47], bf0[8], cos_bit);
2546
0
    bf1[10] = half_btf(cospi[21], bf0[10], cospi[43], bf0[11], cos_bit);
2547
0
    bf1[11] = half_btf(-cospi[21], bf0[11], cospi[43], bf0[10], cos_bit);
2548
0
    bf1[12] = half_btf(cospi[25], bf0[12], cospi[39], bf0[13], cos_bit);
2549
0
    bf1[13] = half_btf(-cospi[25], bf0[13], cospi[39], bf0[12], cos_bit);
2550
0
    bf1[14] = half_btf(cospi[29], bf0[14], cospi[35], bf0[15], cos_bit);
2551
0
    bf1[15] = half_btf(-cospi[29], bf0[15], cospi[35], bf0[14], cos_bit);
2552
0
    bf1[16] = half_btf(cospi[33], bf0[16], cospi[31], bf0[17], cos_bit);
2553
0
    bf1[17] = half_btf(-cospi[33], bf0[17], cospi[31], bf0[16], cos_bit);
2554
0
    bf1[18] = half_btf(cospi[37], bf0[18], cospi[27], bf0[19], cos_bit);
2555
0
    bf1[19] = half_btf(-cospi[37], bf0[19], cospi[27], bf0[18], cos_bit);
2556
0
    bf1[20] = half_btf(cospi[41], bf0[20], cospi[23], bf0[21], cos_bit);
2557
0
    bf1[21] = half_btf(-cospi[41], bf0[21], cospi[23], bf0[20], cos_bit);
2558
0
    bf1[22] = half_btf(cospi[45], bf0[22], cospi[19], bf0[23], cos_bit);
2559
0
    bf1[23] = half_btf(-cospi[45], bf0[23], cospi[19], bf0[22], cos_bit);
2560
0
    bf1[24] = half_btf(cospi[49], bf0[24], cospi[15], bf0[25], cos_bit);
2561
0
    bf1[25] = half_btf(-cospi[49], bf0[25], cospi[15], bf0[24], cos_bit);
2562
0
    bf1[26] = half_btf(cospi[53], bf0[26], cospi[11], bf0[27], cos_bit);
2563
0
    bf1[27] = half_btf(-cospi[53], bf0[27], cospi[11], bf0[26], cos_bit);
2564
0
    bf1[28] = half_btf(cospi[57], bf0[28], cospi[7], bf0[29], cos_bit);
2565
0
    bf1[29] = half_btf(-cospi[57], bf0[29], cospi[7], bf0[28], cos_bit);
2566
0
    bf1[30] = half_btf(cospi[61], bf0[30], cospi[3], bf0[31], cos_bit);
2567
0
    bf1[31] = half_btf(-cospi[61], bf0[31], cospi[3], bf0[30], cos_bit);
2568
2569
    // stage 3
2570
0
    bf0     = step;
2571
0
    bf1     = output;
2572
0
    bf1[0]  = bf0[0] + bf0[16];
2573
0
    bf1[1]  = bf0[1] + bf0[17];
2574
0
    bf1[2]  = bf0[2] + bf0[18];
2575
0
    bf1[3]  = bf0[3] + bf0[19];
2576
0
    bf1[4]  = bf0[4] + bf0[20];
2577
0
    bf1[5]  = bf0[5] + bf0[21];
2578
0
    bf1[6]  = bf0[6] + bf0[22];
2579
0
    bf1[7]  = bf0[7] + bf0[23];
2580
0
    bf1[8]  = bf0[8] + bf0[24];
2581
0
    bf1[9]  = bf0[9] + bf0[25];
2582
0
    bf1[10] = bf0[10] + bf0[26];
2583
0
    bf1[11] = bf0[11] + bf0[27];
2584
0
    bf1[12] = bf0[12] + bf0[28];
2585
0
    bf1[13] = bf0[13] + bf0[29];
2586
0
    bf1[14] = bf0[14] + bf0[30];
2587
0
    bf1[15] = bf0[15] + bf0[31];
2588
0
    bf1[16] = -bf0[16] + bf0[0];
2589
0
    bf1[17] = -bf0[17] + bf0[1];
2590
0
    bf1[18] = -bf0[18] + bf0[2];
2591
0
    bf1[19] = -bf0[19] + bf0[3];
2592
0
    bf1[20] = -bf0[20] + bf0[4];
2593
0
    bf1[21] = -bf0[21] + bf0[5];
2594
0
    bf1[22] = -bf0[22] + bf0[6];
2595
0
    bf1[23] = -bf0[23] + bf0[7];
2596
0
    bf1[24] = -bf0[24] + bf0[8];
2597
0
    bf1[25] = -bf0[25] + bf0[9];
2598
0
    bf1[26] = -bf0[26] + bf0[10];
2599
0
    bf1[27] = -bf0[27] + bf0[11];
2600
0
    bf1[28] = -bf0[28] + bf0[12];
2601
0
    bf1[29] = -bf0[29] + bf0[13];
2602
0
    bf1[30] = -bf0[30] + bf0[14];
2603
0
    bf1[31] = -bf0[31] + bf0[15];
2604
2605
    // stage 4
2606
0
    cospi   = cospi_arr(cos_bit);
2607
0
    bf0     = output;
2608
0
    bf1     = step;
2609
0
    bf1[0]  = bf0[0];
2610
0
    bf1[1]  = bf0[1];
2611
0
    bf1[2]  = bf0[2];
2612
0
    bf1[3]  = bf0[3];
2613
0
    bf1[4]  = bf0[4];
2614
0
    bf1[5]  = bf0[5];
2615
0
    bf1[6]  = bf0[6];
2616
0
    bf1[7]  = bf0[7];
2617
0
    bf1[8]  = bf0[8];
2618
0
    bf1[9]  = bf0[9];
2619
0
    bf1[10] = bf0[10];
2620
0
    bf1[11] = bf0[11];
2621
0
    bf1[12] = bf0[12];
2622
0
    bf1[13] = bf0[13];
2623
0
    bf1[14] = bf0[14];
2624
0
    bf1[15] = bf0[15];
2625
0
    bf1[16] = half_btf(cospi[4], bf0[16], cospi[60], bf0[17], cos_bit);
2626
0
    bf1[17] = half_btf(-cospi[4], bf0[17], cospi[60], bf0[16], cos_bit);
2627
0
    bf1[18] = half_btf(cospi[20], bf0[18], cospi[44], bf0[19], cos_bit);
2628
0
    bf1[19] = half_btf(-cospi[20], bf0[19], cospi[44], bf0[18], cos_bit);
2629
0
    bf1[20] = half_btf(cospi[36], bf0[20], cospi[28], bf0[21], cos_bit);
2630
0
    bf1[21] = half_btf(-cospi[36], bf0[21], cospi[28], bf0[20], cos_bit);
2631
0
    bf1[22] = half_btf(cospi[52], bf0[22], cospi[12], bf0[23], cos_bit);
2632
0
    bf1[23] = half_btf(-cospi[52], bf0[23], cospi[12], bf0[22], cos_bit);
2633
0
    bf1[24] = half_btf(-cospi[60], bf0[24], cospi[4], bf0[25], cos_bit);
2634
0
    bf1[25] = half_btf(cospi[60], bf0[25], cospi[4], bf0[24], cos_bit);
2635
0
    bf1[26] = half_btf(-cospi[44], bf0[26], cospi[20], bf0[27], cos_bit);
2636
0
    bf1[27] = half_btf(cospi[44], bf0[27], cospi[20], bf0[26], cos_bit);
2637
0
    bf1[28] = half_btf(-cospi[28], bf0[28], cospi[36], bf0[29], cos_bit);
2638
0
    bf1[29] = half_btf(cospi[28], bf0[29], cospi[36], bf0[28], cos_bit);
2639
0
    bf1[30] = half_btf(-cospi[12], bf0[30], cospi[52], bf0[31], cos_bit);
2640
0
    bf1[31] = half_btf(cospi[12], bf0[31], cospi[52], bf0[30], cos_bit);
2641
2642
    // stage 5
2643
0
    bf0     = step;
2644
0
    bf1     = output;
2645
0
    bf1[0]  = bf0[0] + bf0[8];
2646
0
    bf1[1]  = bf0[1] + bf0[9];
2647
0
    bf1[2]  = bf0[2] + bf0[10];
2648
0
    bf1[3]  = bf0[3] + bf0[11];
2649
0
    bf1[4]  = bf0[4] + bf0[12];
2650
0
    bf1[5]  = bf0[5] + bf0[13];
2651
0
    bf1[6]  = bf0[6] + bf0[14];
2652
0
    bf1[7]  = bf0[7] + bf0[15];
2653
0
    bf1[8]  = -bf0[8] + bf0[0];
2654
0
    bf1[9]  = -bf0[9] + bf0[1];
2655
0
    bf1[10] = -bf0[10] + bf0[2];
2656
0
    bf1[11] = -bf0[11] + bf0[3];
2657
0
    bf1[12] = -bf0[12] + bf0[4];
2658
0
    bf1[13] = -bf0[13] + bf0[5];
2659
0
    bf1[14] = -bf0[14] + bf0[6];
2660
0
    bf1[15] = -bf0[15] + bf0[7];
2661
0
    bf1[16] = bf0[16] + bf0[24];
2662
0
    bf1[17] = bf0[17] + bf0[25];
2663
0
    bf1[18] = bf0[18] + bf0[26];
2664
0
    bf1[19] = bf0[19] + bf0[27];
2665
0
    bf1[20] = bf0[20] + bf0[28];
2666
0
    bf1[21] = bf0[21] + bf0[29];
2667
0
    bf1[22] = bf0[22] + bf0[30];
2668
0
    bf1[23] = bf0[23] + bf0[31];
2669
0
    bf1[24] = -bf0[24] + bf0[16];
2670
0
    bf1[25] = -bf0[25] + bf0[17];
2671
0
    bf1[26] = -bf0[26] + bf0[18];
2672
0
    bf1[27] = -bf0[27] + bf0[19];
2673
0
    bf1[28] = -bf0[28] + bf0[20];
2674
0
    bf1[29] = -bf0[29] + bf0[21];
2675
0
    bf1[30] = -bf0[30] + bf0[22];
2676
0
    bf1[31] = -bf0[31] + bf0[23];
2677
2678
    // stage 6
2679
0
    cospi   = cospi_arr(cos_bit);
2680
0
    bf0     = output;
2681
0
    bf1     = step;
2682
0
    bf1[0]  = bf0[0];
2683
0
    bf1[1]  = bf0[1];
2684
0
    bf1[2]  = bf0[2];
2685
0
    bf1[3]  = bf0[3];
2686
0
    bf1[4]  = bf0[4];
2687
0
    bf1[5]  = bf0[5];
2688
0
    bf1[6]  = bf0[6];
2689
0
    bf1[7]  = bf0[7];
2690
0
    bf1[8]  = half_btf(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
2691
0
    bf1[9]  = half_btf(-cospi[8], bf0[9], cospi[56], bf0[8], cos_bit);
2692
0
    bf1[10] = half_btf(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
2693
0
    bf1[11] = half_btf(-cospi[40], bf0[11], cospi[24], bf0[10], cos_bit);
2694
0
    bf1[12] = half_btf(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
2695
0
    bf1[13] = half_btf(cospi[56], bf0[13], cospi[8], bf0[12], cos_bit);
2696
0
    bf1[14] = half_btf(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
2697
0
    bf1[15] = half_btf(cospi[24], bf0[15], cospi[40], bf0[14], cos_bit);
2698
0
    bf1[16] = bf0[16];
2699
0
    bf1[17] = bf0[17];
2700
0
    bf1[18] = bf0[18];
2701
0
    bf1[19] = bf0[19];
2702
0
    bf1[20] = bf0[20];
2703
0
    bf1[21] = bf0[21];
2704
0
    bf1[22] = bf0[22];
2705
0
    bf1[23] = bf0[23];
2706
0
    bf1[24] = half_btf(cospi[8], bf0[24], cospi[56], bf0[25], cos_bit);
2707
0
    bf1[25] = half_btf(-cospi[8], bf0[25], cospi[56], bf0[24], cos_bit);
2708
0
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[27], cos_bit);
2709
0
    bf1[27] = half_btf(-cospi[40], bf0[27], cospi[24], bf0[26], cos_bit);
2710
0
    bf1[28] = half_btf(-cospi[56], bf0[28], cospi[8], bf0[29], cos_bit);
2711
0
    bf1[29] = half_btf(cospi[56], bf0[29], cospi[8], bf0[28], cos_bit);
2712
0
    bf1[30] = half_btf(-cospi[24], bf0[30], cospi[40], bf0[31], cos_bit);
2713
0
    bf1[31] = half_btf(cospi[24], bf0[31], cospi[40], bf0[30], cos_bit);
2714
2715
    // stage 7
2716
0
    bf0     = step;
2717
0
    bf1     = output;
2718
0
    bf1[0]  = bf0[0] + bf0[4];
2719
0
    bf1[1]  = bf0[1] + bf0[5];
2720
0
    bf1[2]  = bf0[2] + bf0[6];
2721
0
    bf1[3]  = bf0[3] + bf0[7];
2722
0
    bf1[4]  = -bf0[4] + bf0[0];
2723
0
    bf1[5]  = -bf0[5] + bf0[1];
2724
0
    bf1[6]  = -bf0[6] + bf0[2];
2725
0
    bf1[7]  = -bf0[7] + bf0[3];
2726
0
    bf1[8]  = bf0[8] + bf0[12];
2727
0
    bf1[9]  = bf0[9] + bf0[13];
2728
0
    bf1[10] = bf0[10] + bf0[14];
2729
0
    bf1[11] = bf0[11] + bf0[15];
2730
0
    bf1[12] = -bf0[12] + bf0[8];
2731
0
    bf1[13] = -bf0[13] + bf0[9];
2732
0
    bf1[14] = -bf0[14] + bf0[10];
2733
0
    bf1[15] = -bf0[15] + bf0[11];
2734
0
    bf1[16] = bf0[16] + bf0[20];
2735
0
    bf1[17] = bf0[17] + bf0[21];
2736
0
    bf1[18] = bf0[18] + bf0[22];
2737
0
    bf1[19] = bf0[19] + bf0[23];
2738
0
    bf1[20] = -bf0[20] + bf0[16];
2739
0
    bf1[21] = -bf0[21] + bf0[17];
2740
0
    bf1[22] = -bf0[22] + bf0[18];
2741
0
    bf1[23] = -bf0[23] + bf0[19];
2742
0
    bf1[24] = bf0[24] + bf0[28];
2743
0
    bf1[25] = bf0[25] + bf0[29];
2744
0
    bf1[26] = bf0[26] + bf0[30];
2745
0
    bf1[27] = bf0[27] + bf0[31];
2746
0
    bf1[28] = -bf0[28] + bf0[24];
2747
0
    bf1[29] = -bf0[29] + bf0[25];
2748
0
    bf1[30] = -bf0[30] + bf0[26];
2749
0
    bf1[31] = -bf0[31] + bf0[27];
2750
2751
    // stage 8
2752
0
    cospi   = cospi_arr(cos_bit);
2753
0
    bf0     = output;
2754
0
    bf1     = step;
2755
0
    bf1[0]  = bf0[0];
2756
0
    bf1[1]  = bf0[1];
2757
0
    bf1[2]  = bf0[2];
2758
0
    bf1[3]  = bf0[3];
2759
0
    bf1[4]  = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
2760
0
    bf1[5]  = half_btf(-cospi[16], bf0[5], cospi[48], bf0[4], cos_bit);
2761
0
    bf1[6]  = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
2762
0
    bf1[7]  = half_btf(cospi[48], bf0[7], cospi[16], bf0[6], cos_bit);
2763
0
    bf1[8]  = bf0[8];
2764
0
    bf1[9]  = bf0[9];
2765
0
    bf1[10] = bf0[10];
2766
0
    bf1[11] = bf0[11];
2767
0
    bf1[12] = half_btf(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
2768
0
    bf1[13] = half_btf(-cospi[16], bf0[13], cospi[48], bf0[12], cos_bit);
2769
0
    bf1[14] = half_btf(-cospi[48], bf0[14], cospi[16], bf0[15], cos_bit);
2770
0
    bf1[15] = half_btf(cospi[48], bf0[15], cospi[16], bf0[14], cos_bit);
2771
0
    bf1[16] = bf0[16];
2772
0
    bf1[17] = bf0[17];
2773
0
    bf1[18] = bf0[18];
2774
0
    bf1[19] = bf0[19];
2775
0
    bf1[20] = half_btf(cospi[16], bf0[20], cospi[48], bf0[21], cos_bit);
2776
0
    bf1[21] = half_btf(-cospi[16], bf0[21], cospi[48], bf0[20], cos_bit);
2777
0
    bf1[22] = half_btf(-cospi[48], bf0[22], cospi[16], bf0[23], cos_bit);
2778
0
    bf1[23] = half_btf(cospi[48], bf0[23], cospi[16], bf0[22], cos_bit);
2779
0
    bf1[24] = bf0[24];
2780
0
    bf1[25] = bf0[25];
2781
0
    bf1[26] = bf0[26];
2782
0
    bf1[27] = bf0[27];
2783
0
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[29], cos_bit);
2784
0
    bf1[29] = half_btf(-cospi[16], bf0[29], cospi[48], bf0[28], cos_bit);
2785
0
    bf1[30] = half_btf(-cospi[48], bf0[30], cospi[16], bf0[31], cos_bit);
2786
0
    bf1[31] = half_btf(cospi[48], bf0[31], cospi[16], bf0[30], cos_bit);
2787
2788
    // stage 9
2789
0
    bf0     = step;
2790
0
    bf1     = output;
2791
0
    bf1[0]  = bf0[0] + bf0[2];
2792
0
    bf1[1]  = bf0[1] + bf0[3];
2793
0
    bf1[2]  = -bf0[2] + bf0[0];
2794
0
    bf1[3]  = -bf0[3] + bf0[1];
2795
0
    bf1[4]  = bf0[4] + bf0[6];
2796
0
    bf1[5]  = bf0[5] + bf0[7];
2797
0
    bf1[6]  = -bf0[6] + bf0[4];
2798
0
    bf1[7]  = -bf0[7] + bf0[5];
2799
0
    bf1[8]  = bf0[8] + bf0[10];
2800
0
    bf1[9]  = bf0[9] + bf0[11];
2801
0
    bf1[10] = -bf0[10] + bf0[8];
2802
0
    bf1[11] = -bf0[11] + bf0[9];
2803
0
    bf1[12] = bf0[12] + bf0[14];
2804
0
    bf1[13] = bf0[13] + bf0[15];
2805
0
    bf1[14] = -bf0[14] + bf0[12];
2806
0
    bf1[15] = -bf0[15] + bf0[13];
2807
0
    bf1[16] = bf0[16] + bf0[18];
2808
0
    bf1[17] = bf0[17] + bf0[19];
2809
0
    bf1[18] = -bf0[18] + bf0[16];
2810
0
    bf1[19] = -bf0[19] + bf0[17];
2811
0
    bf1[20] = bf0[20] + bf0[22];
2812
0
    bf1[21] = bf0[21] + bf0[23];
2813
0
    bf1[22] = -bf0[22] + bf0[20];
2814
0
    bf1[23] = -bf0[23] + bf0[21];
2815
0
    bf1[24] = bf0[24] + bf0[26];
2816
0
    bf1[25] = bf0[25] + bf0[27];
2817
0
    bf1[26] = -bf0[26] + bf0[24];
2818
0
    bf1[27] = -bf0[27] + bf0[25];
2819
0
    bf1[28] = bf0[28] + bf0[30];
2820
0
    bf1[29] = bf0[29] + bf0[31];
2821
0
    bf1[30] = -bf0[30] + bf0[28];
2822
0
    bf1[31] = -bf0[31] + bf0[29];
2823
2824
    // stage 10
2825
0
    cospi   = cospi_arr(cos_bit);
2826
0
    bf0     = output;
2827
0
    bf1     = step;
2828
0
    bf1[0]  = bf0[0];
2829
0
    bf1[1]  = bf0[1];
2830
0
    bf1[2]  = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
2831
0
    bf1[3]  = half_btf(-cospi[32], bf0[3], cospi[32], bf0[2], cos_bit);
2832
0
    bf1[4]  = bf0[4];
2833
0
    bf1[5]  = bf0[5];
2834
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
2835
0
    bf1[7]  = half_btf(-cospi[32], bf0[7], cospi[32], bf0[6], cos_bit);
2836
0
    bf1[8]  = bf0[8];
2837
0
    bf1[9]  = bf0[9];
2838
0
    bf1[10] = half_btf(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
2839
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[10], cos_bit);
2840
0
    bf1[12] = bf0[12];
2841
0
    bf1[13] = bf0[13];
2842
0
    bf1[14] = half_btf(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
2843
0
    bf1[15] = half_btf(-cospi[32], bf0[15], cospi[32], bf0[14], cos_bit);
2844
0
    bf1[16] = bf0[16];
2845
0
    bf1[17] = bf0[17];
2846
0
    bf1[18] = half_btf(cospi[32], bf0[18], cospi[32], bf0[19], cos_bit);
2847
0
    bf1[19] = half_btf(-cospi[32], bf0[19], cospi[32], bf0[18], cos_bit);
2848
0
    bf1[20] = bf0[20];
2849
0
    bf1[21] = bf0[21];
2850
0
    bf1[22] = half_btf(cospi[32], bf0[22], cospi[32], bf0[23], cos_bit);
2851
0
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[22], cos_bit);
2852
0
    bf1[24] = bf0[24];
2853
0
    bf1[25] = bf0[25];
2854
0
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[27], cos_bit);
2855
0
    bf1[27] = half_btf(-cospi[32], bf0[27], cospi[32], bf0[26], cos_bit);
2856
0
    bf1[28] = bf0[28];
2857
0
    bf1[29] = bf0[29];
2858
0
    bf1[30] = half_btf(cospi[32], bf0[30], cospi[32], bf0[31], cos_bit);
2859
0
    bf1[31] = half_btf(-cospi[32], bf0[31], cospi[32], bf0[30], cos_bit);
2860
2861
    // stage 11
2862
0
    bf0     = step;
2863
0
    bf1     = output;
2864
0
    bf1[0]  = bf0[0];
2865
0
    bf1[1]  = -bf0[16];
2866
0
    bf1[2]  = bf0[24];
2867
0
    bf1[3]  = -bf0[8];
2868
0
    bf1[4]  = bf0[12];
2869
0
    bf1[5]  = -bf0[28];
2870
0
    bf1[6]  = bf0[20];
2871
0
    bf1[7]  = -bf0[4];
2872
0
    bf1[8]  = bf0[6];
2873
0
    bf1[9]  = -bf0[22];
2874
0
    bf1[10] = bf0[30];
2875
0
    bf1[11] = -bf0[14];
2876
0
    bf1[12] = bf0[10];
2877
0
    bf1[13] = -bf0[26];
2878
0
    bf1[14] = bf0[18];
2879
0
    bf1[15] = -bf0[2];
2880
0
    bf1[16] = bf0[3];
2881
0
    bf1[17] = -bf0[19];
2882
0
    bf1[18] = bf0[27];
2883
0
    bf1[19] = -bf0[11];
2884
0
    bf1[20] = bf0[15];
2885
0
    bf1[21] = -bf0[31];
2886
0
    bf1[22] = bf0[23];
2887
0
    bf1[23] = -bf0[7];
2888
0
    bf1[24] = bf0[5];
2889
0
    bf1[25] = -bf0[21];
2890
0
    bf1[26] = bf0[29];
2891
0
    bf1[27] = -bf0[13];
2892
0
    bf1[28] = bf0[9];
2893
0
    bf1[29] = -bf0[25];
2894
0
    bf1[30] = bf0[17];
2895
0
    bf1[31] = -bf0[1];
2896
0
}
2897
2898
0
void svt_av1_fidentity4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2899
0
    (void)stage_range;
2900
0
    (void)cos_bit;
2901
0
    for (int32_t i = 0; i < 4; ++i) {
2902
0
        output[i] = round_shift((int64_t)input[i] * new_sqrt2, new_sqrt2_bits);
2903
0
    }
2904
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
2905
0
}
2906
2907
0
void svt_av1_fidentity8_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2908
0
    (void)stage_range;
2909
0
    (void)cos_bit;
2910
0
    for (int32_t i = 0; i < 8; ++i) {
2911
0
        output[i] = input[i] * 2;
2912
0
    }
2913
0
}
2914
2915
0
void svt_av1_fidentity16_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2916
0
    (void)stage_range;
2917
0
    (void)cos_bit;
2918
0
    for (int32_t i = 0; i < 16; ++i) {
2919
0
        output[i] = round_shift((int64_t)input[i] * 2 * new_sqrt2, new_sqrt2_bits);
2920
0
    }
2921
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
2922
0
}
2923
2924
0
void svt_av1_fidentity32_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2925
0
    (void)stage_range;
2926
0
    (void)cos_bit;
2927
0
    for (int32_t i = 0; i < 32; ++i) {
2928
0
        output[i] = input[i] * 4;
2929
0
    }
2930
0
}
2931
2932
0
static void av1_fidentity64_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
2933
0
    (void)stage_range;
2934
0
    (void)cos_bit;
2935
0
    for (int32_t i = 0; i < 64; ++i) {
2936
0
        output[i] = round_shift((int64_t)input[i] * 4 * new_sqrt2, new_sqrt2_bits);
2937
0
    }
2938
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
2939
0
}
2940
2941
321k
TxfmFunc svt_aom_fwd_txfm_type_to_func(TxfmType txfmtype) {
2942
321k
    switch (txfmtype) {
2943
10.0k
    case TXFM_TYPE_DCT4:
2944
10.0k
        return svt_av1_fdct4_new;
2945
283k
    case TXFM_TYPE_DCT8:
2946
283k
        return svt_av1_fdct8_new;
2947
7.05k
    case TXFM_TYPE_DCT16:
2948
7.05k
        return svt_av1_fdct16_new;
2949
13.9k
    case TXFM_TYPE_DCT32:
2950
13.9k
        return svt_av1_fdct32_new;
2951
7.37k
    case TXFM_TYPE_DCT64:
2952
7.37k
        return svt_av1_fdct64_new;
2953
0
    case TXFM_TYPE_ADST4:
2954
0
        return svt_av1_fadst4_new;
2955
0
    case TXFM_TYPE_ADST8:
2956
0
        return svt_av1_fadst8_new;
2957
0
    case TXFM_TYPE_ADST16:
2958
0
        return svt_av1_fadst16_new;
2959
0
    case TXFM_TYPE_ADST32:
2960
0
        return av1_fadst32_new;
2961
0
    case TXFM_TYPE_IDENTITY4:
2962
0
        return svt_av1_fidentity4_c;
2963
0
    case TXFM_TYPE_IDENTITY8:
2964
0
        return svt_av1_fidentity8_c;
2965
0
    case TXFM_TYPE_IDENTITY16:
2966
0
        return svt_av1_fidentity16_c;
2967
0
    case TXFM_TYPE_IDENTITY32:
2968
0
        return svt_av1_fidentity32_c;
2969
0
    case TXFM_TYPE_IDENTITY64:
2970
0
        return av1_fidentity64_c;
2971
0
    default:
2972
0
        assert(0);
2973
0
        return NULL;
2974
321k
    }
2975
321k
}
2976
2977
//fwd_txfm2d_c
2978
static INLINE void av1_tranform_two_d_core_c(int16_t* input, uint32_t input_stride, int32_t* output,
2979
160k
                                             const Txfm2dFlipCfg* cfg, int32_t* buf, uint8_t bit_depth) {
2980
160k
    int32_t c, r;
2981
    // Note when assigning txfm_size_col, we use the txfm_size from the
2982
    // row configuration and vice versa. This is intentionally done to
2983
    // accurately perform rectangular transforms. When the transform is
2984
    // rectangular, the number of columns will be the same as the
2985
    // txfm_size stored in the row cfg struct. It will make no difference
2986
    // for square transforms.
2987
160k
    const int32_t txfm_size_col = tx_size_wide[cfg->tx_size];
2988
160k
    const int32_t txfm_size_row = tx_size_high[cfg->tx_size];
2989
    // Take the shift from the larger dimension in the rectangular case.
2990
160k
    const int8_t* shift     = cfg->shift;
2991
160k
    const int32_t rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
2992
160k
    int8_t        stage_range_col[MAX_TXFM_STAGE_NUM];
2993
160k
    int8_t        stage_range_row[MAX_TXFM_STAGE_NUM];
2994
160k
    assert(cfg->stage_num_col <= MAX_TXFM_STAGE_NUM);
2995
160k
    assert(cfg->stage_num_row <= MAX_TXFM_STAGE_NUM);
2996
160k
    svt_av1_gen_fwd_stage_range(stage_range_col, stage_range_row, cfg, bit_depth);
2997
2998
160k
    const int8_t   cos_bit_col   = cfg->cos_bit_col;
2999
160k
    const int8_t   cos_bit_row   = cfg->cos_bit_row;
3000
160k
    const TxfmFunc txfm_func_col = svt_aom_fwd_txfm_type_to_func(cfg->txfm_type_col);
3001
160k
    const TxfmFunc txfm_func_row = svt_aom_fwd_txfm_type_to_func(cfg->txfm_type_row);
3002
160k
    ASSERT(txfm_func_col != NULL);
3003
160k
    ASSERT(txfm_func_row != NULL);
3004
    // use output buffer as temp buffer
3005
160k
    int32_t* temp_in  = output;
3006
160k
    int32_t* temp_out = output + txfm_size_row;
3007
3008
    // Columns
3009
1.85M
    for (c = 0; c < txfm_size_col; ++c) {
3010
1.69M
        if (cfg->ud_flip == 0) {
3011
32.8M
            for (r = 0; r < txfm_size_row; ++r) {
3012
31.1M
                temp_in[r] = input[r * input_stride + c];
3013
31.1M
            }
3014
1.69M
        } else {
3015
210
            for (r = 0; r < txfm_size_row; ++r) {
3016
                // flip upside down
3017
0
                temp_in[r] = input[(txfm_size_row - r - 1) * input_stride + c];
3018
0
            }
3019
210
        }
3020
1.69M
        svt_av1_round_shift_array_c(temp_in, txfm_size_row, -shift[0]); // NM svt_av1_round_shift_array_c
3021
1.69M
        txfm_func_col(temp_in, temp_out, cos_bit_col, stage_range_col);
3022
1.69M
        svt_av1_round_shift_array_c(temp_out, txfm_size_row, -shift[1]); // NM svt_av1_round_shift_array_c
3023
1.69M
        if (cfg->lr_flip == 0) {
3024
32.8M
            for (r = 0; r < txfm_size_row; ++r) {
3025
31.1M
                buf[r * txfm_size_col + c] = temp_out[r];
3026
31.1M
            }
3027
18.4E
        } else {
3028
18.4E
            for (r = 0; r < txfm_size_row; ++r) {
3029
                // flip from left to right
3030
0
                buf[r * txfm_size_col + (txfm_size_col - c - 1)] = temp_out[r];
3031
0
            }
3032
18.4E
        }
3033
1.69M
    }
3034
3035
    // Rows
3036
1.79M
    for (r = 0; r < txfm_size_row; ++r) {
3037
1.63M
        txfm_func_row(buf + r * txfm_size_col, output + r * txfm_size_col, cos_bit_row, stage_range_row);
3038
1.63M
        svt_av1_round_shift_array_c(output + r * txfm_size_col, txfm_size_col, -shift[2]);
3039
3040
1.63M
        if (abs(rect_type) == 1) {
3041
            // Multiply everything by Sqrt2 if the transform is rectangular and the
3042
            // size difference is a factor of 2.
3043
4.08M
            for (c = 0; c < txfm_size_col; ++c) {
3044
4.02M
                output[r * txfm_size_col + c] = round_shift((int64_t)output[r * txfm_size_col + c] * new_sqrt2,
3045
4.02M
                                                            new_sqrt2_bits);
3046
4.02M
            }
3047
62.9k
        }
3048
1.63M
    }
3049
160k
}
3050
3051
160k
static INLINE void set_fwd_txfm_non_scale_range(Txfm2dFlipCfg* cfg) {
3052
160k
    av1_zero(cfg->stage_range_col);
3053
160k
    av1_zero(cfg->stage_range_row);
3054
3055
160k
    if (cfg->txfm_type_col == TXFM_TYPE_INVALID) {
3056
0
        return;
3057
0
    }
3058
3059
160k
    const int8_t* range_mult2_col = fwd_txfm_range_mult2_list[cfg->txfm_type_col];
3060
160k
    const int32_t stage_num_col   = MIN(cfg->stage_num_col, MAX_TXFM_STAGE_NUM);
3061
1.17M
    for (int32_t i = 0; i < stage_num_col; ++i) {
3062
1.00M
        cfg->stage_range_col[i] = (range_mult2_col[i] + 1) >> 1;
3063
1.00M
    }
3064
3065
160k
    if (cfg->txfm_type_row != TXFM_TYPE_INVALID) {
3066
160k
        const int8_t* range_mult2_row = fwd_txfm_range_mult2_list[cfg->txfm_type_row];
3067
160k
        const int32_t stage_num_row   = MIN(cfg->stage_num_row, MAX_TXFM_STAGE_NUM);
3068
1.17M
        for (int32_t i = 0; i < stage_num_row; ++i) {
3069
1.01M
            cfg->stage_range_row[i] = (range_mult2_col[cfg->stage_num_col - 1] + range_mult2_row[i] + 1) >> 1;
3070
1.01M
        }
3071
160k
    }
3072
160k
}
3073
3074
160k
void svt_aom_transform_config(TxType tx_type, TxSize tx_size, Txfm2dFlipCfg* cfg) {
3075
160k
    assert(cfg != NULL);
3076
160k
    cfg->tx_size = tx_size;
3077
160k
    set_flip_cfg(tx_type, cfg);
3078
160k
    const TxType1D tx_type_1d_col = vtx_tab[tx_type];
3079
160k
    const TxType1D tx_type_1d_row = htx_tab[tx_type];
3080
160k
    const int32_t  txw_idx        = tx_size_wide_log2[tx_size] - tx_size_wide_log2[0];
3081
160k
    const int32_t  txh_idx        = tx_size_high_log2[tx_size] - tx_size_high_log2[0];
3082
160k
    cfg->shift                    = fwd_txfm_shift_ls[tx_size];
3083
160k
    cfg->cos_bit_col              = fwd_cos_bit_col[txw_idx][txh_idx];
3084
160k
    cfg->cos_bit_row              = fwd_cos_bit_row[txw_idx][txh_idx];
3085
160k
    cfg->txfm_type_col            = av1_txfm_type_ls[txh_idx][tx_type_1d_col];
3086
160k
    cfg->txfm_type_row            = av1_txfm_type_ls[txw_idx][tx_type_1d_row];
3087
160k
    cfg->stage_num_col            = av1_txfm_stage_num_list[cfg->txfm_type_col];
3088
160k
    cfg->stage_num_row            = av1_txfm_stage_num_list[cfg->txfm_type_row];
3089
160k
    set_fwd_txfm_non_scale_range(cfg);
3090
160k
}
3091
3092
7.36k
static uint64_t energy_computation(int32_t* coeff, uint32_t coeff_stride, uint32_t area_width, uint32_t area_height) {
3093
7.36k
    uint64_t prediction_distortion = 0;
3094
3095
242k
    for (uint32_t row_index = 0; row_index < area_height; ++row_index) {
3096
10.5M
        for (uint32_t column_index = 0; column_index < area_width; ++column_index) {
3097
10.2M
            prediction_distortion += (int64_t)SQR((int64_t)(coeff[column_index]));
3098
10.2M
        }
3099
235k
        coeff += coeff_stride;
3100
235k
    }
3101
3102
7.36k
    return prediction_distortion;
3103
7.36k
}
3104
3105
2.70k
uint64_t svt_handle_transform64x64_c(int32_t* output) {
3106
2.70k
    uint64_t three_quad_energy;
3107
3108
    // top - right 32x32 area.
3109
2.70k
    three_quad_energy = energy_computation(output + 32, 64, 32, 32);
3110
    //bottom 64x32 area.
3111
2.70k
    three_quad_energy += energy_computation(output + 32 * 64, 64, 64, 32);
3112
3113
    // Re-pack non-zero coeffs in the first 32x32 indices.
3114
86.4k
    for (int32_t row = 1; row < 32; ++row) {
3115
83.6k
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3116
83.6k
    }
3117
3118
2.70k
    return three_quad_energy;
3119
2.70k
}
3120
3121
void svt_av1_transform_two_d_64x64_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3122
2.70k
                                     uint8_t bit_depth) {
3123
2.70k
    int32_t       intermediate_transform_buffer[64 * 64];
3124
2.70k
    Txfm2dFlipCfg cfg;
3125
    //av1_get_fwd_txfm_cfg
3126
2.70k
    svt_aom_transform_config(transform_type, TX_64X64, &cfg);
3127
    //fwd_txfm2d_c
3128
2.70k
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3129
2.70k
}
3130
3131
void svt_av1_transform_two_d_32x32_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3132
5.98k
                                     uint8_t bit_depth) {
3133
5.98k
    int32_t       intermediate_transform_buffer[32 * 32];
3134
5.98k
    Txfm2dFlipCfg cfg;
3135
3136
5.98k
    svt_aom_transform_config(transform_type, TX_32X32, &cfg);
3137
3138
5.98k
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3139
5.98k
}
3140
3141
void svt_av1_transform_two_d_16x16_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3142
3.52k
                                     uint8_t bit_depth) {
3143
3.52k
    int32_t       intermediate_transform_buffer[16 * 16];
3144
3.52k
    Txfm2dFlipCfg cfg;
3145
3146
3.52k
    svt_aom_transform_config(transform_type, TX_16X16, &cfg);
3147
3148
3.52k
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3149
3.52k
}
3150
3151
void svt_av1_transform_two_d_8x8_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3152
141k
                                   uint8_t bit_depth) {
3153
141k
    int32_t       intermediate_transform_buffer[8 * 8];
3154
141k
    Txfm2dFlipCfg cfg;
3155
3156
141k
    svt_aom_transform_config(transform_type, TX_8X8, &cfg);
3157
3158
141k
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3159
141k
}
3160
3161
void svt_av1_transform_two_d_4x4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3162
5.02k
                                   uint8_t bit_depth) {
3163
5.02k
    int32_t       intermediate_transform_buffer[4 * 4];
3164
5.02k
    Txfm2dFlipCfg cfg;
3165
3166
5.02k
    svt_aom_transform_config(transform_type, TX_4X4, &cfg);
3167
3168
5.02k
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3169
5.02k
}
3170
3171
/*********************************************************************
3172
* Calculate CBF
3173
*********************************************************************/
3174
void svt_av1_fwd_txfm2d_64x32_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3175
1.96k
                                uint8_t bit_depth) {
3176
1.96k
    int32_t       intermediate_transform_buffer[64 * 32];
3177
1.96k
    Txfm2dFlipCfg cfg;
3178
    /*av1_get_fwd_txfm_cfg*/
3179
1.96k
    svt_aom_transform_config(transform_type, TX_64X32, &cfg);
3180
1.96k
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3181
1.96k
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3182
1.96k
}
3183
3184
1.96k
uint64_t svt_handle_transform64x32_c(int32_t* output) {
3185
    // top - right 32x32 area.
3186
1.96k
    const uint64_t three_quad_energy = energy_computation(output + 32, 64, 32, 32);
3187
3188
    // Re-pack non-zero coeffs in the first 32x32 indices.
3189
62.9k
    for (int32_t row = 1; row < 32; ++row) {
3190
60.9k
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3191
60.9k
    }
3192
3193
1.96k
    return three_quad_energy;
3194
1.96k
}
3195
3196
void svt_av1_fwd_txfm2d_32x64_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3197
0
                                uint8_t bit_depth) {
3198
0
    int32_t intermediate_transform_buffer[32 * 64];
3199
3200
0
    Txfm2dFlipCfg cfg;
3201
    /*av1_get_fwd_txfm_cfg*/
3202
0
    svt_aom_transform_config(transform_type, TX_32X64, &cfg);
3203
    /*fwd_txfm2d_c*/
3204
0
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3205
0
}
3206
3207
0
uint64_t svt_handle_transform32x64_c(int32_t* output) {
3208
    //bottom 32x32 area.
3209
0
    const uint64_t three_quad_energy = energy_computation(output + 32 * 32, 32, 32, 32);
3210
0
    return three_quad_energy;
3211
0
}
3212
3213
void svt_av1_fwd_txfm2d_64x16_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3214
0
                                uint8_t bit_depth) {
3215
0
    int32_t       intermediate_transform_buffer[64 * 16];
3216
0
    Txfm2dFlipCfg cfg;
3217
    /*av1_get_fwd_txfm_cfg*/
3218
0
    svt_aom_transform_config(transform_type, TX_64X16, &cfg);
3219
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3220
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3221
0
}
3222
3223
0
uint64_t svt_handle_transform64x16_c(int32_t* output) {
3224
    // top - right 32x16 area.
3225
0
    const uint64_t three_quad_energy = energy_computation(output + 32, 64, 32, 16);
3226
3227
    // Re-pack non-zero coeffs in the first 32x16 indices.
3228
0
    for (int32_t row = 1; row < 16; ++row) {
3229
0
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3230
0
    }
3231
3232
0
    return three_quad_energy;
3233
0
}
3234
3235
void svt_av1_fwd_txfm2d_16x64_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3236
0
                                uint8_t bit_depth) {
3237
0
    int32_t intermediate_transform_buffer[16 * 64];
3238
3239
0
    Txfm2dFlipCfg cfg;
3240
    /*av1_get_fwd_txfm_cfg*/
3241
0
    svt_aom_transform_config(transform_type, TX_16X64, &cfg);
3242
    /*fwd_txfm2d_c*/
3243
0
    av1_tranform_two_d_core_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3244
0
}
3245
3246
0
uint64_t svt_handle_transform16x64_c(int32_t* output) {
3247
    //bottom 16x32 area.
3248
0
    const uint64_t three_quad_energy = energy_computation(output + 16 * 32, 16, 16, 32);
3249
0
    return three_quad_energy;
3250
0
}
3251
3252
0
uint64_t svt_handle_transform16x64_N2_N4_c(int32_t* output) {
3253
0
    (void)output;
3254
0
    return 0;
3255
0
}
3256
3257
0
uint64_t svt_handle_transform32x64_N2_N4_c(int32_t* output) {
3258
0
    (void)output;
3259
0
    return 0;
3260
0
}
3261
3262
0
uint64_t svt_handle_transform64x16_N2_N4_c(int32_t* output) {
3263
    // Re-pack non-zero coeffs in the first 32x16 indices.
3264
0
    for (int32_t row = 1; row < 16; ++row) {
3265
0
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3266
0
    }
3267
3268
0
    return 0;
3269
0
}
3270
3271
0
uint64_t svt_handle_transform64x32_N2_N4_c(int32_t* output) {
3272
    // Re-pack non-zero coeffs in the first 32x32 indices.
3273
0
    for (int32_t row = 1; row < 32; ++row) {
3274
0
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3275
0
    }
3276
3277
0
    return 0;
3278
0
}
3279
3280
0
uint64_t svt_handle_transform64x64_N2_N4_c(int32_t* output) {
3281
    // Re-pack non-zero coeffs in the first 32x32 indices.
3282
0
    for (int32_t row = 1; row < 32; ++row) {
3283
0
        svt_memcpy_c(output + row * 32, output + row * 64, 32 * sizeof(*output));
3284
0
    }
3285
3286
0
    return 0;
3287
0
}
3288
3289
void svt_av1_fwd_txfm2d_32x16_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3290
0
                                uint8_t bit_depth) {
3291
0
    int32_t       intermediate_transform_buffer[32 * 16];
3292
0
    Txfm2dFlipCfg cfg;
3293
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_32X16, &cfg);
3294
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3295
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3296
0
}
3297
3298
void svt_av1_fwd_txfm2d_16x32_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3299
0
                                uint8_t bit_depth) {
3300
0
    int32_t       intermediate_transform_buffer[16 * 32];
3301
0
    Txfm2dFlipCfg cfg;
3302
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_16X32, &cfg);
3303
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3304
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3305
0
}
3306
3307
void svt_av1_fwd_txfm2d_16x8_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3308
0
                               uint8_t bit_depth) {
3309
0
    int32_t       intermediate_transform_buffer[16 * 8];
3310
0
    Txfm2dFlipCfg cfg;
3311
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_16X8, &cfg);
3312
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3313
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3314
0
}
3315
3316
void svt_av1_fwd_txfm2d_8x16_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3317
0
                               uint8_t bit_depth) {
3318
0
    int32_t       intermediate_transform_buffer[8 * 16];
3319
0
    Txfm2dFlipCfg cfg;
3320
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_8X16, &cfg);
3321
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3322
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3323
0
}
3324
3325
void svt_av1_fwd_txfm2d_32x8_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3326
0
                               uint8_t bit_depth) {
3327
0
    int32_t       intermediate_transform_buffer[32 * 8];
3328
0
    Txfm2dFlipCfg cfg;
3329
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_32X8, &cfg);
3330
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3331
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3332
0
}
3333
3334
void svt_av1_fwd_txfm2d_8x32_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3335
0
                               uint8_t bit_depth) {
3336
0
    int32_t       intermediate_transform_buffer[8 * 32];
3337
0
    Txfm2dFlipCfg cfg;
3338
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_8X32, &cfg);
3339
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3340
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3341
0
}
3342
3343
void svt_av1_fwd_txfm2d_16x4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3344
0
                               uint8_t bit_depth) {
3345
0
    int32_t       intermediate_transform_buffer[16 * 4];
3346
0
    Txfm2dFlipCfg cfg;
3347
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_16X4, &cfg);
3348
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3349
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3350
0
}
3351
3352
void svt_av1_fwd_txfm2d_4x16_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3353
0
                               uint8_t bit_depth) {
3354
0
    int32_t       intermediate_transform_buffer[4 * 16];
3355
0
    Txfm2dFlipCfg cfg;
3356
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_4X16, &cfg);
3357
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3358
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3359
0
}
3360
3361
void svt_av1_fwd_txfm2d_8x4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3362
0
                              uint8_t bit_depth) {
3363
0
    int32_t       intermediate_transform_buffer[8 * 4];
3364
0
    Txfm2dFlipCfg cfg;
3365
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_8X4, &cfg);
3366
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3367
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3368
0
}
3369
3370
void svt_av1_fwd_txfm2d_4x8_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
3371
0
                              uint8_t bit_depth) {
3372
0
    int32_t       intermediate_transform_buffer[4 * 8];
3373
0
    Txfm2dFlipCfg cfg;
3374
0
    /*av1_get_fwd_txfm_cfg*/ svt_aom_transform_config(transform_type, TX_4X8, &cfg);
3375
0
    /*fwd_txfm2d_c*/ av1_tranform_two_d_core_c(
3376
0
        input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
3377
0
}
3378
3379
static EbErrorType av1_estimate_transform_N2(int16_t* residual_buffer, uint32_t residual_stride, int32_t* coeff_buffer,
3380
                                             uint32_t coeff_stride, TxSize transform_size, uint64_t* three_quad_energy,
3381
                                             uint32_t bit_depth, TxType transform_type, PlaneType component_type)
3382
3383
0
{
3384
0
    EbErrorType return_error = EB_ErrorNone;
3385
3386
0
    (void)coeff_stride;
3387
0
    (void)component_type;
3388
3389
0
    switch (transform_size) {
3390
0
    case TX_64X32:
3391
0
        if (transform_type == DCT_DCT) {
3392
0
            svt_av1_fwd_txfm2d_64x32_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3393
0
        } else {
3394
0
            svt_av1_fwd_txfm2d_64x32_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3395
0
        }
3396
3397
0
        *three_quad_energy = svt_handle_transform64x32_N2_N4(coeff_buffer);
3398
3399
0
        break;
3400
3401
0
    case TX_32X64:
3402
0
        if (transform_type == DCT_DCT) {
3403
0
            svt_av1_fwd_txfm2d_32x64_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3404
0
        } else {
3405
0
            svt_av1_fwd_txfm2d_32x64_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3406
0
        }
3407
3408
0
        *three_quad_energy = svt_handle_transform32x64_N2_N4(coeff_buffer);
3409
3410
0
        break;
3411
3412
0
    case TX_64X16:
3413
0
        if (transform_type == DCT_DCT) {
3414
0
            svt_av1_fwd_txfm2d_64x16_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3415
0
        } else {
3416
0
            svt_av1_fwd_txfm2d_64x16_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3417
0
        }
3418
3419
0
        *three_quad_energy = svt_handle_transform64x16_N2_N4(coeff_buffer);
3420
3421
0
        break;
3422
3423
0
    case TX_16X64:
3424
0
        if (transform_type == DCT_DCT) {
3425
0
            svt_av1_fwd_txfm2d_16x64_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3426
0
        } else {
3427
0
            svt_av1_fwd_txfm2d_16x64_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3428
0
        }
3429
3430
0
        *three_quad_energy = svt_handle_transform16x64_N2_N4(coeff_buffer);
3431
3432
0
        break;
3433
3434
0
    case TX_32X16:
3435
        // TTK
3436
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3437
0
            svt_av1_fwd_txfm2d_32x16_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3438
0
        } else {
3439
0
            svt_av1_fwd_txfm2d_32x16_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3440
0
        }
3441
0
        break;
3442
3443
0
    case TX_16X32:
3444
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3445
0
            svt_av1_fwd_txfm2d_16x32_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3446
0
        } else {
3447
0
            svt_av1_fwd_txfm2d_16x32_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3448
0
        }
3449
0
        break;
3450
3451
0
    case TX_16X8:
3452
0
        svt_av1_fwd_txfm2d_16x8_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3453
0
        break;
3454
3455
0
    case TX_8X16:
3456
0
        svt_av1_fwd_txfm2d_8x16_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3457
0
        break;
3458
3459
0
    case TX_32X8:
3460
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3461
0
            svt_av1_fwd_txfm2d_32x8_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3462
0
        } else {
3463
0
            svt_av1_fwd_txfm2d_32x8_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3464
0
        }
3465
0
        break;
3466
3467
0
    case TX_8X32:
3468
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3469
0
            svt_av1_fwd_txfm2d_8x32_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3470
0
        } else {
3471
0
            svt_av1_fwd_txfm2d_8x32_N2_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3472
0
        }
3473
0
        break;
3474
0
    case TX_16X4:
3475
0
        svt_av1_fwd_txfm2d_16x4_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3476
0
        break;
3477
0
    case TX_4X16:
3478
0
        svt_av1_fwd_txfm2d_4x16_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3479
0
        break;
3480
0
    case TX_8X4:
3481
3482
0
        svt_av1_fwd_txfm2d_8x4_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3483
3484
0
        break;
3485
0
    case TX_4X8:
3486
3487
0
        svt_av1_fwd_txfm2d_4x8_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3488
3489
0
        break;
3490
3491
0
    case TX_64X64:
3492
3493
0
        svt_av1_fwd_txfm2d_64x64_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3494
3495
0
        *three_quad_energy = svt_handle_transform64x64_N2_N4(coeff_buffer);
3496
3497
0
        break;
3498
3499
0
    case TX_32X32:
3500
0
        if (transform_type == V_DCT || transform_type == H_DCT || transform_type == V_ADST ||
3501
0
            transform_type == H_ADST || transform_type == V_FLIPADST || transform_type == H_FLIPADST) {
3502
            // Tahani: I believe those cases are never hit
3503
0
            svt_aom_transform_two_d_32x32_N2_c(
3504
0
                residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3505
0
        }
3506
3507
0
        else {
3508
0
            svt_av1_fwd_txfm2d_32x32_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3509
0
        }
3510
3511
0
        break;
3512
3513
0
    case TX_16X16:
3514
3515
0
        svt_av1_fwd_txfm2d_16x16_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3516
3517
0
        break;
3518
0
    case TX_8X8:
3519
3520
0
        svt_av1_fwd_txfm2d_8x8_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3521
3522
0
        break;
3523
0
    case TX_4X4:
3524
3525
0
        svt_av1_fwd_txfm2d_4x4_N2(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3526
3527
0
        break;
3528
0
    default:
3529
0
        assert(0);
3530
0
        break;
3531
0
    }
3532
3533
0
    return return_error;
3534
0
}
3535
3536
static EbErrorType av1_estimate_transform_N4(int16_t* residual_buffer, uint32_t residual_stride, int32_t* coeff_buffer,
3537
                                             uint32_t coeff_stride, TxSize transform_size, uint64_t* three_quad_energy,
3538
                                             uint32_t bit_depth, TxType transform_type, PlaneType component_type)
3539
3540
0
{
3541
0
    EbErrorType return_error = EB_ErrorNone;
3542
3543
0
    (void)coeff_stride;
3544
0
    (void)component_type;
3545
3546
0
    switch (transform_size) {
3547
0
    case TX_64X32:
3548
0
        if (transform_type == DCT_DCT) {
3549
0
            svt_av1_fwd_txfm2d_64x32_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3550
0
        } else {
3551
0
            svt_av1_fwd_txfm2d_64x32_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3552
0
        }
3553
3554
0
        *three_quad_energy = svt_handle_transform64x32_N2_N4(coeff_buffer);
3555
3556
0
        break;
3557
3558
0
    case TX_32X64:
3559
0
        if (transform_type == DCT_DCT) {
3560
0
            svt_av1_fwd_txfm2d_32x64_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3561
0
        } else {
3562
0
            svt_av1_fwd_txfm2d_32x64_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3563
0
        }
3564
3565
0
        *three_quad_energy = svt_handle_transform32x64_N2_N4(coeff_buffer);
3566
3567
0
        break;
3568
3569
0
    case TX_64X16:
3570
0
        if (transform_type == DCT_DCT) {
3571
0
            svt_av1_fwd_txfm2d_64x16_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3572
0
        } else {
3573
0
            svt_av1_fwd_txfm2d_64x16_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3574
0
        }
3575
3576
0
        *three_quad_energy = svt_handle_transform64x16_N2_N4(coeff_buffer);
3577
3578
0
        break;
3579
3580
0
    case TX_16X64:
3581
0
        if (transform_type == DCT_DCT) {
3582
0
            svt_av1_fwd_txfm2d_16x64_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3583
0
        } else {
3584
0
            svt_av1_fwd_txfm2d_16x64_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3585
0
        }
3586
3587
0
        *three_quad_energy = svt_handle_transform16x64_N2_N4(coeff_buffer);
3588
3589
0
        break;
3590
3591
0
    case TX_32X16:
3592
        // TTK
3593
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3594
0
            svt_av1_fwd_txfm2d_32x16_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3595
0
        } else {
3596
0
            svt_av1_fwd_txfm2d_32x16_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3597
0
        }
3598
0
        break;
3599
3600
0
    case TX_16X32:
3601
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3602
0
            svt_av1_fwd_txfm2d_16x32_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3603
0
        } else {
3604
0
            svt_av1_fwd_txfm2d_16x32_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3605
0
        }
3606
0
        break;
3607
3608
0
    case TX_16X8:
3609
0
        svt_av1_fwd_txfm2d_16x8_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3610
0
        break;
3611
3612
0
    case TX_8X16:
3613
0
        svt_av1_fwd_txfm2d_8x16_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3614
0
        break;
3615
3616
0
    case TX_32X8:
3617
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3618
0
            svt_av1_fwd_txfm2d_32x8_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3619
0
        } else {
3620
0
            svt_av1_fwd_txfm2d_32x8_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3621
0
        }
3622
0
        break;
3623
3624
0
    case TX_8X32:
3625
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3626
0
            svt_av1_fwd_txfm2d_8x32_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3627
0
        } else {
3628
0
            svt_av1_fwd_txfm2d_8x32_N4_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3629
0
        }
3630
0
        break;
3631
0
    case TX_16X4:
3632
0
        svt_av1_fwd_txfm2d_16x4_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3633
0
        break;
3634
0
    case TX_4X16:
3635
0
        svt_av1_fwd_txfm2d_4x16_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3636
0
        break;
3637
0
    case TX_8X4:
3638
3639
0
        svt_av1_fwd_txfm2d_8x4_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3640
3641
0
        break;
3642
0
    case TX_4X8:
3643
3644
0
        svt_av1_fwd_txfm2d_4x8_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3645
3646
0
        break;
3647
3648
0
    case TX_64X64:
3649
3650
0
        svt_av1_fwd_txfm2d_64x64_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3651
3652
0
        *three_quad_energy = svt_handle_transform64x64_N2_N4(coeff_buffer);
3653
3654
0
        break;
3655
3656
0
    case TX_32X32:
3657
0
        if (transform_type == V_DCT || transform_type == H_DCT || transform_type == V_ADST ||
3658
0
            transform_type == H_ADST || transform_type == V_FLIPADST || transform_type == H_FLIPADST) {
3659
            // Tahani: I believe those cases are never hit
3660
0
            svt_aom_transform_two_d_32x32_N4_c(
3661
0
                residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3662
0
        }
3663
3664
0
        else {
3665
0
            svt_av1_fwd_txfm2d_32x32_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3666
0
        }
3667
3668
0
        break;
3669
3670
0
    case TX_16X16:
3671
3672
0
        svt_av1_fwd_txfm2d_16x16_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3673
3674
0
        break;
3675
0
    case TX_8X8:
3676
3677
0
        svt_av1_fwd_txfm2d_8x8_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3678
3679
0
        break;
3680
0
    case TX_4X4:
3681
3682
0
        svt_av1_fwd_txfm2d_4x4_N4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3683
3684
0
        break;
3685
0
    default:
3686
0
        assert(0);
3687
0
        break;
3688
0
    }
3689
3690
0
    return return_error;
3691
0
}
3692
3693
static EbErrorType av1_estimate_transform_ONLY_DC(int16_t* residual_buffer, uint32_t residual_stride,
3694
                                                  int32_t* coeff_buffer, uint32_t coeff_stride, TxSize transform_size,
3695
                                                  uint64_t* three_quad_energy, uint32_t bit_depth,
3696
                                                  TxType transform_type, PlaneType component_type)
3697
3698
0
{
3699
0
    EbErrorType return_error = av1_estimate_transform_N4(residual_buffer,
3700
0
                                                         residual_stride,
3701
0
                                                         coeff_buffer,
3702
0
                                                         coeff_stride,
3703
0
                                                         transform_size,
3704
0
                                                         three_quad_energy,
3705
0
                                                         bit_depth,
3706
0
                                                         transform_type,
3707
0
                                                         component_type);
3708
3709
0
    for (int i = 1; i < (tx_size_wide[transform_size] * tx_size_high[transform_size]); i++) {
3710
0
        if (i % tx_size_wide[transform_size] < (tx_size_wide[transform_size] >> 2) ||
3711
0
            i / tx_size_wide[transform_size] < (tx_size_high[transform_size] >> 2)) {
3712
0
            coeff_buffer[i] = 0;
3713
0
        }
3714
0
    }
3715
0
    return return_error;
3716
0
}
3717
3718
static EbErrorType av1_estimate_transform_default(int16_t* residual_buffer, uint32_t residual_stride,
3719
                                                  int32_t* coeff_buffer, uint32_t coeff_stride, TxSize transform_size,
3720
                                                  uint64_t* three_quad_energy, uint32_t bit_depth,
3721
                                                  TxType transform_type, PlaneType component_type)
3722
3723
160k
{
3724
160k
    EbErrorType return_error = EB_ErrorNone;
3725
3726
160k
    (void)coeff_stride;
3727
160k
    (void)component_type;
3728
3729
160k
    switch (transform_size) {
3730
1.96k
    case TX_64X32:
3731
1.96k
        if (transform_type == DCT_DCT) {
3732
1.96k
            svt_av1_fwd_txfm2d_64x32(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3733
1.96k
        } else {
3734
0
            svt_av1_fwd_txfm2d_64x32_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3735
0
        }
3736
3737
1.96k
        *three_quad_energy = svt_handle_transform64x32(coeff_buffer);
3738
3739
1.96k
        break;
3740
3741
0
    case TX_32X64:
3742
0
        if (transform_type == DCT_DCT) {
3743
0
            svt_av1_fwd_txfm2d_32x64(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3744
0
        } else {
3745
0
            svt_av1_fwd_txfm2d_32x64_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3746
0
        }
3747
3748
0
        *three_quad_energy = svt_handle_transform32x64(coeff_buffer);
3749
3750
0
        break;
3751
3752
0
    case TX_64X16:
3753
0
        if (transform_type == DCT_DCT) {
3754
0
            svt_av1_fwd_txfm2d_64x16(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3755
0
        } else {
3756
0
            svt_av1_fwd_txfm2d_64x16_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3757
0
        }
3758
3759
0
        *three_quad_energy = svt_handle_transform64x16(coeff_buffer);
3760
3761
0
        break;
3762
3763
0
    case TX_16X64:
3764
0
        if (transform_type == DCT_DCT) {
3765
0
            svt_av1_fwd_txfm2d_16x64(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3766
0
        } else {
3767
0
            svt_av1_fwd_txfm2d_16x64_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3768
0
        }
3769
3770
0
        *three_quad_energy = svt_handle_transform16x64(coeff_buffer);
3771
3772
0
        break;
3773
3774
0
    case TX_32X16:
3775
        // TTK
3776
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3777
0
            svt_av1_fwd_txfm2d_32x16(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3778
0
        } else {
3779
0
            svt_av1_fwd_txfm2d_32x16_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3780
0
        }
3781
0
        break;
3782
3783
0
    case TX_16X32:
3784
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3785
0
            svt_av1_fwd_txfm2d_16x32(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3786
0
        } else {
3787
0
            svt_av1_fwd_txfm2d_16x32_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3788
0
        }
3789
0
        break;
3790
3791
0
    case TX_16X8:
3792
0
        svt_av1_fwd_txfm2d_16x8(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3793
0
        break;
3794
3795
0
    case TX_8X16:
3796
0
        svt_av1_fwd_txfm2d_8x16(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3797
0
        break;
3798
3799
0
    case TX_32X8:
3800
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3801
0
            svt_av1_fwd_txfm2d_32x8(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3802
0
        } else {
3803
0
            svt_av1_fwd_txfm2d_32x8_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3804
0
        }
3805
0
        break;
3806
3807
0
    case TX_8X32:
3808
0
        if ((transform_type == DCT_DCT) || (transform_type == IDTX)) {
3809
0
            svt_av1_fwd_txfm2d_8x32(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3810
0
        } else {
3811
0
            svt_av1_fwd_txfm2d_8x32_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3812
0
        }
3813
0
        break;
3814
0
    case TX_16X4:
3815
0
        svt_av1_fwd_txfm2d_16x4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3816
0
        break;
3817
0
    case TX_4X16:
3818
0
        svt_av1_fwd_txfm2d_4x16(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3819
0
        break;
3820
0
    case TX_8X4:
3821
3822
0
        svt_av1_fwd_txfm2d_8x4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3823
3824
0
        break;
3825
0
    case TX_4X8:
3826
3827
0
        svt_av1_fwd_txfm2d_4x8(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3828
3829
0
        break;
3830
3831
2.70k
    case TX_64X64:
3832
3833
2.70k
        svt_av1_fwd_txfm2d_64x64(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3834
3835
2.70k
        *three_quad_energy = svt_handle_transform64x64(coeff_buffer);
3836
3837
2.70k
        break;
3838
3839
5.98k
    case TX_32X32:
3840
5.98k
        if (transform_type == V_DCT || transform_type == H_DCT || transform_type == V_ADST ||
3841
5.98k
            transform_type == H_ADST || transform_type == V_FLIPADST || transform_type == H_FLIPADST) {
3842
            // Tahani: I believe those cases are never hit
3843
0
            svt_av1_transform_two_d_32x32_c(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3844
0
        }
3845
3846
5.98k
        else {
3847
5.98k
            svt_av1_fwd_txfm2d_32x32(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3848
5.98k
        }
3849
3850
5.98k
        break;
3851
3852
3.52k
    case TX_16X16:
3853
3854
3.52k
        svt_av1_fwd_txfm2d_16x16(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3855
3856
3.52k
        break;
3857
141k
    case TX_8X8:
3858
3859
141k
        svt_av1_fwd_txfm2d_8x8(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3860
3861
141k
        break;
3862
5.02k
    case TX_4X4:
3863
3864
5.02k
        svt_av1_fwd_txfm2d_4x4(residual_buffer, coeff_buffer, residual_stride, transform_type, bit_depth);
3865
3866
5.02k
        break;
3867
0
    default:
3868
0
        assert(0);
3869
0
        break;
3870
160k
    }
3871
3872
160k
    return return_error;
3873
160k
}
3874
3875
/* 4-point reversible, orthonormal Walsh-Hadamard in 3.5 adds, 0.5 shifts per
3876
   pixel.
3877
   Shared for both high and low bit depth.
3878
 */
3879
801k
void svt_av1_fwht4x4_c(int16_t* input, int32_t* output, uint32_t stride) {
3880
801k
    int            i;
3881
801k
    int64_t        a1, b1, c1, d1, e1;
3882
801k
    const int16_t* ip_pass0 = input;
3883
801k
    const int32_t* ip       = NULL;
3884
801k
    int32_t*       op       = output;
3885
3886
3.99M
    for (i = 0; i < 4; i++) {
3887
3.19M
        a1 = ip_pass0[0 * stride];
3888
3.19M
        b1 = ip_pass0[1 * stride];
3889
3.19M
        c1 = ip_pass0[2 * stride];
3890
3.19M
        d1 = ip_pass0[3 * stride];
3891
3892
3.19M
        a1 += b1;
3893
3.19M
        d1 = d1 - c1;
3894
3.19M
        e1 = (a1 - d1) >> 1;
3895
3.19M
        b1 = e1 - b1;
3896
3.19M
        c1 = e1 - c1;
3897
3.19M
        a1 -= c1;
3898
3.19M
        d1 += b1;
3899
3.19M
        op[0] = (int32_t)a1;
3900
3.19M
        op[1] = (int32_t)c1;
3901
3.19M
        op[2] = (int32_t)d1;
3902
3.19M
        op[3] = (int32_t)b1;
3903
3904
3.19M
        ip_pass0++;
3905
3.19M
        op += 4;
3906
3.19M
    }
3907
801k
    ip = output;
3908
801k
    op = output;
3909
3910
3.98M
    for (i = 0; i < 4; i++) {
3911
3.17M
        a1 = ip[4 * 0];
3912
3.17M
        b1 = ip[4 * 1];
3913
3.17M
        c1 = ip[4 * 2];
3914
3.17M
        d1 = ip[4 * 3];
3915
3916
3.17M
        a1 += b1;
3917
3.17M
        d1 -= c1;
3918
3.17M
        e1 = (a1 - d1) >> 1;
3919
3.17M
        b1 = e1 - b1;
3920
3.17M
        c1 = e1 - c1;
3921
3.17M
        a1 -= c1;
3922
3.17M
        d1 += b1;
3923
3.17M
        op[4 * 0] = (int32_t)(a1 * UNIT_QUANT_FACTOR);
3924
3.17M
        op[4 * 1] = (int32_t)(c1 * UNIT_QUANT_FACTOR);
3925
3.17M
        op[4 * 2] = (int32_t)(d1 * UNIT_QUANT_FACTOR);
3926
3.17M
        op[4 * 3] = (int32_t)(b1 * UNIT_QUANT_FACTOR);
3927
3928
3.17M
        ip++;
3929
3.17M
        op++;
3930
3.17M
    }
3931
801k
}
3932
3933
/*********************************************************************
3934
* Transform
3935
*   Note there is an implicit assumption that TU Size <= PU Size,
3936
*   which is different than the HEVC requirements.
3937
*********************************************************************/
3938
EbErrorType svt_aom_estimate_transform(PictureControlSet* pcs, ModeDecisionContext* ctx, int16_t* residual_buffer,
3939
                                       uint32_t residual_stride, int32_t* coeff_buffer, uint32_t coeff_stride,
3940
                                       TxSize transform_size, uint64_t* three_quad_energy, uint32_t bit_depth,
3941
                                       TxType transform_type, PlaneType component_type, TxCoeffShape trans_coeff_shape)
3942
3943
961k
{
3944
961k
    (void)trans_coeff_shape;
3945
961k
    (void)coeff_stride;
3946
961k
    (void)component_type;
3947
3948
    // Lossless uses a 4x4 WHT; guard on TX_4X4 so larger sizes fall through and
3949
    // fill the full coeff_buffer, avoiding an uninitialized read. Fixes gitlab#2373.
3950
961k
    if (svt_av1_is_lossless_segment(pcs, ctx->blk_ptr->segment_id) && transform_size == TX_4X4) {
3951
801k
        assert(transform_type == DCT_DCT);
3952
801k
        int32_t dst[16];
3953
3954
801k
        svt_av1_fwht4x4(residual_buffer, dst, residual_stride);
3955
3.89M
        for (int i = 0; i < 4; i++) {
3956
15.2M
            for (int j = 0; j < 4; j++) {
3957
12.1M
                coeff_buffer[(j << 2) + i] = dst[(i << 2) + j];
3958
12.1M
            }
3959
3.09M
        }
3960
801k
        return EB_ErrorNone;
3961
801k
    }
3962
3963
159k
    switch (trans_coeff_shape) {
3964
160k
    case DEFAULT_SHAPE:
3965
160k
        return av1_estimate_transform_default(residual_buffer,
3966
160k
                                              residual_stride,
3967
160k
                                              coeff_buffer,
3968
160k
                                              coeff_stride,
3969
160k
                                              transform_size,
3970
160k
                                              three_quad_energy,
3971
160k
                                              bit_depth,
3972
160k
                                              transform_type,
3973
160k
                                              component_type);
3974
0
    case N2_SHAPE:
3975
0
        return av1_estimate_transform_N2(residual_buffer,
3976
0
                                         residual_stride,
3977
0
                                         coeff_buffer,
3978
0
                                         coeff_stride,
3979
0
                                         transform_size,
3980
0
                                         three_quad_energy,
3981
0
                                         bit_depth,
3982
0
                                         transform_type,
3983
0
                                         component_type);
3984
0
    case N4_SHAPE:
3985
0
        return av1_estimate_transform_N4(residual_buffer,
3986
0
                                         residual_stride,
3987
0
                                         coeff_buffer,
3988
0
                                         coeff_stride,
3989
0
                                         transform_size,
3990
0
                                         three_quad_energy,
3991
0
                                         bit_depth,
3992
0
                                         transform_type,
3993
0
                                         component_type);
3994
0
    case ONLY_DC_SHAPE:
3995
0
        return av1_estimate_transform_ONLY_DC(residual_buffer,
3996
0
                                              residual_stride,
3997
0
                                              coeff_buffer,
3998
0
                                              coeff_stride,
3999
0
                                              transform_size,
4000
0
                                              three_quad_energy,
4001
0
                                              bit_depth,
4002
0
                                              transform_type,
4003
0
                                              component_type);
4004
159k
    }
4005
4006
159k
    assert(0);
4007
0
    return EB_ErrorBadParameter;
4008
159k
}
4009
4010
// PF_N4
4011
0
static void highbd_fwd_txfm_64x64_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4012
0
    assert(txfm_param->tx_type == DCT_DCT);
4013
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4014
0
    const int bd        = txfm_param->bd;
4015
0
    svt_av1_fwd_txfm2d_64x64_N4(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4016
0
}
4017
4018
0
static void highbd_fwd_txfm_32x64_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4019
0
    assert(txfm_param->tx_type == DCT_DCT);
4020
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4021
0
    const int bd        = txfm_param->bd;
4022
0
    svt_av1_fwd_txfm2d_32x64_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4023
0
}
4024
4025
0
static void highbd_fwd_txfm_64x32_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4026
0
    assert(txfm_param->tx_type == DCT_DCT);
4027
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4028
0
    const int bd        = txfm_param->bd;
4029
0
    svt_av1_fwd_txfm2d_64x32_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4030
0
}
4031
4032
0
static void highbd_fwd_txfm_16x64_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4033
0
    assert(txfm_param->tx_type == DCT_DCT);
4034
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4035
0
    const int bd        = txfm_param->bd;
4036
0
    svt_av1_fwd_txfm2d_16x64_N4(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4037
0
}
4038
4039
0
static void highbd_fwd_txfm_64x16_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4040
0
    assert(txfm_param->tx_type == DCT_DCT);
4041
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4042
0
    const int bd        = txfm_param->bd;
4043
0
    svt_av1_fwd_txfm2d_64x16_N4(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4044
0
}
4045
4046
0
static void highbd_fwd_txfm_32x32_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4047
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4048
0
    const TxType tx_type   = txfm_param->tx_type;
4049
0
    const int    bd        = txfm_param->bd;
4050
0
    svt_av1_fwd_txfm2d_32x32_N4(src_diff, dst_coeff, diff_stride, tx_type, bd);
4051
0
}
4052
4053
0
static void highbd_fwd_txfm_16x16_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4054
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4055
0
    const TxType tx_type   = txfm_param->tx_type;
4056
0
    const int    bd        = txfm_param->bd;
4057
0
    svt_av1_fwd_txfm2d_16x16_N4(src_diff, dst_coeff, diff_stride, tx_type, bd);
4058
0
}
4059
4060
0
static void highbd_fwd_txfm_8x8_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4061
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4062
0
    const TxType tx_type   = txfm_param->tx_type;
4063
0
    const int    bd        = txfm_param->bd;
4064
0
    svt_av1_fwd_txfm2d_8x8_N4(src_diff, dst_coeff, diff_stride, tx_type, bd);
4065
0
}
4066
4067
0
static void highbd_fwd_txfm_4x8_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4068
0
    int32_t* dst_coeff = (int32_t*)coeff;
4069
0
    svt_av1_fwd_txfm2d_4x8_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4070
0
}
4071
4072
0
static void highbd_fwd_txfm_8x4_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4073
0
    int32_t* dst_coeff = (int32_t*)coeff;
4074
0
    svt_av1_fwd_txfm2d_8x4_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4075
0
}
4076
4077
0
static void highbd_fwd_txfm_8x16_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4078
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4079
0
    const TxType tx_type   = txfm_param->tx_type;
4080
0
    const int    bd        = txfm_param->bd;
4081
0
    svt_av1_fwd_txfm2d_8x16_N4(src_diff, dst_coeff, diff_stride, tx_type, bd);
4082
0
}
4083
4084
0
static void highbd_fwd_txfm_16x8_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4085
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4086
0
    const TxType tx_type   = txfm_param->tx_type;
4087
0
    const int    bd        = txfm_param->bd;
4088
0
    svt_av1_fwd_txfm2d_16x8_N4(src_diff, dst_coeff, diff_stride, tx_type, bd);
4089
0
}
4090
4091
0
static void highbd_fwd_txfm_16x32_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4092
0
    int32_t* dst_coeff = (int32_t*)coeff;
4093
0
    svt_av1_fwd_txfm2d_16x32_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4094
0
}
4095
4096
0
static void highbd_fwd_txfm_32x16_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4097
0
    int32_t* dst_coeff = (int32_t*)coeff;
4098
0
    svt_av1_fwd_txfm2d_32x16_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4099
0
}
4100
4101
0
static void highbd_fwd_txfm_4x16_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4102
0
    int32_t* dst_coeff = (int32_t*)coeff;
4103
0
    svt_av1_fwd_txfm2d_4x16(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4104
0
}
4105
4106
0
static void highbd_fwd_txfm_16x4_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4107
0
    int32_t* dst_coeff = (int32_t*)coeff;
4108
0
    svt_av1_fwd_txfm2d_16x4_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4109
0
}
4110
4111
0
static void highbd_fwd_txfm_8x32_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4112
0
    int32_t* dst_coeff = (int32_t*)coeff;
4113
0
    svt_av1_fwd_txfm2d_8x32_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4114
0
}
4115
4116
0
static void highbd_fwd_txfm_32x8_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4117
0
    int32_t* dst_coeff = (int32_t*)coeff;
4118
0
    svt_av1_fwd_txfm2d_32x8_N4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4119
0
}
4120
4121
//PF_N2
4122
0
static void highbd_fwd_txfm_64x64_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4123
0
    assert(txfm_param->tx_type == DCT_DCT);
4124
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4125
0
    const int bd        = txfm_param->bd;
4126
0
    svt_av1_fwd_txfm2d_64x64_N2(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4127
0
}
4128
4129
0
static void highbd_fwd_txfm_32x64_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4130
0
    assert(txfm_param->tx_type == DCT_DCT);
4131
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4132
0
    const int bd        = txfm_param->bd;
4133
0
    svt_av1_fwd_txfm2d_32x64_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4134
0
}
4135
4136
0
static void highbd_fwd_txfm_64x32_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4137
0
    assert(txfm_param->tx_type == DCT_DCT);
4138
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4139
0
    const int bd        = txfm_param->bd;
4140
0
    svt_av1_fwd_txfm2d_64x32_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4141
0
}
4142
4143
0
static void highbd_fwd_txfm_16x64_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4144
0
    assert(txfm_param->tx_type == DCT_DCT);
4145
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4146
0
    const int bd        = txfm_param->bd;
4147
0
    svt_av1_fwd_txfm2d_16x64_N2(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4148
0
}
4149
4150
0
static void highbd_fwd_txfm_64x16_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4151
0
    assert(txfm_param->tx_type == DCT_DCT);
4152
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4153
0
    const int bd        = txfm_param->bd;
4154
0
    svt_av1_fwd_txfm2d_64x16_N2(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4155
0
}
4156
4157
0
static void highbd_fwd_txfm_32x32_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4158
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4159
0
    const TxType tx_type   = txfm_param->tx_type;
4160
0
    const int    bd        = txfm_param->bd;
4161
0
    svt_av1_fwd_txfm2d_32x32_N2(src_diff, dst_coeff, diff_stride, tx_type, bd);
4162
0
}
4163
4164
0
static void highbd_fwd_txfm_16x16_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4165
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4166
0
    const TxType tx_type   = txfm_param->tx_type;
4167
0
    const int    bd        = txfm_param->bd;
4168
0
    svt_av1_fwd_txfm2d_16x16_N2(src_diff, dst_coeff, diff_stride, tx_type, bd);
4169
0
}
4170
4171
0
static void highbd_fwd_txfm_8x8_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4172
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4173
0
    const TxType tx_type   = txfm_param->tx_type;
4174
0
    const int    bd        = txfm_param->bd;
4175
0
    svt_av1_fwd_txfm2d_8x8_N2(src_diff, dst_coeff, diff_stride, tx_type, bd);
4176
0
}
4177
4178
0
static void highbd_fwd_txfm_4x8_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4179
0
    int32_t* dst_coeff = (int32_t*)coeff;
4180
0
    svt_av1_fwd_txfm2d_4x8_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4181
0
}
4182
4183
0
static void highbd_fwd_txfm_8x4_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4184
0
    int32_t* dst_coeff = (int32_t*)coeff;
4185
0
    svt_av1_fwd_txfm2d_8x4_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4186
0
}
4187
4188
0
static void highbd_fwd_txfm_8x16_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4189
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4190
0
    const TxType tx_type   = txfm_param->tx_type;
4191
0
    const int    bd        = txfm_param->bd;
4192
0
    svt_av1_fwd_txfm2d_8x16_N2(src_diff, dst_coeff, diff_stride, tx_type, bd);
4193
0
}
4194
4195
0
static void highbd_fwd_txfm_16x8_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4196
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4197
0
    const TxType tx_type   = txfm_param->tx_type;
4198
0
    const int    bd        = txfm_param->bd;
4199
0
    svt_av1_fwd_txfm2d_16x8_N2(src_diff, dst_coeff, diff_stride, tx_type, bd);
4200
0
}
4201
4202
0
static void highbd_fwd_txfm_16x32_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4203
0
    int32_t* dst_coeff = (int32_t*)coeff;
4204
0
    svt_av1_fwd_txfm2d_16x32_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4205
0
}
4206
4207
0
static void highbd_fwd_txfm_32x16_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4208
0
    int32_t* dst_coeff = (int32_t*)coeff;
4209
0
    svt_av1_fwd_txfm2d_32x16_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4210
0
}
4211
4212
0
static void highbd_fwd_txfm_4x16_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4213
0
    int32_t* dst_coeff = (int32_t*)coeff;
4214
0
    svt_av1_fwd_txfm2d_4x16(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4215
0
}
4216
4217
0
static void highbd_fwd_txfm_16x4_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4218
0
    int32_t* dst_coeff = (int32_t*)coeff;
4219
0
    svt_av1_fwd_txfm2d_16x4_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4220
0
}
4221
4222
0
static void highbd_fwd_txfm_8x32_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4223
0
    int32_t* dst_coeff = (int32_t*)coeff;
4224
0
    svt_av1_fwd_txfm2d_8x32_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4225
0
}
4226
4227
0
static void highbd_fwd_txfm_32x8_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4228
0
    int32_t* dst_coeff = (int32_t*)coeff;
4229
0
    svt_av1_fwd_txfm2d_32x8_N2(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4230
0
}
4231
4232
0
static void highbd_fwd_txfm_64x64(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4233
0
    assert(txfm_param->tx_type == DCT_DCT);
4234
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4235
0
    const int bd        = txfm_param->bd;
4236
0
    svt_av1_fwd_txfm2d_64x64(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4237
0
}
4238
4239
0
static void highbd_fwd_txfm_32x64(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4240
0
    assert(txfm_param->tx_type == DCT_DCT);
4241
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4242
0
    const int bd        = txfm_param->bd;
4243
0
    svt_av1_fwd_txfm2d_32x64(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4244
0
}
4245
4246
0
static void highbd_fwd_txfm_64x32(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4247
0
    assert(txfm_param->tx_type == DCT_DCT);
4248
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4249
0
    const int bd        = txfm_param->bd;
4250
0
    svt_av1_fwd_txfm2d_64x32(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, bd);
4251
0
}
4252
4253
0
static void highbd_fwd_txfm_16x64(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4254
0
    assert(txfm_param->tx_type == DCT_DCT);
4255
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4256
0
    const int bd        = txfm_param->bd;
4257
0
    svt_av1_fwd_txfm2d_16x64(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4258
0
}
4259
4260
0
static void highbd_fwd_txfm_64x16(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4261
0
    assert(txfm_param->tx_type == DCT_DCT);
4262
0
    int32_t*  dst_coeff = (int32_t*)coeff;
4263
0
    const int bd        = txfm_param->bd;
4264
0
    svt_av1_fwd_txfm2d_64x16(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
4265
0
}
4266
4267
0
static void highbd_fwd_txfm_32x32(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4268
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4269
0
    const TxType tx_type   = txfm_param->tx_type;
4270
0
    const int    bd        = txfm_param->bd;
4271
0
    svt_av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd);
4272
0
}
4273
4274
0
static void highbd_fwd_txfm_16x16(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4275
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4276
0
    const TxType tx_type   = txfm_param->tx_type;
4277
0
    const int    bd        = txfm_param->bd;
4278
0
    svt_av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd);
4279
0
}
4280
4281
0
static void highbd_fwd_txfm_8x8(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4282
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4283
0
    const TxType tx_type   = txfm_param->tx_type;
4284
0
    const int    bd        = txfm_param->bd;
4285
0
    svt_av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd);
4286
0
}
4287
4288
0
static void highbd_fwd_txfm_4x8(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4289
0
    int32_t* dst_coeff = (int32_t*)coeff;
4290
0
    svt_av1_fwd_txfm2d_4x8(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4291
0
}
4292
4293
0
static void highbd_fwd_txfm_8x4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4294
0
    int32_t* dst_coeff = (int32_t*)coeff;
4295
0
    svt_av1_fwd_txfm2d_8x4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4296
0
}
4297
4298
0
static void highbd_fwd_txfm_8x16(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4299
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4300
0
    const TxType tx_type   = txfm_param->tx_type;
4301
0
    const int    bd        = txfm_param->bd;
4302
0
    svt_av1_fwd_txfm2d_8x16(src_diff, dst_coeff, diff_stride, tx_type, bd);
4303
0
}
4304
4305
0
static void highbd_fwd_txfm_16x8(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4306
0
    int32_t*     dst_coeff = (int32_t*)coeff;
4307
0
    const TxType tx_type   = txfm_param->tx_type;
4308
0
    const int    bd        = txfm_param->bd;
4309
0
    svt_av1_fwd_txfm2d_16x8(src_diff, dst_coeff, diff_stride, tx_type, bd);
4310
0
}
4311
4312
0
static void highbd_fwd_txfm_16x32(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4313
0
    int32_t* dst_coeff = (int32_t*)coeff;
4314
0
    svt_av1_fwd_txfm2d_16x32(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4315
0
}
4316
4317
0
static void highbd_fwd_txfm_32x16(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4318
0
    int32_t* dst_coeff = (int32_t*)coeff;
4319
0
    svt_av1_fwd_txfm2d_32x16(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4320
0
}
4321
4322
0
static void highbd_fwd_txfm_4x16(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4323
0
    int32_t* dst_coeff = (int32_t*)coeff;
4324
0
    svt_av1_fwd_txfm2d_4x16(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4325
0
}
4326
4327
0
static void highbd_fwd_txfm_16x4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4328
0
    int32_t* dst_coeff = (int32_t*)coeff;
4329
0
    svt_av1_fwd_txfm2d_16x4(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4330
0
}
4331
4332
0
static void highbd_fwd_txfm_8x32(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4333
0
    int32_t* dst_coeff = (int32_t*)coeff;
4334
0
    svt_av1_fwd_txfm2d_8x32(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4335
0
}
4336
4337
0
static void highbd_fwd_txfm_32x8(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4338
0
    int32_t* dst_coeff = (int32_t*)coeff;
4339
0
    svt_av1_fwd_txfm2d_32x8(src_diff, dst_coeff, diff_stride, txfm_param->tx_type, txfm_param->bd);
4340
0
}
4341
4342
0
void svt_av1_highbd_fwd_txfm_n4(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4343
0
    assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]);
4344
0
    const TxSize tx_size = txfm_param->tx_size;
4345
0
    switch (tx_size) {
4346
0
    case TX_64X64:
4347
0
        highbd_fwd_txfm_64x64_n4(src_diff, coeff, diff_stride, txfm_param);
4348
0
        break;
4349
0
    case TX_32X64:
4350
0
        highbd_fwd_txfm_32x64_n4(src_diff, coeff, diff_stride, txfm_param);
4351
0
        break;
4352
0
    case TX_64X32:
4353
0
        highbd_fwd_txfm_64x32_n4(src_diff, coeff, diff_stride, txfm_param);
4354
0
        break;
4355
0
    case TX_16X64:
4356
0
        highbd_fwd_txfm_16x64_n4(src_diff, coeff, diff_stride, txfm_param);
4357
0
        break;
4358
0
    case TX_64X16:
4359
0
        highbd_fwd_txfm_64x16_n4(src_diff, coeff, diff_stride, txfm_param);
4360
0
        break;
4361
0
    case TX_32X32:
4362
0
        highbd_fwd_txfm_32x32_n4(src_diff, coeff, diff_stride, txfm_param);
4363
0
        break;
4364
0
    case TX_16X16:
4365
0
        highbd_fwd_txfm_16x16_n4(src_diff, coeff, diff_stride, txfm_param);
4366
0
        break;
4367
0
    case TX_8X8:
4368
0
        highbd_fwd_txfm_8x8_n4(src_diff, coeff, diff_stride, txfm_param);
4369
0
        break;
4370
0
    case TX_4X8:
4371
0
        highbd_fwd_txfm_4x8_n4(src_diff, coeff, diff_stride, txfm_param);
4372
0
        break;
4373
0
    case TX_8X4:
4374
0
        highbd_fwd_txfm_8x4_n4(src_diff, coeff, diff_stride, txfm_param);
4375
0
        break;
4376
0
    case TX_8X16:
4377
0
        highbd_fwd_txfm_8x16_n4(src_diff, coeff, diff_stride, txfm_param);
4378
0
        break;
4379
0
    case TX_16X8:
4380
0
        highbd_fwd_txfm_16x8_n4(src_diff, coeff, diff_stride, txfm_param);
4381
0
        break;
4382
0
    case TX_16X32:
4383
0
        highbd_fwd_txfm_16x32_n4(src_diff, coeff, diff_stride, txfm_param);
4384
0
        break;
4385
0
    case TX_32X16:
4386
0
        highbd_fwd_txfm_32x16_n4(src_diff, coeff, diff_stride, txfm_param);
4387
0
        break;
4388
0
    case TX_4X4:
4389
        //hack highbd_fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param);
4390
0
        break;
4391
0
    case TX_4X16:
4392
0
        highbd_fwd_txfm_4x16_n4(src_diff, coeff, diff_stride, txfm_param);
4393
0
        break;
4394
0
    case TX_16X4:
4395
0
        highbd_fwd_txfm_16x4_n4(src_diff, coeff, diff_stride, txfm_param);
4396
0
        break;
4397
0
    case TX_8X32:
4398
0
        highbd_fwd_txfm_8x32_n4(src_diff, coeff, diff_stride, txfm_param);
4399
0
        break;
4400
0
    case TX_32X8:
4401
0
        highbd_fwd_txfm_32x8_n4(src_diff, coeff, diff_stride, txfm_param);
4402
0
        break;
4403
0
    default:
4404
0
        assert(0);
4405
0
        break;
4406
0
    }
4407
0
}
4408
4409
0
void svt_av1_highbd_fwd_txfm_n2(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4410
0
    assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]);
4411
0
    const TxSize tx_size = txfm_param->tx_size;
4412
0
    switch (tx_size) {
4413
0
    case TX_64X64:
4414
0
        highbd_fwd_txfm_64x64_n2(src_diff, coeff, diff_stride, txfm_param);
4415
0
        break;
4416
0
    case TX_32X64:
4417
0
        highbd_fwd_txfm_32x64_n2(src_diff, coeff, diff_stride, txfm_param);
4418
0
        break;
4419
0
    case TX_64X32:
4420
0
        highbd_fwd_txfm_64x32_n2(src_diff, coeff, diff_stride, txfm_param);
4421
0
        break;
4422
0
    case TX_16X64:
4423
0
        highbd_fwd_txfm_16x64_n2(src_diff, coeff, diff_stride, txfm_param);
4424
0
        break;
4425
0
    case TX_64X16:
4426
0
        highbd_fwd_txfm_64x16_n2(src_diff, coeff, diff_stride, txfm_param);
4427
0
        break;
4428
0
    case TX_32X32:
4429
0
        highbd_fwd_txfm_32x32_n2(src_diff, coeff, diff_stride, txfm_param);
4430
0
        break;
4431
0
    case TX_16X16:
4432
0
        highbd_fwd_txfm_16x16_n2(src_diff, coeff, diff_stride, txfm_param);
4433
0
        break;
4434
0
    case TX_8X8:
4435
0
        highbd_fwd_txfm_8x8_n2(src_diff, coeff, diff_stride, txfm_param);
4436
0
        break;
4437
0
    case TX_4X8:
4438
0
        highbd_fwd_txfm_4x8_n2(src_diff, coeff, diff_stride, txfm_param);
4439
0
        break;
4440
0
    case TX_8X4:
4441
0
        highbd_fwd_txfm_8x4_n2(src_diff, coeff, diff_stride, txfm_param);
4442
0
        break;
4443
0
    case TX_8X16:
4444
0
        highbd_fwd_txfm_8x16_n2(src_diff, coeff, diff_stride, txfm_param);
4445
0
        break;
4446
0
    case TX_16X8:
4447
0
        highbd_fwd_txfm_16x8_n2(src_diff, coeff, diff_stride, txfm_param);
4448
0
        break;
4449
0
    case TX_16X32:
4450
0
        highbd_fwd_txfm_16x32_n2(src_diff, coeff, diff_stride, txfm_param);
4451
0
        break;
4452
0
    case TX_32X16:
4453
0
        highbd_fwd_txfm_32x16_n2(src_diff, coeff, diff_stride, txfm_param);
4454
0
        break;
4455
0
    case TX_4X4:
4456
        //hack highbd_fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param);
4457
0
        break;
4458
0
    case TX_4X16:
4459
0
        highbd_fwd_txfm_4x16_n2(src_diff, coeff, diff_stride, txfm_param);
4460
0
        break;
4461
0
    case TX_16X4:
4462
0
        highbd_fwd_txfm_16x4_n2(src_diff, coeff, diff_stride, txfm_param);
4463
0
        break;
4464
0
    case TX_8X32:
4465
0
        highbd_fwd_txfm_8x32_n2(src_diff, coeff, diff_stride, txfm_param);
4466
0
        break;
4467
0
    case TX_32X8:
4468
0
        highbd_fwd_txfm_32x8_n2(src_diff, coeff, diff_stride, txfm_param);
4469
0
        break;
4470
0
    default:
4471
0
        assert(0);
4472
0
        break;
4473
0
    }
4474
0
}
4475
4476
0
void svt_av1_highbd_fwd_txfm(int16_t* src_diff, TranLow* coeff, int diff_stride, TxfmParam* txfm_param) {
4477
0
    assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]);
4478
0
    const TxSize tx_size = txfm_param->tx_size;
4479
0
    switch (tx_size) {
4480
0
    case TX_64X64:
4481
0
        highbd_fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param);
4482
0
        break;
4483
0
    case TX_32X64:
4484
0
        highbd_fwd_txfm_32x64(src_diff, coeff, diff_stride, txfm_param);
4485
0
        break;
4486
0
    case TX_64X32:
4487
0
        highbd_fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param);
4488
0
        break;
4489
0
    case TX_16X64:
4490
0
        highbd_fwd_txfm_16x64(src_diff, coeff, diff_stride, txfm_param);
4491
0
        break;
4492
0
    case TX_64X16:
4493
0
        highbd_fwd_txfm_64x16(src_diff, coeff, diff_stride, txfm_param);
4494
0
        break;
4495
0
    case TX_32X32:
4496
0
        highbd_fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param);
4497
0
        break;
4498
0
    case TX_16X16:
4499
0
        highbd_fwd_txfm_16x16(src_diff, coeff, diff_stride, txfm_param);
4500
0
        break;
4501
0
    case TX_8X8:
4502
0
        highbd_fwd_txfm_8x8(src_diff, coeff, diff_stride, txfm_param);
4503
0
        break;
4504
0
    case TX_4X8:
4505
0
        highbd_fwd_txfm_4x8(src_diff, coeff, diff_stride, txfm_param);
4506
0
        break;
4507
0
    case TX_8X4:
4508
0
        highbd_fwd_txfm_8x4(src_diff, coeff, diff_stride, txfm_param);
4509
0
        break;
4510
0
    case TX_8X16:
4511
0
        highbd_fwd_txfm_8x16(src_diff, coeff, diff_stride, txfm_param);
4512
0
        break;
4513
0
    case TX_16X8:
4514
0
        highbd_fwd_txfm_16x8(src_diff, coeff, diff_stride, txfm_param);
4515
0
        break;
4516
0
    case TX_16X32:
4517
0
        highbd_fwd_txfm_16x32(src_diff, coeff, diff_stride, txfm_param);
4518
0
        break;
4519
0
    case TX_32X16:
4520
0
        highbd_fwd_txfm_32x16(src_diff, coeff, diff_stride, txfm_param);
4521
0
        break;
4522
0
    case TX_4X4:
4523
        //hack highbd_fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param);
4524
0
        break;
4525
0
    case TX_4X16:
4526
0
        highbd_fwd_txfm_4x16(src_diff, coeff, diff_stride, txfm_param);
4527
0
        break;
4528
0
    case TX_16X4:
4529
0
        highbd_fwd_txfm_16x4(src_diff, coeff, diff_stride, txfm_param);
4530
0
        break;
4531
0
    case TX_8X32:
4532
0
        highbd_fwd_txfm_8x32(src_diff, coeff, diff_stride, txfm_param);
4533
0
        break;
4534
0
    case TX_32X8:
4535
0
        highbd_fwd_txfm_32x8(src_diff, coeff, diff_stride, txfm_param);
4536
0
        break;
4537
0
    default:
4538
0
        assert(0);
4539
0
        break;
4540
0
    }
4541
0
}
4542
4543
void svt_av1_wht_fwd_txfm(int16_t* src_diff, int bw, int32_t* coeff, TxSize tx_size, TxCoeffShape pf_shape,
4544
0
                          int bit_depth, int is_hbd) {
4545
0
    TxfmParam txfm_param;
4546
0
    txfm_param.tx_type     = DCT_DCT;
4547
0
    txfm_param.tx_size     = tx_size;
4548
0
    txfm_param.lossless    = 0;
4549
0
    txfm_param.tx_set_type = EXT_TX_SET_ALL16;
4550
4551
0
    txfm_param.bd     = bit_depth;
4552
0
    txfm_param.is_hbd = is_hbd;
4553
0
    switch (pf_shape) {
4554
0
    case N4_SHAPE:
4555
0
        svt_av1_highbd_fwd_txfm_n4(src_diff, coeff, bw, &txfm_param);
4556
0
        break;
4557
0
    case N2_SHAPE:
4558
0
        svt_av1_highbd_fwd_txfm_n2(src_diff, coeff, bw, &txfm_param);
4559
0
        break;
4560
0
    default:
4561
0
        svt_av1_highbd_fwd_txfm(src_diff, coeff, bw, &txfm_param);
4562
0
    }
4563
0
}
4564
4565
0
void svt_av1_fidentity16_N2_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4566
0
    (void)stage_range;
4567
0
    (void)cos_bit;
4568
0
    for (int32_t i = 0; i < 8; ++i) {
4569
0
        output[i] = round_shift((int64_t)input[i] * 2 * new_sqrt2, new_sqrt2_bits);
4570
0
    }
4571
4572
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
4573
0
}
4574
4575
0
void svt_av1_fadst16_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4576
0
    (void)stage_range;
4577
0
    const int32_t* cospi;
4578
4579
0
    int32_t *bf0, *bf1;
4580
0
    int32_t  step[16];
4581
4582
    // stage 0;
4583
4584
    // stage 1;
4585
0
    assert(output != input);
4586
0
    bf1     = output;
4587
0
    bf1[0]  = input[0];
4588
0
    bf1[1]  = -input[15];
4589
0
    bf1[2]  = -input[7];
4590
0
    bf1[3]  = input[8];
4591
0
    bf1[4]  = -input[3];
4592
0
    bf1[5]  = input[12];
4593
0
    bf1[6]  = input[4];
4594
0
    bf1[7]  = -input[11];
4595
0
    bf1[8]  = -input[1];
4596
0
    bf1[9]  = input[14];
4597
0
    bf1[10] = input[6];
4598
0
    bf1[11] = -input[9];
4599
0
    bf1[12] = input[2];
4600
0
    bf1[13] = -input[13];
4601
0
    bf1[14] = -input[5];
4602
0
    bf1[15] = input[10];
4603
4604
    // stage 2
4605
0
    cospi   = cospi_arr(cos_bit);
4606
0
    bf0     = output;
4607
0
    bf1     = step;
4608
0
    bf1[0]  = bf0[0];
4609
0
    bf1[1]  = bf0[1];
4610
0
    bf1[2]  = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
4611
0
    bf1[3]  = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
4612
0
    bf1[4]  = bf0[4];
4613
0
    bf1[5]  = bf0[5];
4614
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
4615
0
    bf1[7]  = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
4616
0
    bf1[8]  = bf0[8];
4617
0
    bf1[9]  = bf0[9];
4618
0
    bf1[10] = half_btf(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
4619
0
    bf1[11] = half_btf(cospi[32], bf0[10], -cospi[32], bf0[11], cos_bit);
4620
0
    bf1[12] = bf0[12];
4621
0
    bf1[13] = bf0[13];
4622
0
    bf1[14] = half_btf(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
4623
0
    bf1[15] = half_btf(cospi[32], bf0[14], -cospi[32], bf0[15], cos_bit);
4624
4625
    // stage 3
4626
0
    bf0     = step;
4627
0
    bf1     = output;
4628
0
    bf1[0]  = bf0[0] + bf0[2];
4629
0
    bf1[1]  = bf0[1] + bf0[3];
4630
0
    bf1[2]  = bf0[0] - bf0[2];
4631
0
    bf1[3]  = bf0[1] - bf0[3];
4632
0
    bf1[4]  = bf0[4] + bf0[6];
4633
0
    bf1[5]  = bf0[5] + bf0[7];
4634
0
    bf1[6]  = bf0[4] - bf0[6];
4635
0
    bf1[7]  = bf0[5] - bf0[7];
4636
0
    bf1[8]  = bf0[8] + bf0[10];
4637
0
    bf1[9]  = bf0[9] + bf0[11];
4638
0
    bf1[10] = bf0[8] - bf0[10];
4639
0
    bf1[11] = bf0[9] - bf0[11];
4640
0
    bf1[12] = bf0[12] + bf0[14];
4641
0
    bf1[13] = bf0[13] + bf0[15];
4642
0
    bf1[14] = bf0[12] - bf0[14];
4643
0
    bf1[15] = bf0[13] - bf0[15];
4644
4645
    // stage 4
4646
0
    cospi   = cospi_arr(cos_bit);
4647
0
    bf0     = output;
4648
0
    bf1     = step;
4649
0
    bf1[0]  = bf0[0];
4650
0
    bf1[1]  = bf0[1];
4651
0
    bf1[2]  = bf0[2];
4652
0
    bf1[3]  = bf0[3];
4653
0
    bf1[4]  = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
4654
0
    bf1[5]  = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
4655
0
    bf1[6]  = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
4656
0
    bf1[7]  = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
4657
0
    bf1[8]  = bf0[8];
4658
0
    bf1[9]  = bf0[9];
4659
0
    bf1[10] = bf0[10];
4660
0
    bf1[11] = bf0[11];
4661
0
    bf1[12] = half_btf(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
4662
0
    bf1[13] = half_btf(cospi[48], bf0[12], -cospi[16], bf0[13], cos_bit);
4663
0
    bf1[14] = half_btf(-cospi[48], bf0[14], cospi[16], bf0[15], cos_bit);
4664
0
    bf1[15] = half_btf(cospi[16], bf0[14], cospi[48], bf0[15], cos_bit);
4665
4666
    // stage 5
4667
0
    bf0     = step;
4668
0
    bf1     = output;
4669
0
    bf1[0]  = bf0[0] + bf0[4];
4670
0
    bf1[1]  = bf0[1] + bf0[5];
4671
0
    bf1[2]  = bf0[2] + bf0[6];
4672
0
    bf1[3]  = bf0[3] + bf0[7];
4673
0
    bf1[4]  = bf0[0] - bf0[4];
4674
0
    bf1[5]  = bf0[1] - bf0[5];
4675
0
    bf1[6]  = bf0[2] - bf0[6];
4676
0
    bf1[7]  = bf0[3] - bf0[7];
4677
0
    bf1[8]  = bf0[8] + bf0[12];
4678
0
    bf1[9]  = bf0[9] + bf0[13];
4679
0
    bf1[10] = bf0[10] + bf0[14];
4680
0
    bf1[11] = bf0[11] + bf0[15];
4681
0
    bf1[12] = bf0[8] - bf0[12];
4682
0
    bf1[13] = bf0[9] - bf0[13];
4683
0
    bf1[14] = bf0[10] - bf0[14];
4684
0
    bf1[15] = bf0[11] - bf0[15];
4685
4686
    // stage 6
4687
0
    cospi   = cospi_arr(cos_bit);
4688
0
    bf0     = output;
4689
0
    bf1     = step;
4690
0
    bf1[0]  = bf0[0];
4691
0
    bf1[1]  = bf0[1];
4692
0
    bf1[2]  = bf0[2];
4693
0
    bf1[3]  = bf0[3];
4694
0
    bf1[4]  = bf0[4];
4695
0
    bf1[5]  = bf0[5];
4696
0
    bf1[6]  = bf0[6];
4697
0
    bf1[7]  = bf0[7];
4698
0
    bf1[8]  = half_btf(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
4699
0
    bf1[9]  = half_btf(cospi[56], bf0[8], -cospi[8], bf0[9], cos_bit);
4700
0
    bf1[10] = half_btf(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
4701
0
    bf1[11] = half_btf(cospi[24], bf0[10], -cospi[40], bf0[11], cos_bit);
4702
0
    bf1[12] = half_btf(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
4703
0
    bf1[13] = half_btf(cospi[8], bf0[12], cospi[56], bf0[13], cos_bit);
4704
0
    bf1[14] = half_btf(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
4705
0
    bf1[15] = half_btf(cospi[40], bf0[14], cospi[24], bf0[15], cos_bit);
4706
4707
    // stage 7
4708
0
    bf0     = step;
4709
0
    bf1     = output;
4710
0
    bf1[0]  = bf0[0] + bf0[8];
4711
0
    bf1[1]  = bf0[1] + bf0[9];
4712
0
    bf1[2]  = bf0[2] + bf0[10];
4713
0
    bf1[3]  = bf0[3] + bf0[11];
4714
0
    bf1[4]  = bf0[4] + bf0[12];
4715
0
    bf1[5]  = bf0[5] + bf0[13];
4716
0
    bf1[6]  = bf0[6] + bf0[14];
4717
0
    bf1[7]  = bf0[7] + bf0[15];
4718
0
    bf1[8]  = bf0[0] - bf0[8];
4719
0
    bf1[9]  = bf0[1] - bf0[9];
4720
0
    bf1[10] = bf0[2] - bf0[10];
4721
0
    bf1[11] = bf0[3] - bf0[11];
4722
0
    bf1[12] = bf0[4] - bf0[12];
4723
0
    bf1[13] = bf0[5] - bf0[13];
4724
0
    bf1[14] = bf0[6] - bf0[14];
4725
0
    bf1[15] = bf0[7] - bf0[15];
4726
4727
    // stage 8
4728
0
    cospi   = cospi_arr(cos_bit);
4729
0
    bf0     = output;
4730
0
    bf1     = step;
4731
0
    bf1[1]  = half_btf(cospi[62], bf0[0], -cospi[2], bf0[1], cos_bit);
4732
0
    bf1[3]  = half_btf(cospi[54], bf0[2], -cospi[10], bf0[3], cos_bit);
4733
0
    bf1[5]  = half_btf(cospi[46], bf0[4], -cospi[18], bf0[5], cos_bit);
4734
0
    bf1[7]  = half_btf(cospi[38], bf0[6], -cospi[26], bf0[7], cos_bit);
4735
0
    bf1[8]  = half_btf(cospi[34], bf0[8], cospi[30], bf0[9], cos_bit);
4736
0
    bf1[10] = half_btf(cospi[42], bf0[10], cospi[22], bf0[11], cos_bit);
4737
0
    bf1[12] = half_btf(cospi[50], bf0[12], cospi[14], bf0[13], cos_bit);
4738
0
    bf1[14] = half_btf(cospi[58], bf0[14], cospi[6], bf0[15], cos_bit);
4739
4740
    // stage 9
4741
0
    bf0    = step;
4742
0
    bf1    = output;
4743
0
    bf1[0] = bf0[1];
4744
0
    bf1[1] = bf0[14];
4745
0
    bf1[2] = bf0[3];
4746
0
    bf1[3] = bf0[12];
4747
0
    bf1[4] = bf0[5];
4748
0
    bf1[5] = bf0[10];
4749
0
    bf1[6] = bf0[7];
4750
0
    bf1[7] = bf0[8];
4751
0
}
4752
4753
0
void svt_av1_fdct16_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4754
0
    (void)stage_range;
4755
0
    const int32_t* cospi;
4756
4757
0
    int32_t *bf0, *bf1;
4758
0
    int32_t  step[16];
4759
4760
    // stage 0;
4761
4762
    // stage 1;
4763
0
    bf1     = output;
4764
0
    bf1[0]  = input[0] + input[15];
4765
0
    bf1[1]  = input[1] + input[14];
4766
0
    bf1[2]  = input[2] + input[13];
4767
0
    bf1[3]  = input[3] + input[12];
4768
0
    bf1[4]  = input[4] + input[11];
4769
0
    bf1[5]  = input[5] + input[10];
4770
0
    bf1[6]  = input[6] + input[9];
4771
0
    bf1[7]  = input[7] + input[8];
4772
0
    bf1[8]  = -input[8] + input[7];
4773
0
    bf1[9]  = -input[9] + input[6];
4774
0
    bf1[10] = -input[10] + input[5];
4775
0
    bf1[11] = -input[11] + input[4];
4776
0
    bf1[12] = -input[12] + input[3];
4777
0
    bf1[13] = -input[13] + input[2];
4778
0
    bf1[14] = -input[14] + input[1];
4779
0
    bf1[15] = -input[15] + input[0];
4780
4781
    // stage 2
4782
0
    cospi   = cospi_arr(cos_bit);
4783
0
    bf0     = output;
4784
0
    bf1     = step;
4785
0
    bf1[0]  = bf0[0] + bf0[7];
4786
0
    bf1[1]  = bf0[1] + bf0[6];
4787
0
    bf1[2]  = bf0[2] + bf0[5];
4788
0
    bf1[3]  = bf0[3] + bf0[4];
4789
0
    bf1[4]  = -bf0[4] + bf0[3];
4790
0
    bf1[5]  = -bf0[5] + bf0[2];
4791
0
    bf1[6]  = -bf0[6] + bf0[1];
4792
0
    bf1[7]  = -bf0[7] + bf0[0];
4793
0
    bf1[8]  = bf0[8];
4794
0
    bf1[9]  = bf0[9];
4795
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
4796
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
4797
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
4798
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
4799
0
    bf1[14] = bf0[14];
4800
0
    bf1[15] = bf0[15];
4801
4802
    // stage 3
4803
0
    cospi   = cospi_arr(cos_bit);
4804
0
    bf0     = step;
4805
0
    bf1     = output;
4806
0
    bf1[0]  = bf0[0] + bf0[3];
4807
0
    bf1[1]  = bf0[1] + bf0[2];
4808
0
    bf1[2]  = -bf0[2] + bf0[1];
4809
0
    bf1[3]  = -bf0[3] + bf0[0];
4810
0
    bf1[4]  = bf0[4];
4811
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
4812
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
4813
0
    bf1[7]  = bf0[7];
4814
0
    bf1[8]  = bf0[8] + bf0[11];
4815
0
    bf1[9]  = bf0[9] + bf0[10];
4816
0
    bf1[10] = -bf0[10] + bf0[9];
4817
0
    bf1[11] = -bf0[11] + bf0[8];
4818
0
    bf1[12] = -bf0[12] + bf0[15];
4819
0
    bf1[13] = -bf0[13] + bf0[14];
4820
0
    bf1[14] = bf0[14] + bf0[13];
4821
0
    bf1[15] = bf0[15] + bf0[12];
4822
4823
    // stage 4
4824
0
    cospi   = cospi_arr(cos_bit);
4825
0
    bf0     = output;
4826
0
    bf1     = step;
4827
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
4828
0
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
4829
0
    bf1[4]  = bf0[4] + bf0[5];
4830
0
    bf1[5]  = -bf0[5] + bf0[4];
4831
0
    bf1[6]  = -bf0[6] + bf0[7];
4832
0
    bf1[7]  = bf0[7] + bf0[6];
4833
0
    bf1[8]  = bf0[8];
4834
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
4835
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
4836
0
    bf1[11] = bf0[11];
4837
0
    bf1[12] = bf0[12];
4838
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
4839
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
4840
0
    bf1[15] = bf0[15];
4841
4842
    // stage 5
4843
0
    cospi   = cospi_arr(cos_bit);
4844
0
    bf0     = step;
4845
0
    bf1     = output;
4846
0
    bf1[0]  = bf0[0];
4847
0
    bf1[2]  = bf0[2];
4848
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
4849
0
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
4850
0
    bf1[8]  = bf0[8] + bf0[9];
4851
0
    bf1[9]  = -bf0[9] + bf0[8];
4852
0
    bf1[10] = -bf0[10] + bf0[11];
4853
0
    bf1[11] = bf0[11] + bf0[10];
4854
0
    bf1[12] = bf0[12] + bf0[13];
4855
0
    bf1[13] = -bf0[13] + bf0[12];
4856
0
    bf1[14] = -bf0[14] + bf0[15];
4857
0
    bf1[15] = bf0[15] + bf0[14];
4858
4859
    // stage 6
4860
0
    cospi   = cospi_arr(cos_bit);
4861
0
    bf0     = output;
4862
0
    bf1     = step;
4863
0
    bf1[0]  = bf0[0];
4864
0
    bf1[2]  = bf0[2];
4865
0
    bf1[4]  = bf0[4];
4866
0
    bf1[6]  = bf0[6];
4867
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
4868
0
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
4869
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
4870
0
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
4871
4872
    // stage 7
4873
0
    bf0    = step;
4874
0
    bf1    = output;
4875
0
    bf1[0] = bf0[0];
4876
0
    bf1[1] = bf0[8];
4877
0
    bf1[2] = bf0[4];
4878
0
    bf1[3] = bf0[12];
4879
0
    bf1[4] = bf0[2];
4880
0
    bf1[5] = bf0[10];
4881
0
    bf1[6] = bf0[6];
4882
0
    bf1[7] = bf0[14];
4883
0
}
4884
4885
0
void svt_av1_fidentity8_N2_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4886
0
    (void)stage_range;
4887
0
    (void)cos_bit;
4888
0
    for (int32_t i = 0; i < 4; ++i) {
4889
0
        output[i] = input[i] * 2;
4890
0
    }
4891
0
}
4892
4893
0
void svt_av1_fadst8_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4894
0
    (void)stage_range;
4895
0
    const int32_t* cospi;
4896
4897
0
    int32_t *bf0, *bf1;
4898
0
    int32_t  step[8];
4899
4900
    // stage 0;
4901
4902
    // stage 1;
4903
0
    assert(output != input);
4904
0
    bf1    = output;
4905
0
    bf1[0] = input[0];
4906
0
    bf1[1] = -input[7];
4907
0
    bf1[2] = -input[3];
4908
0
    bf1[3] = input[4];
4909
0
    bf1[4] = -input[1];
4910
0
    bf1[5] = input[6];
4911
0
    bf1[6] = input[2];
4912
0
    bf1[7] = -input[5];
4913
4914
    // stage 2
4915
0
    cospi  = cospi_arr(cos_bit);
4916
0
    bf0    = output;
4917
0
    bf1    = step;
4918
0
    bf1[0] = bf0[0];
4919
0
    bf1[1] = bf0[1];
4920
0
    bf1[2] = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
4921
0
    bf1[3] = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
4922
0
    bf1[4] = bf0[4];
4923
0
    bf1[5] = bf0[5];
4924
0
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
4925
0
    bf1[7] = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
4926
4927
    // stage 3
4928
0
    bf0    = step;
4929
0
    bf1    = output;
4930
0
    bf1[0] = bf0[0] + bf0[2];
4931
0
    bf1[1] = bf0[1] + bf0[3];
4932
0
    bf1[2] = bf0[0] - bf0[2];
4933
0
    bf1[3] = bf0[1] - bf0[3];
4934
0
    bf1[4] = bf0[4] + bf0[6];
4935
0
    bf1[5] = bf0[5] + bf0[7];
4936
0
    bf1[6] = bf0[4] - bf0[6];
4937
0
    bf1[7] = bf0[5] - bf0[7];
4938
4939
    // stage 4
4940
0
    cospi  = cospi_arr(cos_bit);
4941
0
    bf0    = output;
4942
0
    bf1    = step;
4943
0
    bf1[0] = bf0[0];
4944
0
    bf1[1] = bf0[1];
4945
0
    bf1[2] = bf0[2];
4946
0
    bf1[3] = bf0[3];
4947
0
    bf1[4] = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
4948
0
    bf1[5] = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
4949
0
    bf1[6] = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
4950
0
    bf1[7] = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
4951
4952
    // stage 5
4953
0
    bf0    = step;
4954
0
    bf1    = output;
4955
0
    bf1[0] = bf0[0] + bf0[4];
4956
0
    bf1[1] = bf0[1] + bf0[5];
4957
0
    bf1[2] = bf0[2] + bf0[6];
4958
0
    bf1[3] = bf0[3] + bf0[7];
4959
0
    bf1[4] = bf0[0] - bf0[4];
4960
0
    bf1[5] = bf0[1] - bf0[5];
4961
0
    bf1[6] = bf0[2] - bf0[6];
4962
0
    bf1[7] = bf0[3] - bf0[7];
4963
4964
    // stage 6
4965
0
    cospi  = cospi_arr(cos_bit);
4966
0
    bf0    = output;
4967
0
    bf1    = step;
4968
0
    bf1[1] = half_btf(cospi[60], bf0[0], -cospi[4], bf0[1], cos_bit);
4969
0
    bf1[3] = half_btf(cospi[44], bf0[2], -cospi[20], bf0[3], cos_bit);
4970
0
    bf1[4] = half_btf(cospi[36], bf0[4], cospi[28], bf0[5], cos_bit);
4971
0
    bf1[6] = half_btf(cospi[52], bf0[6], cospi[12], bf0[7], cos_bit);
4972
4973
    // stage 7
4974
0
    bf0    = step;
4975
0
    bf1    = output;
4976
0
    bf1[0] = bf0[1];
4977
0
    bf1[1] = bf0[6];
4978
0
    bf1[2] = bf0[3];
4979
0
    bf1[3] = bf0[4];
4980
0
}
4981
4982
0
void svt_av1_fdct8_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
4983
0
    (void)stage_range;
4984
0
    const int32_t* cospi;
4985
4986
0
    int32_t *bf0, *bf1;
4987
0
    int32_t  step[8];
4988
4989
    // stage 0;
4990
4991
    // stage 1;
4992
0
    bf1    = output;
4993
0
    bf1[0] = input[0] + input[7];
4994
0
    bf1[1] = input[1] + input[6];
4995
0
    bf1[2] = input[2] + input[5];
4996
0
    bf1[3] = input[3] + input[4];
4997
0
    bf1[4] = -input[4] + input[3];
4998
0
    bf1[5] = -input[5] + input[2];
4999
0
    bf1[6] = -input[6] + input[1];
5000
0
    bf1[7] = -input[7] + input[0];
5001
5002
    // stage 2
5003
0
    cospi  = cospi_arr(cos_bit);
5004
0
    bf0    = output;
5005
0
    bf1    = step;
5006
0
    bf1[0] = bf0[0] + bf0[3];
5007
0
    bf1[1] = bf0[1] + bf0[2];
5008
0
    bf1[2] = -bf0[2] + bf0[1];
5009
0
    bf1[3] = -bf0[3] + bf0[0];
5010
0
    bf1[4] = bf0[4];
5011
0
    bf1[5] = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
5012
0
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
5013
0
    bf1[7] = bf0[7];
5014
5015
    // stage 3
5016
0
    cospi  = cospi_arr(cos_bit);
5017
0
    bf0    = step;
5018
0
    bf1    = output;
5019
0
    bf1[0] = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
5020
0
    bf1[2] = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
5021
0
    bf1[4] = bf0[4] + bf0[5];
5022
0
    bf1[5] = -bf0[5] + bf0[4];
5023
0
    bf1[6] = -bf0[6] + bf0[7];
5024
0
    bf1[7] = bf0[7] + bf0[6];
5025
5026
    // stage 4
5027
0
    cospi  = cospi_arr(cos_bit);
5028
0
    bf0    = output;
5029
0
    bf1    = step;
5030
0
    bf1[0] = bf0[0];
5031
0
    bf1[2] = bf0[2];
5032
0
    bf1[4] = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
5033
0
    bf1[6] = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
5034
5035
    // stage 5
5036
0
    bf0    = step;
5037
0
    bf1    = output;
5038
0
    bf1[0] = bf0[0];
5039
0
    bf1[1] = bf0[4];
5040
0
    bf1[2] = bf0[2];
5041
0
    bf1[3] = bf0[6];
5042
0
}
5043
5044
0
void svt_av1_fidentity4_N2_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5045
0
    (void)stage_range;
5046
0
    (void)cos_bit;
5047
0
    output[0] = round_shift((int64_t)input[0] * new_sqrt2, new_sqrt2_bits);
5048
0
    output[1] = round_shift((int64_t)input[1] * new_sqrt2, new_sqrt2_bits);
5049
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
5050
0
}
5051
5052
0
void svt_av1_fadst4_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5053
0
    (void)stage_range;
5054
0
    int32_t        bit   = cos_bit;
5055
0
    const int32_t* sinpi = sinpi_arr(bit);
5056
0
    int32_t        x0, x1, x2, x3;
5057
0
    int32_t        s0, s2, s4, s5, s7;
5058
5059
    // stage 0
5060
0
    x0 = input[0];
5061
0
    x1 = input[1];
5062
0
    x2 = input[2];
5063
0
    x3 = input[3];
5064
5065
0
    if (!(x0 | x1 | x2 | x3)) {
5066
0
        output[0] = output[1] = output[2] = output[3] = 0;
5067
0
        return;
5068
0
    }
5069
5070
    // stage 1
5071
0
    s0 = sinpi[1] * x0;
5072
0
    s2 = sinpi[2] * x1;
5073
0
    s4 = sinpi[3] * x2;
5074
0
    s5 = sinpi[4] * x3;
5075
0
    s7 = x0 + x1;
5076
5077
    // stage 2
5078
0
    s7 = s7 - x3;
5079
5080
    // stage 3
5081
0
    x0 = s0 + s2;
5082
0
    x1 = sinpi[3] * s7;
5083
5084
    // stage 4
5085
0
    x0 = x0 + s5;
5086
5087
    // stage 5
5088
0
    s0 = x0 + s4;
5089
5090
    // 1-D transform scaling factor is sqrt(2).
5091
0
    output[0] = round_shift(s0, bit);
5092
0
    output[1] = round_shift(x1, bit);
5093
0
}
5094
5095
0
void svt_av1_fdct4_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5096
0
    (void)stage_range;
5097
0
    const int32_t* cospi;
5098
5099
0
    int32_t* bf0;
5100
0
    int32_t  step[4];
5101
5102
    // stage 1;
5103
0
    bf0    = step;
5104
0
    bf0[0] = input[0] + input[3];
5105
0
    bf0[1] = input[1] + input[2];
5106
0
    bf0[2] = -input[2] + input[1];
5107
0
    bf0[3] = -input[3] + input[0];
5108
5109
    // stage 2
5110
0
    cospi = cospi_arr(cos_bit);
5111
5112
0
    output[0] = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
5113
0
    output[1] = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
5114
0
}
5115
5116
0
void svt_av1_fdct32_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5117
0
    (void)stage_range;
5118
0
    const int32_t* cospi;
5119
5120
0
    int32_t *bf0, *bf1;
5121
0
    int32_t  step[32];
5122
5123
    // stage 0;
5124
5125
    // stage 1;
5126
0
    bf1     = output;
5127
0
    bf1[0]  = input[0] + input[31];
5128
0
    bf1[1]  = input[1] + input[30];
5129
0
    bf1[2]  = input[2] + input[29];
5130
0
    bf1[3]  = input[3] + input[28];
5131
0
    bf1[4]  = input[4] + input[27];
5132
0
    bf1[5]  = input[5] + input[26];
5133
0
    bf1[6]  = input[6] + input[25];
5134
0
    bf1[7]  = input[7] + input[24];
5135
0
    bf1[8]  = input[8] + input[23];
5136
0
    bf1[9]  = input[9] + input[22];
5137
0
    bf1[10] = input[10] + input[21];
5138
0
    bf1[11] = input[11] + input[20];
5139
0
    bf1[12] = input[12] + input[19];
5140
0
    bf1[13] = input[13] + input[18];
5141
0
    bf1[14] = input[14] + input[17];
5142
0
    bf1[15] = input[15] + input[16];
5143
0
    bf1[16] = -input[16] + input[15];
5144
0
    bf1[17] = -input[17] + input[14];
5145
0
    bf1[18] = -input[18] + input[13];
5146
0
    bf1[19] = -input[19] + input[12];
5147
0
    bf1[20] = -input[20] + input[11];
5148
0
    bf1[21] = -input[21] + input[10];
5149
0
    bf1[22] = -input[22] + input[9];
5150
0
    bf1[23] = -input[23] + input[8];
5151
0
    bf1[24] = -input[24] + input[7];
5152
0
    bf1[25] = -input[25] + input[6];
5153
0
    bf1[26] = -input[26] + input[5];
5154
0
    bf1[27] = -input[27] + input[4];
5155
0
    bf1[28] = -input[28] + input[3];
5156
0
    bf1[29] = -input[29] + input[2];
5157
0
    bf1[30] = -input[30] + input[1];
5158
0
    bf1[31] = -input[31] + input[0];
5159
5160
    // stage 2
5161
0
    cospi   = cospi_arr(cos_bit);
5162
0
    bf0     = output;
5163
0
    bf1     = step;
5164
0
    bf1[0]  = bf0[0] + bf0[15];
5165
0
    bf1[1]  = bf0[1] + bf0[14];
5166
0
    bf1[2]  = bf0[2] + bf0[13];
5167
0
    bf1[3]  = bf0[3] + bf0[12];
5168
0
    bf1[4]  = bf0[4] + bf0[11];
5169
0
    bf1[5]  = bf0[5] + bf0[10];
5170
0
    bf1[6]  = bf0[6] + bf0[9];
5171
0
    bf1[7]  = bf0[7] + bf0[8];
5172
0
    bf1[8]  = -bf0[8] + bf0[7];
5173
0
    bf1[9]  = -bf0[9] + bf0[6];
5174
0
    bf1[10] = -bf0[10] + bf0[5];
5175
0
    bf1[11] = -bf0[11] + bf0[4];
5176
0
    bf1[12] = -bf0[12] + bf0[3];
5177
0
    bf1[13] = -bf0[13] + bf0[2];
5178
0
    bf1[14] = -bf0[14] + bf0[1];
5179
0
    bf1[15] = -bf0[15] + bf0[0];
5180
0
    bf1[16] = bf0[16];
5181
0
    bf1[17] = bf0[17];
5182
0
    bf1[18] = bf0[18];
5183
0
    bf1[19] = bf0[19];
5184
0
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
5185
0
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
5186
0
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
5187
0
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
5188
0
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
5189
0
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
5190
0
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
5191
0
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
5192
0
    bf1[28] = bf0[28];
5193
0
    bf1[29] = bf0[29];
5194
0
    bf1[30] = bf0[30];
5195
0
    bf1[31] = bf0[31];
5196
5197
    // stage 3
5198
0
    cospi   = cospi_arr(cos_bit);
5199
0
    bf0     = step;
5200
0
    bf1     = output;
5201
0
    bf1[0]  = bf0[0] + bf0[7];
5202
0
    bf1[1]  = bf0[1] + bf0[6];
5203
0
    bf1[2]  = bf0[2] + bf0[5];
5204
0
    bf1[3]  = bf0[3] + bf0[4];
5205
0
    bf1[4]  = -bf0[4] + bf0[3];
5206
0
    bf1[5]  = -bf0[5] + bf0[2];
5207
0
    bf1[6]  = -bf0[6] + bf0[1];
5208
0
    bf1[7]  = -bf0[7] + bf0[0];
5209
0
    bf1[8]  = bf0[8];
5210
0
    bf1[9]  = bf0[9];
5211
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
5212
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
5213
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
5214
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
5215
0
    bf1[14] = bf0[14];
5216
0
    bf1[15] = bf0[15];
5217
0
    bf1[16] = bf0[16] + bf0[23];
5218
0
    bf1[17] = bf0[17] + bf0[22];
5219
0
    bf1[18] = bf0[18] + bf0[21];
5220
0
    bf1[19] = bf0[19] + bf0[20];
5221
0
    bf1[20] = -bf0[20] + bf0[19];
5222
0
    bf1[21] = -bf0[21] + bf0[18];
5223
0
    bf1[22] = -bf0[22] + bf0[17];
5224
0
    bf1[23] = -bf0[23] + bf0[16];
5225
0
    bf1[24] = -bf0[24] + bf0[31];
5226
0
    bf1[25] = -bf0[25] + bf0[30];
5227
0
    bf1[26] = -bf0[26] + bf0[29];
5228
0
    bf1[27] = -bf0[27] + bf0[28];
5229
0
    bf1[28] = bf0[28] + bf0[27];
5230
0
    bf1[29] = bf0[29] + bf0[26];
5231
0
    bf1[30] = bf0[30] + bf0[25];
5232
0
    bf1[31] = bf0[31] + bf0[24];
5233
5234
    // stage 4
5235
0
    cospi   = cospi_arr(cos_bit);
5236
0
    bf0     = output;
5237
0
    bf1     = step;
5238
0
    bf1[0]  = bf0[0] + bf0[3];
5239
0
    bf1[1]  = bf0[1] + bf0[2];
5240
0
    bf1[2]  = -bf0[2] + bf0[1];
5241
0
    bf1[3]  = -bf0[3] + bf0[0];
5242
0
    bf1[4]  = bf0[4];
5243
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
5244
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
5245
0
    bf1[7]  = bf0[7];
5246
0
    bf1[8]  = bf0[8] + bf0[11];
5247
0
    bf1[9]  = bf0[9] + bf0[10];
5248
0
    bf1[10] = -bf0[10] + bf0[9];
5249
0
    bf1[11] = -bf0[11] + bf0[8];
5250
0
    bf1[12] = -bf0[12] + bf0[15];
5251
0
    bf1[13] = -bf0[13] + bf0[14];
5252
0
    bf1[14] = bf0[14] + bf0[13];
5253
0
    bf1[15] = bf0[15] + bf0[12];
5254
0
    bf1[16] = bf0[16];
5255
0
    bf1[17] = bf0[17];
5256
0
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
5257
0
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
5258
0
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
5259
0
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
5260
0
    bf1[22] = bf0[22];
5261
0
    bf1[23] = bf0[23];
5262
0
    bf1[24] = bf0[24];
5263
0
    bf1[25] = bf0[25];
5264
0
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
5265
0
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
5266
0
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
5267
0
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
5268
0
    bf1[30] = bf0[30];
5269
0
    bf1[31] = bf0[31];
5270
5271
    // stage 5
5272
0
    cospi   = cospi_arr(cos_bit);
5273
0
    bf0     = step;
5274
0
    bf1     = output;
5275
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
5276
0
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
5277
0
    bf1[4]  = bf0[4] + bf0[5];
5278
0
    bf1[5]  = -bf0[5] + bf0[4];
5279
0
    bf1[6]  = -bf0[6] + bf0[7];
5280
0
    bf1[7]  = bf0[7] + bf0[6];
5281
0
    bf1[8]  = bf0[8];
5282
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
5283
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
5284
0
    bf1[11] = bf0[11];
5285
0
    bf1[12] = bf0[12];
5286
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
5287
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
5288
0
    bf1[15] = bf0[15];
5289
0
    bf1[16] = bf0[16] + bf0[19];
5290
0
    bf1[17] = bf0[17] + bf0[18];
5291
0
    bf1[18] = -bf0[18] + bf0[17];
5292
0
    bf1[19] = -bf0[19] + bf0[16];
5293
0
    bf1[20] = -bf0[20] + bf0[23];
5294
0
    bf1[21] = -bf0[21] + bf0[22];
5295
0
    bf1[22] = bf0[22] + bf0[21];
5296
0
    bf1[23] = bf0[23] + bf0[20];
5297
0
    bf1[24] = bf0[24] + bf0[27];
5298
0
    bf1[25] = bf0[25] + bf0[26];
5299
0
    bf1[26] = -bf0[26] + bf0[25];
5300
0
    bf1[27] = -bf0[27] + bf0[24];
5301
0
    bf1[28] = -bf0[28] + bf0[31];
5302
0
    bf1[29] = -bf0[29] + bf0[30];
5303
0
    bf1[30] = bf0[30] + bf0[29];
5304
0
    bf1[31] = bf0[31] + bf0[28];
5305
5306
    // stage 6
5307
0
    cospi   = cospi_arr(cos_bit);
5308
0
    bf0     = output;
5309
0
    bf1     = step;
5310
0
    bf1[0]  = bf0[0];
5311
0
    bf1[2]  = bf0[2];
5312
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
5313
0
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
5314
0
    bf1[8]  = bf0[8] + bf0[9];
5315
0
    bf1[9]  = -bf0[9] + bf0[8];
5316
0
    bf1[10] = -bf0[10] + bf0[11];
5317
0
    bf1[11] = bf0[11] + bf0[10];
5318
0
    bf1[12] = bf0[12] + bf0[13];
5319
0
    bf1[13] = -bf0[13] + bf0[12];
5320
0
    bf1[14] = -bf0[14] + bf0[15];
5321
0
    bf1[15] = bf0[15] + bf0[14];
5322
0
    bf1[16] = bf0[16];
5323
0
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
5324
0
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
5325
0
    bf1[19] = bf0[19];
5326
0
    bf1[20] = bf0[20];
5327
0
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
5328
0
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
5329
0
    bf1[23] = bf0[23];
5330
0
    bf1[24] = bf0[24];
5331
0
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
5332
0
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
5333
0
    bf1[27] = bf0[27];
5334
0
    bf1[28] = bf0[28];
5335
0
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
5336
0
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
5337
0
    bf1[31] = bf0[31];
5338
5339
    // stage 7
5340
0
    cospi   = cospi_arr(cos_bit);
5341
0
    bf0     = step;
5342
0
    bf1     = output;
5343
0
    bf1[0]  = bf0[0];
5344
0
    bf1[2]  = bf0[2];
5345
0
    bf1[4]  = bf0[4];
5346
0
    bf1[6]  = bf0[6];
5347
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
5348
0
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
5349
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
5350
0
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
5351
0
    bf1[16] = bf0[16] + bf0[17];
5352
0
    bf1[17] = -bf0[17] + bf0[16];
5353
0
    bf1[18] = -bf0[18] + bf0[19];
5354
0
    bf1[19] = bf0[19] + bf0[18];
5355
0
    bf1[20] = bf0[20] + bf0[21];
5356
0
    bf1[21] = -bf0[21] + bf0[20];
5357
0
    bf1[22] = -bf0[22] + bf0[23];
5358
0
    bf1[23] = bf0[23] + bf0[22];
5359
0
    bf1[24] = bf0[24] + bf0[25];
5360
0
    bf1[25] = -bf0[25] + bf0[24];
5361
0
    bf1[26] = -bf0[26] + bf0[27];
5362
0
    bf1[27] = bf0[27] + bf0[26];
5363
0
    bf1[28] = bf0[28] + bf0[29];
5364
0
    bf1[29] = -bf0[29] + bf0[28];
5365
0
    bf1[30] = -bf0[30] + bf0[31];
5366
0
    bf1[31] = bf0[31] + bf0[30];
5367
5368
    // stage 8
5369
0
    cospi   = cospi_arr(cos_bit);
5370
0
    bf0     = output;
5371
0
    bf1     = step;
5372
0
    bf1[0]  = bf0[0];
5373
0
    bf1[2]  = bf0[2];
5374
0
    bf1[4]  = bf0[4];
5375
0
    bf1[6]  = bf0[6];
5376
0
    bf1[8]  = bf0[8];
5377
0
    bf1[10] = bf0[10];
5378
0
    bf1[12] = bf0[12];
5379
0
    bf1[14] = bf0[14];
5380
0
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
5381
0
    bf1[18] = half_btf(cospi[46], bf0[18], cospi[18], bf0[29], cos_bit);
5382
0
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
5383
0
    bf1[22] = half_btf(cospi[38], bf0[22], cospi[26], bf0[25], cos_bit);
5384
0
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
5385
0
    bf1[26] = half_btf(cospi[22], bf0[26], -cospi[42], bf0[21], cos_bit);
5386
0
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
5387
0
    bf1[30] = half_btf(cospi[30], bf0[30], -cospi[34], bf0[17], cos_bit);
5388
5389
    // stage 9
5390
0
    bf0     = step;
5391
0
    bf1     = output;
5392
0
    bf1[0]  = bf0[0];
5393
0
    bf1[1]  = bf0[16];
5394
0
    bf1[2]  = bf0[8];
5395
0
    bf1[3]  = bf0[24];
5396
0
    bf1[4]  = bf0[4];
5397
0
    bf1[5]  = bf0[20];
5398
0
    bf1[6]  = bf0[12];
5399
0
    bf1[7]  = bf0[28];
5400
0
    bf1[8]  = bf0[2];
5401
0
    bf1[9]  = bf0[18];
5402
0
    bf1[10] = bf0[10];
5403
0
    bf1[11] = bf0[26];
5404
0
    bf1[12] = bf0[6];
5405
0
    bf1[13] = bf0[22];
5406
0
    bf1[14] = bf0[14];
5407
0
    bf1[15] = bf0[30];
5408
0
}
5409
5410
0
void svt_av1_fidentity32_N2_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5411
0
    (void)stage_range;
5412
0
    (void)cos_bit;
5413
0
    for (int32_t i = 0; i < 16; ++i) {
5414
0
        output[i] = input[i] * 4;
5415
0
    }
5416
0
}
5417
5418
0
void svt_av1_fdct64_new_N2(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
5419
0
    (void)stage_range;
5420
0
    const int32_t* cospi;
5421
5422
0
    int32_t *bf0, *bf1;
5423
0
    int32_t  step[64];
5424
5425
    // stage 0;
5426
5427
    // stage 1;
5428
0
    bf1     = output;
5429
0
    bf1[0]  = input[0] + input[63];
5430
0
    bf1[1]  = input[1] + input[62];
5431
0
    bf1[2]  = input[2] + input[61];
5432
0
    bf1[3]  = input[3] + input[60];
5433
0
    bf1[4]  = input[4] + input[59];
5434
0
    bf1[5]  = input[5] + input[58];
5435
0
    bf1[6]  = input[6] + input[57];
5436
0
    bf1[7]  = input[7] + input[56];
5437
0
    bf1[8]  = input[8] + input[55];
5438
0
    bf1[9]  = input[9] + input[54];
5439
0
    bf1[10] = input[10] + input[53];
5440
0
    bf1[11] = input[11] + input[52];
5441
0
    bf1[12] = input[12] + input[51];
5442
0
    bf1[13] = input[13] + input[50];
5443
0
    bf1[14] = input[14] + input[49];
5444
0
    bf1[15] = input[15] + input[48];
5445
0
    bf1[16] = input[16] + input[47];
5446
0
    bf1[17] = input[17] + input[46];
5447
0
    bf1[18] = input[18] + input[45];
5448
0
    bf1[19] = input[19] + input[44];
5449
0
    bf1[20] = input[20] + input[43];
5450
0
    bf1[21] = input[21] + input[42];
5451
0
    bf1[22] = input[22] + input[41];
5452
0
    bf1[23] = input[23] + input[40];
5453
0
    bf1[24] = input[24] + input[39];
5454
0
    bf1[25] = input[25] + input[38];
5455
0
    bf1[26] = input[26] + input[37];
5456
0
    bf1[27] = input[27] + input[36];
5457
0
    bf1[28] = input[28] + input[35];
5458
0
    bf1[29] = input[29] + input[34];
5459
0
    bf1[30] = input[30] + input[33];
5460
0
    bf1[31] = input[31] + input[32];
5461
0
    bf1[32] = -input[32] + input[31];
5462
0
    bf1[33] = -input[33] + input[30];
5463
0
    bf1[34] = -input[34] + input[29];
5464
0
    bf1[35] = -input[35] + input[28];
5465
0
    bf1[36] = -input[36] + input[27];
5466
0
    bf1[37] = -input[37] + input[26];
5467
0
    bf1[38] = -input[38] + input[25];
5468
0
    bf1[39] = -input[39] + input[24];
5469
0
    bf1[40] = -input[40] + input[23];
5470
0
    bf1[41] = -input[41] + input[22];
5471
0
    bf1[42] = -input[42] + input[21];
5472
0
    bf1[43] = -input[43] + input[20];
5473
0
    bf1[44] = -input[44] + input[19];
5474
0
    bf1[45] = -input[45] + input[18];
5475
0
    bf1[46] = -input[46] + input[17];
5476
0
    bf1[47] = -input[47] + input[16];
5477
0
    bf1[48] = -input[48] + input[15];
5478
0
    bf1[49] = -input[49] + input[14];
5479
0
    bf1[50] = -input[50] + input[13];
5480
0
    bf1[51] = -input[51] + input[12];
5481
0
    bf1[52] = -input[52] + input[11];
5482
0
    bf1[53] = -input[53] + input[10];
5483
0
    bf1[54] = -input[54] + input[9];
5484
0
    bf1[55] = -input[55] + input[8];
5485
0
    bf1[56] = -input[56] + input[7];
5486
0
    bf1[57] = -input[57] + input[6];
5487
0
    bf1[58] = -input[58] + input[5];
5488
0
    bf1[59] = -input[59] + input[4];
5489
0
    bf1[60] = -input[60] + input[3];
5490
0
    bf1[61] = -input[61] + input[2];
5491
0
    bf1[62] = -input[62] + input[1];
5492
0
    bf1[63] = -input[63] + input[0];
5493
5494
    // stage 2
5495
0
    cospi   = cospi_arr(cos_bit);
5496
0
    bf0     = output;
5497
0
    bf1     = step;
5498
0
    bf1[0]  = bf0[0] + bf0[31];
5499
0
    bf1[1]  = bf0[1] + bf0[30];
5500
0
    bf1[2]  = bf0[2] + bf0[29];
5501
0
    bf1[3]  = bf0[3] + bf0[28];
5502
0
    bf1[4]  = bf0[4] + bf0[27];
5503
0
    bf1[5]  = bf0[5] + bf0[26];
5504
0
    bf1[6]  = bf0[6] + bf0[25];
5505
0
    bf1[7]  = bf0[7] + bf0[24];
5506
0
    bf1[8]  = bf0[8] + bf0[23];
5507
0
    bf1[9]  = bf0[9] + bf0[22];
5508
0
    bf1[10] = bf0[10] + bf0[21];
5509
0
    bf1[11] = bf0[11] + bf0[20];
5510
0
    bf1[12] = bf0[12] + bf0[19];
5511
0
    bf1[13] = bf0[13] + bf0[18];
5512
0
    bf1[14] = bf0[14] + bf0[17];
5513
0
    bf1[15] = bf0[15] + bf0[16];
5514
0
    bf1[16] = -bf0[16] + bf0[15];
5515
0
    bf1[17] = -bf0[17] + bf0[14];
5516
0
    bf1[18] = -bf0[18] + bf0[13];
5517
0
    bf1[19] = -bf0[19] + bf0[12];
5518
0
    bf1[20] = -bf0[20] + bf0[11];
5519
0
    bf1[21] = -bf0[21] + bf0[10];
5520
0
    bf1[22] = -bf0[22] + bf0[9];
5521
0
    bf1[23] = -bf0[23] + bf0[8];
5522
0
    bf1[24] = -bf0[24] + bf0[7];
5523
0
    bf1[25] = -bf0[25] + bf0[6];
5524
0
    bf1[26] = -bf0[26] + bf0[5];
5525
0
    bf1[27] = -bf0[27] + bf0[4];
5526
0
    bf1[28] = -bf0[28] + bf0[3];
5527
0
    bf1[29] = -bf0[29] + bf0[2];
5528
0
    bf1[30] = -bf0[30] + bf0[1];
5529
0
    bf1[31] = -bf0[31] + bf0[0];
5530
0
    bf1[32] = bf0[32];
5531
0
    bf1[33] = bf0[33];
5532
0
    bf1[34] = bf0[34];
5533
0
    bf1[35] = bf0[35];
5534
0
    bf1[36] = bf0[36];
5535
0
    bf1[37] = bf0[37];
5536
0
    bf1[38] = bf0[38];
5537
0
    bf1[39] = bf0[39];
5538
0
    bf1[40] = half_btf(-cospi[32], bf0[40], cospi[32], bf0[55], cos_bit);
5539
0
    bf1[41] = half_btf(-cospi[32], bf0[41], cospi[32], bf0[54], cos_bit);
5540
0
    bf1[42] = half_btf(-cospi[32], bf0[42], cospi[32], bf0[53], cos_bit);
5541
0
    bf1[43] = half_btf(-cospi[32], bf0[43], cospi[32], bf0[52], cos_bit);
5542
0
    bf1[44] = half_btf(-cospi[32], bf0[44], cospi[32], bf0[51], cos_bit);
5543
0
    bf1[45] = half_btf(-cospi[32], bf0[45], cospi[32], bf0[50], cos_bit);
5544
0
    bf1[46] = half_btf(-cospi[32], bf0[46], cospi[32], bf0[49], cos_bit);
5545
0
    bf1[47] = half_btf(-cospi[32], bf0[47], cospi[32], bf0[48], cos_bit);
5546
0
    bf1[48] = half_btf(cospi[32], bf0[48], cospi[32], bf0[47], cos_bit);
5547
0
    bf1[49] = half_btf(cospi[32], bf0[49], cospi[32], bf0[46], cos_bit);
5548
0
    bf1[50] = half_btf(cospi[32], bf0[50], cospi[32], bf0[45], cos_bit);
5549
0
    bf1[51] = half_btf(cospi[32], bf0[51], cospi[32], bf0[44], cos_bit);
5550
0
    bf1[52] = half_btf(cospi[32], bf0[52], cospi[32], bf0[43], cos_bit);
5551
0
    bf1[53] = half_btf(cospi[32], bf0[53], cospi[32], bf0[42], cos_bit);
5552
0
    bf1[54] = half_btf(cospi[32], bf0[54], cospi[32], bf0[41], cos_bit);
5553
0
    bf1[55] = half_btf(cospi[32], bf0[55], cospi[32], bf0[40], cos_bit);
5554
0
    bf1[56] = bf0[56];
5555
0
    bf1[57] = bf0[57];
5556
0
    bf1[58] = bf0[58];
5557
0
    bf1[59] = bf0[59];
5558
0
    bf1[60] = bf0[60];
5559
0
    bf1[61] = bf0[61];
5560
0
    bf1[62] = bf0[62];
5561
0
    bf1[63] = bf0[63];
5562
5563
    // stage 3
5564
0
    cospi   = cospi_arr(cos_bit);
5565
0
    bf0     = step;
5566
0
    bf1     = output;
5567
0
    bf1[0]  = bf0[0] + bf0[15];
5568
0
    bf1[1]  = bf0[1] + bf0[14];
5569
0
    bf1[2]  = bf0[2] + bf0[13];
5570
0
    bf1[3]  = bf0[3] + bf0[12];
5571
0
    bf1[4]  = bf0[4] + bf0[11];
5572
0
    bf1[5]  = bf0[5] + bf0[10];
5573
0
    bf1[6]  = bf0[6] + bf0[9];
5574
0
    bf1[7]  = bf0[7] + bf0[8];
5575
0
    bf1[8]  = -bf0[8] + bf0[7];
5576
0
    bf1[9]  = -bf0[9] + bf0[6];
5577
0
    bf1[10] = -bf0[10] + bf0[5];
5578
0
    bf1[11] = -bf0[11] + bf0[4];
5579
0
    bf1[12] = -bf0[12] + bf0[3];
5580
0
    bf1[13] = -bf0[13] + bf0[2];
5581
0
    bf1[14] = -bf0[14] + bf0[1];
5582
0
    bf1[15] = -bf0[15] + bf0[0];
5583
0
    bf1[16] = bf0[16];
5584
0
    bf1[17] = bf0[17];
5585
0
    bf1[18] = bf0[18];
5586
0
    bf1[19] = bf0[19];
5587
0
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
5588
0
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
5589
0
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
5590
0
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
5591
0
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
5592
0
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
5593
0
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
5594
0
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
5595
0
    bf1[28] = bf0[28];
5596
0
    bf1[29] = bf0[29];
5597
0
    bf1[30] = bf0[30];
5598
0
    bf1[31] = bf0[31];
5599
0
    bf1[32] = bf0[32] + bf0[47];
5600
0
    bf1[33] = bf0[33] + bf0[46];
5601
0
    bf1[34] = bf0[34] + bf0[45];
5602
0
    bf1[35] = bf0[35] + bf0[44];
5603
0
    bf1[36] = bf0[36] + bf0[43];
5604
0
    bf1[37] = bf0[37] + bf0[42];
5605
0
    bf1[38] = bf0[38] + bf0[41];
5606
0
    bf1[39] = bf0[39] + bf0[40];
5607
0
    bf1[40] = -bf0[40] + bf0[39];
5608
0
    bf1[41] = -bf0[41] + bf0[38];
5609
0
    bf1[42] = -bf0[42] + bf0[37];
5610
0
    bf1[43] = -bf0[43] + bf0[36];
5611
0
    bf1[44] = -bf0[44] + bf0[35];
5612
0
    bf1[45] = -bf0[45] + bf0[34];
5613
0
    bf1[46] = -bf0[46] + bf0[33];
5614
0
    bf1[47] = -bf0[47] + bf0[32];
5615
0
    bf1[48] = -bf0[48] + bf0[63];
5616
0
    bf1[49] = -bf0[49] + bf0[62];
5617
0
    bf1[50] = -bf0[50] + bf0[61];
5618
0
    bf1[51] = -bf0[51] + bf0[60];
5619
0
    bf1[52] = -bf0[52] + bf0[59];
5620
0
    bf1[53] = -bf0[53] + bf0[58];
5621
0
    bf1[54] = -bf0[54] + bf0[57];
5622
0
    bf1[55] = -bf0[55] + bf0[56];
5623
0
    bf1[56] = bf0[56] + bf0[55];
5624
0
    bf1[57] = bf0[57] + bf0[54];
5625
0
    bf1[58] = bf0[58] + bf0[53];
5626
0
    bf1[59] = bf0[59] + bf0[52];
5627
0
    bf1[60] = bf0[60] + bf0[51];
5628
0
    bf1[61] = bf0[61] + bf0[50];
5629
0
    bf1[62] = bf0[62] + bf0[49];
5630
0
    bf1[63] = bf0[63] + bf0[48];
5631
5632
    // stage 4
5633
0
    cospi   = cospi_arr(cos_bit);
5634
0
    bf0     = output;
5635
0
    bf1     = step;
5636
0
    bf1[0]  = bf0[0] + bf0[7];
5637
0
    bf1[1]  = bf0[1] + bf0[6];
5638
0
    bf1[2]  = bf0[2] + bf0[5];
5639
0
    bf1[3]  = bf0[3] + bf0[4];
5640
0
    bf1[4]  = -bf0[4] + bf0[3];
5641
0
    bf1[5]  = -bf0[5] + bf0[2];
5642
0
    bf1[6]  = -bf0[6] + bf0[1];
5643
0
    bf1[7]  = -bf0[7] + bf0[0];
5644
0
    bf1[8]  = bf0[8];
5645
0
    bf1[9]  = bf0[9];
5646
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
5647
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
5648
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
5649
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
5650
0
    bf1[14] = bf0[14];
5651
0
    bf1[15] = bf0[15];
5652
0
    bf1[16] = bf0[16] + bf0[23];
5653
0
    bf1[17] = bf0[17] + bf0[22];
5654
0
    bf1[18] = bf0[18] + bf0[21];
5655
0
    bf1[19] = bf0[19] + bf0[20];
5656
0
    bf1[20] = -bf0[20] + bf0[19];
5657
0
    bf1[21] = -bf0[21] + bf0[18];
5658
0
    bf1[22] = -bf0[22] + bf0[17];
5659
0
    bf1[23] = -bf0[23] + bf0[16];
5660
0
    bf1[24] = -bf0[24] + bf0[31];
5661
0
    bf1[25] = -bf0[25] + bf0[30];
5662
0
    bf1[26] = -bf0[26] + bf0[29];
5663
0
    bf1[27] = -bf0[27] + bf0[28];
5664
0
    bf1[28] = bf0[28] + bf0[27];
5665
0
    bf1[29] = bf0[29] + bf0[26];
5666
0
    bf1[30] = bf0[30] + bf0[25];
5667
0
    bf1[31] = bf0[31] + bf0[24];
5668
0
    bf1[32] = bf0[32];
5669
0
    bf1[33] = bf0[33];
5670
0
    bf1[34] = bf0[34];
5671
0
    bf1[35] = bf0[35];
5672
0
    bf1[36] = half_btf(-cospi[16], bf0[36], cospi[48], bf0[59], cos_bit);
5673
0
    bf1[37] = half_btf(-cospi[16], bf0[37], cospi[48], bf0[58], cos_bit);
5674
0
    bf1[38] = half_btf(-cospi[16], bf0[38], cospi[48], bf0[57], cos_bit);
5675
0
    bf1[39] = half_btf(-cospi[16], bf0[39], cospi[48], bf0[56], cos_bit);
5676
0
    bf1[40] = half_btf(-cospi[48], bf0[40], -cospi[16], bf0[55], cos_bit);
5677
0
    bf1[41] = half_btf(-cospi[48], bf0[41], -cospi[16], bf0[54], cos_bit);
5678
0
    bf1[42] = half_btf(-cospi[48], bf0[42], -cospi[16], bf0[53], cos_bit);
5679
0
    bf1[43] = half_btf(-cospi[48], bf0[43], -cospi[16], bf0[52], cos_bit);
5680
0
    bf1[44] = bf0[44];
5681
0
    bf1[45] = bf0[45];
5682
0
    bf1[46] = bf0[46];
5683
0
    bf1[47] = bf0[47];
5684
0
    bf1[48] = bf0[48];
5685
0
    bf1[49] = bf0[49];
5686
0
    bf1[50] = bf0[50];
5687
0
    bf1[51] = bf0[51];
5688
0
    bf1[52] = half_btf(cospi[48], bf0[52], -cospi[16], bf0[43], cos_bit);
5689
0
    bf1[53] = half_btf(cospi[48], bf0[53], -cospi[16], bf0[42], cos_bit);
5690
0
    bf1[54] = half_btf(cospi[48], bf0[54], -cospi[16], bf0[41], cos_bit);
5691
0
    bf1[55] = half_btf(cospi[48], bf0[55], -cospi[16], bf0[40], cos_bit);
5692
0
    bf1[56] = half_btf(cospi[16], bf0[56], cospi[48], bf0[39], cos_bit);
5693
0
    bf1[57] = half_btf(cospi[16], bf0[57], cospi[48], bf0[38], cos_bit);
5694
0
    bf1[58] = half_btf(cospi[16], bf0[58], cospi[48], bf0[37], cos_bit);
5695
0
    bf1[59] = half_btf(cospi[16], bf0[59], cospi[48], bf0[36], cos_bit);
5696
0
    bf1[60] = bf0[60];
5697
0
    bf1[61] = bf0[61];
5698
0
    bf1[62] = bf0[62];
5699
0
    bf1[63] = bf0[63];
5700
5701
    // stage 5
5702
0
    cospi   = cospi_arr(cos_bit);
5703
0
    bf0     = step;
5704
0
    bf1     = output;
5705
0
    bf1[0]  = bf0[0] + bf0[3];
5706
0
    bf1[1]  = bf0[1] + bf0[2];
5707
0
    bf1[2]  = -bf0[2] + bf0[1];
5708
0
    bf1[3]  = -bf0[3] + bf0[0];
5709
0
    bf1[4]  = bf0[4];
5710
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
5711
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
5712
0
    bf1[7]  = bf0[7];
5713
0
    bf1[8]  = bf0[8] + bf0[11];
5714
0
    bf1[9]  = bf0[9] + bf0[10];
5715
0
    bf1[10] = -bf0[10] + bf0[9];
5716
0
    bf1[11] = -bf0[11] + bf0[8];
5717
0
    bf1[12] = -bf0[12] + bf0[15];
5718
0
    bf1[13] = -bf0[13] + bf0[14];
5719
0
    bf1[14] = bf0[14] + bf0[13];
5720
0
    bf1[15] = bf0[15] + bf0[12];
5721
0
    bf1[16] = bf0[16];
5722
0
    bf1[17] = bf0[17];
5723
0
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
5724
0
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
5725
0
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
5726
0
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
5727
0
    bf1[22] = bf0[22];
5728
0
    bf1[23] = bf0[23];
5729
0
    bf1[24] = bf0[24];
5730
0
    bf1[25] = bf0[25];
5731
0
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
5732
0
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
5733
0
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
5734
0
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
5735
0
    bf1[30] = bf0[30];
5736
0
    bf1[31] = bf0[31];
5737
0
    bf1[32] = bf0[32] + bf0[39];
5738
0
    bf1[33] = bf0[33] + bf0[38];
5739
0
    bf1[34] = bf0[34] + bf0[37];
5740
0
    bf1[35] = bf0[35] + bf0[36];
5741
0
    bf1[36] = -bf0[36] + bf0[35];
5742
0
    bf1[37] = -bf0[37] + bf0[34];
5743
0
    bf1[38] = -bf0[38] + bf0[33];
5744
0
    bf1[39] = -bf0[39] + bf0[32];
5745
0
    bf1[40] = -bf0[40] + bf0[47];
5746
0
    bf1[41] = -bf0[41] + bf0[46];
5747
0
    bf1[42] = -bf0[42] + bf0[45];
5748
0
    bf1[43] = -bf0[43] + bf0[44];
5749
0
    bf1[44] = bf0[44] + bf0[43];
5750
0
    bf1[45] = bf0[45] + bf0[42];
5751
0
    bf1[46] = bf0[46] + bf0[41];
5752
0
    bf1[47] = bf0[47] + bf0[40];
5753
0
    bf1[48] = bf0[48] + bf0[55];
5754
0
    bf1[49] = bf0[49] + bf0[54];
5755
0
    bf1[50] = bf0[50] + bf0[53];
5756
0
    bf1[51] = bf0[51] + bf0[52];
5757
0
    bf1[52] = -bf0[52] + bf0[51];
5758
0
    bf1[53] = -bf0[53] + bf0[50];
5759
0
    bf1[54] = -bf0[54] + bf0[49];
5760
0
    bf1[55] = -bf0[55] + bf0[48];
5761
0
    bf1[56] = -bf0[56] + bf0[63];
5762
0
    bf1[57] = -bf0[57] + bf0[62];
5763
0
    bf1[58] = -bf0[58] + bf0[61];
5764
0
    bf1[59] = -bf0[59] + bf0[60];
5765
0
    bf1[60] = bf0[60] + bf0[59];
5766
0
    bf1[61] = bf0[61] + bf0[58];
5767
0
    bf1[62] = bf0[62] + bf0[57];
5768
0
    bf1[63] = bf0[63] + bf0[56];
5769
5770
    // stage 6
5771
0
    cospi   = cospi_arr(cos_bit);
5772
0
    bf0     = output;
5773
0
    bf1     = step;
5774
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
5775
0
    bf1[2]  = half_btf(cospi[48], bf0[2], cospi[16], bf0[3], cos_bit);
5776
0
    bf1[4]  = bf0[4] + bf0[5];
5777
0
    bf1[5]  = -bf0[5] + bf0[4];
5778
0
    bf1[6]  = -bf0[6] + bf0[7];
5779
0
    bf1[7]  = bf0[7] + bf0[6];
5780
0
    bf1[8]  = bf0[8];
5781
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
5782
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
5783
0
    bf1[11] = bf0[11];
5784
0
    bf1[12] = bf0[12];
5785
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
5786
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
5787
0
    bf1[15] = bf0[15];
5788
0
    bf1[16] = bf0[16] + bf0[19];
5789
0
    bf1[17] = bf0[17] + bf0[18];
5790
0
    bf1[18] = -bf0[18] + bf0[17];
5791
0
    bf1[19] = -bf0[19] + bf0[16];
5792
0
    bf1[20] = -bf0[20] + bf0[23];
5793
0
    bf1[21] = -bf0[21] + bf0[22];
5794
0
    bf1[22] = bf0[22] + bf0[21];
5795
0
    bf1[23] = bf0[23] + bf0[20];
5796
0
    bf1[24] = bf0[24] + bf0[27];
5797
0
    bf1[25] = bf0[25] + bf0[26];
5798
0
    bf1[26] = -bf0[26] + bf0[25];
5799
0
    bf1[27] = -bf0[27] + bf0[24];
5800
0
    bf1[28] = -bf0[28] + bf0[31];
5801
0
    bf1[29] = -bf0[29] + bf0[30];
5802
0
    bf1[30] = bf0[30] + bf0[29];
5803
0
    bf1[31] = bf0[31] + bf0[28];
5804
0
    bf1[32] = bf0[32];
5805
0
    bf1[33] = bf0[33];
5806
0
    bf1[34] = half_btf(-cospi[8], bf0[34], cospi[56], bf0[61], cos_bit);
5807
0
    bf1[35] = half_btf(-cospi[8], bf0[35], cospi[56], bf0[60], cos_bit);
5808
0
    bf1[36] = half_btf(-cospi[56], bf0[36], -cospi[8], bf0[59], cos_bit);
5809
0
    bf1[37] = half_btf(-cospi[56], bf0[37], -cospi[8], bf0[58], cos_bit);
5810
0
    bf1[38] = bf0[38];
5811
0
    bf1[39] = bf0[39];
5812
0
    bf1[40] = bf0[40];
5813
0
    bf1[41] = bf0[41];
5814
0
    bf1[42] = half_btf(-cospi[40], bf0[42], cospi[24], bf0[53], cos_bit);
5815
0
    bf1[43] = half_btf(-cospi[40], bf0[43], cospi[24], bf0[52], cos_bit);
5816
0
    bf1[44] = half_btf(-cospi[24], bf0[44], -cospi[40], bf0[51], cos_bit);
5817
0
    bf1[45] = half_btf(-cospi[24], bf0[45], -cospi[40], bf0[50], cos_bit);
5818
0
    bf1[46] = bf0[46];
5819
0
    bf1[47] = bf0[47];
5820
0
    bf1[48] = bf0[48];
5821
0
    bf1[49] = bf0[49];
5822
0
    bf1[50] = half_btf(cospi[24], bf0[50], -cospi[40], bf0[45], cos_bit);
5823
0
    bf1[51] = half_btf(cospi[24], bf0[51], -cospi[40], bf0[44], cos_bit);
5824
0
    bf1[52] = half_btf(cospi[40], bf0[52], cospi[24], bf0[43], cos_bit);
5825
0
    bf1[53] = half_btf(cospi[40], bf0[53], cospi[24], bf0[42], cos_bit);
5826
0
    bf1[54] = bf0[54];
5827
0
    bf1[55] = bf0[55];
5828
0
    bf1[56] = bf0[56];
5829
0
    bf1[57] = bf0[57];
5830
0
    bf1[58] = half_btf(cospi[56], bf0[58], -cospi[8], bf0[37], cos_bit);
5831
0
    bf1[59] = half_btf(cospi[56], bf0[59], -cospi[8], bf0[36], cos_bit);
5832
0
    bf1[60] = half_btf(cospi[8], bf0[60], cospi[56], bf0[35], cos_bit);
5833
0
    bf1[61] = half_btf(cospi[8], bf0[61], cospi[56], bf0[34], cos_bit);
5834
0
    bf1[62] = bf0[62];
5835
0
    bf1[63] = bf0[63];
5836
5837
    // stage 7
5838
0
    cospi   = cospi_arr(cos_bit);
5839
0
    bf0     = step;
5840
0
    bf1     = output;
5841
0
    bf1[0]  = bf0[0];
5842
0
    bf1[2]  = bf0[2];
5843
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
5844
0
    bf1[6]  = half_btf(cospi[24], bf0[6], -cospi[40], bf0[5], cos_bit);
5845
0
    bf1[8]  = bf0[8] + bf0[9];
5846
0
    bf1[9]  = -bf0[9] + bf0[8];
5847
0
    bf1[10] = -bf0[10] + bf0[11];
5848
0
    bf1[11] = bf0[11] + bf0[10];
5849
0
    bf1[12] = bf0[12] + bf0[13];
5850
0
    bf1[13] = -bf0[13] + bf0[12];
5851
0
    bf1[14] = -bf0[14] + bf0[15];
5852
0
    bf1[15] = bf0[15] + bf0[14];
5853
0
    bf1[16] = bf0[16];
5854
0
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
5855
0
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
5856
0
    bf1[19] = bf0[19];
5857
0
    bf1[20] = bf0[20];
5858
0
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
5859
0
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
5860
0
    bf1[23] = bf0[23];
5861
0
    bf1[24] = bf0[24];
5862
0
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
5863
0
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
5864
0
    bf1[27] = bf0[27];
5865
0
    bf1[28] = bf0[28];
5866
0
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
5867
0
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
5868
0
    bf1[31] = bf0[31];
5869
0
    bf1[32] = bf0[32] + bf0[35];
5870
0
    bf1[33] = bf0[33] + bf0[34];
5871
0
    bf1[34] = -bf0[34] + bf0[33];
5872
0
    bf1[35] = -bf0[35] + bf0[32];
5873
0
    bf1[36] = -bf0[36] + bf0[39];
5874
0
    bf1[37] = -bf0[37] + bf0[38];
5875
0
    bf1[38] = bf0[38] + bf0[37];
5876
0
    bf1[39] = bf0[39] + bf0[36];
5877
0
    bf1[40] = bf0[40] + bf0[43];
5878
0
    bf1[41] = bf0[41] + bf0[42];
5879
0
    bf1[42] = -bf0[42] + bf0[41];
5880
0
    bf1[43] = -bf0[43] + bf0[40];
5881
0
    bf1[44] = -bf0[44] + bf0[47];
5882
0
    bf1[45] = -bf0[45] + bf0[46];
5883
0
    bf1[46] = bf0[46] + bf0[45];
5884
0
    bf1[47] = bf0[47] + bf0[44];
5885
0
    bf1[48] = bf0[48] + bf0[51];
5886
0
    bf1[49] = bf0[49] + bf0[50];
5887
0
    bf1[50] = -bf0[50] + bf0[49];
5888
0
    bf1[51] = -bf0[51] + bf0[48];
5889
0
    bf1[52] = -bf0[52] + bf0[55];
5890
0
    bf1[53] = -bf0[53] + bf0[54];
5891
0
    bf1[54] = bf0[54] + bf0[53];
5892
0
    bf1[55] = bf0[55] + bf0[52];
5893
0
    bf1[56] = bf0[56] + bf0[59];
5894
0
    bf1[57] = bf0[57] + bf0[58];
5895
0
    bf1[58] = -bf0[58] + bf0[57];
5896
0
    bf1[59] = -bf0[59] + bf0[56];
5897
0
    bf1[60] = -bf0[60] + bf0[63];
5898
0
    bf1[61] = -bf0[61] + bf0[62];
5899
0
    bf1[62] = bf0[62] + bf0[61];
5900
0
    bf1[63] = bf0[63] + bf0[60];
5901
5902
    // stage 8
5903
0
    cospi   = cospi_arr(cos_bit);
5904
0
    bf0     = output;
5905
0
    bf1     = step;
5906
0
    bf1[0]  = bf0[0];
5907
0
    bf1[2]  = bf0[2];
5908
0
    bf1[4]  = bf0[4];
5909
0
    bf1[6]  = bf0[6];
5910
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
5911
0
    bf1[10] = half_btf(cospi[44], bf0[10], cospi[20], bf0[13], cos_bit);
5912
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
5913
0
    bf1[14] = half_btf(cospi[28], bf0[14], -cospi[36], bf0[9], cos_bit);
5914
0
    bf1[16] = bf0[16] + bf0[17];
5915
0
    bf1[17] = -bf0[17] + bf0[16];
5916
0
    bf1[18] = -bf0[18] + bf0[19];
5917
0
    bf1[19] = bf0[19] + bf0[18];
5918
0
    bf1[20] = bf0[20] + bf0[21];
5919
0
    bf1[21] = -bf0[21] + bf0[20];
5920
0
    bf1[22] = -bf0[22] + bf0[23];
5921
0
    bf1[23] = bf0[23] + bf0[22];
5922
0
    bf1[24] = bf0[24] + bf0[25];
5923
0
    bf1[25] = -bf0[25] + bf0[24];
5924
0
    bf1[26] = -bf0[26] + bf0[27];
5925
0
    bf1[27] = bf0[27] + bf0[26];
5926
0
    bf1[28] = bf0[28] + bf0[29];
5927
0
    bf1[29] = -bf0[29] + bf0[28];
5928
0
    bf1[30] = -bf0[30] + bf0[31];
5929
0
    bf1[31] = bf0[31] + bf0[30];
5930
0
    bf1[32] = bf0[32];
5931
0
    bf1[33] = half_btf(-cospi[4], bf0[33], cospi[60], bf0[62], cos_bit);
5932
0
    bf1[34] = half_btf(-cospi[60], bf0[34], -cospi[4], bf0[61], cos_bit);
5933
0
    bf1[35] = bf0[35];
5934
0
    bf1[36] = bf0[36];
5935
0
    bf1[37] = half_btf(-cospi[36], bf0[37], cospi[28], bf0[58], cos_bit);
5936
0
    bf1[38] = half_btf(-cospi[28], bf0[38], -cospi[36], bf0[57], cos_bit);
5937
0
    bf1[39] = bf0[39];
5938
0
    bf1[40] = bf0[40];
5939
0
    bf1[41] = half_btf(-cospi[20], bf0[41], cospi[44], bf0[54], cos_bit);
5940
0
    bf1[42] = half_btf(-cospi[44], bf0[42], -cospi[20], bf0[53], cos_bit);
5941
0
    bf1[43] = bf0[43];
5942
0
    bf1[44] = bf0[44];
5943
0
    bf1[45] = half_btf(-cospi[52], bf0[45], cospi[12], bf0[50], cos_bit);
5944
0
    bf1[46] = half_btf(-cospi[12], bf0[46], -cospi[52], bf0[49], cos_bit);
5945
0
    bf1[47] = bf0[47];
5946
0
    bf1[48] = bf0[48];
5947
0
    bf1[49] = half_btf(cospi[12], bf0[49], -cospi[52], bf0[46], cos_bit);
5948
0
    bf1[50] = half_btf(cospi[52], bf0[50], cospi[12], bf0[45], cos_bit);
5949
0
    bf1[51] = bf0[51];
5950
0
    bf1[52] = bf0[52];
5951
0
    bf1[53] = half_btf(cospi[44], bf0[53], -cospi[20], bf0[42], cos_bit);
5952
0
    bf1[54] = half_btf(cospi[20], bf0[54], cospi[44], bf0[41], cos_bit);
5953
0
    bf1[55] = bf0[55];
5954
0
    bf1[56] = bf0[56];
5955
0
    bf1[57] = half_btf(cospi[28], bf0[57], -cospi[36], bf0[38], cos_bit);
5956
0
    bf1[58] = half_btf(cospi[36], bf0[58], cospi[28], bf0[37], cos_bit);
5957
0
    bf1[59] = bf0[59];
5958
0
    bf1[60] = bf0[60];
5959
0
    bf1[61] = half_btf(cospi[60], bf0[61], -cospi[4], bf0[34], cos_bit);
5960
0
    bf1[62] = half_btf(cospi[4], bf0[62], cospi[60], bf0[33], cos_bit);
5961
0
    bf1[63] = bf0[63];
5962
5963
    // stage 9
5964
0
    cospi   = cospi_arr(cos_bit);
5965
0
    bf0     = step;
5966
0
    bf1     = output;
5967
0
    bf1[0]  = bf0[0];
5968
0
    bf1[2]  = bf0[2];
5969
0
    bf1[4]  = bf0[4];
5970
0
    bf1[6]  = bf0[6];
5971
0
    bf1[8]  = bf0[8];
5972
0
    bf1[10] = bf0[10];
5973
0
    bf1[12] = bf0[12];
5974
0
    bf1[14] = bf0[14];
5975
0
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
5976
0
    bf1[18] = half_btf(cospi[46], bf0[18], cospi[18], bf0[29], cos_bit);
5977
0
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
5978
0
    bf1[22] = half_btf(cospi[38], bf0[22], cospi[26], bf0[25], cos_bit);
5979
0
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
5980
0
    bf1[26] = half_btf(cospi[22], bf0[26], -cospi[42], bf0[21], cos_bit);
5981
0
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
5982
0
    bf1[30] = half_btf(cospi[30], bf0[30], -cospi[34], bf0[17], cos_bit);
5983
0
    bf1[32] = bf0[32] + bf0[33];
5984
0
    bf1[33] = -bf0[33] + bf0[32];
5985
0
    bf1[34] = -bf0[34] + bf0[35];
5986
0
    bf1[35] = bf0[35] + bf0[34];
5987
0
    bf1[36] = bf0[36] + bf0[37];
5988
0
    bf1[37] = -bf0[37] + bf0[36];
5989
0
    bf1[38] = -bf0[38] + bf0[39];
5990
0
    bf1[39] = bf0[39] + bf0[38];
5991
0
    bf1[40] = bf0[40] + bf0[41];
5992
0
    bf1[41] = -bf0[41] + bf0[40];
5993
0
    bf1[42] = -bf0[42] + bf0[43];
5994
0
    bf1[43] = bf0[43] + bf0[42];
5995
0
    bf1[44] = bf0[44] + bf0[45];
5996
0
    bf1[45] = -bf0[45] + bf0[44];
5997
0
    bf1[46] = -bf0[46] + bf0[47];
5998
0
    bf1[47] = bf0[47] + bf0[46];
5999
0
    bf1[48] = bf0[48] + bf0[49];
6000
0
    bf1[49] = -bf0[49] + bf0[48];
6001
0
    bf1[50] = -bf0[50] + bf0[51];
6002
0
    bf1[51] = bf0[51] + bf0[50];
6003
0
    bf1[52] = bf0[52] + bf0[53];
6004
0
    bf1[53] = -bf0[53] + bf0[52];
6005
0
    bf1[54] = -bf0[54] + bf0[55];
6006
0
    bf1[55] = bf0[55] + bf0[54];
6007
0
    bf1[56] = bf0[56] + bf0[57];
6008
0
    bf1[57] = -bf0[57] + bf0[56];
6009
0
    bf1[58] = -bf0[58] + bf0[59];
6010
0
    bf1[59] = bf0[59] + bf0[58];
6011
0
    bf1[60] = bf0[60] + bf0[61];
6012
0
    bf1[61] = -bf0[61] + bf0[60];
6013
0
    bf1[62] = -bf0[62] + bf0[63];
6014
0
    bf1[63] = bf0[63] + bf0[62];
6015
6016
    // stage 10
6017
0
    cospi   = cospi_arr(cos_bit);
6018
0
    bf0     = output;
6019
0
    bf1     = step;
6020
0
    bf1[0]  = bf0[0];
6021
0
    bf1[2]  = bf0[2];
6022
0
    bf1[4]  = bf0[4];
6023
0
    bf1[6]  = bf0[6];
6024
0
    bf1[8]  = bf0[8];
6025
0
    bf1[10] = bf0[10];
6026
0
    bf1[12] = bf0[12];
6027
0
    bf1[14] = bf0[14];
6028
0
    bf1[16] = bf0[16];
6029
0
    bf1[18] = bf0[18];
6030
0
    bf1[20] = bf0[20];
6031
0
    bf1[22] = bf0[22];
6032
0
    bf1[24] = bf0[24];
6033
0
    bf1[26] = bf0[26];
6034
0
    bf1[28] = bf0[28];
6035
0
    bf1[30] = bf0[30];
6036
0
    bf1[32] = half_btf(cospi[63], bf0[32], cospi[1], bf0[63], cos_bit);
6037
0
    bf1[34] = half_btf(cospi[47], bf0[34], cospi[17], bf0[61], cos_bit);
6038
0
    bf1[36] = half_btf(cospi[55], bf0[36], cospi[9], bf0[59], cos_bit);
6039
0
    bf1[38] = half_btf(cospi[39], bf0[38], cospi[25], bf0[57], cos_bit);
6040
0
    bf1[40] = half_btf(cospi[59], bf0[40], cospi[5], bf0[55], cos_bit);
6041
0
    bf1[42] = half_btf(cospi[43], bf0[42], cospi[21], bf0[53], cos_bit);
6042
0
    bf1[44] = half_btf(cospi[51], bf0[44], cospi[13], bf0[51], cos_bit);
6043
0
    bf1[46] = half_btf(cospi[35], bf0[46], cospi[29], bf0[49], cos_bit);
6044
0
    bf1[48] = half_btf(cospi[3], bf0[48], -cospi[61], bf0[47], cos_bit);
6045
0
    bf1[50] = half_btf(cospi[19], bf0[50], -cospi[45], bf0[45], cos_bit);
6046
0
    bf1[52] = half_btf(cospi[11], bf0[52], -cospi[53], bf0[43], cos_bit);
6047
0
    bf1[54] = half_btf(cospi[27], bf0[54], -cospi[37], bf0[41], cos_bit);
6048
0
    bf1[56] = half_btf(cospi[7], bf0[56], -cospi[57], bf0[39], cos_bit);
6049
0
    bf1[58] = half_btf(cospi[23], bf0[58], -cospi[41], bf0[37], cos_bit);
6050
0
    bf1[60] = half_btf(cospi[15], bf0[60], -cospi[49], bf0[35], cos_bit);
6051
0
    bf1[62] = half_btf(cospi[31], bf0[62], -cospi[33], bf0[33], cos_bit);
6052
6053
    // stage 11
6054
0
    bf0     = step;
6055
0
    bf1     = output;
6056
0
    bf1[0]  = bf0[0];
6057
0
    bf1[1]  = bf0[32];
6058
0
    bf1[2]  = bf0[16];
6059
0
    bf1[3]  = bf0[48];
6060
0
    bf1[4]  = bf0[8];
6061
0
    bf1[5]  = bf0[40];
6062
0
    bf1[6]  = bf0[24];
6063
0
    bf1[7]  = bf0[56];
6064
0
    bf1[8]  = bf0[4];
6065
0
    bf1[9]  = bf0[36];
6066
0
    bf1[10] = bf0[20];
6067
0
    bf1[11] = bf0[52];
6068
0
    bf1[12] = bf0[12];
6069
0
    bf1[13] = bf0[44];
6070
0
    bf1[14] = bf0[28];
6071
0
    bf1[15] = bf0[60];
6072
0
    bf1[16] = bf0[2];
6073
0
    bf1[17] = bf0[34];
6074
0
    bf1[18] = bf0[18];
6075
0
    bf1[19] = bf0[50];
6076
0
    bf1[20] = bf0[10];
6077
0
    bf1[21] = bf0[42];
6078
0
    bf1[22] = bf0[26];
6079
0
    bf1[23] = bf0[58];
6080
0
    bf1[24] = bf0[6];
6081
0
    bf1[25] = bf0[38];
6082
0
    bf1[26] = bf0[22];
6083
0
    bf1[27] = bf0[54];
6084
0
    bf1[28] = bf0[14];
6085
0
    bf1[29] = bf0[46];
6086
0
    bf1[30] = bf0[30];
6087
0
    bf1[31] = bf0[62];
6088
0
}
6089
6090
0
static void av1_fidentity64_N2_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6091
0
    (void)stage_range;
6092
0
    (void)cos_bit;
6093
0
    for (int32_t i = 0; i < 32; ++i) {
6094
0
        output[i] = round_shift((int64_t)input[i] * 4 * new_sqrt2, new_sqrt2_bits);
6095
0
    }
6096
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
6097
0
}
6098
6099
0
static INLINE TxfmFunc fwd_txfm_type_to_func_N2(TxfmType txfmtype) {
6100
0
    switch (txfmtype) {
6101
0
    case TXFM_TYPE_DCT4:
6102
0
        return svt_av1_fdct4_new_N2;
6103
0
    case TXFM_TYPE_DCT8:
6104
0
        return svt_av1_fdct8_new_N2;
6105
0
    case TXFM_TYPE_DCT16:
6106
0
        return svt_av1_fdct16_new_N2;
6107
0
    case TXFM_TYPE_DCT32:
6108
0
        return svt_av1_fdct32_new_N2;
6109
0
    case TXFM_TYPE_DCT64:
6110
0
        return svt_av1_fdct64_new_N2;
6111
0
    case TXFM_TYPE_ADST4:
6112
0
        return svt_av1_fadst4_new_N2;
6113
0
    case TXFM_TYPE_ADST8:
6114
0
        return svt_av1_fadst8_new_N2;
6115
0
    case TXFM_TYPE_ADST16:
6116
0
        return svt_av1_fadst16_new_N2;
6117
0
    case TXFM_TYPE_ADST32:
6118
0
        return av1_fadst32_new;
6119
0
    case TXFM_TYPE_IDENTITY4:
6120
0
        return svt_av1_fidentity4_N2_c;
6121
0
    case TXFM_TYPE_IDENTITY8:
6122
0
        return svt_av1_fidentity8_N2_c;
6123
0
    case TXFM_TYPE_IDENTITY16:
6124
0
        return svt_av1_fidentity16_N2_c;
6125
0
    case TXFM_TYPE_IDENTITY32:
6126
0
        return svt_av1_fidentity32_N2_c;
6127
0
    case TXFM_TYPE_IDENTITY64:
6128
0
        return av1_fidentity64_N2_c;
6129
0
    default:
6130
0
        assert(0);
6131
0
        return NULL;
6132
0
    }
6133
0
}
6134
6135
static INLINE void av1_tranform_two_d_core_N2_c(int16_t* input, uint32_t input_stride, int32_t* output,
6136
0
                                                const Txfm2dFlipCfg* cfg, int32_t* buf, uint8_t bit_depth) {
6137
0
    int32_t c, r;
6138
    // Note when assigning txfm_size_col, we use the txfm_size from the
6139
    // row configuration and vice versa. This is intentionally done to
6140
    // accurately perform rectangular transforms. When the transform is
6141
    // rectangular, the number of columns will be the same as the
6142
    // txfm_size stored in the row cfg struct. It will make no difference
6143
    // for square transforms.
6144
0
    const int32_t txfm_size_col = tx_size_wide[cfg->tx_size];
6145
0
    const int32_t txfm_size_row = tx_size_high[cfg->tx_size];
6146
    // Take the shift from the larger dimension in the rectangular case.
6147
0
    const int8_t* shift     = cfg->shift;
6148
0
    const int32_t rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
6149
0
    int8_t        stage_range_col[MAX_TXFM_STAGE_NUM];
6150
0
    int8_t        stage_range_row[MAX_TXFM_STAGE_NUM];
6151
0
    assert(cfg->stage_num_col <= MAX_TXFM_STAGE_NUM);
6152
0
    assert(cfg->stage_num_row <= MAX_TXFM_STAGE_NUM);
6153
0
    svt_av1_gen_fwd_stage_range(stage_range_col, stage_range_row, cfg, bit_depth);
6154
6155
0
    const int8_t   cos_bit_col   = cfg->cos_bit_col;
6156
0
    const int8_t   cos_bit_row   = cfg->cos_bit_row;
6157
0
    const TxfmFunc txfm_func_col = fwd_txfm_type_to_func_N2(cfg->txfm_type_col);
6158
0
    const TxfmFunc txfm_func_row = fwd_txfm_type_to_func_N2(cfg->txfm_type_row);
6159
0
    ASSERT(txfm_func_col != NULL);
6160
0
    ASSERT(txfm_func_row != NULL);
6161
    // use output buffer as temp buffer
6162
0
    int32_t* temp_in  = output;
6163
0
    int32_t* temp_out = output + txfm_size_row;
6164
6165
    // Columns
6166
0
    for (c = 0; c < txfm_size_col; ++c) {
6167
0
        if (cfg->ud_flip == 0) {
6168
0
            for (r = 0; r < txfm_size_row; ++r) {
6169
0
                temp_in[r] = input[r * input_stride + c];
6170
0
            }
6171
0
        } else {
6172
0
            for (r = 0; r < txfm_size_row; ++r) {
6173
                // flip upside down
6174
0
                temp_in[r] = input[(txfm_size_row - r - 1) * input_stride + c];
6175
0
            }
6176
0
        }
6177
0
        svt_av1_round_shift_array_c(temp_in, txfm_size_row, -shift[0]); // NM svt_av1_round_shift_array_c
6178
0
        txfm_func_col(temp_in, temp_out, cos_bit_col, stage_range_col);
6179
0
        svt_av1_round_shift_array_c(temp_out, txfm_size_row / 2, -shift[1]); // NM svt_av1_round_shift_array_c
6180
0
        if (cfg->lr_flip == 0) {
6181
0
            for (r = 0; r < txfm_size_row; ++r) {
6182
0
                buf[r * txfm_size_col + c] = temp_out[r];
6183
0
            }
6184
0
        } else {
6185
0
            for (r = 0; r < txfm_size_row; ++r) {
6186
                // flip from left to right
6187
0
                buf[r * txfm_size_col + (txfm_size_col - c - 1)] = temp_out[r];
6188
0
            }
6189
0
        }
6190
0
    }
6191
6192
    // Rows
6193
0
    for (r = 0; r < txfm_size_row / 2; ++r) {
6194
0
        txfm_func_row(buf + r * txfm_size_col, output + r * txfm_size_col, cos_bit_row, stage_range_row);
6195
0
        svt_av1_round_shift_array_c(output + r * txfm_size_col, txfm_size_col / 2, -shift[2]);
6196
6197
0
        if (abs(rect_type) == 1) {
6198
            // Multiply everything by Sqrt2 if the transform is rectangular and the
6199
            // size difference is a factor of 2.
6200
0
            for (c = 0; c < txfm_size_col / 2; ++c) {
6201
0
                output[r * txfm_size_col + c] = round_shift((int64_t)output[r * txfm_size_col + c] * new_sqrt2,
6202
0
                                                            new_sqrt2_bits);
6203
0
            }
6204
0
        }
6205
0
    }
6206
6207
0
    for (int i = 0; i < (txfm_size_col * txfm_size_row); i++) {
6208
0
        if (i % txfm_size_col >= (txfm_size_col >> 1) || i / txfm_size_col >= (txfm_size_row >> 1)) {
6209
0
            output[i] = 0;
6210
0
        }
6211
0
    }
6212
0
}
6213
6214
void svt_aom_transform_two_d_64x64_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6215
0
                                        uint8_t bit_depth) {
6216
0
    int32_t       intermediate_transform_buffer[64 * 64];
6217
0
    Txfm2dFlipCfg cfg;
6218
0
    svt_aom_transform_config(transform_type, TX_64X64, &cfg);
6219
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6220
0
}
6221
6222
void svt_aom_transform_two_d_32x32_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6223
0
                                        uint8_t bit_depth) {
6224
0
    int32_t       intermediate_transform_buffer[32 * 32];
6225
0
    Txfm2dFlipCfg cfg;
6226
0
    svt_aom_transform_config(transform_type, TX_32X32, &cfg);
6227
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6228
0
}
6229
6230
void svt_aom_transform_two_d_16x16_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6231
0
                                        uint8_t bit_depth) {
6232
0
    int32_t       intermediate_transform_buffer[16 * 16];
6233
0
    Txfm2dFlipCfg cfg;
6234
0
    svt_aom_transform_config(transform_type, TX_16X16, &cfg);
6235
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6236
0
}
6237
6238
void svt_aom_transform_two_d_8x8_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6239
0
                                      uint8_t bit_depth) {
6240
0
    int32_t       intermediate_transform_buffer[8 * 8];
6241
0
    Txfm2dFlipCfg cfg;
6242
0
    svt_aom_transform_config(transform_type, TX_8X8, &cfg);
6243
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6244
0
}
6245
6246
void svt_aom_transform_two_d_4x4_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6247
0
                                      uint8_t bit_depth) {
6248
0
    int32_t       intermediate_transform_buffer[4 * 4];
6249
0
    Txfm2dFlipCfg cfg;
6250
0
    svt_aom_transform_config(transform_type, TX_4X4, &cfg);
6251
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6252
0
}
6253
6254
void svt_av1_fwd_txfm2d_64x32_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6255
0
                                   uint8_t bit_depth) {
6256
0
    int32_t       intermediate_transform_buffer[64 * 32];
6257
0
    Txfm2dFlipCfg cfg;
6258
0
    svt_aom_transform_config(transform_type, TX_64X32, &cfg);
6259
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6260
0
}
6261
6262
void svt_av1_fwd_txfm2d_32x64_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6263
0
                                   uint8_t bit_depth) {
6264
0
    int32_t       intermediate_transform_buffer[32 * 64];
6265
0
    Txfm2dFlipCfg cfg;
6266
0
    svt_aom_transform_config(transform_type, TX_32X64, &cfg);
6267
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6268
0
}
6269
6270
void svt_av1_fwd_txfm2d_64x16_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6271
0
                                   uint8_t bit_depth) {
6272
0
    int32_t       intermediate_transform_buffer[64 * 16];
6273
0
    Txfm2dFlipCfg cfg;
6274
0
    svt_aom_transform_config(transform_type, TX_64X16, &cfg);
6275
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6276
0
}
6277
6278
void svt_av1_fwd_txfm2d_16x64_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6279
0
                                   uint8_t bit_depth) {
6280
0
    int32_t       intermediate_transform_buffer[16 * 64];
6281
0
    Txfm2dFlipCfg cfg;
6282
0
    svt_aom_transform_config(transform_type, TX_16X64, &cfg);
6283
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6284
0
}
6285
6286
void svt_av1_fwd_txfm2d_32x16_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6287
0
                                   uint8_t bit_depth) {
6288
0
    int32_t       intermediate_transform_buffer[32 * 16];
6289
0
    Txfm2dFlipCfg cfg;
6290
0
    svt_aom_transform_config(transform_type, TX_32X16, &cfg);
6291
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6292
0
}
6293
6294
void svt_av1_fwd_txfm2d_16x32_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6295
0
                                   uint8_t bit_depth) {
6296
0
    int32_t       intermediate_transform_buffer[16 * 32];
6297
0
    Txfm2dFlipCfg cfg;
6298
0
    svt_aom_transform_config(transform_type, TX_16X32, &cfg);
6299
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6300
0
}
6301
6302
void svt_av1_fwd_txfm2d_16x8_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6303
0
                                  uint8_t bit_depth) {
6304
0
    int32_t       intermediate_transform_buffer[16 * 8];
6305
0
    Txfm2dFlipCfg cfg;
6306
0
    svt_aom_transform_config(transform_type, TX_16X8, &cfg);
6307
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6308
0
}
6309
6310
void svt_av1_fwd_txfm2d_8x16_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6311
0
                                  uint8_t bit_depth) {
6312
0
    int32_t       intermediate_transform_buffer[8 * 16];
6313
0
    Txfm2dFlipCfg cfg;
6314
0
    svt_aom_transform_config(transform_type, TX_8X16, &cfg);
6315
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6316
0
}
6317
6318
void svt_av1_fwd_txfm2d_32x8_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6319
0
                                  uint8_t bit_depth) {
6320
0
    int32_t       intermediate_transform_buffer[32 * 8];
6321
0
    Txfm2dFlipCfg cfg;
6322
0
    svt_aom_transform_config(transform_type, TX_32X8, &cfg);
6323
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6324
0
}
6325
6326
void svt_av1_fwd_txfm2d_8x32_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6327
0
                                  uint8_t bit_depth) {
6328
0
    int32_t       intermediate_transform_buffer[8 * 32];
6329
0
    Txfm2dFlipCfg cfg;
6330
0
    svt_aom_transform_config(transform_type, TX_8X32, &cfg);
6331
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6332
0
}
6333
6334
void svt_av1_fwd_txfm2d_16x4_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6335
0
                                  uint8_t bit_depth) {
6336
0
    int32_t       intermediate_transform_buffer[16 * 4];
6337
0
    Txfm2dFlipCfg cfg;
6338
0
    svt_aom_transform_config(transform_type, TX_16X4, &cfg);
6339
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6340
0
}
6341
6342
void svt_av1_fwd_txfm2d_4x16_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6343
0
                                  uint8_t bit_depth) {
6344
0
    int32_t       intermediate_transform_buffer[4 * 16];
6345
0
    Txfm2dFlipCfg cfg;
6346
0
    svt_aom_transform_config(transform_type, TX_4X16, &cfg);
6347
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6348
0
}
6349
6350
void svt_av1_fwd_txfm2d_8x4_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6351
0
                                 uint8_t bit_depth) {
6352
0
    int32_t       intermediate_transform_buffer[8 * 4];
6353
0
    Txfm2dFlipCfg cfg;
6354
0
    svt_aom_transform_config(transform_type, TX_8X4, &cfg);
6355
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6356
0
}
6357
6358
void svt_av1_fwd_txfm2d_4x8_N2_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
6359
0
                                 uint8_t bit_depth) {
6360
0
    int32_t       intermediate_transform_buffer[4 * 8];
6361
0
    Txfm2dFlipCfg cfg;
6362
0
    svt_aom_transform_config(transform_type, TX_4X8, &cfg);
6363
0
    av1_tranform_two_d_core_N2_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
6364
0
}
6365
6366
0
void svt_av1_fdct4_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6367
0
    (void)stage_range;
6368
0
    const int32_t* cospi = cospi_arr(cos_bit);
6369
0
    int32_t        step[2];
6370
6371
    // stage 1;
6372
0
    step[0] = input[0] + input[3];
6373
0
    step[1] = input[1] + input[2];
6374
6375
0
    output[0] = half_btf(cospi[32], step[0], cospi[32], step[1], cos_bit);
6376
0
}
6377
6378
0
void svt_av1_fadst4_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6379
0
    (void)stage_range;
6380
0
    int32_t        bit   = cos_bit;
6381
0
    const int32_t* sinpi = sinpi_arr(bit);
6382
0
    int32_t        x0, x1, x2, x3;
6383
0
    int32_t        s0, s2, s4, s5;
6384
6385
    // stage 0
6386
0
    x0 = input[0];
6387
0
    x1 = input[1];
6388
0
    x2 = input[2];
6389
0
    x3 = input[3];
6390
6391
0
    if (!(x0 | x1 | x2 | x3)) {
6392
0
        output[0] = output[1] = output[2] = output[3] = 0;
6393
0
        return;
6394
0
    }
6395
6396
    // stage 1
6397
0
    s0 = sinpi[1] * x0;
6398
0
    s2 = sinpi[2] * x1;
6399
0
    s4 = sinpi[3] * x2;
6400
0
    s5 = sinpi[4] * x3;
6401
6402
    // stage 3
6403
0
    x0 = s0 + s2;
6404
6405
    // stage 4
6406
0
    x0 = x0 + s5;
6407
6408
    // stage 5
6409
0
    s0 = x0 + s4;
6410
6411
    // 1-D transform scaling factor is sqrt(2).
6412
0
    output[0] = round_shift(s0, bit);
6413
0
}
6414
6415
0
void svt_av1_fidentity4_N4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6416
0
    (void)stage_range;
6417
0
    (void)cos_bit;
6418
0
    output[0] = round_shift((int64_t)input[0] * new_sqrt2, new_sqrt2_bits);
6419
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
6420
0
}
6421
6422
0
void svt_av1_fdct8_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6423
0
    (void)stage_range;
6424
0
    const int32_t* cospi;
6425
6426
0
    int32_t *bf0, *bf1;
6427
0
    int32_t  step[8];
6428
6429
    // stage 0;
6430
6431
    // stage 1;
6432
0
    bf1    = output;
6433
0
    bf1[0] = input[0] + input[7];
6434
0
    bf1[1] = input[1] + input[6];
6435
0
    bf1[2] = input[2] + input[5];
6436
0
    bf1[3] = input[3] + input[4];
6437
0
    bf1[4] = -input[4] + input[3];
6438
0
    bf1[5] = -input[5] + input[2];
6439
0
    bf1[6] = -input[6] + input[1];
6440
0
    bf1[7] = -input[7] + input[0];
6441
6442
    // stage 2
6443
0
    cospi  = cospi_arr(cos_bit);
6444
0
    bf0    = output;
6445
0
    bf1    = step;
6446
0
    bf1[0] = bf0[0] + bf0[3];
6447
0
    bf1[1] = bf0[1] + bf0[2];
6448
0
    bf1[4] = bf0[4];
6449
0
    bf1[5] = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
6450
0
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
6451
0
    bf1[7] = bf0[7];
6452
6453
    // stage 3
6454
0
    bf0    = step;
6455
0
    bf1    = output;
6456
0
    bf1[0] = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
6457
0
    bf1[4] = bf0[4] + bf0[5];
6458
0
    bf1[7] = bf0[7] + bf0[6];
6459
6460
    // stage 4
6461
0
    bf0    = output;
6462
0
    bf1    = step;
6463
0
    bf1[0] = bf0[0];
6464
0
    bf1[4] = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
6465
6466
    // stage 5
6467
0
    bf0    = step;
6468
0
    bf1    = output;
6469
0
    bf1[0] = bf0[0];
6470
0
    bf1[1] = bf0[4];
6471
0
}
6472
6473
0
void svt_av1_fadst8_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6474
0
    (void)stage_range;
6475
0
    const int32_t* cospi;
6476
6477
0
    int32_t *bf0, *bf1;
6478
0
    int32_t  step[8];
6479
6480
    // stage 0;
6481
6482
    // stage 1;
6483
0
    assert(output != input);
6484
0
    bf1    = output;
6485
0
    bf1[0] = input[0];
6486
0
    bf1[1] = -input[7];
6487
0
    bf1[2] = -input[3];
6488
0
    bf1[3] = input[4];
6489
0
    bf1[4] = -input[1];
6490
0
    bf1[5] = input[6];
6491
0
    bf1[6] = input[2];
6492
0
    bf1[7] = -input[5];
6493
6494
    // stage 2
6495
0
    cospi  = cospi_arr(cos_bit);
6496
0
    bf0    = output;
6497
0
    bf1    = step;
6498
0
    bf1[0] = bf0[0];
6499
0
    bf1[1] = bf0[1];
6500
0
    bf1[2] = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
6501
0
    bf1[3] = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
6502
0
    bf1[4] = bf0[4];
6503
0
    bf1[5] = bf0[5];
6504
0
    bf1[6] = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
6505
0
    bf1[7] = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
6506
6507
    // stage 3
6508
0
    bf0    = step;
6509
0
    bf1    = output;
6510
0
    bf1[0] = bf0[0] + bf0[2];
6511
0
    bf1[1] = bf0[1] + bf0[3];
6512
0
    bf1[2] = bf0[0] - bf0[2];
6513
0
    bf1[3] = bf0[1] - bf0[3];
6514
0
    bf1[4] = bf0[4] + bf0[6];
6515
0
    bf1[5] = bf0[5] + bf0[7];
6516
0
    bf1[6] = bf0[4] - bf0[6];
6517
0
    bf1[7] = bf0[5] - bf0[7];
6518
6519
    // stage 4
6520
0
    bf0    = output;
6521
0
    bf1    = step;
6522
0
    bf1[0] = bf0[0];
6523
0
    bf1[1] = bf0[1];
6524
0
    bf1[2] = bf0[2];
6525
0
    bf1[3] = bf0[3];
6526
0
    bf1[4] = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
6527
0
    bf1[5] = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
6528
0
    bf1[6] = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
6529
0
    bf1[7] = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
6530
6531
    // stage 5
6532
0
    bf0    = step;
6533
0
    bf1    = output;
6534
0
    bf1[0] = bf0[0] + bf0[4];
6535
0
    bf1[1] = bf0[1] + bf0[5];
6536
0
    bf1[6] = bf0[2] - bf0[6];
6537
0
    bf1[7] = bf0[3] - bf0[7];
6538
6539
    // stage 6
6540
0
    bf0    = output;
6541
0
    bf1    = step;
6542
0
    bf1[1] = half_btf(cospi[60], bf0[0], -cospi[4], bf0[1], cos_bit);
6543
0
    bf1[6] = half_btf(cospi[52], bf0[6], cospi[12], bf0[7], cos_bit);
6544
6545
    // stage 7
6546
0
    bf0    = step;
6547
0
    bf1    = output;
6548
0
    bf1[0] = bf0[1];
6549
0
    bf1[1] = bf0[6];
6550
0
}
6551
6552
0
void svt_av1_fidentity8_N4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6553
0
    (void)stage_range;
6554
0
    (void)cos_bit;
6555
0
    for (int32_t i = 0; i < 2; ++i) {
6556
0
        output[i] = input[i] * 2;
6557
0
    }
6558
0
}
6559
6560
0
void svt_av1_fdct16_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6561
0
    (void)stage_range;
6562
0
    const int32_t* cospi;
6563
6564
0
    int32_t *bf0, *bf1;
6565
0
    int32_t  step[16];
6566
6567
    // stage 0;
6568
6569
    // stage 1;
6570
0
    bf1     = output;
6571
0
    bf1[0]  = input[0] + input[15];
6572
0
    bf1[1]  = input[1] + input[14];
6573
0
    bf1[2]  = input[2] + input[13];
6574
0
    bf1[3]  = input[3] + input[12];
6575
0
    bf1[4]  = input[4] + input[11];
6576
0
    bf1[5]  = input[5] + input[10];
6577
0
    bf1[6]  = input[6] + input[9];
6578
0
    bf1[7]  = input[7] + input[8];
6579
0
    bf1[8]  = -input[8] + input[7];
6580
0
    bf1[9]  = -input[9] + input[6];
6581
0
    bf1[10] = -input[10] + input[5];
6582
0
    bf1[11] = -input[11] + input[4];
6583
0
    bf1[12] = -input[12] + input[3];
6584
0
    bf1[13] = -input[13] + input[2];
6585
0
    bf1[14] = -input[14] + input[1];
6586
0
    bf1[15] = -input[15] + input[0];
6587
6588
    // stage 2
6589
0
    cospi   = cospi_arr(cos_bit);
6590
0
    bf0     = output;
6591
0
    bf1     = step;
6592
0
    bf1[0]  = bf0[0] + bf0[7];
6593
0
    bf1[1]  = bf0[1] + bf0[6];
6594
0
    bf1[2]  = bf0[2] + bf0[5];
6595
0
    bf1[3]  = bf0[3] + bf0[4];
6596
0
    bf1[4]  = -bf0[4] + bf0[3];
6597
0
    bf1[5]  = -bf0[5] + bf0[2];
6598
0
    bf1[6]  = -bf0[6] + bf0[1];
6599
0
    bf1[7]  = -bf0[7] + bf0[0];
6600
0
    bf1[8]  = bf0[8];
6601
0
    bf1[9]  = bf0[9];
6602
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
6603
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
6604
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
6605
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
6606
0
    bf1[14] = bf0[14];
6607
0
    bf1[15] = bf0[15];
6608
6609
    // stage 3
6610
0
    bf0     = step;
6611
0
    bf1     = output;
6612
0
    bf1[0]  = bf0[0] + bf0[3];
6613
0
    bf1[1]  = bf0[1] + bf0[2];
6614
0
    bf1[4]  = bf0[4];
6615
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
6616
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
6617
0
    bf1[7]  = bf0[7];
6618
0
    bf1[8]  = bf0[8] + bf0[11];
6619
0
    bf1[9]  = bf0[9] + bf0[10];
6620
0
    bf1[10] = -bf0[10] + bf0[9];
6621
0
    bf1[11] = -bf0[11] + bf0[8];
6622
0
    bf1[12] = -bf0[12] + bf0[15];
6623
0
    bf1[13] = -bf0[13] + bf0[14];
6624
0
    bf1[14] = bf0[14] + bf0[13];
6625
0
    bf1[15] = bf0[15] + bf0[12];
6626
6627
    // stage 4
6628
0
    bf0     = output;
6629
0
    bf1     = step;
6630
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
6631
0
    bf1[4]  = bf0[4] + bf0[5];
6632
0
    bf1[7]  = bf0[7] + bf0[6];
6633
0
    bf1[8]  = bf0[8];
6634
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
6635
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
6636
0
    bf1[11] = bf0[11];
6637
0
    bf1[12] = bf0[12];
6638
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
6639
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
6640
0
    bf1[15] = bf0[15];
6641
6642
    // stage 5
6643
0
    bf0     = step;
6644
0
    bf1     = output;
6645
0
    bf1[0]  = bf0[0];
6646
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
6647
0
    bf1[8]  = bf0[8] + bf0[9];
6648
0
    bf1[11] = bf0[11] + bf0[10];
6649
0
    bf1[12] = bf0[12] + bf0[13];
6650
0
    bf1[15] = bf0[15] + bf0[14];
6651
6652
    // stage 6
6653
0
    bf0     = output;
6654
0
    bf1     = step;
6655
0
    bf1[0]  = bf0[0];
6656
0
    bf1[4]  = bf0[4];
6657
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
6658
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
6659
6660
    // stage 7
6661
0
    bf0    = step;
6662
0
    bf1    = output;
6663
0
    bf1[0] = bf0[0];
6664
0
    bf1[1] = bf0[8];
6665
0
    bf1[2] = bf0[4];
6666
0
    bf1[3] = bf0[12];
6667
0
}
6668
6669
0
void svt_av1_fadst16_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6670
0
    (void)stage_range;
6671
0
    const int32_t* cospi;
6672
6673
0
    int32_t *bf0, *bf1;
6674
0
    int32_t  step[16];
6675
6676
    // stage 0;
6677
6678
    // stage 1;
6679
0
    assert(output != input);
6680
0
    bf1     = output;
6681
0
    bf1[0]  = input[0];
6682
0
    bf1[1]  = -input[15];
6683
0
    bf1[2]  = -input[7];
6684
0
    bf1[3]  = input[8];
6685
0
    bf1[4]  = -input[3];
6686
0
    bf1[5]  = input[12];
6687
0
    bf1[6]  = input[4];
6688
0
    bf1[7]  = -input[11];
6689
0
    bf1[8]  = -input[1];
6690
0
    bf1[9]  = input[14];
6691
0
    bf1[10] = input[6];
6692
0
    bf1[11] = -input[9];
6693
0
    bf1[12] = input[2];
6694
0
    bf1[13] = -input[13];
6695
0
    bf1[14] = -input[5];
6696
0
    bf1[15] = input[10];
6697
6698
    // stage 2
6699
0
    cospi   = cospi_arr(cos_bit);
6700
0
    bf0     = output;
6701
0
    bf1     = step;
6702
0
    bf1[0]  = bf0[0];
6703
0
    bf1[1]  = bf0[1];
6704
0
    bf1[2]  = half_btf(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
6705
0
    bf1[3]  = half_btf(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
6706
0
    bf1[4]  = bf0[4];
6707
0
    bf1[5]  = bf0[5];
6708
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
6709
0
    bf1[7]  = half_btf(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
6710
0
    bf1[8]  = bf0[8];
6711
0
    bf1[9]  = bf0[9];
6712
0
    bf1[10] = half_btf(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
6713
0
    bf1[11] = half_btf(cospi[32], bf0[10], -cospi[32], bf0[11], cos_bit);
6714
0
    bf1[12] = bf0[12];
6715
0
    bf1[13] = bf0[13];
6716
0
    bf1[14] = half_btf(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
6717
0
    bf1[15] = half_btf(cospi[32], bf0[14], -cospi[32], bf0[15], cos_bit);
6718
6719
    // stage 3
6720
0
    bf0     = step;
6721
0
    bf1     = output;
6722
0
    bf1[0]  = bf0[0] + bf0[2];
6723
0
    bf1[1]  = bf0[1] + bf0[3];
6724
0
    bf1[2]  = bf0[0] - bf0[2];
6725
0
    bf1[3]  = bf0[1] - bf0[3];
6726
0
    bf1[4]  = bf0[4] + bf0[6];
6727
0
    bf1[5]  = bf0[5] + bf0[7];
6728
0
    bf1[6]  = bf0[4] - bf0[6];
6729
0
    bf1[7]  = bf0[5] - bf0[7];
6730
0
    bf1[8]  = bf0[8] + bf0[10];
6731
0
    bf1[9]  = bf0[9] + bf0[11];
6732
0
    bf1[10] = bf0[8] - bf0[10];
6733
0
    bf1[11] = bf0[9] - bf0[11];
6734
0
    bf1[12] = bf0[12] + bf0[14];
6735
0
    bf1[13] = bf0[13] + bf0[15];
6736
0
    bf1[14] = bf0[12] - bf0[14];
6737
0
    bf1[15] = bf0[13] - bf0[15];
6738
6739
    // stage 4
6740
0
    bf0     = output;
6741
0
    bf1     = step;
6742
0
    bf1[0]  = bf0[0];
6743
0
    bf1[1]  = bf0[1];
6744
0
    bf1[2]  = bf0[2];
6745
0
    bf1[3]  = bf0[3];
6746
0
    bf1[4]  = half_btf(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
6747
0
    bf1[5]  = half_btf(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
6748
0
    bf1[6]  = half_btf(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
6749
0
    bf1[7]  = half_btf(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
6750
0
    bf1[8]  = bf0[8];
6751
0
    bf1[9]  = bf0[9];
6752
0
    bf1[10] = bf0[10];
6753
0
    bf1[11] = bf0[11];
6754
0
    bf1[12] = half_btf(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
6755
0
    bf1[13] = half_btf(cospi[48], bf0[12], -cospi[16], bf0[13], cos_bit);
6756
0
    bf1[14] = half_btf(-cospi[48], bf0[14], cospi[16], bf0[15], cos_bit);
6757
0
    bf1[15] = half_btf(cospi[16], bf0[14], cospi[48], bf0[15], cos_bit);
6758
6759
    // stage 5
6760
0
    bf0     = step;
6761
0
    bf1     = output;
6762
0
    bf1[0]  = bf0[0] + bf0[4];
6763
0
    bf1[1]  = bf0[1] + bf0[5];
6764
0
    bf1[2]  = bf0[2] + bf0[6];
6765
0
    bf1[3]  = bf0[3] + bf0[7];
6766
0
    bf1[4]  = bf0[0] - bf0[4];
6767
0
    bf1[5]  = bf0[1] - bf0[5];
6768
0
    bf1[6]  = bf0[2] - bf0[6];
6769
0
    bf1[7]  = bf0[3] - bf0[7];
6770
0
    bf1[8]  = bf0[8] + bf0[12];
6771
0
    bf1[9]  = bf0[9] + bf0[13];
6772
0
    bf1[10] = bf0[10] + bf0[14];
6773
0
    bf1[11] = bf0[11] + bf0[15];
6774
0
    bf1[12] = bf0[8] - bf0[12];
6775
0
    bf1[13] = bf0[9] - bf0[13];
6776
0
    bf1[14] = bf0[10] - bf0[14];
6777
0
    bf1[15] = bf0[11] - bf0[15];
6778
6779
    // stage 6
6780
0
    bf0     = output;
6781
0
    bf1     = step;
6782
0
    bf1[0]  = bf0[0];
6783
0
    bf1[1]  = bf0[1];
6784
0
    bf1[2]  = bf0[2];
6785
0
    bf1[3]  = bf0[3];
6786
0
    bf1[4]  = bf0[4];
6787
0
    bf1[5]  = bf0[5];
6788
0
    bf1[6]  = bf0[6];
6789
0
    bf1[7]  = bf0[7];
6790
0
    bf1[8]  = half_btf(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
6791
0
    bf1[9]  = half_btf(cospi[56], bf0[8], -cospi[8], bf0[9], cos_bit);
6792
0
    bf1[10] = half_btf(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
6793
0
    bf1[11] = half_btf(cospi[24], bf0[10], -cospi[40], bf0[11], cos_bit);
6794
0
    bf1[12] = half_btf(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
6795
0
    bf1[13] = half_btf(cospi[8], bf0[12], cospi[56], bf0[13], cos_bit);
6796
0
    bf1[14] = half_btf(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
6797
0
    bf1[15] = half_btf(cospi[40], bf0[14], cospi[24], bf0[15], cos_bit);
6798
6799
    // stage 7
6800
0
    bf0     = step;
6801
0
    bf1     = output;
6802
0
    bf1[0]  = bf0[0] + bf0[8];
6803
0
    bf1[1]  = bf0[1] + bf0[9];
6804
0
    bf1[2]  = bf0[2] + bf0[10];
6805
0
    bf1[3]  = bf0[3] + bf0[11];
6806
0
    bf1[12] = bf0[4] - bf0[12];
6807
0
    bf1[13] = bf0[5] - bf0[13];
6808
0
    bf1[14] = bf0[6] - bf0[14];
6809
0
    bf1[15] = bf0[7] - bf0[15];
6810
6811
    // stage 8
6812
0
    bf0     = output;
6813
0
    bf1     = step;
6814
0
    bf1[1]  = half_btf(cospi[62], bf0[0], -cospi[2], bf0[1], cos_bit);
6815
0
    bf1[3]  = half_btf(cospi[54], bf0[2], -cospi[10], bf0[3], cos_bit);
6816
0
    bf1[12] = half_btf(cospi[50], bf0[12], cospi[14], bf0[13], cos_bit);
6817
0
    bf1[14] = half_btf(cospi[58], bf0[14], cospi[6], bf0[15], cos_bit);
6818
6819
    // stage 9
6820
0
    bf0    = step;
6821
0
    bf1    = output;
6822
0
    bf1[0] = bf0[1];
6823
0
    bf1[1] = bf0[14];
6824
0
    bf1[2] = bf0[3];
6825
0
    bf1[3] = bf0[12];
6826
0
}
6827
6828
0
void svt_av1_fidentity16_N4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6829
0
    (void)stage_range;
6830
0
    (void)cos_bit;
6831
0
    for (int32_t i = 0; i < 4; ++i) {
6832
0
        output[i] = round_shift((int64_t)input[i] * 2 * new_sqrt2, new_sqrt2_bits);
6833
0
    }
6834
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
6835
0
}
6836
6837
0
void svt_av1_fdct32_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
6838
0
    (void)stage_range;
6839
0
    const int32_t* cospi;
6840
6841
0
    int32_t *bf0, *bf1;
6842
0
    int32_t  step[32];
6843
6844
    // stage 0;
6845
6846
    // stage 1;
6847
0
    bf1     = output;
6848
0
    bf1[0]  = input[0] + input[31];
6849
0
    bf1[1]  = input[1] + input[30];
6850
0
    bf1[2]  = input[2] + input[29];
6851
0
    bf1[3]  = input[3] + input[28];
6852
0
    bf1[4]  = input[4] + input[27];
6853
0
    bf1[5]  = input[5] + input[26];
6854
0
    bf1[6]  = input[6] + input[25];
6855
0
    bf1[7]  = input[7] + input[24];
6856
0
    bf1[8]  = input[8] + input[23];
6857
0
    bf1[9]  = input[9] + input[22];
6858
0
    bf1[10] = input[10] + input[21];
6859
0
    bf1[11] = input[11] + input[20];
6860
0
    bf1[12] = input[12] + input[19];
6861
0
    bf1[13] = input[13] + input[18];
6862
0
    bf1[14] = input[14] + input[17];
6863
0
    bf1[15] = input[15] + input[16];
6864
0
    bf1[16] = -input[16] + input[15];
6865
0
    bf1[17] = -input[17] + input[14];
6866
0
    bf1[18] = -input[18] + input[13];
6867
0
    bf1[19] = -input[19] + input[12];
6868
0
    bf1[20] = -input[20] + input[11];
6869
0
    bf1[21] = -input[21] + input[10];
6870
0
    bf1[22] = -input[22] + input[9];
6871
0
    bf1[23] = -input[23] + input[8];
6872
0
    bf1[24] = -input[24] + input[7];
6873
0
    bf1[25] = -input[25] + input[6];
6874
0
    bf1[26] = -input[26] + input[5];
6875
0
    bf1[27] = -input[27] + input[4];
6876
0
    bf1[28] = -input[28] + input[3];
6877
0
    bf1[29] = -input[29] + input[2];
6878
0
    bf1[30] = -input[30] + input[1];
6879
0
    bf1[31] = -input[31] + input[0];
6880
6881
    // stage 2
6882
0
    cospi   = cospi_arr(cos_bit);
6883
0
    bf0     = output;
6884
0
    bf1     = step;
6885
0
    bf1[0]  = bf0[0] + bf0[15];
6886
0
    bf1[1]  = bf0[1] + bf0[14];
6887
0
    bf1[2]  = bf0[2] + bf0[13];
6888
0
    bf1[3]  = bf0[3] + bf0[12];
6889
0
    bf1[4]  = bf0[4] + bf0[11];
6890
0
    bf1[5]  = bf0[5] + bf0[10];
6891
0
    bf1[6]  = bf0[6] + bf0[9];
6892
0
    bf1[7]  = bf0[7] + bf0[8];
6893
0
    bf1[8]  = -bf0[8] + bf0[7];
6894
0
    bf1[9]  = -bf0[9] + bf0[6];
6895
0
    bf1[10] = -bf0[10] + bf0[5];
6896
0
    bf1[11] = -bf0[11] + bf0[4];
6897
0
    bf1[12] = -bf0[12] + bf0[3];
6898
0
    bf1[13] = -bf0[13] + bf0[2];
6899
0
    bf1[14] = -bf0[14] + bf0[1];
6900
0
    bf1[15] = -bf0[15] + bf0[0];
6901
0
    bf1[16] = bf0[16];
6902
0
    bf1[17] = bf0[17];
6903
0
    bf1[18] = bf0[18];
6904
0
    bf1[19] = bf0[19];
6905
0
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
6906
0
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
6907
0
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
6908
0
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
6909
0
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
6910
0
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
6911
0
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
6912
0
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
6913
0
    bf1[28] = bf0[28];
6914
0
    bf1[29] = bf0[29];
6915
0
    bf1[30] = bf0[30];
6916
0
    bf1[31] = bf0[31];
6917
6918
    // stage 3
6919
0
    bf0     = step;
6920
0
    bf1     = output;
6921
0
    bf1[0]  = bf0[0] + bf0[7];
6922
0
    bf1[1]  = bf0[1] + bf0[6];
6923
0
    bf1[2]  = bf0[2] + bf0[5];
6924
0
    bf1[3]  = bf0[3] + bf0[4];
6925
0
    bf1[4]  = -bf0[4] + bf0[3];
6926
0
    bf1[5]  = -bf0[5] + bf0[2];
6927
0
    bf1[6]  = -bf0[6] + bf0[1];
6928
0
    bf1[7]  = -bf0[7] + bf0[0];
6929
0
    bf1[8]  = bf0[8];
6930
0
    bf1[9]  = bf0[9];
6931
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
6932
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
6933
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
6934
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
6935
0
    bf1[14] = bf0[14];
6936
0
    bf1[15] = bf0[15];
6937
0
    bf1[16] = bf0[16] + bf0[23];
6938
0
    bf1[17] = bf0[17] + bf0[22];
6939
0
    bf1[18] = bf0[18] + bf0[21];
6940
0
    bf1[19] = bf0[19] + bf0[20];
6941
0
    bf1[20] = -bf0[20] + bf0[19];
6942
0
    bf1[21] = -bf0[21] + bf0[18];
6943
0
    bf1[22] = -bf0[22] + bf0[17];
6944
0
    bf1[23] = -bf0[23] + bf0[16];
6945
0
    bf1[24] = -bf0[24] + bf0[31];
6946
0
    bf1[25] = -bf0[25] + bf0[30];
6947
0
    bf1[26] = -bf0[26] + bf0[29];
6948
0
    bf1[27] = -bf0[27] + bf0[28];
6949
0
    bf1[28] = bf0[28] + bf0[27];
6950
0
    bf1[29] = bf0[29] + bf0[26];
6951
0
    bf1[30] = bf0[30] + bf0[25];
6952
0
    bf1[31] = bf0[31] + bf0[24];
6953
6954
    // stage 4
6955
0
    bf0     = output;
6956
0
    bf1     = step;
6957
0
    bf1[0]  = bf0[0] + bf0[3];
6958
0
    bf1[1]  = bf0[1] + bf0[2];
6959
0
    bf1[4]  = bf0[4];
6960
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
6961
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
6962
0
    bf1[7]  = bf0[7];
6963
0
    bf1[8]  = bf0[8] + bf0[11];
6964
0
    bf1[9]  = bf0[9] + bf0[10];
6965
0
    bf1[10] = -bf0[10] + bf0[9];
6966
0
    bf1[11] = -bf0[11] + bf0[8];
6967
0
    bf1[12] = -bf0[12] + bf0[15];
6968
0
    bf1[13] = -bf0[13] + bf0[14];
6969
0
    bf1[14] = bf0[14] + bf0[13];
6970
0
    bf1[15] = bf0[15] + bf0[12];
6971
0
    bf1[16] = bf0[16];
6972
0
    bf1[17] = bf0[17];
6973
0
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
6974
0
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
6975
0
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
6976
0
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
6977
0
    bf1[22] = bf0[22];
6978
0
    bf1[23] = bf0[23];
6979
0
    bf1[24] = bf0[24];
6980
0
    bf1[25] = bf0[25];
6981
0
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
6982
0
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
6983
0
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
6984
0
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
6985
0
    bf1[30] = bf0[30];
6986
0
    bf1[31] = bf0[31];
6987
6988
    // stage 5
6989
0
    bf0     = step;
6990
0
    bf1     = output;
6991
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
6992
0
    bf1[4]  = bf0[4] + bf0[5];
6993
0
    bf1[7]  = bf0[7] + bf0[6];
6994
0
    bf1[8]  = bf0[8];
6995
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
6996
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
6997
0
    bf1[11] = bf0[11];
6998
0
    bf1[12] = bf0[12];
6999
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
7000
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
7001
0
    bf1[15] = bf0[15];
7002
0
    bf1[16] = bf0[16] + bf0[19];
7003
0
    bf1[17] = bf0[17] + bf0[18];
7004
0
    bf1[18] = -bf0[18] + bf0[17];
7005
0
    bf1[19] = -bf0[19] + bf0[16];
7006
0
    bf1[20] = -bf0[20] + bf0[23];
7007
0
    bf1[21] = -bf0[21] + bf0[22];
7008
0
    bf1[22] = bf0[22] + bf0[21];
7009
0
    bf1[23] = bf0[23] + bf0[20];
7010
0
    bf1[24] = bf0[24] + bf0[27];
7011
0
    bf1[25] = bf0[25] + bf0[26];
7012
0
    bf1[26] = -bf0[26] + bf0[25];
7013
0
    bf1[27] = -bf0[27] + bf0[24];
7014
0
    bf1[28] = -bf0[28] + bf0[31];
7015
0
    bf1[29] = -bf0[29] + bf0[30];
7016
0
    bf1[30] = bf0[30] + bf0[29];
7017
0
    bf1[31] = bf0[31] + bf0[28];
7018
7019
    // stage 6
7020
0
    bf0     = output;
7021
0
    bf1     = step;
7022
0
    bf1[0]  = bf0[0];
7023
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
7024
0
    bf1[8]  = bf0[8] + bf0[9];
7025
0
    bf1[11] = bf0[11] + bf0[10];
7026
0
    bf1[12] = bf0[12] + bf0[13];
7027
0
    bf1[15] = bf0[15] + bf0[14];
7028
0
    bf1[16] = bf0[16];
7029
0
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
7030
0
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
7031
0
    bf1[19] = bf0[19];
7032
0
    bf1[20] = bf0[20];
7033
0
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
7034
0
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
7035
0
    bf1[23] = bf0[23];
7036
0
    bf1[24] = bf0[24];
7037
0
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
7038
0
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
7039
0
    bf1[27] = bf0[27];
7040
0
    bf1[28] = bf0[28];
7041
0
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
7042
0
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
7043
0
    bf1[31] = bf0[31];
7044
7045
    // stage 7
7046
0
    bf0     = step;
7047
0
    bf1     = output;
7048
0
    bf1[0]  = bf0[0];
7049
0
    bf1[4]  = bf0[4];
7050
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
7051
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
7052
0
    bf1[16] = bf0[16] + bf0[17];
7053
0
    bf1[19] = bf0[19] + bf0[18];
7054
0
    bf1[20] = bf0[20] + bf0[21];
7055
0
    bf1[23] = bf0[23] + bf0[22];
7056
0
    bf1[24] = bf0[24] + bf0[25];
7057
0
    bf1[27] = bf0[27] + bf0[26];
7058
0
    bf1[28] = bf0[28] + bf0[29];
7059
0
    bf1[31] = bf0[31] + bf0[30];
7060
7061
    // stage 8
7062
0
    bf0     = output;
7063
0
    bf1     = step;
7064
0
    bf1[0]  = bf0[0];
7065
0
    bf1[4]  = bf0[4];
7066
0
    bf1[8]  = bf0[8];
7067
0
    bf1[12] = bf0[12];
7068
0
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
7069
0
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
7070
0
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
7071
0
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
7072
7073
    // stage 9
7074
0
    bf0    = step;
7075
0
    bf1    = output;
7076
0
    bf1[0] = bf0[0];
7077
0
    bf1[1] = bf0[16];
7078
0
    bf1[2] = bf0[8];
7079
0
    bf1[3] = bf0[24];
7080
0
    bf1[4] = bf0[4];
7081
0
    bf1[5] = bf0[20];
7082
0
    bf1[6] = bf0[12];
7083
0
    bf1[7] = bf0[28];
7084
0
}
7085
7086
0
void svt_av1_fidentity32_N4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
7087
0
    (void)stage_range;
7088
0
    (void)cos_bit;
7089
0
    for (int32_t i = 0; i < 8; ++i) {
7090
0
        output[i] = input[i] * 4;
7091
0
    }
7092
0
}
7093
7094
0
void svt_av1_fdct64_new_N4(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
7095
0
    (void)stage_range;
7096
0
    const int32_t* cospi;
7097
7098
0
    int32_t *bf0, *bf1;
7099
0
    int32_t  step[64];
7100
7101
    // stage 0;
7102
7103
    // stage 1;
7104
0
    bf1     = output;
7105
0
    bf1[0]  = input[0] + input[63];
7106
0
    bf1[1]  = input[1] + input[62];
7107
0
    bf1[2]  = input[2] + input[61];
7108
0
    bf1[3]  = input[3] + input[60];
7109
0
    bf1[4]  = input[4] + input[59];
7110
0
    bf1[5]  = input[5] + input[58];
7111
0
    bf1[6]  = input[6] + input[57];
7112
0
    bf1[7]  = input[7] + input[56];
7113
0
    bf1[8]  = input[8] + input[55];
7114
0
    bf1[9]  = input[9] + input[54];
7115
0
    bf1[10] = input[10] + input[53];
7116
0
    bf1[11] = input[11] + input[52];
7117
0
    bf1[12] = input[12] + input[51];
7118
0
    bf1[13] = input[13] + input[50];
7119
0
    bf1[14] = input[14] + input[49];
7120
0
    bf1[15] = input[15] + input[48];
7121
0
    bf1[16] = input[16] + input[47];
7122
0
    bf1[17] = input[17] + input[46];
7123
0
    bf1[18] = input[18] + input[45];
7124
0
    bf1[19] = input[19] + input[44];
7125
0
    bf1[20] = input[20] + input[43];
7126
0
    bf1[21] = input[21] + input[42];
7127
0
    bf1[22] = input[22] + input[41];
7128
0
    bf1[23] = input[23] + input[40];
7129
0
    bf1[24] = input[24] + input[39];
7130
0
    bf1[25] = input[25] + input[38];
7131
0
    bf1[26] = input[26] + input[37];
7132
0
    bf1[27] = input[27] + input[36];
7133
0
    bf1[28] = input[28] + input[35];
7134
0
    bf1[29] = input[29] + input[34];
7135
0
    bf1[30] = input[30] + input[33];
7136
0
    bf1[31] = input[31] + input[32];
7137
0
    bf1[32] = -input[32] + input[31];
7138
0
    bf1[33] = -input[33] + input[30];
7139
0
    bf1[34] = -input[34] + input[29];
7140
0
    bf1[35] = -input[35] + input[28];
7141
0
    bf1[36] = -input[36] + input[27];
7142
0
    bf1[37] = -input[37] + input[26];
7143
0
    bf1[38] = -input[38] + input[25];
7144
0
    bf1[39] = -input[39] + input[24];
7145
0
    bf1[40] = -input[40] + input[23];
7146
0
    bf1[41] = -input[41] + input[22];
7147
0
    bf1[42] = -input[42] + input[21];
7148
0
    bf1[43] = -input[43] + input[20];
7149
0
    bf1[44] = -input[44] + input[19];
7150
0
    bf1[45] = -input[45] + input[18];
7151
0
    bf1[46] = -input[46] + input[17];
7152
0
    bf1[47] = -input[47] + input[16];
7153
0
    bf1[48] = -input[48] + input[15];
7154
0
    bf1[49] = -input[49] + input[14];
7155
0
    bf1[50] = -input[50] + input[13];
7156
0
    bf1[51] = -input[51] + input[12];
7157
0
    bf1[52] = -input[52] + input[11];
7158
0
    bf1[53] = -input[53] + input[10];
7159
0
    bf1[54] = -input[54] + input[9];
7160
0
    bf1[55] = -input[55] + input[8];
7161
0
    bf1[56] = -input[56] + input[7];
7162
0
    bf1[57] = -input[57] + input[6];
7163
0
    bf1[58] = -input[58] + input[5];
7164
0
    bf1[59] = -input[59] + input[4];
7165
0
    bf1[60] = -input[60] + input[3];
7166
0
    bf1[61] = -input[61] + input[2];
7167
0
    bf1[62] = -input[62] + input[1];
7168
0
    bf1[63] = -input[63] + input[0];
7169
7170
    // stage 2
7171
0
    cospi   = cospi_arr(cos_bit);
7172
0
    bf0     = output;
7173
0
    bf1     = step;
7174
0
    bf1[0]  = bf0[0] + bf0[31];
7175
0
    bf1[1]  = bf0[1] + bf0[30];
7176
0
    bf1[2]  = bf0[2] + bf0[29];
7177
0
    bf1[3]  = bf0[3] + bf0[28];
7178
0
    bf1[4]  = bf0[4] + bf0[27];
7179
0
    bf1[5]  = bf0[5] + bf0[26];
7180
0
    bf1[6]  = bf0[6] + bf0[25];
7181
0
    bf1[7]  = bf0[7] + bf0[24];
7182
0
    bf1[8]  = bf0[8] + bf0[23];
7183
0
    bf1[9]  = bf0[9] + bf0[22];
7184
0
    bf1[10] = bf0[10] + bf0[21];
7185
0
    bf1[11] = bf0[11] + bf0[20];
7186
0
    bf1[12] = bf0[12] + bf0[19];
7187
0
    bf1[13] = bf0[13] + bf0[18];
7188
0
    bf1[14] = bf0[14] + bf0[17];
7189
0
    bf1[15] = bf0[15] + bf0[16];
7190
0
    bf1[16] = -bf0[16] + bf0[15];
7191
0
    bf1[17] = -bf0[17] + bf0[14];
7192
0
    bf1[18] = -bf0[18] + bf0[13];
7193
0
    bf1[19] = -bf0[19] + bf0[12];
7194
0
    bf1[20] = -bf0[20] + bf0[11];
7195
0
    bf1[21] = -bf0[21] + bf0[10];
7196
0
    bf1[22] = -bf0[22] + bf0[9];
7197
0
    bf1[23] = -bf0[23] + bf0[8];
7198
0
    bf1[24] = -bf0[24] + bf0[7];
7199
0
    bf1[25] = -bf0[25] + bf0[6];
7200
0
    bf1[26] = -bf0[26] + bf0[5];
7201
0
    bf1[27] = -bf0[27] + bf0[4];
7202
0
    bf1[28] = -bf0[28] + bf0[3];
7203
0
    bf1[29] = -bf0[29] + bf0[2];
7204
0
    bf1[30] = -bf0[30] + bf0[1];
7205
0
    bf1[31] = -bf0[31] + bf0[0];
7206
0
    bf1[32] = bf0[32];
7207
0
    bf1[33] = bf0[33];
7208
0
    bf1[34] = bf0[34];
7209
0
    bf1[35] = bf0[35];
7210
0
    bf1[36] = bf0[36];
7211
0
    bf1[37] = bf0[37];
7212
0
    bf1[38] = bf0[38];
7213
0
    bf1[39] = bf0[39];
7214
0
    bf1[40] = half_btf(-cospi[32], bf0[40], cospi[32], bf0[55], cos_bit);
7215
0
    bf1[41] = half_btf(-cospi[32], bf0[41], cospi[32], bf0[54], cos_bit);
7216
0
    bf1[42] = half_btf(-cospi[32], bf0[42], cospi[32], bf0[53], cos_bit);
7217
0
    bf1[43] = half_btf(-cospi[32], bf0[43], cospi[32], bf0[52], cos_bit);
7218
0
    bf1[44] = half_btf(-cospi[32], bf0[44], cospi[32], bf0[51], cos_bit);
7219
0
    bf1[45] = half_btf(-cospi[32], bf0[45], cospi[32], bf0[50], cos_bit);
7220
0
    bf1[46] = half_btf(-cospi[32], bf0[46], cospi[32], bf0[49], cos_bit);
7221
0
    bf1[47] = half_btf(-cospi[32], bf0[47], cospi[32], bf0[48], cos_bit);
7222
0
    bf1[48] = half_btf(cospi[32], bf0[48], cospi[32], bf0[47], cos_bit);
7223
0
    bf1[49] = half_btf(cospi[32], bf0[49], cospi[32], bf0[46], cos_bit);
7224
0
    bf1[50] = half_btf(cospi[32], bf0[50], cospi[32], bf0[45], cos_bit);
7225
0
    bf1[51] = half_btf(cospi[32], bf0[51], cospi[32], bf0[44], cos_bit);
7226
0
    bf1[52] = half_btf(cospi[32], bf0[52], cospi[32], bf0[43], cos_bit);
7227
0
    bf1[53] = half_btf(cospi[32], bf0[53], cospi[32], bf0[42], cos_bit);
7228
0
    bf1[54] = half_btf(cospi[32], bf0[54], cospi[32], bf0[41], cos_bit);
7229
0
    bf1[55] = half_btf(cospi[32], bf0[55], cospi[32], bf0[40], cos_bit);
7230
0
    bf1[56] = bf0[56];
7231
0
    bf1[57] = bf0[57];
7232
0
    bf1[58] = bf0[58];
7233
0
    bf1[59] = bf0[59];
7234
0
    bf1[60] = bf0[60];
7235
0
    bf1[61] = bf0[61];
7236
0
    bf1[62] = bf0[62];
7237
0
    bf1[63] = bf0[63];
7238
7239
    // stage 3
7240
0
    cospi   = cospi_arr(cos_bit);
7241
0
    bf0     = step;
7242
0
    bf1     = output;
7243
0
    bf1[0]  = bf0[0] + bf0[15];
7244
0
    bf1[1]  = bf0[1] + bf0[14];
7245
0
    bf1[2]  = bf0[2] + bf0[13];
7246
0
    bf1[3]  = bf0[3] + bf0[12];
7247
0
    bf1[4]  = bf0[4] + bf0[11];
7248
0
    bf1[5]  = bf0[5] + bf0[10];
7249
0
    bf1[6]  = bf0[6] + bf0[9];
7250
0
    bf1[7]  = bf0[7] + bf0[8];
7251
0
    bf1[8]  = -bf0[8] + bf0[7];
7252
0
    bf1[9]  = -bf0[9] + bf0[6];
7253
0
    bf1[10] = -bf0[10] + bf0[5];
7254
0
    bf1[11] = -bf0[11] + bf0[4];
7255
0
    bf1[12] = -bf0[12] + bf0[3];
7256
0
    bf1[13] = -bf0[13] + bf0[2];
7257
0
    bf1[14] = -bf0[14] + bf0[1];
7258
0
    bf1[15] = -bf0[15] + bf0[0];
7259
0
    bf1[16] = bf0[16];
7260
0
    bf1[17] = bf0[17];
7261
0
    bf1[18] = bf0[18];
7262
0
    bf1[19] = bf0[19];
7263
0
    bf1[20] = half_btf(-cospi[32], bf0[20], cospi[32], bf0[27], cos_bit);
7264
0
    bf1[21] = half_btf(-cospi[32], bf0[21], cospi[32], bf0[26], cos_bit);
7265
0
    bf1[22] = half_btf(-cospi[32], bf0[22], cospi[32], bf0[25], cos_bit);
7266
0
    bf1[23] = half_btf(-cospi[32], bf0[23], cospi[32], bf0[24], cos_bit);
7267
0
    bf1[24] = half_btf(cospi[32], bf0[24], cospi[32], bf0[23], cos_bit);
7268
0
    bf1[25] = half_btf(cospi[32], bf0[25], cospi[32], bf0[22], cos_bit);
7269
0
    bf1[26] = half_btf(cospi[32], bf0[26], cospi[32], bf0[21], cos_bit);
7270
0
    bf1[27] = half_btf(cospi[32], bf0[27], cospi[32], bf0[20], cos_bit);
7271
0
    bf1[28] = bf0[28];
7272
0
    bf1[29] = bf0[29];
7273
0
    bf1[30] = bf0[30];
7274
0
    bf1[31] = bf0[31];
7275
0
    bf1[32] = bf0[32] + bf0[47];
7276
0
    bf1[33] = bf0[33] + bf0[46];
7277
0
    bf1[34] = bf0[34] + bf0[45];
7278
0
    bf1[35] = bf0[35] + bf0[44];
7279
0
    bf1[36] = bf0[36] + bf0[43];
7280
0
    bf1[37] = bf0[37] + bf0[42];
7281
0
    bf1[38] = bf0[38] + bf0[41];
7282
0
    bf1[39] = bf0[39] + bf0[40];
7283
0
    bf1[40] = -bf0[40] + bf0[39];
7284
0
    bf1[41] = -bf0[41] + bf0[38];
7285
0
    bf1[42] = -bf0[42] + bf0[37];
7286
0
    bf1[43] = -bf0[43] + bf0[36];
7287
0
    bf1[44] = -bf0[44] + bf0[35];
7288
0
    bf1[45] = -bf0[45] + bf0[34];
7289
0
    bf1[46] = -bf0[46] + bf0[33];
7290
0
    bf1[47] = -bf0[47] + bf0[32];
7291
0
    bf1[48] = -bf0[48] + bf0[63];
7292
0
    bf1[49] = -bf0[49] + bf0[62];
7293
0
    bf1[50] = -bf0[50] + bf0[61];
7294
0
    bf1[51] = -bf0[51] + bf0[60];
7295
0
    bf1[52] = -bf0[52] + bf0[59];
7296
0
    bf1[53] = -bf0[53] + bf0[58];
7297
0
    bf1[54] = -bf0[54] + bf0[57];
7298
0
    bf1[55] = -bf0[55] + bf0[56];
7299
0
    bf1[56] = bf0[56] + bf0[55];
7300
0
    bf1[57] = bf0[57] + bf0[54];
7301
0
    bf1[58] = bf0[58] + bf0[53];
7302
0
    bf1[59] = bf0[59] + bf0[52];
7303
0
    bf1[60] = bf0[60] + bf0[51];
7304
0
    bf1[61] = bf0[61] + bf0[50];
7305
0
    bf1[62] = bf0[62] + bf0[49];
7306
0
    bf1[63] = bf0[63] + bf0[48];
7307
7308
    // stage 4
7309
0
    cospi   = cospi_arr(cos_bit);
7310
0
    bf0     = output;
7311
0
    bf1     = step;
7312
0
    bf1[0]  = bf0[0] + bf0[7];
7313
0
    bf1[1]  = bf0[1] + bf0[6];
7314
0
    bf1[2]  = bf0[2] + bf0[5];
7315
0
    bf1[3]  = bf0[3] + bf0[4];
7316
0
    bf1[4]  = -bf0[4] + bf0[3];
7317
0
    bf1[5]  = -bf0[5] + bf0[2];
7318
0
    bf1[6]  = -bf0[6] + bf0[1];
7319
0
    bf1[7]  = -bf0[7] + bf0[0];
7320
0
    bf1[8]  = bf0[8];
7321
0
    bf1[9]  = bf0[9];
7322
0
    bf1[10] = half_btf(-cospi[32], bf0[10], cospi[32], bf0[13], cos_bit);
7323
0
    bf1[11] = half_btf(-cospi[32], bf0[11], cospi[32], bf0[12], cos_bit);
7324
0
    bf1[12] = half_btf(cospi[32], bf0[12], cospi[32], bf0[11], cos_bit);
7325
0
    bf1[13] = half_btf(cospi[32], bf0[13], cospi[32], bf0[10], cos_bit);
7326
0
    bf1[14] = bf0[14];
7327
0
    bf1[15] = bf0[15];
7328
0
    bf1[16] = bf0[16] + bf0[23];
7329
0
    bf1[17] = bf0[17] + bf0[22];
7330
0
    bf1[18] = bf0[18] + bf0[21];
7331
0
    bf1[19] = bf0[19] + bf0[20];
7332
0
    bf1[20] = -bf0[20] + bf0[19];
7333
0
    bf1[21] = -bf0[21] + bf0[18];
7334
0
    bf1[22] = -bf0[22] + bf0[17];
7335
0
    bf1[23] = -bf0[23] + bf0[16];
7336
0
    bf1[24] = -bf0[24] + bf0[31];
7337
0
    bf1[25] = -bf0[25] + bf0[30];
7338
0
    bf1[26] = -bf0[26] + bf0[29];
7339
0
    bf1[27] = -bf0[27] + bf0[28];
7340
0
    bf1[28] = bf0[28] + bf0[27];
7341
0
    bf1[29] = bf0[29] + bf0[26];
7342
0
    bf1[30] = bf0[30] + bf0[25];
7343
0
    bf1[31] = bf0[31] + bf0[24];
7344
0
    bf1[32] = bf0[32];
7345
0
    bf1[33] = bf0[33];
7346
0
    bf1[34] = bf0[34];
7347
0
    bf1[35] = bf0[35];
7348
0
    bf1[36] = half_btf(-cospi[16], bf0[36], cospi[48], bf0[59], cos_bit);
7349
0
    bf1[37] = half_btf(-cospi[16], bf0[37], cospi[48], bf0[58], cos_bit);
7350
0
    bf1[38] = half_btf(-cospi[16], bf0[38], cospi[48], bf0[57], cos_bit);
7351
0
    bf1[39] = half_btf(-cospi[16], bf0[39], cospi[48], bf0[56], cos_bit);
7352
0
    bf1[40] = half_btf(-cospi[48], bf0[40], -cospi[16], bf0[55], cos_bit);
7353
0
    bf1[41] = half_btf(-cospi[48], bf0[41], -cospi[16], bf0[54], cos_bit);
7354
0
    bf1[42] = half_btf(-cospi[48], bf0[42], -cospi[16], bf0[53], cos_bit);
7355
0
    bf1[43] = half_btf(-cospi[48], bf0[43], -cospi[16], bf0[52], cos_bit);
7356
0
    bf1[44] = bf0[44];
7357
0
    bf1[45] = bf0[45];
7358
0
    bf1[46] = bf0[46];
7359
0
    bf1[47] = bf0[47];
7360
0
    bf1[48] = bf0[48];
7361
0
    bf1[49] = bf0[49];
7362
0
    bf1[50] = bf0[50];
7363
0
    bf1[51] = bf0[51];
7364
0
    bf1[52] = half_btf(cospi[48], bf0[52], -cospi[16], bf0[43], cos_bit);
7365
0
    bf1[53] = half_btf(cospi[48], bf0[53], -cospi[16], bf0[42], cos_bit);
7366
0
    bf1[54] = half_btf(cospi[48], bf0[54], -cospi[16], bf0[41], cos_bit);
7367
0
    bf1[55] = half_btf(cospi[48], bf0[55], -cospi[16], bf0[40], cos_bit);
7368
0
    bf1[56] = half_btf(cospi[16], bf0[56], cospi[48], bf0[39], cos_bit);
7369
0
    bf1[57] = half_btf(cospi[16], bf0[57], cospi[48], bf0[38], cos_bit);
7370
0
    bf1[58] = half_btf(cospi[16], bf0[58], cospi[48], bf0[37], cos_bit);
7371
0
    bf1[59] = half_btf(cospi[16], bf0[59], cospi[48], bf0[36], cos_bit);
7372
0
    bf1[60] = bf0[60];
7373
0
    bf1[61] = bf0[61];
7374
0
    bf1[62] = bf0[62];
7375
0
    bf1[63] = bf0[63];
7376
7377
    // stage 5
7378
0
    cospi   = cospi_arr(cos_bit);
7379
0
    bf0     = step;
7380
0
    bf1     = output;
7381
0
    bf1[0]  = bf0[0] + bf0[3];
7382
0
    bf1[1]  = bf0[1] + bf0[2];
7383
0
    bf1[4]  = bf0[4];
7384
0
    bf1[5]  = half_btf(-cospi[32], bf0[5], cospi[32], bf0[6], cos_bit);
7385
0
    bf1[6]  = half_btf(cospi[32], bf0[6], cospi[32], bf0[5], cos_bit);
7386
0
    bf1[7]  = bf0[7];
7387
0
    bf1[8]  = bf0[8] + bf0[11];
7388
0
    bf1[9]  = bf0[9] + bf0[10];
7389
0
    bf1[10] = -bf0[10] + bf0[9];
7390
0
    bf1[11] = -bf0[11] + bf0[8];
7391
0
    bf1[12] = -bf0[12] + bf0[15];
7392
0
    bf1[13] = -bf0[13] + bf0[14];
7393
0
    bf1[14] = bf0[14] + bf0[13];
7394
0
    bf1[15] = bf0[15] + bf0[12];
7395
0
    bf1[16] = bf0[16];
7396
0
    bf1[17] = bf0[17];
7397
0
    bf1[18] = half_btf(-cospi[16], bf0[18], cospi[48], bf0[29], cos_bit);
7398
0
    bf1[19] = half_btf(-cospi[16], bf0[19], cospi[48], bf0[28], cos_bit);
7399
0
    bf1[20] = half_btf(-cospi[48], bf0[20], -cospi[16], bf0[27], cos_bit);
7400
0
    bf1[21] = half_btf(-cospi[48], bf0[21], -cospi[16], bf0[26], cos_bit);
7401
0
    bf1[22] = bf0[22];
7402
0
    bf1[23] = bf0[23];
7403
0
    bf1[24] = bf0[24];
7404
0
    bf1[25] = bf0[25];
7405
0
    bf1[26] = half_btf(cospi[48], bf0[26], -cospi[16], bf0[21], cos_bit);
7406
0
    bf1[27] = half_btf(cospi[48], bf0[27], -cospi[16], bf0[20], cos_bit);
7407
0
    bf1[28] = half_btf(cospi[16], bf0[28], cospi[48], bf0[19], cos_bit);
7408
0
    bf1[29] = half_btf(cospi[16], bf0[29], cospi[48], bf0[18], cos_bit);
7409
0
    bf1[30] = bf0[30];
7410
0
    bf1[31] = bf0[31];
7411
0
    bf1[32] = bf0[32] + bf0[39];
7412
0
    bf1[33] = bf0[33] + bf0[38];
7413
0
    bf1[34] = bf0[34] + bf0[37];
7414
0
    bf1[35] = bf0[35] + bf0[36];
7415
0
    bf1[36] = -bf0[36] + bf0[35];
7416
0
    bf1[37] = -bf0[37] + bf0[34];
7417
0
    bf1[38] = -bf0[38] + bf0[33];
7418
0
    bf1[39] = -bf0[39] + bf0[32];
7419
0
    bf1[40] = -bf0[40] + bf0[47];
7420
0
    bf1[41] = -bf0[41] + bf0[46];
7421
0
    bf1[42] = -bf0[42] + bf0[45];
7422
0
    bf1[43] = -bf0[43] + bf0[44];
7423
0
    bf1[44] = bf0[44] + bf0[43];
7424
0
    bf1[45] = bf0[45] + bf0[42];
7425
0
    bf1[46] = bf0[46] + bf0[41];
7426
0
    bf1[47] = bf0[47] + bf0[40];
7427
0
    bf1[48] = bf0[48] + bf0[55];
7428
0
    bf1[49] = bf0[49] + bf0[54];
7429
0
    bf1[50] = bf0[50] + bf0[53];
7430
0
    bf1[51] = bf0[51] + bf0[52];
7431
0
    bf1[52] = -bf0[52] + bf0[51];
7432
0
    bf1[53] = -bf0[53] + bf0[50];
7433
0
    bf1[54] = -bf0[54] + bf0[49];
7434
0
    bf1[55] = -bf0[55] + bf0[48];
7435
0
    bf1[56] = -bf0[56] + bf0[63];
7436
0
    bf1[57] = -bf0[57] + bf0[62];
7437
0
    bf1[58] = -bf0[58] + bf0[61];
7438
0
    bf1[59] = -bf0[59] + bf0[60];
7439
0
    bf1[60] = bf0[60] + bf0[59];
7440
0
    bf1[61] = bf0[61] + bf0[58];
7441
0
    bf1[62] = bf0[62] + bf0[57];
7442
0
    bf1[63] = bf0[63] + bf0[56];
7443
7444
    // stage 6
7445
0
    cospi   = cospi_arr(cos_bit);
7446
0
    bf0     = output;
7447
0
    bf1     = step;
7448
0
    bf1[0]  = half_btf(cospi[32], bf0[0], cospi[32], bf0[1], cos_bit);
7449
0
    bf1[4]  = bf0[4] + bf0[5];
7450
0
    bf1[7]  = bf0[7] + bf0[6];
7451
0
    bf1[8]  = bf0[8];
7452
0
    bf1[9]  = half_btf(-cospi[16], bf0[9], cospi[48], bf0[14], cos_bit);
7453
0
    bf1[10] = half_btf(-cospi[48], bf0[10], -cospi[16], bf0[13], cos_bit);
7454
0
    bf1[11] = bf0[11];
7455
0
    bf1[12] = bf0[12];
7456
0
    bf1[13] = half_btf(cospi[48], bf0[13], -cospi[16], bf0[10], cos_bit);
7457
0
    bf1[14] = half_btf(cospi[16], bf0[14], cospi[48], bf0[9], cos_bit);
7458
0
    bf1[15] = bf0[15];
7459
0
    bf1[16] = bf0[16] + bf0[19];
7460
0
    bf1[17] = bf0[17] + bf0[18];
7461
0
    bf1[18] = -bf0[18] + bf0[17];
7462
0
    bf1[19] = -bf0[19] + bf0[16];
7463
0
    bf1[20] = -bf0[20] + bf0[23];
7464
0
    bf1[21] = -bf0[21] + bf0[22];
7465
0
    bf1[22] = bf0[22] + bf0[21];
7466
0
    bf1[23] = bf0[23] + bf0[20];
7467
0
    bf1[24] = bf0[24] + bf0[27];
7468
0
    bf1[25] = bf0[25] + bf0[26];
7469
0
    bf1[26] = -bf0[26] + bf0[25];
7470
0
    bf1[27] = -bf0[27] + bf0[24];
7471
0
    bf1[28] = -bf0[28] + bf0[31];
7472
0
    bf1[29] = -bf0[29] + bf0[30];
7473
0
    bf1[30] = bf0[30] + bf0[29];
7474
0
    bf1[31] = bf0[31] + bf0[28];
7475
0
    bf1[32] = bf0[32];
7476
0
    bf1[33] = bf0[33];
7477
0
    bf1[34] = half_btf(-cospi[8], bf0[34], cospi[56], bf0[61], cos_bit);
7478
0
    bf1[35] = half_btf(-cospi[8], bf0[35], cospi[56], bf0[60], cos_bit);
7479
0
    bf1[36] = half_btf(-cospi[56], bf0[36], -cospi[8], bf0[59], cos_bit);
7480
0
    bf1[37] = half_btf(-cospi[56], bf0[37], -cospi[8], bf0[58], cos_bit);
7481
0
    bf1[38] = bf0[38];
7482
0
    bf1[39] = bf0[39];
7483
0
    bf1[40] = bf0[40];
7484
0
    bf1[41] = bf0[41];
7485
0
    bf1[42] = half_btf(-cospi[40], bf0[42], cospi[24], bf0[53], cos_bit);
7486
0
    bf1[43] = half_btf(-cospi[40], bf0[43], cospi[24], bf0[52], cos_bit);
7487
0
    bf1[44] = half_btf(-cospi[24], bf0[44], -cospi[40], bf0[51], cos_bit);
7488
0
    bf1[45] = half_btf(-cospi[24], bf0[45], -cospi[40], bf0[50], cos_bit);
7489
0
    bf1[46] = bf0[46];
7490
0
    bf1[47] = bf0[47];
7491
0
    bf1[48] = bf0[48];
7492
0
    bf1[49] = bf0[49];
7493
0
    bf1[50] = half_btf(cospi[24], bf0[50], -cospi[40], bf0[45], cos_bit);
7494
0
    bf1[51] = half_btf(cospi[24], bf0[51], -cospi[40], bf0[44], cos_bit);
7495
0
    bf1[52] = half_btf(cospi[40], bf0[52], cospi[24], bf0[43], cos_bit);
7496
0
    bf1[53] = half_btf(cospi[40], bf0[53], cospi[24], bf0[42], cos_bit);
7497
0
    bf1[54] = bf0[54];
7498
0
    bf1[55] = bf0[55];
7499
0
    bf1[56] = bf0[56];
7500
0
    bf1[57] = bf0[57];
7501
0
    bf1[58] = half_btf(cospi[56], bf0[58], -cospi[8], bf0[37], cos_bit);
7502
0
    bf1[59] = half_btf(cospi[56], bf0[59], -cospi[8], bf0[36], cos_bit);
7503
0
    bf1[60] = half_btf(cospi[8], bf0[60], cospi[56], bf0[35], cos_bit);
7504
0
    bf1[61] = half_btf(cospi[8], bf0[61], cospi[56], bf0[34], cos_bit);
7505
0
    bf1[62] = bf0[62];
7506
0
    bf1[63] = bf0[63];
7507
7508
    // stage 7
7509
0
    cospi   = cospi_arr(cos_bit);
7510
0
    bf0     = step;
7511
0
    bf1     = output;
7512
0
    bf1[0]  = bf0[0];
7513
0
    bf1[4]  = half_btf(cospi[56], bf0[4], cospi[8], bf0[7], cos_bit);
7514
0
    bf1[8]  = bf0[8] + bf0[9];
7515
0
    bf1[11] = bf0[11] + bf0[10];
7516
0
    bf1[12] = bf0[12] + bf0[13];
7517
0
    bf1[15] = bf0[15] + bf0[14];
7518
0
    bf1[16] = bf0[16];
7519
0
    bf1[17] = half_btf(-cospi[8], bf0[17], cospi[56], bf0[30], cos_bit);
7520
0
    bf1[18] = half_btf(-cospi[56], bf0[18], -cospi[8], bf0[29], cos_bit);
7521
0
    bf1[19] = bf0[19];
7522
0
    bf1[20] = bf0[20];
7523
0
    bf1[21] = half_btf(-cospi[40], bf0[21], cospi[24], bf0[26], cos_bit);
7524
0
    bf1[22] = half_btf(-cospi[24], bf0[22], -cospi[40], bf0[25], cos_bit);
7525
0
    bf1[23] = bf0[23];
7526
0
    bf1[24] = bf0[24];
7527
0
    bf1[25] = half_btf(cospi[24], bf0[25], -cospi[40], bf0[22], cos_bit);
7528
0
    bf1[26] = half_btf(cospi[40], bf0[26], cospi[24], bf0[21], cos_bit);
7529
0
    bf1[27] = bf0[27];
7530
0
    bf1[28] = bf0[28];
7531
0
    bf1[29] = half_btf(cospi[56], bf0[29], -cospi[8], bf0[18], cos_bit);
7532
0
    bf1[30] = half_btf(cospi[8], bf0[30], cospi[56], bf0[17], cos_bit);
7533
0
    bf1[31] = bf0[31];
7534
0
    bf1[32] = bf0[32] + bf0[35];
7535
0
    bf1[33] = bf0[33] + bf0[34];
7536
0
    bf1[34] = -bf0[34] + bf0[33];
7537
0
    bf1[35] = -bf0[35] + bf0[32];
7538
0
    bf1[36] = -bf0[36] + bf0[39];
7539
0
    bf1[37] = -bf0[37] + bf0[38];
7540
0
    bf1[38] = bf0[38] + bf0[37];
7541
0
    bf1[39] = bf0[39] + bf0[36];
7542
0
    bf1[40] = bf0[40] + bf0[43];
7543
0
    bf1[41] = bf0[41] + bf0[42];
7544
0
    bf1[42] = -bf0[42] + bf0[41];
7545
0
    bf1[43] = -bf0[43] + bf0[40];
7546
0
    bf1[44] = -bf0[44] + bf0[47];
7547
0
    bf1[45] = -bf0[45] + bf0[46];
7548
0
    bf1[46] = bf0[46] + bf0[45];
7549
0
    bf1[47] = bf0[47] + bf0[44];
7550
0
    bf1[48] = bf0[48] + bf0[51];
7551
0
    bf1[49] = bf0[49] + bf0[50];
7552
0
    bf1[50] = -bf0[50] + bf0[49];
7553
0
    bf1[51] = -bf0[51] + bf0[48];
7554
0
    bf1[52] = -bf0[52] + bf0[55];
7555
0
    bf1[53] = -bf0[53] + bf0[54];
7556
0
    bf1[54] = bf0[54] + bf0[53];
7557
0
    bf1[55] = bf0[55] + bf0[52];
7558
0
    bf1[56] = bf0[56] + bf0[59];
7559
0
    bf1[57] = bf0[57] + bf0[58];
7560
0
    bf1[58] = -bf0[58] + bf0[57];
7561
0
    bf1[59] = -bf0[59] + bf0[56];
7562
0
    bf1[60] = -bf0[60] + bf0[63];
7563
0
    bf1[61] = -bf0[61] + bf0[62];
7564
0
    bf1[62] = bf0[62] + bf0[61];
7565
0
    bf1[63] = bf0[63] + bf0[60];
7566
7567
    // stage 8
7568
0
    cospi   = cospi_arr(cos_bit);
7569
0
    bf0     = output;
7570
0
    bf1     = step;
7571
0
    bf1[0]  = bf0[0];
7572
0
    bf1[4]  = bf0[4];
7573
0
    bf1[8]  = half_btf(cospi[60], bf0[8], cospi[4], bf0[15], cos_bit);
7574
0
    bf1[12] = half_btf(cospi[12], bf0[12], -cospi[52], bf0[11], cos_bit);
7575
0
    bf1[16] = bf0[16] + bf0[17];
7576
0
    bf1[19] = bf0[19] + bf0[18];
7577
0
    bf1[20] = bf0[20] + bf0[21];
7578
0
    bf1[23] = bf0[23] + bf0[22];
7579
0
    bf1[24] = bf0[24] + bf0[25];
7580
0
    bf1[27] = bf0[27] + bf0[26];
7581
0
    bf1[28] = bf0[28] + bf0[29];
7582
0
    bf1[31] = bf0[31] + bf0[30];
7583
0
    bf1[32] = bf0[32];
7584
0
    bf1[33] = half_btf(-cospi[4], bf0[33], cospi[60], bf0[62], cos_bit);
7585
0
    bf1[34] = half_btf(-cospi[60], bf0[34], -cospi[4], bf0[61], cos_bit);
7586
0
    bf1[35] = bf0[35];
7587
0
    bf1[36] = bf0[36];
7588
0
    bf1[37] = half_btf(-cospi[36], bf0[37], cospi[28], bf0[58], cos_bit);
7589
0
    bf1[38] = half_btf(-cospi[28], bf0[38], -cospi[36], bf0[57], cos_bit);
7590
0
    bf1[39] = bf0[39];
7591
0
    bf1[40] = bf0[40];
7592
0
    bf1[41] = half_btf(-cospi[20], bf0[41], cospi[44], bf0[54], cos_bit);
7593
0
    bf1[42] = half_btf(-cospi[44], bf0[42], -cospi[20], bf0[53], cos_bit);
7594
0
    bf1[43] = bf0[43];
7595
0
    bf1[44] = bf0[44];
7596
0
    bf1[45] = half_btf(-cospi[52], bf0[45], cospi[12], bf0[50], cos_bit);
7597
0
    bf1[46] = half_btf(-cospi[12], bf0[46], -cospi[52], bf0[49], cos_bit);
7598
0
    bf1[47] = bf0[47];
7599
0
    bf1[48] = bf0[48];
7600
0
    bf1[49] = half_btf(cospi[12], bf0[49], -cospi[52], bf0[46], cos_bit);
7601
0
    bf1[50] = half_btf(cospi[52], bf0[50], cospi[12], bf0[45], cos_bit);
7602
0
    bf1[51] = bf0[51];
7603
0
    bf1[52] = bf0[52];
7604
0
    bf1[53] = half_btf(cospi[44], bf0[53], -cospi[20], bf0[42], cos_bit);
7605
0
    bf1[54] = half_btf(cospi[20], bf0[54], cospi[44], bf0[41], cos_bit);
7606
0
    bf1[55] = bf0[55];
7607
0
    bf1[56] = bf0[56];
7608
0
    bf1[57] = half_btf(cospi[28], bf0[57], -cospi[36], bf0[38], cos_bit);
7609
0
    bf1[58] = half_btf(cospi[36], bf0[58], cospi[28], bf0[37], cos_bit);
7610
0
    bf1[59] = bf0[59];
7611
0
    bf1[60] = bf0[60];
7612
0
    bf1[61] = half_btf(cospi[60], bf0[61], -cospi[4], bf0[34], cos_bit);
7613
0
    bf1[62] = half_btf(cospi[4], bf0[62], cospi[60], bf0[33], cos_bit);
7614
0
    bf1[63] = bf0[63];
7615
7616
    // stage 9
7617
0
    cospi   = cospi_arr(cos_bit);
7618
0
    bf0     = step;
7619
0
    bf1     = output;
7620
0
    bf1[0]  = bf0[0];
7621
0
    bf1[4]  = bf0[4];
7622
0
    bf1[8]  = bf0[8];
7623
0
    bf1[12] = bf0[12];
7624
0
    bf1[16] = half_btf(cospi[62], bf0[16], cospi[2], bf0[31], cos_bit);
7625
0
    bf1[20] = half_btf(cospi[54], bf0[20], cospi[10], bf0[27], cos_bit);
7626
0
    bf1[24] = half_btf(cospi[6], bf0[24], -cospi[58], bf0[23], cos_bit);
7627
0
    bf1[28] = half_btf(cospi[14], bf0[28], -cospi[50], bf0[19], cos_bit);
7628
0
    bf1[32] = bf0[32] + bf0[33];
7629
0
    bf1[35] = bf0[35] + bf0[34];
7630
0
    bf1[36] = bf0[36] + bf0[37];
7631
0
    bf1[39] = bf0[39] + bf0[38];
7632
0
    bf1[40] = bf0[40] + bf0[41];
7633
0
    bf1[43] = bf0[43] + bf0[42];
7634
0
    bf1[44] = bf0[44] + bf0[45];
7635
0
    bf1[47] = bf0[47] + bf0[46];
7636
0
    bf1[48] = bf0[48] + bf0[49];
7637
0
    bf1[51] = bf0[51] + bf0[50];
7638
0
    bf1[52] = bf0[52] + bf0[53];
7639
0
    bf1[55] = bf0[55] + bf0[54];
7640
0
    bf1[56] = bf0[56] + bf0[57];
7641
0
    bf1[59] = bf0[59] + bf0[58];
7642
0
    bf1[60] = bf0[60] + bf0[61];
7643
0
    bf1[63] = bf0[63] + bf0[62];
7644
7645
    // stage 10
7646
0
    cospi   = cospi_arr(cos_bit);
7647
0
    bf0     = output;
7648
0
    bf1     = step;
7649
0
    bf1[0]  = bf0[0];
7650
0
    bf1[4]  = bf0[4];
7651
0
    bf1[8]  = bf0[8];
7652
0
    bf1[12] = bf0[12];
7653
0
    bf1[16] = bf0[16];
7654
0
    bf1[20] = bf0[20];
7655
0
    bf1[24] = bf0[24];
7656
0
    bf1[28] = bf0[28];
7657
0
    bf1[32] = half_btf(cospi[63], bf0[32], cospi[1], bf0[63], cos_bit);
7658
0
    bf1[36] = half_btf(cospi[55], bf0[36], cospi[9], bf0[59], cos_bit);
7659
0
    bf1[40] = half_btf(cospi[59], bf0[40], cospi[5], bf0[55], cos_bit);
7660
0
    bf1[44] = half_btf(cospi[51], bf0[44], cospi[13], bf0[51], cos_bit);
7661
0
    bf1[48] = half_btf(cospi[3], bf0[48], -cospi[61], bf0[47], cos_bit);
7662
0
    bf1[52] = half_btf(cospi[11], bf0[52], -cospi[53], bf0[43], cos_bit);
7663
0
    bf1[56] = half_btf(cospi[7], bf0[56], -cospi[57], bf0[39], cos_bit);
7664
0
    bf1[60] = half_btf(cospi[15], bf0[60], -cospi[49], bf0[35], cos_bit);
7665
7666
    // stage 11
7667
0
    bf0     = step;
7668
0
    bf1     = output;
7669
0
    bf1[0]  = bf0[0];
7670
0
    bf1[1]  = bf0[32];
7671
0
    bf1[2]  = bf0[16];
7672
0
    bf1[3]  = bf0[48];
7673
0
    bf1[4]  = bf0[8];
7674
0
    bf1[5]  = bf0[40];
7675
0
    bf1[6]  = bf0[24];
7676
0
    bf1[7]  = bf0[56];
7677
0
    bf1[8]  = bf0[4];
7678
0
    bf1[9]  = bf0[36];
7679
0
    bf1[10] = bf0[20];
7680
0
    bf1[11] = bf0[52];
7681
0
    bf1[12] = bf0[12];
7682
0
    bf1[13] = bf0[44];
7683
0
    bf1[14] = bf0[28];
7684
0
    bf1[15] = bf0[60];
7685
0
}
7686
7687
0
static void av1_fidentity64_N4_c(const int32_t* input, int32_t* output, int8_t cos_bit, const int8_t* stage_range) {
7688
0
    (void)stage_range;
7689
0
    (void)cos_bit;
7690
0
    for (int32_t i = 0; i < 16; ++i) {
7691
0
        output[i] = round_shift((int64_t)input[i] * 4 * new_sqrt2, new_sqrt2_bits);
7692
0
    }
7693
0
    assert(stage_range[0] + new_sqrt2_bits <= 32);
7694
0
}
7695
7696
0
static INLINE TxfmFunc fwd_txfm_type_to_func_N4(TxfmType txfmtype) {
7697
0
    switch (txfmtype) {
7698
0
    case TXFM_TYPE_DCT4:
7699
0
        return svt_av1_fdct4_new_N4;
7700
0
    case TXFM_TYPE_DCT8:
7701
0
        return svt_av1_fdct8_new_N4;
7702
0
    case TXFM_TYPE_DCT16:
7703
0
        return svt_av1_fdct16_new_N4;
7704
0
    case TXFM_TYPE_DCT32:
7705
0
        return svt_av1_fdct32_new_N4;
7706
0
    case TXFM_TYPE_DCT64:
7707
0
        return svt_av1_fdct64_new_N4;
7708
0
    case TXFM_TYPE_ADST4:
7709
0
        return svt_av1_fadst4_new_N4;
7710
0
    case TXFM_TYPE_ADST8:
7711
0
        return svt_av1_fadst8_new_N4;
7712
0
    case TXFM_TYPE_ADST16:
7713
0
        return svt_av1_fadst16_new_N4;
7714
0
    case TXFM_TYPE_ADST32:
7715
0
        return av1_fadst32_new;
7716
0
    case TXFM_TYPE_IDENTITY4:
7717
0
        return svt_av1_fidentity4_N4_c;
7718
0
    case TXFM_TYPE_IDENTITY8:
7719
0
        return svt_av1_fidentity8_N4_c;
7720
0
    case TXFM_TYPE_IDENTITY16:
7721
0
        return svt_av1_fidentity16_N4_c;
7722
0
    case TXFM_TYPE_IDENTITY32:
7723
0
        return svt_av1_fidentity32_N4_c;
7724
0
    case TXFM_TYPE_IDENTITY64:
7725
0
        return av1_fidentity64_N4_c;
7726
0
    default:
7727
0
        assert(0);
7728
0
        return NULL;
7729
0
    }
7730
0
}
7731
7732
static INLINE void av1_tranform_two_d_core_N4_c(int16_t* input, uint32_t input_stride, int32_t* output,
7733
0
                                                const Txfm2dFlipCfg* cfg, int32_t* buf, uint8_t bit_depth) {
7734
0
    int32_t c, r;
7735
    // Note when assigning txfm_size_col, we use the txfm_size from the
7736
    // row configuration and vice versa. This is intentionally done to
7737
    // accurately perform rectangular transforms. When the transform is
7738
    // rectangular, the number of columns will be the same as the
7739
    // txfm_size stored in the row cfg struct. It will make no difference
7740
    // for square transforms.
7741
0
    const int32_t txfm_size_col = tx_size_wide[cfg->tx_size];
7742
0
    const int32_t txfm_size_row = tx_size_high[cfg->tx_size];
7743
    // Take the shift from the larger dimension in the rectangular case.
7744
0
    const int8_t* shift     = cfg->shift;
7745
0
    const int32_t rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
7746
0
    int8_t        stage_range_col[MAX_TXFM_STAGE_NUM];
7747
0
    int8_t        stage_range_row[MAX_TXFM_STAGE_NUM];
7748
0
    assert(cfg->stage_num_col <= MAX_TXFM_STAGE_NUM);
7749
0
    assert(cfg->stage_num_row <= MAX_TXFM_STAGE_NUM);
7750
0
    svt_av1_gen_fwd_stage_range(stage_range_col, stage_range_row, cfg, bit_depth);
7751
7752
0
    const int8_t   cos_bit_col   = cfg->cos_bit_col;
7753
0
    const int8_t   cos_bit_row   = cfg->cos_bit_row;
7754
0
    const TxfmFunc txfm_func_col = fwd_txfm_type_to_func_N4(cfg->txfm_type_col);
7755
0
    const TxfmFunc txfm_func_row = fwd_txfm_type_to_func_N4(cfg->txfm_type_row);
7756
0
    ASSERT(txfm_func_col != NULL);
7757
0
    ASSERT(txfm_func_row != NULL);
7758
    // use output buffer as temp buffer
7759
0
    int32_t* temp_in  = output;
7760
0
    int32_t* temp_out = output + txfm_size_row;
7761
7762
    // Columns
7763
0
    for (c = 0; c < txfm_size_col; ++c) {
7764
0
        if (cfg->ud_flip == 0) {
7765
0
            for (r = 0; r < txfm_size_row; ++r) {
7766
0
                temp_in[r] = input[r * input_stride + c];
7767
0
            }
7768
0
        } else {
7769
0
            for (r = 0; r < txfm_size_row; ++r) {
7770
                // flip upside down
7771
0
                temp_in[r] = input[(txfm_size_row - r - 1) * input_stride + c];
7772
0
            }
7773
0
        }
7774
0
        svt_av1_round_shift_array_c(temp_in, txfm_size_row, -shift[0]); // NM svt_av1_round_shift_array_c
7775
0
        txfm_func_col(temp_in, temp_out, cos_bit_col, stage_range_col);
7776
0
        svt_av1_round_shift_array_c(temp_out, txfm_size_row / 4, -shift[1]); // NM svt_av1_round_shift_array_c
7777
0
        if (cfg->lr_flip == 0) {
7778
0
            for (r = 0; r < txfm_size_row; ++r) {
7779
0
                buf[r * txfm_size_col + c] = temp_out[r];
7780
0
            }
7781
0
        } else {
7782
0
            for (r = 0; r < txfm_size_row; ++r) {
7783
                // flip from left to right
7784
0
                buf[r * txfm_size_col + (txfm_size_col - c - 1)] = temp_out[r];
7785
0
            }
7786
0
        }
7787
0
    }
7788
7789
    // Rows
7790
0
    for (r = 0; r < txfm_size_row / 4; ++r) {
7791
0
        txfm_func_row(buf + r * txfm_size_col, output + r * txfm_size_col, cos_bit_row, stage_range_row);
7792
0
        svt_av1_round_shift_array_c(output + r * txfm_size_col, txfm_size_col / 4, -shift[2]);
7793
7794
0
        if (abs(rect_type) == 1) {
7795
            // Multiply everything by Sqrt2 if the transform is rectangular and the
7796
            // size difference is a factor of 2.
7797
0
            for (c = 0; c < txfm_size_col / 4; ++c) {
7798
0
                output[r * txfm_size_col + c] = round_shift((int64_t)output[r * txfm_size_col + c] * new_sqrt2,
7799
0
                                                            new_sqrt2_bits);
7800
0
            }
7801
0
        }
7802
0
    }
7803
0
    for (int i = 0; i < (txfm_size_col * txfm_size_row); i++) {
7804
0
        if (i % txfm_size_col >= (txfm_size_col >> 2) || i / txfm_size_col >= (txfm_size_row >> 2)) {
7805
0
            output[i] = 0;
7806
0
        }
7807
0
    }
7808
0
}
7809
7810
void svt_aom_transform_two_d_64x64_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7811
0
                                        uint8_t bit_depth) {
7812
0
    int32_t       intermediate_transform_buffer[64 * 64];
7813
0
    Txfm2dFlipCfg cfg;
7814
0
    svt_aom_transform_config(transform_type, TX_64X64, &cfg);
7815
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7816
0
}
7817
7818
void svt_aom_transform_two_d_32x32_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7819
0
                                        uint8_t bit_depth) {
7820
0
    int32_t       intermediate_transform_buffer[32 * 32];
7821
0
    Txfm2dFlipCfg cfg;
7822
0
    svt_aom_transform_config(transform_type, TX_32X32, &cfg);
7823
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7824
0
}
7825
7826
void svt_aom_transform_two_d_16x16_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7827
0
                                        uint8_t bit_depth) {
7828
0
    int32_t       intermediate_transform_buffer[16 * 16];
7829
0
    Txfm2dFlipCfg cfg;
7830
0
    svt_aom_transform_config(transform_type, TX_16X16, &cfg);
7831
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7832
0
}
7833
7834
void svt_aom_transform_two_d_8x8_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7835
0
                                      uint8_t bit_depth) {
7836
0
    int32_t       intermediate_transform_buffer[8 * 8];
7837
0
    Txfm2dFlipCfg cfg;
7838
0
    svt_aom_transform_config(transform_type, TX_8X8, &cfg);
7839
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7840
0
}
7841
7842
void svt_aom_transform_two_d_4x4_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7843
0
                                      uint8_t bit_depth) {
7844
0
    int32_t       intermediate_transform_buffer[4 * 4];
7845
0
    Txfm2dFlipCfg cfg;
7846
0
    svt_aom_transform_config(transform_type, TX_4X4, &cfg);
7847
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7848
0
}
7849
7850
void svt_av1_fwd_txfm2d_64x32_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7851
0
                                   uint8_t bit_depth) {
7852
0
    int32_t       intermediate_transform_buffer[64 * 32];
7853
0
    Txfm2dFlipCfg cfg;
7854
0
    svt_aom_transform_config(transform_type, TX_64X32, &cfg);
7855
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7856
0
}
7857
7858
void svt_av1_fwd_txfm2d_32x64_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7859
0
                                   uint8_t bit_depth) {
7860
0
    int32_t       intermediate_transform_buffer[32 * 64];
7861
0
    Txfm2dFlipCfg cfg;
7862
0
    svt_aom_transform_config(transform_type, TX_32X64, &cfg);
7863
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7864
0
}
7865
7866
void svt_av1_fwd_txfm2d_64x16_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7867
0
                                   uint8_t bit_depth) {
7868
0
    int32_t       intermediate_transform_buffer[64 * 16];
7869
0
    Txfm2dFlipCfg cfg;
7870
0
    svt_aom_transform_config(transform_type, TX_64X16, &cfg);
7871
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7872
0
}
7873
7874
void svt_av1_fwd_txfm2d_16x64_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7875
0
                                   uint8_t bit_depth) {
7876
0
    int32_t       intermediate_transform_buffer[16 * 64];
7877
0
    Txfm2dFlipCfg cfg;
7878
0
    svt_aom_transform_config(transform_type, TX_16X64, &cfg);
7879
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7880
0
}
7881
7882
void svt_av1_fwd_txfm2d_32x16_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7883
0
                                   uint8_t bit_depth) {
7884
0
    int32_t       intermediate_transform_buffer[32 * 16];
7885
0
    Txfm2dFlipCfg cfg;
7886
0
    svt_aom_transform_config(transform_type, TX_32X16, &cfg);
7887
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7888
0
}
7889
7890
void svt_av1_fwd_txfm2d_16x32_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7891
0
                                   uint8_t bit_depth) {
7892
0
    int32_t       intermediate_transform_buffer[16 * 32];
7893
0
    Txfm2dFlipCfg cfg;
7894
0
    svt_aom_transform_config(transform_type, TX_16X32, &cfg);
7895
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7896
0
}
7897
7898
void svt_av1_fwd_txfm2d_16x8_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7899
0
                                  uint8_t bit_depth) {
7900
0
    int32_t       intermediate_transform_buffer[16 * 8];
7901
0
    Txfm2dFlipCfg cfg;
7902
0
    svt_aom_transform_config(transform_type, TX_16X8, &cfg);
7903
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7904
0
}
7905
7906
void svt_av1_fwd_txfm2d_8x16_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7907
0
                                  uint8_t bit_depth) {
7908
0
    int32_t       intermediate_transform_buffer[8 * 16];
7909
0
    Txfm2dFlipCfg cfg;
7910
0
    svt_aom_transform_config(transform_type, TX_8X16, &cfg);
7911
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7912
0
}
7913
7914
void svt_av1_fwd_txfm2d_32x8_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7915
0
                                  uint8_t bit_depth) {
7916
0
    int32_t       intermediate_transform_buffer[32 * 8];
7917
0
    Txfm2dFlipCfg cfg;
7918
0
    svt_aom_transform_config(transform_type, TX_32X8, &cfg);
7919
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7920
0
}
7921
7922
void svt_av1_fwd_txfm2d_8x32_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7923
0
                                  uint8_t bit_depth) {
7924
0
    int32_t       intermediate_transform_buffer[8 * 32];
7925
0
    Txfm2dFlipCfg cfg;
7926
0
    svt_aom_transform_config(transform_type, TX_8X32, &cfg);
7927
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7928
0
}
7929
7930
void svt_av1_fwd_txfm2d_16x4_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7931
0
                                  uint8_t bit_depth) {
7932
0
    int32_t       intermediate_transform_buffer[16 * 4];
7933
0
    Txfm2dFlipCfg cfg;
7934
0
    svt_aom_transform_config(transform_type, TX_16X4, &cfg);
7935
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7936
0
}
7937
7938
void svt_av1_fwd_txfm2d_4x16_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7939
0
                                  uint8_t bit_depth) {
7940
0
    int32_t       intermediate_transform_buffer[4 * 16];
7941
0
    Txfm2dFlipCfg cfg;
7942
0
    svt_aom_transform_config(transform_type, TX_4X16, &cfg);
7943
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7944
0
}
7945
7946
void svt_av1_fwd_txfm2d_8x4_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7947
0
                                 uint8_t bit_depth) {
7948
0
    int32_t       intermediate_transform_buffer[8 * 4];
7949
0
    Txfm2dFlipCfg cfg;
7950
0
    svt_aom_transform_config(transform_type, TX_8X4, &cfg);
7951
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7952
0
}
7953
7954
void svt_av1_fwd_txfm2d_4x8_N4_c(int16_t* input, int32_t* output, uint32_t input_stride, TxType transform_type,
7955
0
                                 uint8_t bit_depth) {
7956
0
    int32_t       intermediate_transform_buffer[4 * 8];
7957
0
    Txfm2dFlipCfg cfg;
7958
0
    svt_aom_transform_config(transform_type, TX_4X8, &cfg);
7959
0
    av1_tranform_two_d_core_N4_c(input, input_stride, output, &cfg, intermediate_transform_buffer, bit_depth);
7960
0
}