Home | History | Annotate | Download | only in src
      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 
     21    PacketVideo Corp.
     22    MP3 Decoder Library
     23 
     24    Filename: pvmp3_poly_phase_synthesis.cpp
     25 
     26 
     27      Date: 09/21/2007
     28 
     29 ------------------------------------------------------------------------------
     30  REVISION HISTORY
     31 
     32 
     33  Description:
     34 
     35 ------------------------------------------------------------------------------
     36  INPUT AND OUTPUT DEFINITIONS
     37 
     38   Input
     39     tmp3dec_chan   *pChVars,          decoder state structure per channel
     40     int32          numChannels,       number of channels
     41     e_equalization equalizerType,     equalization mode
     42     int16          *outPcm            pointer to the PCM output data
     43 
     44   Output
     45     int16          *outPcm            pointer to the PCM output data
     46 
     47 ------------------------------------------------------------------------------
     48  FUNCTION DESCRIPTION
     49 
     50     polyphase synthesis
     51     Each time the subband samples for all 32 polyphase subbands of one
     52     channel have been calculated, they can be applied to the synthesis
     53     subband filter and 32 consecutive audio samples can be calculated
     54 
     55 ------------------------------------------------------------------------------
     56  REQUIREMENTS
     57 
     58 
     59 ------------------------------------------------------------------------------
     60  REFERENCES
     61 
     62  [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
     63      ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
     64 
     65 ------------------------------------------------------------------------------
     66  PSEUDO-CODE
     67 
     68 ------------------------------------------------------------------------------
     69 */
     70 
     71 
     72 /*----------------------------------------------------------------------------
     73 ; INCLUDES
     74 ----------------------------------------------------------------------------*/
     75 
     76 #include "pvmp3_poly_phase_synthesis.h"
     77 #include "pvmp3_polyphase_filter_window.h"
     78 #include "pv_mp3dec_fxd_op.h"
     79 #include "pvmp3_dec_defs.h"
     80 #include "pvmp3_dct_16.h"
     81 #include "pvmp3_equalizer.h"
     82 #include "mp3_mem_funcs.h"
     83 
     84 
     85 /*----------------------------------------------------------------------------
     86 ; MACROS
     87 ; Define module specific macros here
     88 ----------------------------------------------------------------------------*/
     89 
     90 
     91 /*----------------------------------------------------------------------------
     92 ; DEFINES
     93 ; Include all pre-processor statements here. Include conditional
     94 ; compile variables also.
     95 ----------------------------------------------------------------------------*/
     96 
     97 /*----------------------------------------------------------------------------
     98 ; LOCAL FUNCTION DEFINITIONS
     99 ; Function Prototype declaration
    100 ----------------------------------------------------------------------------*/
    101 
    102 /*----------------------------------------------------------------------------
    103 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    104 ; Variable declaration - defined here and used outside this module
    105 ----------------------------------------------------------------------------*/
    106 
    107 /*----------------------------------------------------------------------------
    108 ; EXTERNAL FUNCTION REFERENCES
    109 ; Declare functions defined elsewhere and referenced in this module
    110 ----------------------------------------------------------------------------*/
    111 
    112 /*----------------------------------------------------------------------------
    113 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    114 ; Declare variables used in this module but defined elsewhere
    115 ----------------------------------------------------------------------------*/
    116 
    117 
    118 /*----------------------------------------------------------------------------
    119 ; FUNCTION CODE
    120 ----------------------------------------------------------------------------*/
    121 
    122 void pvmp3_poly_phase_synthesis(tmp3dec_chan   *pChVars,
    123                                 int32          numChannels,
    124                                 e_equalization equalizerType,
    125                                 int16          *outPcm)
    126 {
    127     /*
    128      *  Equalizer
    129      */
    130     pvmp3_equalizer(pChVars->circ_buffer,
    131                     equalizerType,
    132                     pChVars->work_buf_int32);
    133 
    134 
    135     int16 * ptr_out = outPcm;
    136 
    137 
    138     for (int32  band = 0; band < FILTERBANK_BANDS; band += 2)
    139     {
    140         int32 *inData  = &pChVars->circ_buffer[544 - (band<<5)];
    141 
    142         /*
    143          *   DCT 32
    144          */
    145 
    146         pvmp3_split(&inData[16]);
    147 
    148         pvmp3_dct_16(&inData[16], 0);
    149         pvmp3_dct_16(inData, 1);     // Even terms
    150 
    151         pvmp3_merge_in_place_N32(inData);
    152 
    153         pvmp3_polyphase_filter_window(inData,
    154                                       ptr_out,
    155                                       numChannels);
    156 
    157         inData  -= SUBBANDS_NUMBER;
    158 
    159         /*
    160          *   DCT 32
    161          */
    162 
    163         pvmp3_split(&inData[16]);
    164 
    165         pvmp3_dct_16(&inData[16], 0);
    166         pvmp3_dct_16(inData, 1);     // Even terms
    167 
    168         pvmp3_merge_in_place_N32(inData);
    169 
    170         pvmp3_polyphase_filter_window(inData,
    171                                       ptr_out + (numChannels << 5),
    172                                       numChannels);
    173 
    174         ptr_out += (numChannels << 6);
    175 
    176         inData  -= SUBBANDS_NUMBER;
    177 
    178     }/* end band loop */
    179 
    180     pv_memmove(&pChVars->circ_buffer[576],
    181                pChVars->circ_buffer,
    182                480*sizeof(*pChVars->circ_buffer));
    183 
    184 }
    185 
    186 
    187 
    188