annotate mp3lib/layer2.c @ 4513:2e3800da1ceb

Switched from libmp1e to libavcodec, at least for me it runs helluva lot faster than libmp1e (high quality divx movies that before ran very poor now plays perfectly). Also includes some minor fixes to the osd support. Since libmp1e has issues with non-mmx system I think this move is a smart one...
author mswitch
date Sun, 03 Feb 2002 14:55:27 +0000
parents 03b7e2955a20
children 8a0a93d6b4c3
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 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 for (i=jsbound;i;i--,alloc1+=(1<<step))
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 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 for (i=sblimit-jsbound;i;i--,alloc1+=(1<<step))
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;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 for (i=sblimit2;i;i--)
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 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 for (i=sblimit;i;i--,alloc1+=(1<<step))
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;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 for (i=sblimit;i;i--)
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;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 for (i=sblimit2;i;i--)
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 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 static int translate[3][2][16] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 int table,sblim;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 static struct al_table *tables[5] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 if(fr->lsf)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 table = 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 sblim = sblims[table];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 fr->alloc = tables[table];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 fr->II_sblimit = sblim;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 int do_layer2(struct frame *fr,int outmode)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 int clip=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 int i,j;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 int stereo = fr->stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 unsigned int bit_alloc[64];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 int scale[192];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 int single = fr->single;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 II_select_table(fr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 (fr->mode_ext<<2)+4 : fr->II_sblimit;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 if(stereo == 1 || single == 3)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 single = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 II_step_one(bit_alloc, scale, fr);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 for (i=0;i<SCALE_BLOCK;i++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 II_step_two(bit_alloc,fraction,scale,fr,i>>2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 for (j=0;j<3;j++)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 if(single >= 0)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 clip += (fr->synth_mono) (fraction[single][j],pcm_sample,&pcm_point);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 int p1 = pcm_point;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 clip += (fr->synth) (fraction[0][j],0,pcm_sample,&p1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 clip += (fr->synth) (fraction[1][j],1,pcm_sample,&pcm_point);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 // if(pcm_point >= audiobufsize) audio_flush(outmode,ai);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 return clip;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303