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