annotate mp3lib/layer2.c @ 14379:30d62dbb5520

lavc is reintegrated, just as it was before removal some commits ago it hasn't been touched yet (no work done yet) so it's neither reformatted nor up to date
author kraymer
date Wed, 05 Jan 2005 23:32:38 +0000
parents 55174e3d2917
children 07e7a572bd84
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 * Mpeg Layer-2 audio decoder
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3 * --------------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 *
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 //#include "mpg123.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 #include "l2tables.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 static int grp_3tab[32 * 3] = { 0, }; /* used: 27 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 static int grp_5tab[128 * 3] = { 0, }; /* used: 125 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 static real muls[27][64]; /* also used by layer 1 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 static void init_layer2(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 static double mulmul[27] = {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 0.0 , -2.0/3.0 , 2.0/3.0 ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21 2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23 2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 -4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 -8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 static int base[3][9] = {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 { 1 , 0, 2 , } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 { 17, 18, 0 , 19, 20 , } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29 { 21, 1, 22, 23, 0, 24, 25, 2, 26 } };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 int i,j,k,l,len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 real *table;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 static int tablen[3] = { 3 , 5 , 9 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 static int *itable,*tables[3] = { grp_3tab , grp_5tab , grp_9tab };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 for(i=0;i<3;i++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 itable = tables[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 len = tablen[i];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 for(j=0;j<len;j++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 for(k=0;k<len;k++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 for(l=0;l<len;l++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 *itable++ = base[i][l];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 *itable++ = base[i][k];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 *itable++ = base[i][j];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 for(k=0;k<27;k++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 double m=mulmul[k];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 table = muls[k];
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
53 if(_has_mmx)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
54 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
55 for(j=3,i=0;i<63;i++,j--)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
56 *table++ = 16384 * m * pow(2.0,(double) j / 3.0);
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
57 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
58 else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 for(j=3,i=0;i<63;i++,j--)
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
60 {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 *table++ = m * pow(2.0,(double) j / 3.0);
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1
diff changeset
62 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 *table++ = 0.0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 static void II_step_one(unsigned int *bit_alloc,int *scale,struct frame *fr)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 int stereo = fr->stereo-1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 int sblimit = fr->II_sblimit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 int jsbound = fr->jsbound;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 int sblimit2 = fr->II_sblimit<<stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 struct al_table *alloc1 = fr->alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 static unsigned int scfsi_buf[64];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 unsigned int *scfsi,*bita;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 int sc,step;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 bita = bit_alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 if(stereo)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 {
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
83 for (i=jsbound;i>0;i--,alloc1+=(1<<step))
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 *bita++ = (char) getbits(step=alloc1->bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 *bita++ = (char) getbits(step);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 }
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
88 for (i=sblimit-jsbound;i>0;i--,alloc1+=(1<<step))
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 bita[0] = (char) getbits(step=alloc1->bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 bita[1] = bita[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 bita+=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 bita = bit_alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 scfsi=scfsi_buf;
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
96 for (i=sblimit2;i>0;i--)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 if (*bita++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 *scfsi++ = (char) getbits_fast(2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 else /* mono */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 {
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
102 for (i=sblimit;i>0;i--,alloc1+=(1<<step))
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 *bita++ = (char) getbits(step=alloc1->bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 bita = bit_alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 scfsi=scfsi_buf;
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
106 for (i=sblimit;i>0;i--)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 if (*bita++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 *scfsi++ = (char) getbits_fast(2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 bita = bit_alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 scfsi=scfsi_buf;
13336
55174e3d2917 Index must be positive to prevent endless loop on bad data
rtognimp
parents: 12131
diff changeset
113 for (i=sblimit2;i>0;i--)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 if (*bita++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 switch (*scfsi++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 case 0:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 *scale++ = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 *scale++ = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 *scale++ = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 case 1 :
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 *scale++ = sc = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 *scale++ = sc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 *scale++ = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 case 2:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 *scale++ = sc = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 *scale++ = sc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 *scale++ = sc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 default: /* case 3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 *scale++ = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 *scale++ = sc = getbits_fast(6);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 *scale++ = sc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 static void II_step_two(unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 int i,j,k,ba;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 int stereo = fr->stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 int sblimit = fr->II_sblimit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 int jsbound = fr->jsbound;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 struct al_table *alloc2,*alloc1 = fr->alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 unsigned int *bita=bit_alloc;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 int d1,step;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 for (i=0;i<jsbound;i++,alloc1+=(1<<step))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 step = alloc1->bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 for (j=0;j<stereo;j++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 if ( (ba=*bita++) )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 k=(alloc2 = alloc1+ba)->bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 if( (d1=alloc2->d) < 0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 real cm=muls[k][scale[x1]];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 fraction[j][0][i] = ((real) ((int)getbits(k) + d1)) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 fraction[j][1][i] = ((real) ((int)getbits(k) + d1)) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 fraction[j][2][i] = ((real) ((int)getbits(k) + d1)) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 unsigned int idx,*tab,m=scale[x1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 idx = (unsigned int) getbits(k);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 tab = (unsigned int *) (table[d1] + idx + idx + idx);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 fraction[j][0][i] = muls[*tab++][m];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 fraction[j][1][i] = muls[*tab++][m];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 fraction[j][2][i] = muls[*tab][m];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 scale+=3;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 for (i=jsbound;i<sblimit;i++,alloc1+=(1<<step))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 step = alloc1->bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 bita++; /* channel 1 and channel 2 bitalloc are the same */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 if ( (ba=*bita++) )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 k=(alloc2 = alloc1+ba)->bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 if( (d1=alloc2->d) < 0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 real cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 cm=muls[k][scale[x1+3]];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(k) + d1) ) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(k) + d1) ) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(k) + d1) ) * cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 cm=muls[k][scale[x1]];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 fraction[0][0][i] *= cm; fraction[0][1][i] *= cm; fraction[0][2][i] *= cm;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 unsigned int idx,*tab,m1,m2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 m1 = scale[x1]; m2 = scale[x1+3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 idx = (unsigned int) getbits(k);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 tab = (unsigned int *) (table[d1] + idx + idx + idx);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = muls[*tab][m2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 scale+=6;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 should we use individual scalefac for channel 2 or
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 is the current way the right one , where we just copy channel 1 to
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 channel 2 ??
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 The current 'strange' thing is, that we throw away the scalefac
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 values for the second channel ...!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 -> changed .. now we use the scalefac values of channel one !!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 if(sblimit > (fr->down_sample_sblimit) )
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 sblimit = fr->down_sample_sblimit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 for(i=sblimit;i<SBLIMIT;i++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 for (j=0;j<stereo;j++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 static void II_select_table(struct frame *fr)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 {
9152
arpi
parents: 9130
diff changeset
238 static int translate[9][2][16] =
9130
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
239 { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } , /*44.1 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
240 { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , /*44.1 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
241 { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } , /*48 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
242 { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } , /*48 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
243 { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } , /*32 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
244 { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } , /*32 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
245 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*22.05 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
246 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } , /*22.05 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
247 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*24 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
248 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } , /*24 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
249 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*16 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
250 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } , /*16 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
251 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*11.025 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
252 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } , /*11.025 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
253 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*12 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
254 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } , /*12 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
255 { { 2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0 } , /*8 stereo*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
256 { 2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,0 } } /*8 mono*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
257 /* 0 48 64 96 128 192 256 384 */
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
258 /* 32 56 80 112 160 224 320 XX*/
8a0a93d6b4c3 In mp3lib/sr1.c, look at the line 226:
arpi
parents: 1245
diff changeset
259 };
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 int table,sblim;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 static struct al_table *tables[5] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 if(fr->lsf)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 table = 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 sblim = sblims[table];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 fr->alloc = tables[table];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 fr->II_sblimit = sblim;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276
12131
d155623271e3 fix symbol clashes when linking with libmp3lame including mp3 decoder, man, mp3lib is so much bloated
alex
parents: 9152
diff changeset
277 static int do_layer2(struct frame *fr,int outmode)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 int clip=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 int i,j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 int stereo = fr->stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 unsigned int bit_alloc[64];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 int scale[192];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 int single = fr->single;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 II_select_table(fr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 (fr->mode_ext<<2)+4 : fr->II_sblimit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 if(stereo == 1 || single == 3)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 single = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 II_step_one(bit_alloc, scale, fr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 for (i=0;i<SCALE_BLOCK;i++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 II_step_two(bit_alloc,fraction,scale,fr,i>>2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 for (j=0;j<3;j++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 if(single >= 0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 clip += (fr->synth_mono) (fraction[single][j],pcm_sample,&pcm_point);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 int p1 = pcm_point;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 clip += (fr->synth) (fraction[0][j],0,pcm_sample,&p1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308 clip += (fr->synth) (fraction[1][j],1,pcm_sample,&pcm_point);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 // if(pcm_point >= audiobufsize) audio_flush(outmode,ai);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 return clip;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 }