1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_poly_phase_synthesis.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  Input
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3dec_chan   *pChVars,          decoder state structure per channel
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32          numChannels,       number of channels
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    e_equalization equalizerType,     equalization mode
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16          *outPcm            pointer to the PCM output data
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  Output
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16          *outPcm            pointer to the PCM output data
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    polyphase synthesis
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Each time the subband samples for all 32 polyphase subbands of one
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    channel have been calculated, they can be applied to the synthesis
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    subband filter and 32 consecutive audio samples can be calculated
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_poly_phase_synthesis.h"
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_polyphase_filter_window.h"
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dec_defs.h"
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_dct_16.h"
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_equalizer.h"
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h"
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_poly_phase_synthesis(tmp3dec_chan   *pChVars,
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                int32          numChannels,
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                e_equalization equalizerType,
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                int16          *outPcm)
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     *  Equalizer
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     */
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_equalizer(pChVars->circ_buffer,
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    equalizerType,
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    pChVars->work_buf_int32);
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int16 * ptr_out = outPcm;
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (int32  band = 0; band < FILTERBANK_BANDS; band += 2)
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 *inData  = &pChVars->circ_buffer[544 - (band<<5)];
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *   DCT 32
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_split(&inData[16]);
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_dct_16(&inData[16], 0);
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_dct_16(inData, 1);     // Even terms
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_merge_in_place_N32(inData);
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_polyphase_filter_window(inData,
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                      ptr_out,
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                      numChannels);
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        inData  -= SUBBANDS_NUMBER;
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *   DCT 32
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_split(&inData[16]);
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_dct_16(&inData[16], 0);
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_dct_16(inData, 1);     // Even terms
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_merge_in_place_N32(inData);
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        pvmp3_polyphase_filter_window(inData,
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                      ptr_out + (numChannels << 5),
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                      numChannels);
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        ptr_out += (numChannels << 6);
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        inData  -= SUBBANDS_NUMBER;
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }/* end band loop */
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pv_memmove(&pChVars->circ_buffer[576],
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber               pChVars->circ_buffer,
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber               480*sizeof(*pChVars->circ_buffer));
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
188