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_imdct_synth.cpp
25
26     Date: 09/21/2007
27
28------------------------------------------------------------------------------
29 REVISION HISTORY
30
31
32 Description:
33
34------------------------------------------------------------------------------
35 INPUT AND OUTPUT DEFINITIONS
36
37 Input
38    int32 in[],         Pointer to spec values of current channel
39    int32 overlap[],    Pointer to overlap values of current channel
40    uint32 blk_type,    Block type
41    int16 mx_band,      In case of mixed blocks, # of bands with long
42                        blocks (2 or 4) else 0
43    int32 *Scratch_mem
44  Returns
45
46    int32 in[],
47
48------------------------------------------------------------------------------
49 FUNCTION DESCRIPTION
50
51    The frequency lines are preprocessed by the "alias reduction" scheme
52    and fed into the IMDCT matrix, each 18 into one transform block.
53    The first half of the output values are added to the stored overlap
54    values from the last block. These values are new output values and
55    are input values for the polyphase filterbank. The second half of the
56    output values is stored for overlap with the next data granule.
57    The number of windowed samples is 12 for short blocks, and 36 for long
58    blocks
59
60Windowing
61
62    Depending on window_switching_flag[gr][ch], block_type[gr][ch] and
63    mixed_block_flag[gr][ch] different shapes of windows are used.
64        normal window
65        start window
66        stop window
67        short windows
68            Each of the three short blocks is windowed separately.
69            The windowed short blocks must be overlapped and concatenated.
70
71Overlapping and adding with previous block
72
73    The first half (18 values) of the current block (36 values) has to be
74    overlapped with the second half of the previous block. The second half
75    of the current block has to be stored for overlapping with the next block
76
77------------------------------------------------------------------------------
78 REQUIREMENTS
79
80
81------------------------------------------------------------------------------
82 REFERENCES
83
84 [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
85     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
86
87------------------------------------------------------------------------------
88 PSEUDO-CODE
89
90------------------------------------------------------------------------------
91*/
92
93
94/*----------------------------------------------------------------------------
95; INCLUDES
96----------------------------------------------------------------------------*/
97
98#include "pvmp3_imdct_synth.h"
99#include "pv_mp3dec_fxd_op.h"
100#include "pvmp3_dec_defs.h"
101#include "pvmp3_mdct_18.h"
102#include "pvmp3_mdct_6.h"
103#include "mp3_mem_funcs.h"
104
105
106
107/*----------------------------------------------------------------------------
108; MACROS
109; Define module specific macros here
110----------------------------------------------------------------------------*/
111
112
113/*----------------------------------------------------------------------------
114; DEFINES
115; Include all pre-processor statements here. Include conditional
116; compile variables also.
117----------------------------------------------------------------------------*/
118#define LONG        0
119#define START       1
120#define SHORT       2
121#define STOP        3
122
123/*----------------------------------------------------------------------------
124; LOCAL FUNCTION DEFINITIONS
125; Function Prototype declaration
126----------------------------------------------------------------------------*/
127
128/*----------------------------------------------------------------------------
129; LOCAL STORE/BUFFER/POINTER DEFINITIONS
130; Variable declaration - defined here and used outside this module
131----------------------------------------------------------------------------*/
132/*
133 *   sin(pi/36*(k+0.5)),k=0..35
134 */
135
136const int32 normal_win[36] =
137{
138    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
139    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
140    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
141    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
142    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
143    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
144    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
145    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
146    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
147    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
148    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
149    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
150};
151
152
153const int32 start_win[36] =
154{
155    /*   k=0..17  sin(pi/36*(k+0.5)),  */
156    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
157    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
158    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
159    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
160    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
161    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
162
163    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
164    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
165    /*    k=24..29; sin(pi/12*(k-18+0.5)) */
166    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
167    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
168
169    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
170    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f)
171};
172
173
174const int32 stop_win[36] =
175{
176    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
177    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
178    /*    k=6..11; sin(pi/12*(k-6+0.5)) */
179    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
180    Qfmt_31(-0.79335334029124f),   Qfmt_31(-0.92387953251129f),   Qfmt_31(0.99144486137381f),
181
182    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(-0.99999990000000f),
183    Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),
184    /*   k=18..35  sin(pi/36*(k+0.5)),  */
185    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
186    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
187    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
188    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
189    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
190    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
191};
192
193
194const int32 short_win[12] =
195{
196    /*    k=0..11; sin(pi/12*(k+0.5)) */
197    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
198    Qfmt_31(0.79335334029124f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.99144486137381f),
199    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
200    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
201};
202/*----------------------------------------------------------------------------
203; EXTERNAL FUNCTION REFERENCES
204; Declare functions defined elsewhere and referenced in this module
205----------------------------------------------------------------------------*/
206
207/*----------------------------------------------------------------------------
208; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
209; Declare variables used in this module but defined elsewhere
210----------------------------------------------------------------------------*/
211
212/*----------------------------------------------------------------------------
213; FUNCTION CODE
214----------------------------------------------------------------------------*/
215
216void pvmp3_imdct_synth(int32  in[SUBBANDS_NUMBER*FILTERBANK_BANDS],
217                       int32  overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS],
218                       uint32 blk_type,
219                       int16  mx_band,
220                       int32  used_freq_lines,
221                       int32  *Scratch_mem)
222{
223
224    int32 band;
225    int32 bands2process = used_freq_lines + 2;
226
227    if (bands2process > SUBBANDS_NUMBER)
228    {
229        bands2process = SUBBANDS_NUMBER;  /* default */
230    }
231
232
233    /*
234     *  in case of mx_poly_band> 0, do
235     *  long transforms
236     */
237
238
239    for (band = 0; band < bands2process; band++)
240    {
241        uint32 current_blk_type = (band < mx_band) ? LONG : blk_type;
242
243        int32 * out     = in      + (band * FILTERBANK_BANDS);
244        int32 * history = overlap + (band * FILTERBANK_BANDS);
245
246        switch (current_blk_type)
247        {
248            case LONG:
249
250                pvmp3_mdct_18(out, history, normal_win);
251
252                break;
253
254            case START:
255
256                pvmp3_mdct_18(out, history, start_win);
257
258                break;
259
260            case STOP:
261
262                pvmp3_mdct_18(out, history, stop_win);
263
264                break;
265
266            case SHORT:
267            {
268                int32 *tmp_prev_ovr = &Scratch_mem[FILTERBANK_BANDS];
269                int32 i;
270
271                for (i = 0; i < 6; i++)
272                {
273                    Scratch_mem[i    ] = out[(i*3)];
274                    Scratch_mem[6  +i] = out[(i*3) + 1];
275                    Scratch_mem[12 +i] = out[(i*3) + 2];
276                }
277
278                pvmp3_mdct_6(&Scratch_mem[ 0], &tmp_prev_ovr[ 0]);
279                pvmp3_mdct_6(&Scratch_mem[ 6], &tmp_prev_ovr[ 6]);
280                pvmp3_mdct_6(&Scratch_mem[12], &tmp_prev_ovr[12]);
281
282                for (i = 0; i < 6; i++)
283                {
284                    int32 temp  =  history[i];
285                    /* next iteration overlap */
286                    history[i]  =  fxp_mul32_Q32(tmp_prev_ovr[ 6+i] << 1, short_win[6+i]);
287                    history[i] +=  fxp_mul32_Q32(Scratch_mem[12+i] << 1, short_win[  i]);
288                    out[i]  =  temp;
289                }
290
291                for (i = 0; i < 6; i++)
292                {
293                    out[i+6]   =  fxp_mul32_Q32(Scratch_mem[i] << 1, short_win[i]);
294                    out[i+6]  +=  history[i+6];
295                    /* next iteration overlap */
296                    history[i+6]  =  fxp_mul32_Q32(tmp_prev_ovr[12+i] << 1, short_win[6+i]);
297
298                }
299                for (i = 0; i < 6; i++)
300                {
301                    out[i+12]  =  fxp_mul32_Q32(tmp_prev_ovr[  i] << 1, short_win[6+i]);
302                    out[i+12] +=  fxp_mul32_Q32(Scratch_mem[6+i] << 1, short_win[  i]);
303                    out[i+12] +=  history[i+12];
304                    history[12+i]  =  0;
305                }
306            }
307
308            break;
309        }
310
311        /*
312         *     Compensation for frequency inversion of polyphase filterbank
313         *     every odd time sample of every odd odd subband is mulitplied by -1  before
314         *     processing by the polyphase filter
315         */
316
317        if (band & 1)
318        {
319            for (int32 slot = 1; slot < FILTERBANK_BANDS; slot += 6)
320            {
321                int32 temp1 = out[slot  ];
322                int32 temp2 = out[slot+2];
323                int32 temp3 = out[slot+4];
324                out[slot  ] = -temp1;
325                out[slot+2] = -temp2;
326                out[slot+4] = -temp3;
327            }
328        }
329    }
330
331
332    for (band = bands2process; band < SUBBANDS_NUMBER; band++)
333    {
334        int32 * out     = in      + (band * FILTERBANK_BANDS);
335        int32 * history = overlap + (band * FILTERBANK_BANDS);
336        int32 slot;
337
338        if (band & 1)
339        {
340            for (slot = 0; slot < FILTERBANK_BANDS; slot += 6)
341            {
342                int32 temp1 =  history[slot  ];
343                int32 temp2 =  history[slot+1];
344                int32 temp3 =  history[slot+2];
345                out[slot  ] =  temp1;
346                out[slot+1] = -temp2;
347                out[slot+2] =  temp3;
348
349                temp1 =  history[slot+3];
350                temp2 =  history[slot+4];
351                temp3 =  history[slot+5];
352                out[slot+3] = -temp1;
353                out[slot+4] =  temp2;
354                out[slot+5] = -temp3;
355            }
356        }
357        else
358        {
359            for (slot = 0; slot < FILTERBANK_BANDS; slot += 3)
360            {
361                int32 temp1 =  history[slot  ];
362                int32 temp2 =  history[slot+1];
363                int32 temp3 =  history[slot+2];
364                out[slot  ] =  temp1;
365                out[slot+1] =  temp2;
366                out[slot+2] =  temp3;
367            }
368        }
369
370        pv_memset(history, 0, FILTERBANK_BANDS*sizeof(*overlap));
371    }
372}
373
374
375
376
377