Home | History | Annotate | Download | only in aacdec
      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 
     85 const 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 
    144 void 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 
    175 void 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 
    467 void 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 
    495 void 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 
    521 void 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