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: dst32.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 32
     33 
     34 
     35 ------------------------------------------------------------------------------
     36  FUNCTION DESCRIPTION
     37 
     38     Implement discrete sine transform of lenght 32
     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 "dst32.h"
     62 #include "dst16.h"
     63 
     64 #include "fxp_mul32.h"
     65 
     66 /*----------------------------------------------------------------------------
     67 ; MACROS
     68 ; Define module specific macros here
     69 ----------------------------------------------------------------------------*/
     70 
     71 
     72 /*----------------------------------------------------------------------------
     73 ; DEFINES
     74 ; Include all pre-processor statements here. Include conditional
     75 ; compile variables also.
     76 ----------------------------------------------------------------------------*/
     77 
     78 
     79 #define R_SHIFT1     29
     80 #define Qfmt29(x)   (Int32)(x*((Int32)1<<R_SHIFT1) + (x>=0?0.5F:-0.5F))
     81 #define Qfmt31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
     82 
     83 const Int32 CosTable_16[14] =
     84 {
     85     Qfmt31(0.50060299823520F),   Qfmt31(0.50547095989754F),
     86     Qfmt31(0.51544730992262F),   Qfmt31(0.53104259108978F),
     87     Qfmt31(0.55310389603444F),   Qfmt31(0.58293496820613F),
     88     Qfmt31(0.62250412303566F),   Qfmt31(0.67480834145501F),
     89     Qfmt31(0.74453627100230F),   Qfmt31(0.83934964541553F),
     90     Qfmt29(0.97256823786196F),   Qfmt29(1.16943993343288F),
     91     Qfmt29(1.48416461631417F),   Qfmt29(2.05778100995341F)
     92 };
     93 
     94 /*----------------------------------------------------------------------------
     95 ; LOCAL FUNCTION DEFINITIONS
     96 ; Function Prototype declaration
     97 ----------------------------------------------------------------------------*/
     98 
     99 /*----------------------------------------------------------------------------
    100 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    101 ; Variable declaration - defined here and used outside this module
    102 ----------------------------------------------------------------------------*/
    103 
    104 /*----------------------------------------------------------------------------
    105 ; EXTERNAL FUNCTION REFERENCES
    106 ; Declare functions defined elsewhere and referenced in this module
    107 ----------------------------------------------------------------------------*/
    108 
    109 /*----------------------------------------------------------------------------
    110 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    111 ; Declare variables used in this module but defined elsewhere
    112 ----------------------------------------------------------------------------*/
    113 
    114 /*----------------------------------------------------------------------------
    115 ; FUNCTION CODE
    116 ----------------------------------------------------------------------------*/
    117 
    118 
    119 void dst_32(Int32 vec[], Int32 scratch_mem[])   /* scratch_mem size 32 */
    120 {
    121     Int32 *temp_even = scratch_mem;
    122 
    123     Int32 i;
    124     const Int32 *pt_cos = &CosTable_16[13];
    125     Int32 tmp0 = vec[31] >> 1;
    126     Int32 tmp1, tmp2;
    127     Int32 *pt_even = temp_even;
    128     Int32 *pt_odd  = vec;
    129     Int32 *pt_vec  = vec;
    130     Int32 *pt_vecN_1  = vec;
    131     Int32 tmp3;
    132 
    133 
    134     tmp1 = 0;
    135 
    136     for (i = 5; i != 0; i--)
    137     {
    138         *(pt_even++) = *(pt_vec++);
    139         tmp2         = *(pt_vec++);
    140         *(pt_even++) = *(pt_vec++);
    141         tmp3         = *(pt_vec++);
    142         *(pt_even++) = *(pt_vec++);
    143         *(pt_odd++) = tmp2 + tmp1;
    144         *(pt_odd++) = tmp3 + tmp2;
    145         tmp1         = *(pt_vec++);
    146         *(pt_odd++) = tmp1 + tmp3;
    147     }
    148 
    149     *(pt_even) = *(pt_vec++);
    150     *(pt_odd)  = *(pt_vec) + tmp1;
    151 
    152 
    153     dst_16(temp_even, &scratch_mem[16]);
    154     dst_16(vec, &scratch_mem[24]);
    155 
    156 
    157     pt_vecN_1  = &vec[16];
    158 
    159     tmp1 = temp_even[15];
    160 
    161     tmp3  = fxp_mul32_Q31((vec[15] - tmp0) << 3, Qfmt31(0.63687550772175F)) << 2;
    162     tmp2  = temp_even[14];
    163     *(pt_vecN_1++)  = tmp3 - tmp1;
    164     vec[15]         = tmp3 + tmp1;
    165     tmp1  = temp_even[13];
    166     tmp3  = fxp_mul32_Q31((vec[14] + tmp0) << 3, Qfmt31(0.85190210461718F));
    167     *(pt_vecN_1++)  = tmp3 - tmp2;
    168     vec[14]         = tmp3 + tmp2;
    169 
    170     pt_even = &temp_even[12];
    171     pt_vec  = &vec[13];
    172 
    173     for (i = 2; i != 0; i--)
    174     {
    175         tmp3  = fxp_mul32_Q29((*(pt_vec) - tmp0), *(pt_cos--));
    176         tmp2 = *(pt_even--);
    177         *(pt_vec--)     = tmp3 + tmp1;
    178         *(pt_vecN_1++)  = tmp3 - tmp1;
    179         tmp3  = fxp_mul32_Q29((*(pt_vec) + tmp0), *(pt_cos--));
    180         tmp1 = *(pt_even--);
    181         *(pt_vec--)     = tmp3 + tmp2;
    182         *(pt_vecN_1++)  = tmp3 - tmp2;
    183     }
    184 
    185     for (i = 5; i != 0; i--)
    186     {
    187         tmp3  = fxp_mul32_Q31((*(pt_vec) - tmp0) << 1, *(pt_cos--));
    188         tmp2 = *(pt_even--);
    189         *(pt_vec--)     = tmp3 + tmp1;
    190         *(pt_vecN_1++)  = tmp3 - tmp1;
    191         tmp3  = fxp_mul32_Q31((*(pt_vec) + tmp0) << 1, *(pt_cos--));
    192         tmp1 = *(pt_even--);
    193         *(pt_vec--)     = tmp3 + tmp2;
    194         *(pt_vecN_1++)  = tmp3 - tmp2;
    195     }
    196 
    197 
    198 }
    199 
    200 #endif
    201