annotate Input/mpg123/layer2.c @ 28:a4513169b27e trunk

[svn] Possible crash fix.
author nenolod
date Tue, 25 Oct 2005 21:46:47 -0700
parents cb178e5ad177
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3 * Mpeg Layer-2 audio decoder
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 * --------------------------
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 #include <glib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 #include <math.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 #include "audacious/output.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13 #include "mpg123.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14 #include "l2tables.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 #include "getbits.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18 static int grp_3tab[32 * 3] = { 0, }; /* used: 27 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19 static int grp_5tab[128 * 3] = { 0, }; /* used: 125 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20 static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 real mpg123_muls[27][64]; /* also used by layer 1 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 /* Used by the getbits macros */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 static unsigned long rval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 mpg123_init_layer2(gboolean mmx)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 static double mulmul[27] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31 0.0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36 -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38 static int base[3][9] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 {1, 0, 2,},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 {17, 18, 0, 19, 20,},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 {21, 1, 22, 23, 0, 24, 25, 2, 26}
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 int i, j, k, l, len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44 real *table;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 static int tablen[3] = { 3, 5, 9 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 static int *itable, *tables[3] = { grp_3tab, grp_5tab, grp_9tab };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48 for (i = 0; i < 3; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49 itable = tables[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50 len = tablen[i];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51 for (j = 0; j < len; j++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52 for (k = 0; k < len; k++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 for (l = 0; l < len; l++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 *itable++ = base[i][l];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 *itable++ = base[i][k];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56 *itable++ = base[i][j];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60 for (k = 0; k < 27; k++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61 double m = mulmul[k];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 table = mpg123_muls[k];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 #ifdef USE_SIMD
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 if (mmx)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 for (j = 3, i = 0; i < 63; i++, j--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66 *table++ = 16384 * m * pow(2.0, (double) j / 3.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69 for (j = 3, i = 0; i < 63; i++, j--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 *table++ = m * pow(2.0, (double) j / 3.0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71 *table++ = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76 II_step_one(unsigned int *bit_alloc, int *scale, struct frame *fr)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 int stereo = fr->stereo - 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 int sblimit = fr->II_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 int jsbound = fr->jsbound;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 int sblimit2 = fr->II_sblimit << stereo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82 struct al_table *alloc1 = fr->alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84 static unsigned int scfsi_buf[64];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 unsigned int *scfsi, *bita;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 int sc, step;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88 bita = bit_alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89 if (stereo) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90 for (i = jsbound; i > 0; i--, alloc1 += (1 << step)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 *bita++ = (char) mpg123_getbits(step = alloc1->bits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 *bita++ = (char) mpg123_getbits(step);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 for (i = sblimit - jsbound; i > 0; i--, alloc1 += (1 << step)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 bita[0] = (char) mpg123_getbits(step = alloc1->bits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 bita[1] = bita[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 bita += 2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 bita = bit_alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 scfsi = scfsi_buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101 for (i = sblimit2; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102 if (*bita++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103 *scfsi++ = (char) mpg123_getbits_fast(2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 /* mono */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 for (i = sblimit; i; i--, alloc1 += (1 << step))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 *bita++ = (char) mpg123_getbits(step = alloc1->bits);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 bita = bit_alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 scfsi = scfsi_buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112 for (i = sblimit; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 if (*bita++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 *scfsi++ = (char) mpg123_getbits_fast(2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 bita = bit_alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 scfsi = scfsi_buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119 for (i = sblimit2; i; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 if (*bita++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 switch (*scfsi++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 case 0:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 *scale++ = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124 *scale++ = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 *scale++ = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 case 1:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 *scale++ = sc = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 *scale++ = sc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 *scale++ = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 case 2:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 *scale++ = sc = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 *scale++ = sc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135 *scale++ = sc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137 default: /* case 3 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 *scale++ = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 *scale++ = sc = mpg123_getbits_fast(6);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140 *scale++ = sc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147 II_step_two(unsigned int *bit_alloc, real fraction[2][4][SBLIMIT],
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148 int *scale, struct frame *fr, int x1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150 int i, j, k, ba;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151 int stereo = fr->stereo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 int sblimit = fr->II_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153 int jsbound = fr->jsbound;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 struct al_table *alloc2, *alloc1 = fr->alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155 unsigned int *bita = bit_alloc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156 int d1, step;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 for (i = 0; i < jsbound; i++, alloc1 += (1 << step)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 step = alloc1->bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 for (j = 0; j < stereo; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161 if ((ba = *bita++)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 k = (alloc2 = alloc1 + ba)->bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163 if ((d1 = alloc2->d) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164 real cm = mpg123_muls[k][scale[x1]];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166 fraction[j][0][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167 ((real) ((int) mpg123_getbits(k) + d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168 fraction[j][1][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 ((real) ((int) mpg123_getbits(k) + d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170 fraction[j][2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171 ((real) ((int) mpg123_getbits(k) + d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 static int *table[] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175 { 0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176 grp_9tab
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 unsigned int idx, *tab, m = scale[x1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 idx = (unsigned int) mpg123_getbits(k);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181 tab = (unsigned int *) (table[d1] + idx + idx + idx);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 fraction[j][0][i] = mpg123_muls[*tab++][m];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183 fraction[j][1][i] = mpg123_muls[*tab++][m];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184 fraction[j][2][i] = mpg123_muls[*tab][m];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 scale += 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 for (i = jsbound; i < sblimit; i++, alloc1 += (1 << step)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195 step = alloc1->bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 bita++; /* channel 1 and channel 2 bitalloc are the same */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 if ((ba = *bita++)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198 k = (alloc2 = alloc1 + ba)->bits;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 if ((d1 = alloc2->d) < 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200 real cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202 cm = mpg123_muls[k][scale[x1 + 3]];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203 fraction[1][0][i] = (fraction[0][0][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204 (real) ((int) mpg123_getbits(k) +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 fraction[1][1][i] = (fraction[0][1][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 (real) ((int) mpg123_getbits(k) +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208 d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209 fraction[1][2][i] = (fraction[0][2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 (real) ((int) mpg123_getbits(k) +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211 d1)) * cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212 cm = mpg123_muls[k][scale[x1]];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213 fraction[0][0][i] *= cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
214 fraction[0][1][i] *= cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
215 fraction[0][2][i] *= cm;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
216 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
217 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
218 static int *table[] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
219 { 0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0, grp_9tab };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
220 unsigned int idx, *tab, m1, m2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
221
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
222 m1 = scale[x1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
223 m2 = scale[x1 + 3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
224 idx = (unsigned int) mpg123_getbits(k);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
225 tab = (unsigned int *) (table[d1] + idx + idx + idx);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
226 fraction[0][0][i] = mpg123_muls[*tab][m1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
227 fraction[1][0][i] = mpg123_muls[*tab++][m2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
228 fraction[0][1][i] = mpg123_muls[*tab][m1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
229 fraction[1][1][i] = mpg123_muls[*tab++][m2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
230 fraction[0][2][i] = mpg123_muls[*tab][m1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
231 fraction[1][2][i] = mpg123_muls[*tab][m2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
232 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
233 scale += 6;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
234 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
235 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
236 fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
237 fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
238 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
239 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
240 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
241 should we use individual scalefac for channel 2 or
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
242 is the current way the right one , where we just copy channel 1 to
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
243 channel 2 ??
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
244 The current 'strange' thing is, that we throw away the scalefac
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
245 values for the second channel ...!!
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
246 -> changed .. now we use the scalefac values of channel one !!
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
247 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
248 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
249
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
250 if (sblimit > (fr->down_sample_sblimit))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
251 sblimit = fr->down_sample_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
252
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
253 for (i = sblimit; i < SBLIMIT; i++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
254 for (j = 0; j < stereo; j++)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
255 fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
256
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
257 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
258
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
259 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
260 II_select_table(struct frame *fr)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
261 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
262 static int translate[3][2][16] = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
263 {{0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
264 {0, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
265 {{0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
266 {0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
267 {{0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 0},
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
268 {0, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}}
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
269 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
270
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
271 int table, sblim;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
272 static struct al_table *tables[5] =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
273 { alloc_0, alloc_1, alloc_2, alloc_3, alloc_4 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
274 static int sblims[5] = { 27, 30, 8, 12, 30 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
275
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
276 if (fr->lsf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
277 table = 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
278 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
279 table =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
280 translate[fr->sampling_frequency][2 -
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
281 fr->stereo][fr->bitrate_index];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
282 sblim = sblims[table];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
283
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
284 fr->alloc = tables[table];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
285 fr->II_sblimit = sblim;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
286 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
287
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
288
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
289 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
290 mpg123_do_layer2(struct frame *fr)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
291 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
292 int i, j;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
293 int stereo = fr->stereo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
294 real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
295 unsigned int bit_alloc[64];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
296 int scale[192];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
297 int single = fr->single;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
298
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
299 II_select_table(fr);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
300 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
301 (fr->mode_ext << 2) + 4 : fr->II_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
302 if (fr->jsbound > fr->II_sblimit)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
303 fr->jsbound = fr->II_sblimit;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
304
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
305 if (stereo == 1 || single == 3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
306 single = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
307
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
308 II_step_one(bit_alloc, scale, fr);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
309
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
310 for (i = 0; i < SCALE_BLOCK; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
311 II_step_two(bit_alloc, fraction, scale, fr, i >> 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
312 for (j = 0; j < 3; j++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
313 if (single >= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
314 (fr->synth_mono) (fraction[single][j], mpg123_pcm_sample,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
315 &mpg123_pcm_point);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
316 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
317 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
318 int p1 = mpg123_pcm_point;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
319
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
320 (fr->synth) (fraction[0][j], 0, mpg123_pcm_sample, &p1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
321 (fr->synth) (fraction[1][j], 1, mpg123_pcm_sample,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
322 &mpg123_pcm_point);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
323 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
324
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
325 /* if(mpg123_pcm_point >= audiobufsize)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
326 audio_flush(outmode,ai); */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
327 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
328 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
329 if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
330 produce_audio(mpg123_ip.output->written_time(),
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
331 mpg123_cfg.resolution ==
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
332 16 ? FMT_S16_NE : FMT_U8,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
333 mpg123_cfg.channels ==
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
334 2 ? fr->stereo : 1, mpg123_pcm_point,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
335 mpg123_pcm_sample, &mpg123_info->going);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
336 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
337
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
338 mpg123_pcm_point = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
339
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
340 return 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
341 }