Code cleanups (bug #66)
[asterisk/asterisk.git] / codecs / mp3 / src / l3init.c
1 /*____________________________________________________________________________
2         
3         FreeAmp - The Free MP3 Player
4
5         MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
6         Corp.  http://www.xingtech.com
7
8         Portions Copyright (C) 1998 EMusic.com
9
10         This program is free software; you can redistribute it and/or modify
11         it under the terms of the GNU General Public License as published by
12         the Free Software Foundation; either version 2 of the License, or
13         (at your option) any later version.
14
15         This program is distributed in the hope that it will be useful,
16         but WITHOUT ANY WARRANTY; without even the implied warranty of
17         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18         GNU General Public License for more details.
19
20         You should have received a copy of the GNU General Public License
21         along with this program; if not, write to the Free Software
22         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23         
24         $Id$
25 ____________________________________________________________________________*/
26
27 /****  tinit.c  ***************************************************
28   Layer III  init tables
29
30
31 ******************************************************************/
32
33 #include <stdlib.h>
34 #include <stdio.h>
35 #include <float.h>
36 #include <math.h>
37 #include "L3.h"
38 #include "mhead.h"
39 #include "protos.h"
40
41 /* get rid of precision loss warnings on conversion */
42 #ifdef _MSC_VER
43 #pragma warning(disable:4244 4056)
44 #endif
45
46
47
48 static const float Ci[8] =
49 {
50    -0.6f, -0.535f, -0.33f, -0.185f, -0.095f, -0.041f, -0.0142f, -0.0037f};
51
52
53 void hwin_init(MPEG *m);                /* hybrid windows -- */
54 void imdct_init(MPEG *m);
55 typedef struct
56 {
57    float *w;
58    float *w2;
59    void *coef;
60 }
61 IMDCT_INIT_BLOCK;
62
63 void msis_init(MPEG *m);
64 void msis_init_MPEG2(MPEG *m);
65
66 /*=============================================================*/
67 int L3table_init(MPEG *m)
68 {
69    int i;
70    float *x;
71    LS *ls;
72    int scalefact_scale, preemp, scalefac;
73    double tmp;
74    PAIR *csa;
75
76 /*================ quant ===============================*/
77
78 /* 8 bit plus 2 lookup x = pow(2.0, 0.25*(global_gain-210)) */
79 /* extra 2 for ms scaling by 1/sqrt(2) */
80 /* extra 4 for cvt to mono scaling by 1/2 */
81    x = quant_init_global_addr(m);
82    for (i = 0; i < 256 + 2 + 4; i++)
83       x[i] = (float) pow(2.0, 0.25 * ((i - (2 + 4)) - 210 + GLOBAL_GAIN_SCALE));
84
85
86 /* x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp) */
87    ls = quant_init_scale_addr(m);
88    for (scalefact_scale = 0; scalefact_scale < 2; scalefact_scale++)
89    {
90       for (preemp = 0; preemp < 4; preemp++)
91       {
92          for (scalefac = 0; scalefac < 32; scalefac++)
93          {
94             ls[scalefact_scale][preemp][scalefac] =
95                (float) pow(2.0, -0.5 * (1 + scalefact_scale) * (scalefac + preemp));
96          }
97       }
98    }
99
100 /*--- iSample**(4/3) lookup, -32<=i<=31 ---*/
101    x = quant_init_pow_addr(m);
102    for (i = 0; i < 64; i++)
103    {
104       tmp = i - 32;
105       x[i] = (float) (tmp * pow(fabs(tmp), (1.0 / 3.0)));
106    }
107
108
109 /*-- pow(2.0, -0.25*8.0*subblock_gain)  3 bits --*/
110    x = quant_init_subblock_addr(m);
111    for (i = 0; i < 8; i++)
112    {
113       x[i] = (float) pow(2.0, 0.25 * -8.0 * i);
114    }
115
116 /*-------------------------*/
117 // quant_init_sf_band(sr_index);   replaced by code in sup.c
118
119
120 /*================ antialias ===============================*/
121    csa = alias_init_addr(m);
122    for (i = 0; i < 8; i++)
123    {
124       csa[i][0] = (float) (1.0 / sqrt(1.0 + Ci[i] * Ci[i]));
125       csa[i][1] = (float) (Ci[i] / sqrt(1.0 + Ci[i] * Ci[i]));
126    }
127
128
129 /*================ msis ===============================*/
130    msis_init(m);
131    msis_init_MPEG2(m);
132
133 /*================ imdct ===============================*/
134    imdct_init(m);
135
136 /*--- hybrid windows ------------*/
137    hwin_init(m);
138
139    return 0;
140 }
141 /*====================================================================*/
142 typedef float ARRAY36[36];
143 ARRAY36 *hwin_init_addr(MPEG *m);
144
145 /*--------------------------------------------------------------------*/
146 void hwin_init(MPEG *m)
147 {
148    int i, j;
149    double pi;
150    ARRAY36 *win;
151
152    win = hwin_init_addr(m);
153
154    pi = 4.0 * atan(1.0);
155
156 /* type 0 */
157    for (i = 0; i < 36; i++)
158       win[0][i] = (float) sin(pi / 36 * (i + 0.5));
159
160 /* type 1 */
161    for (i = 0; i < 18; i++)
162       win[1][i] = (float) sin(pi / 36 * (i + 0.5));
163    for (i = 18; i < 24; i++)
164       win[1][i] = 1.0F;
165    for (i = 24; i < 30; i++)
166       win[1][i] = (float) sin(pi / 12 * (i + 0.5 - 18));
167    for (i = 30; i < 36; i++)
168       win[1][i] = 0.0F;
169
170 /* type 3 */
171    for (i = 0; i < 6; i++)
172       win[3][i] = 0.0F;
173    for (i = 6; i < 12; i++)
174       win[3][i] = (float) sin(pi / 12 * (i + 0.5 - 6));
175    for (i = 12; i < 18; i++)
176       win[3][i] = 1.0F;
177    for (i = 18; i < 36; i++)
178       win[3][i] = (float) sin(pi / 36 * (i + 0.5));
179
180 /* type 2 */
181    for (i = 0; i < 12; i++)
182       win[2][i] = (float) sin(pi / 12 * (i + 0.5));
183    for (i = 12; i < 36; i++)
184       win[2][i] = 0.0F;
185
186 /*--- invert signs by region to match mdct 18pt --> 36pt mapping */
187    for (j = 0; j < 4; j++)
188    {
189       if (j == 2)
190          continue;
191       for (i = 9; i < 36; i++)
192          win[j][i] = -win[j][i];
193    }
194
195 /*-- invert signs for short blocks --*/
196    for (i = 3; i < 12; i++)
197       win[2][i] = -win[2][i];
198
199    return;
200 }
201 /*=============================================================*/
202 typedef float ARRAY4[4];
203 IMDCT_INIT_BLOCK *imdct_init_addr_18(void);
204 IMDCT_INIT_BLOCK *imdct_init_addr_6(void);
205
206 /*-------------------------------------------------------------*/
207 void imdct_init(MPEG *m)
208 {
209    int k, p, n;
210    double t, pi;
211    IMDCT_INIT_BLOCK *addr;
212    float *w, *w2;
213    float *v, *v2, *coef87;
214    ARRAY4 *coef;
215
216 /*--- 18 point --*/
217    addr = imdct_init_addr_18();
218    w = addr->w;
219    w2 = addr->w2;
220    coef = addr->coef;
221 /*----*/
222    n = 18;
223    pi = 4.0 * atan(1.0);
224    t = pi / (4 * n);
225    for (p = 0; p < n; p++)
226       w[p] = (float) (2.0 * cos(t * (2 * p + 1)));
227    for (p = 0; p < 9; p++)
228       w2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1));
229
230    t = pi / (2 * n);
231    for (k = 0; k < 9; k++)
232    {
233       for (p = 0; p < 4; p++)
234          coef[k][p] = (float) cos(t * (2 * k) * (2 * p + 1));
235    }
236
237 /*--- 6 point */
238    addr = imdct_init_addr_6();
239    v = addr->w;
240    v2 = addr->w2;
241    coef87 = addr->coef;
242 /*----*/
243    n = 6;
244    pi = 4.0 * atan(1.0);
245    t = pi / (4 * n);
246    for (p = 0; p < n; p++)
247       v[p] = (float) 2.0 *cos(t * (2 * p + 1));
248
249    for (p = 0; p < 3; p++)
250       v2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1));
251
252    t = pi / (2 * n);
253    k = 1;
254    p = 0;
255    *coef87 = (float) cos(t * (2 * k) * (2 * p + 1));
256 /* adjust scaling to save a few mults */
257    for (p = 0; p < 6; p++)
258       v[p] = v[p] / 2.0f;
259    *coef87 = (float) 2.0 *(*coef87);
260
261
262    return;
263 }
264 /*===============================================================*/
265 typedef float ARRAY8_2[8][2];
266 ARRAY8_2 *msis_init_addr(MPEG *m);
267
268 /*-------------------------------------------------------------*/
269 void msis_init(MPEG *m)
270 {
271    int i;
272    double s, c;
273    double pi;
274    double t;
275    ARRAY8_2 *lr;
276
277    lr = msis_init_addr(m);
278
279
280    pi = 4.0 * atan(1.0);
281    t = pi / 12.0;
282    for (i = 0; i < 7; i++)
283    {
284       s = sin(i * t);
285       c = cos(i * t);
286     /* ms_mode = 0 */
287       lr[0][i][0] = (float) (s / (s + c));
288       lr[0][i][1] = (float) (c / (s + c));
289     /* ms_mode = 1 */
290       lr[1][i][0] = (float) (sqrt(2.0) * (s / (s + c)));
291       lr[1][i][1] = (float) (sqrt(2.0) * (c / (s + c)));
292    }
293 /* sf = 7 */
294 /* ms_mode = 0 */
295    lr[0][i][0] = 1.0f;
296    lr[0][i][1] = 0.0f;
297 /* ms_mode = 1, in is bands is routine does ms processing */
298    lr[1][i][0] = 1.0f;
299    lr[1][i][1] = 1.0f;
300
301
302 /*-------
303 for(i=0;i<21;i++) nBand[0][i] = 
304             sfBandTable[sr_index].l[i+1] - sfBandTable[sr_index].l[i];
305 for(i=0;i<12;i++) nBand[1][i] = 
306             sfBandTable[sr_index].s[i+1] - sfBandTable[sr_index].s[i];
307 -------------*/
308
309 }
310 /*-------------------------------------------------------------*/
311 /*===============================================================*/
312 typedef float ARRAY2_64_2[2][64][2];
313 ARRAY2_64_2 *msis_init_addr_MPEG2(MPEG *m);
314
315 /*-------------------------------------------------------------*/
316 void msis_init_MPEG2(MPEG *m)
317 {
318    int k, n;
319    double t;
320    ARRAY2_64_2 *lr;
321    int intensity_scale, ms_mode, sf, sflen;
322    float ms_factor[2];
323
324
325    ms_factor[0] = 1.0;
326    ms_factor[1] = (float) sqrt(2.0);
327
328    lr = msis_init_addr_MPEG2(m);
329
330 /* intensity stereo MPEG2 */
331 /* lr2[intensity_scale][ms_mode][sflen_offset+sf][left/right] */
332
333    for (intensity_scale = 0; intensity_scale < 2; intensity_scale++)
334    {
335       t = pow(2.0, -0.25 * (1 + intensity_scale));
336       for (ms_mode = 0; ms_mode < 2; ms_mode++)
337       {
338
339          n = 1;
340          k = 0;
341          for (sflen = 0; sflen < 6; sflen++)
342          {
343             for (sf = 0; sf < (n - 1); sf++, k++)
344             {
345                if (sf == 0)
346                {
347                   lr[intensity_scale][ms_mode][k][0] = ms_factor[ms_mode] * 1.0f;
348                   lr[intensity_scale][ms_mode][k][1] = ms_factor[ms_mode] * 1.0f;
349                }
350                else if ((sf & 1))
351                {
352                   lr[intensity_scale][ms_mode][k][0] =
353                      (float) (ms_factor[ms_mode] * pow(t, (sf + 1) / 2));
354                   lr[intensity_scale][ms_mode][k][1] = ms_factor[ms_mode] * 1.0f;
355                }
356                else
357                {
358                   lr[intensity_scale][ms_mode][k][0] = ms_factor[ms_mode] * 1.0f;
359                   lr[intensity_scale][ms_mode][k][1] =
360                      (float) (ms_factor[ms_mode] * pow(t, sf / 2));
361                }
362             }
363
364           /* illegal is_pos used to do ms processing */
365             if (ms_mode == 0)
366             {                   /* ms_mode = 0 */
367                lr[intensity_scale][ms_mode][k][0] = 1.0f;
368                lr[intensity_scale][ms_mode][k][1] = 0.0f;
369             }
370             else
371             {
372              /* ms_mode = 1, in is bands is routine does ms processing */
373                lr[intensity_scale][ms_mode][k][0] = 1.0f;
374                lr[intensity_scale][ms_mode][k][1] = 1.0f;
375             }
376             k++;
377             n = n + n;
378          }
379       }
380    }
381
382 }
383 /*-------------------------------------------------------------*/