Version 0.1.1 from FTP
[asterisk/asterisk.git] / codecs / mp3 / src / csbt.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 /****  csbt.c  ***************************************************
28
29 MPEG audio decoder, dct and window
30 portable C
31
32 1/7/96 mod for Layer III
33   
34 ******************************************************************/
35
36 #include <stdlib.h>
37 #include <stdio.h>
38 #include <float.h>
39 #include <math.h>
40 #include "L3.h"
41 #include "mhead.h"
42
43 void fdct32(MPEG *m, float *, float *);
44 void fdct32_dual(MPEG *m, float *, float *);
45 void fdct32_dual_mono(MPEG *m, float *, float *);
46 void fdct16(MPEG *m, float *, float *);
47 void fdct16_dual(MPEG *m, float *, float *);
48 void fdct16_dual_mono(MPEG *m, float *, float *);
49 void fdct8(MPEG *m, float *, float *);
50 void fdct8_dual(MPEG *m, float *, float *);
51 void fdct8_dual_mono(MPEG *m, float *, float *);
52
53 void window(float *, int , short *pcm);
54 void window_dual(MPEG *m, float *, int , short *pcm);
55 void window16(MPEG *m, float *, int , short *pcm);
56 void window16_dual(MPEG *m, float *, int , short *pcm);
57 void window8(MPEG *m, float *, int , short *pcm);
58 void window8_dual(MPEG *m, float *, int , short *pcm);
59 float *dct_coef_addr(MPEG *m);
60
61 /*-------------------------------------------------------------------------*/
62 /* circular window buffers */
63
64 /*======================================================================*/
65 static void gencoef(MPEG *m)            /* gen coef for N=32 (31 coefs) */
66 {
67    int p, n, i, k;
68    double t, pi;
69    float *coef32;
70
71    coef32 = dct_coef_addr(m);
72
73    pi = 4.0 * atan(1.0);
74    n = 16;
75    k = 0;
76    for (i = 0; i < 5; i++, n = n / 2)
77    {
78
79       for (p = 0; p < n; p++, k++)
80       {
81          t = (pi / (4 * n)) * (2 * p + 1);
82          coef32[k] = (float) (0.50 / cos(t));
83       }
84    }
85 }
86 /*------------------------------------------------------------*/
87 void sbt_init(MPEG *m)
88 {
89    int i;
90
91    if (m->csbt.first_pass)
92    {
93       gencoef(m);
94       m->csbt.first_pass = 0;
95    }
96
97 /* clear window m->csbt.vbuf */
98    for (i = 0; i < 512; i++)
99    {
100       m->csbt.vbuf[i] = 0.0F;
101       m->csbt.vbuf2[i] = 0.0F;
102    }
103    m->csbt.vb2_ptr = m->csbt.vb_ptr = 0;
104
105 }
106 /*============================================================*/
107 /*============================================================*/
108 /*============================================================*/
109 void sbt_mono(MPEG *m, float *sample, short *pcm, int n)
110 {
111    int i;
112
113    for (i = 0; i < n; i++)
114    {
115       fdct32(m, sample, m->csbt.vbuf + m->csbt.vb_ptr);
116       window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
117       sample += 64;
118       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
119       pcm += 32;
120    }
121
122 }
123 /*------------------------------------------------------------*/
124 void sbt_dual(MPEG *m, float *sample, short *pcm, int n)
125 {
126    int i;
127
128    for (i = 0; i < n; i++)
129    {
130       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
131       fdct32_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
132       window_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
133       window_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
134       sample += 64;
135       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
136       pcm += 64;
137    }
138
139
140 }
141 /*------------------------------------------------------------*/
142 /* convert dual to mono */
143 void sbt_dual_mono(MPEG *m, float *sample, short *pcm, int n)
144 {
145    int i;
146
147    for (i = 0; i < n; i++)
148    {
149       fdct32_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
150       window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
151       sample += 64;
152       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
153       pcm += 32;
154    }
155
156 }
157 /*------------------------------------------------------------*/
158 /* convert dual to left */
159 void sbt_dual_left(MPEG *m, float *sample, short *pcm, int n)
160 {
161    int i;
162
163    for (i = 0; i < n; i++)
164    {
165       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
166       window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
167       sample += 64;
168       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
169       pcm += 32;
170    }
171 }
172 /*------------------------------------------------------------*/
173 /* convert dual to right */
174 void sbt_dual_right(MPEG *m, float *sample, short *pcm, int n)
175 {
176    int i;
177
178    sample++;                    /* point to right chan */
179    for (i = 0; i < n; i++)
180    {
181       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
182       window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
183       sample += 64;
184       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
185       pcm += 32;
186    }
187 }
188 /*------------------------------------------------------------*/
189 /*---------------- 16 pt sbt's  -------------------------------*/
190 /*------------------------------------------------------------*/
191 void sbt16_mono(MPEG *m, float *sample, short *pcm, int n)
192 {
193    int i;
194
195    for (i = 0; i < n; i++)
196    {
197       fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
198       window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
199       sample += 64;
200       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
201       pcm += 16;
202    }
203
204
205 }
206 /*------------------------------------------------------------*/
207 void sbt16_dual(MPEG *m, float *sample, short *pcm, int n)
208 {
209    int i;
210
211    for (i = 0; i < n; i++)
212    {
213       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
214       fdct16_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
215       window16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
216       window16_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
217       sample += 64;
218       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
219       pcm += 32;
220    }
221 }
222 /*------------------------------------------------------------*/
223 void sbt16_dual_mono(MPEG *m, float *sample, short *pcm, int n)
224 {
225    int i;
226
227    for (i = 0; i < n; i++)
228    {
229       fdct16_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
230       window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
231       sample += 64;
232       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
233       pcm += 16;
234    }
235 }
236 /*------------------------------------------------------------*/
237 void sbt16_dual_left(MPEG *m, float *sample, short *pcm, int n)
238 {
239    int i;
240
241    for (i = 0; i < n; i++)
242    {
243       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
244       window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
245       sample += 64;
246       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
247       pcm += 16;
248    }
249 }
250 /*------------------------------------------------------------*/
251 void sbt16_dual_right(MPEG *m, float *sample, short *pcm, int n)
252 {
253    int i;
254
255    sample++;
256    for (i = 0; i < n; i++)
257    {
258       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
259       window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
260       sample += 64;
261       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
262       pcm += 16;
263    }
264 }
265 /*------------------------------------------------------------*/
266 /*---------------- 8 pt sbt's  -------------------------------*/
267 /*------------------------------------------------------------*/
268 void sbt8_mono(MPEG *m, float *sample, short *pcm, int n)
269 {
270    int i;
271
272    for (i = 0; i < n; i++)
273    {
274       fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
275       window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
276       sample += 64;
277       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
278       pcm += 8;
279    }
280
281 }
282 /*------------------------------------------------------------*/
283 void sbt8_dual(MPEG *m, float *sample, short *pcm, int n)
284 {
285    int i;
286
287    for (i = 0; i < n; i++)
288    {
289       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
290       fdct8_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
291       window8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
292       window8_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
293       sample += 64;
294       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
295       pcm += 16;
296    }
297 }
298 /*------------------------------------------------------------*/
299 void sbt8_dual_mono(MPEG *m, float *sample, short *pcm, int n)
300 {
301    int i;
302
303    for (i = 0; i < n; i++)
304    {
305       fdct8_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
306       window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
307       sample += 64;
308       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
309       pcm += 8;
310    }
311 }
312 /*------------------------------------------------------------*/
313 void sbt8_dual_left(MPEG *m, float *sample, short *pcm, int n)
314 {
315    int i;
316
317    for (i = 0; i < n; i++)
318    {
319       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
320       window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
321       sample += 64;
322       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
323       pcm += 8;
324    }
325 }
326 /*------------------------------------------------------------*/
327 void sbt8_dual_right(MPEG *m, float *sample, short *pcm, int n)
328 {
329    int i;
330
331    sample++;
332    for (i = 0; i < n; i++)
333    {
334       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
335       window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
336       sample += 64;
337       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
338       pcm += 8;
339    }
340 }
341 /*------------------------------------------------------------*/
342 /*------------------------------------------------------------*/
343 #include "csbtb.c"              /* 8 bit output */
344 #include "csbtL3.c"             /* Layer III */
345 /*------------------------------------------------------------*/