annotate Plugins/Input/mpg123/layer2.c @ 61:fa848bd484d8 trunk

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