1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/*
19
20 Filename: dct64.c
21
22------------------------------------------------------------------------------
23 REVISION HISTORY
24
25
26 Who:                                   Date: MM/DD/YYYY
27 Description:
28
29------------------------------------------------------------------------------
30 INPUT AND OUTPUT DEFINITIONS
31
32    Int32 x             32-bit integer input length 64
33
34
35------------------------------------------------------------------------------
36 FUNCTION DESCRIPTION
37
38    Implement dct of lenght 64
39
40------------------------------------------------------------------------------
41 REQUIREMENTS
42
43
44------------------------------------------------------------------------------
45 REFERENCES
46
47------------------------------------------------------------------------------
48 PSEUDO-CODE
49
50------------------------------------------------------------------------------
51*/
52
53
54/*----------------------------------------------------------------------------
55; INCLUDES
56----------------------------------------------------------------------------*/
57
58#ifdef AAC_PLUS
59
60
61#include "dct16.h"
62#include "dct64.h"
63
64#include "pv_audio_type_defs.h"
65#include "synthesis_sub_band.h"
66
67#include "fxp_mul32.h"
68
69
70/*----------------------------------------------------------------------------
71; MACROS
72; Define module specific macros here
73----------------------------------------------------------------------------*/
74
75
76/*----------------------------------------------------------------------------
77; DEFINES
78; Include all pre-processor statements here. Include conditional
79; compile variables also.
80----------------------------------------------------------------------------*/
81
82#define Qfmt(a)   (Int32)(a*((Int32)1<<26) + (a>=0?0.5F:-0.5F))
83#define Qfmt31(a)   (Int32)(a*0x7FFFFFFF)
84
85const Int32 CosTable_48[48] =
86{
87    Qfmt31(0.50015063602065F) ,  Qfmt31(0.50135845244641F) ,
88    Qfmt31(0.50378872568104F) ,  Qfmt31(0.50747117207256F) ,
89    Qfmt31(0.51245147940822F) ,  Qfmt31(0.51879271310533F) ,
90    Qfmt31(0.52657731515427F) ,  Qfmt31(0.53590981690799F) ,
91    Qfmt31(0.54692043798551F) ,  Qfmt31(0.55976981294708F) ,
92    Qfmt31(0.57465518403266F) ,  Qfmt31(0.59181853585742F) ,
93    Qfmt31(0.61155734788251F) ,  Qfmt31(0.63423893668840F) ,
94    Qfmt31(0.66031980781371F) ,  Qfmt31(0.69037212820021F) ,
95    Qfmt31(0.72512052237720F) ,  Qfmt31(0.76549416497309F) ,
96    Qfmt31(0.81270209081449F) ,  Qfmt31(0.86834471522335F) ,
97    Qfmt(0.93458359703641F) ,  Qfmt(1.01440826499705F) ,
98    Qfmt(1.11207162057972F) ,  Qfmt(1.23383273797657F) ,
99    Qfmt(1.38929395863283F) ,  Qfmt(1.59397228338563F) ,
100    Qfmt(1.87467598000841F) ,  Qfmt(2.28205006800516F) ,
101    Qfmt(2.92462842815822F) ,  Qfmt(4.08461107812925F) ,
102    Qfmt(6.79675071167363F) ,  Qfmt(20.37387816723145F) , /* 32 */
103    Qfmt(0.50060299823520F) ,  Qfmt(0.50547095989754F) ,
104    Qfmt(0.51544730992262F) ,  Qfmt(0.53104259108978F) ,
105    Qfmt(0.55310389603444F) ,  Qfmt(0.58293496820613F) ,
106    Qfmt(0.62250412303566F) ,  Qfmt(0.67480834145501F) ,
107    Qfmt(0.74453627100230F) ,  Qfmt(0.83934964541553F) ,
108    Qfmt(0.97256823786196F) ,  Qfmt(1.16943993343288F) ,
109    Qfmt(1.48416461631417F) ,  Qfmt(2.05778100995341F) ,
110    Qfmt(3.40760841846872F) ,  Qfmt(10.19000812354803F)
111};
112
113
114
115
116/*----------------------------------------------------------------------------
117; LOCAL FUNCTION DEFINITIONS
118; Function Prototype declaration
119----------------------------------------------------------------------------*/
120
121/*----------------------------------------------------------------------------
122; LOCAL STORE/BUFFER/POINTER DEFINITIONS
123; Variable declaration - defined here and used outside this module
124----------------------------------------------------------------------------*/
125
126/*----------------------------------------------------------------------------
127; EXTERNAL FUNCTION REFERENCES
128; Declare functions defined elsewhere and referenced in this module
129----------------------------------------------------------------------------*/
130
131/*----------------------------------------------------------------------------
132; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
133; Declare variables used in this module but defined elsewhere
134----------------------------------------------------------------------------*/
135
136/*----------------------------------------------------------------------------
137; FUNCTION CODE
138----------------------------------------------------------------------------*/
139
140/*----------------------------------------------------------------------------
141; dct_64
142----------------------------------------------------------------------------*/
143
144void pv_split_LC(Int32 *vector,
145                 Int32 *temp_o)
146{
147
148    Int32 i;
149    Int32 *pt_vector     = &vector[0];
150    Int32 *pt_vector_N_1 = &vector[31];
151    const Int32 *pt_cosTerms = &CosTable_48[32];
152    Int32 *pt_temp_o = temp_o;
153    Int32 tmp1;
154    Int32 tmp2;
155    Int32 tmp3;
156
157
158    tmp1 = *(pt_vector);
159    tmp2 = *(pt_vector_N_1--);
160    for (i = 16; i != 0; i--)
161    {
162        tmp3 = *(pt_cosTerms++);
163        *(pt_vector++) =   tmp1  + tmp2;
164        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), tmp3);
165        tmp1 = *(pt_vector);
166        tmp2 = *(pt_vector_N_1--);
167    }
168
169}
170
171
172#ifdef HQ_SBR
173
174
175void dct_64(Int32 vec[], Int32 *scratch_mem)
176{
177    Int32 *temp_e1;
178    Int32 *temp_o1;
179
180    Int32 *pt_vec;
181
182    Int   i;
183
184    Int32 aux1;
185    Int32 aux2;
186    Int32 aux3;
187    Int32 aux4;
188
189    const Int32 *cosTerms = &CosTable_48[31];
190
191    temp_o1 = &vec[32];
192    temp_e1 = temp_o1 - 1;
193
194
195    for (i = 6; i != 0; i--)
196    {
197        aux1 = *(temp_e1);
198        aux2 = *(temp_o1);
199        aux3 = *(cosTerms--);
200        *(temp_e1--) =   aux1  + aux2;
201        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
202        aux1 = *(temp_e1);
203        aux2 = *(temp_o1);
204        aux3 = *(cosTerms--);
205        *(temp_e1--) =   aux1  + aux2;
206        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
207    }
208
209
210    for (i = 10; i != 0; i--)
211    {
212        aux1 = *(temp_e1);
213        aux2 = *(temp_o1);
214        aux3 = *(cosTerms--);
215        *(temp_e1--) =   aux1  + aux2;
216        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
217        aux1 = *(temp_e1);
218        aux2 = *(temp_o1);
219        aux3 = *(cosTerms--);
220        *(temp_e1--) =   aux1  + aux2;
221        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
222    }
223
224
225    pv_split(&vec[16]);
226
227    dct_16(&vec[16], 0);
228    dct_16(vec,     1);      // Even terms
229
230    pv_merge_in_place_N32(vec);
231
232    pv_split_z(&vec[32]);
233
234    dct_16(&vec[32], 1);     // Even terms
235    dct_16(&vec[48], 0);
236
237    pv_merge_in_place_N32(&vec[32]);
238
239
240
241    aux1   = vec[32];
242    aux3   = vec[33];
243    aux4   = vec[ 1];  /* vec[ 1] */
244
245    /* -----------------------------------*/
246    aux1     = vec[32] + vec[33];
247    vec[ 0] +=  aux1;
248    vec[ 1] +=  aux1;
249
250    aux1        = vec[34];
251    aux2        = vec[ 2];   /* vec[ 2] */
252    aux3        += aux1;
253    vec[ 2] = aux4 + aux3;
254    aux4        = vec[ 3];  /* vec[ 3] */
255    vec[ 3] = aux2 + aux3;
256
257    aux3        = vec[35];
258
259    /* -----------------------------------*/
260    aux1        += aux3;
261    vec[32] = vec[ 4];
262    vec[33] = vec[ 5];
263    vec[ 4] = aux2 + aux1;
264    vec[ 5] = aux4 + aux1;
265
266    aux1        = vec[36];
267    aux2        = vec[32];  /* vec[ 4] */
268    aux3        += aux1;
269    vec[34] = vec[ 6];
270    vec[35] = vec[ 7];
271    vec[ 6] = aux4 + aux3;
272    vec[ 7] = aux2 + aux3;
273
274    aux3        = vec[37];
275    aux4        = vec[33];  /* vec[ 5] */
276
277    /* -----------------------------------*/
278    aux1        += aux3;
279    vec[32] = vec[ 8];
280    vec[33] = vec[ 9];
281    vec[ 8] = aux2 + aux1;
282    vec[ 9] = aux4 + aux1;
283
284    aux1        = vec[38];
285    aux2        = vec[34];  /* vec[ 6] */
286    aux3        += aux1;
287    vec[34] = vec[10];
288    vec[10] = aux4 + aux3;
289    aux4        = vec[35];  /* vec[ 7] */
290    vec[35] = vec[11];
291    vec[11] = aux2 + aux3;
292
293    aux3        = vec[39];
294
295    /* -----------------------------------*/
296    aux1        += aux3;
297    vec[36] = vec[12];
298    vec[37] = vec[13];
299    vec[12] = aux2 + aux1;
300    vec[13] = aux4 + aux1;
301
302    aux1        = vec[40];
303    aux2        = vec[32];  /* vec[ 8] */
304    aux3        += aux1;
305    vec[32] = vec[14];
306    vec[14] = aux4 + aux3;
307    aux4        = vec[33];  /* vec[ 9] */
308    vec[33] = vec[15];
309    vec[15] = aux2 + aux3;
310
311    aux3        = vec[41];
312
313    /* -----------------------------------*/
314    aux1        += aux3;
315    vec[38] = vec[16];
316    vec[39] = vec[17];
317    vec[16] = aux2 + aux1;
318    vec[17] = aux4 + aux1;
319
320    aux1        = vec[42];
321    aux2        = vec[34];  /* vec[10] */
322    aux3        += aux1;
323    vec[34] = vec[18];
324    vec[18] = aux4 + aux3;
325    aux4        = vec[35];  /* vec[11] */
326    vec[35] = vec[19];
327    vec[19] = aux2 + aux3;
328
329    aux3        = vec[43];
330
331    /* -----------------------------------*/
332    aux1        += aux3;
333    vec[40] = vec[20];
334    vec[41] = vec[21];
335    vec[20] = aux2 + aux1;
336    vec[21] = aux4 + aux1;
337
338    aux1        = vec[44];
339    aux2        = vec[36];  /* vec[12] */
340    aux3        += aux1;
341    vec[42] = vec[22];
342    vec[43] = vec[23];
343    vec[22] = aux4 + aux3;
344    vec[23] = aux2 + aux3;
345
346    aux3        = vec[45];
347    aux4        = vec[37];  /* vec[13] */
348
349    /* -----------------------------------*/
350
351
352    scratch_mem[0] = vec[24];
353    scratch_mem[1] = vec[25];
354    aux1        += aux3;
355    vec[24] = aux2 + aux1;
356    vec[25] = aux4 + aux1;
357
358    aux1        = vec[46];
359    aux2        = vec[32];  /* vec[14] */
360    scratch_mem[2] = vec[26];
361    scratch_mem[3] = vec[27];
362    aux3        += aux1;
363    vec[26] = aux4 + aux3;
364    vec[27] = aux2 + aux3;
365
366    aux3        = vec[47];
367    aux4        = vec[33];  /* vec[15] */
368
369    /* -----------------------------------*/
370    scratch_mem[4] = vec[28];
371    scratch_mem[5] = vec[29];
372    aux1        += aux3;
373    vec[28] = aux2 + aux1;
374    vec[29] = aux4 + aux1;
375
376    aux1        = vec[48];
377    aux2        = vec[38];  /* vec[16] */
378    scratch_mem[6] = vec[30];
379    scratch_mem[7] = vec[31];
380    aux3        += aux1;
381    vec[30] = aux4 + aux3;
382    vec[31] = aux2 + aux3;
383
384    aux3        = vec[49];
385    aux4        = vec[39];  /* vec[17] */
386
387    /* -----------------------------------*/
388    aux1        += aux3;
389    vec[32] = aux2 + aux1;
390    vec[33] = aux4 + aux1;
391
392    aux1        = vec[50];
393    aux2        = vec[34];  /* vec[18] */
394    aux3        += aux1;
395    vec[34] = aux4 + aux3;
396    aux4        = vec[35];  /* vec[19] */
397    vec[35] = aux2 + aux3;
398
399    aux3        = vec[51];
400
401
402    /* -----------------------------------*/
403    aux1        += aux3;
404    vec[36] = aux2 + aux1;
405    vec[37] = aux4 + aux1;
406
407    aux1        = vec[52];
408    aux2        = vec[40];  /* vec[20] */
409    aux3        += aux1;
410    vec[38] = aux4 + aux3;
411    vec[39] = aux2 + aux3;
412
413    aux3        = vec[53];
414    aux4        = vec[41];  /* vec[21] */
415
416    /* -----------------------------------*/
417    aux1        += aux3;
418    vec[40] = aux2 + aux1;
419    vec[41] = aux4 + aux1;
420
421    aux1        = vec[54];
422    aux2        = vec[42];  /* vec[22] */
423    aux3        += aux1;
424    vec[42] = aux4 + aux3;
425    aux4        = vec[43];  /* vec[23] */
426    vec[43] = aux2 + aux3;
427
428    aux3        = vec[55];
429
430    /* -----------------------------------*/
431
432    pt_vec = &vec[44];
433    temp_o1 = &vec[56];
434    temp_e1 = &scratch_mem[0];
435
436    for (i = 4; i != 0; i--)
437    {
438        aux1        += aux3;
439        *(pt_vec++) = aux2 + aux1;
440        *(pt_vec++) = aux4 + aux1;
441
442        aux1        = *(temp_o1++);
443        aux3        += aux1;
444        aux2        = *(temp_e1++);
445        *(pt_vec++) = aux4 + aux3;
446        *(pt_vec++) = aux2 + aux3;
447
448        aux3        = *(temp_o1++);
449        aux4        = *(temp_e1++);
450    }
451
452    aux1       += aux3;
453    vec[60] = aux2 + aux1;
454    vec[61] = aux4 + aux1;
455    vec[62] = aux4 + aux3;
456
457}
458
459
460#endif
461
462/*----------------------------------------------------------------------------
463; pv_split
464----------------------------------------------------------------------------*/
465
466
467void pv_split(Int32 *temp_o)
468{
469
470    Int32 i;
471    const Int32 *pt_cosTerms = &CosTable_48[47];
472    Int32 *pt_temp_o = temp_o;
473    Int32 *pt_temp_e = pt_temp_o - 1;
474    Int32 tmp1;
475    Int32 tmp2;
476    Int32 cosx;
477
478    for (i = 8; i != 0; i--)
479    {
480        tmp2 = *(pt_temp_o);
481        tmp1 = *(pt_temp_e);
482        cosx = *(pt_cosTerms--);
483        *(pt_temp_e--) =   tmp1  + tmp2;
484        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
485        tmp1 = *(pt_temp_e);
486        tmp2 = *(pt_temp_o);
487        cosx = *(pt_cosTerms--);
488        *(pt_temp_e--) =   tmp1  + tmp2;
489        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
490    }
491}
492
493
494
495void pv_split_z(Int32 *vector)
496{
497    Int32 i;
498    Int32 *pt_vector     = &vector[31];
499    const Int32 *pt_cosTerms = &CosTable_48[32];
500    Int32 *pt_temp_e = vector;
501    Int32 tmp1;
502    Int32 tmp2;
503    Int32 cosx;
504
505    for (i = 8; i != 0; i--)
506    {
507        tmp1 = *(pt_vector);
508        tmp2 = *(pt_temp_e);
509        cosx = *(pt_cosTerms++);
510        *(pt_temp_e++) =   tmp1  + tmp2;
511        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
512        tmp2 = *(pt_temp_e);
513        tmp1 = *(pt_vector);
514        cosx = *(pt_cosTerms++);
515        *(pt_temp_e++) =   tmp1  + tmp2;
516        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
517    }
518}
519
520
521void pv_merge_in_place_N32(Int32 vec[])
522{
523
524    Int32 temp[4];
525
526    temp[0] = vec[14];
527    vec[14] = vec[ 7];
528    temp[1] = vec[12];
529    vec[12] = vec[ 6];
530    temp[2] = vec[10];
531    vec[10] = vec[ 5];
532    temp[3] = vec[ 8];
533    vec[ 8] = vec[ 4];
534    vec[ 6] = vec[ 3];
535    vec[ 4] = vec[ 2];
536    vec[ 2] = vec[ 1];
537
538    vec[ 1] = vec[16] + vec[17];
539    vec[16] = temp[3];
540    vec[ 3] = vec[18] + vec[17];
541    vec[ 5] = vec[19] + vec[18];
542    vec[18] = vec[9];
543    temp[3] = vec[11];
544
545    vec[ 7] = vec[20] + vec[19];
546    vec[ 9] = vec[21] + vec[20];
547    vec[20] = temp[2];
548    temp[2] = vec[13];
549    vec[11] = vec[22] + vec[21];
550    vec[13] = vec[23] + vec[22];
551    vec[22] = temp[3];
552    temp[3] = vec[15];
553    vec[15] = vec[24] + vec[23];
554    vec[17] = vec[25] + vec[24];
555    vec[19] = vec[26] + vec[25];
556    vec[21] = vec[27] + vec[26];
557    vec[23] = vec[28] + vec[27];
558    vec[25] = vec[29] + vec[28];
559    vec[27] = vec[30] + vec[29];
560    vec[29] = vec[30] + vec[31];
561    vec[24] = temp[1];
562    vec[26] = temp[2];
563    vec[28] = temp[0];
564    vec[30] = temp[3];
565}
566
567#endif
568
569
570