[MPG123]
[reactos.git] / reactos / sdk / lib / 3rdparty / libmpg123 / layer1.c
1 /*
2 layer1.c: the layer 1 decoder
3
4 copyright 1995-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
5 see COPYING and AUTHORS files in distribution or http://mpg123.org
6 initially written by Michael Hipp
7
8 may have a few bugs after last optimization ...
9 */
10
11 #include "mpg123lib_intern.h"
12 #include "getbits.h"
13 #include "debug.h"
14
15 /*
16 Allocation value is not allowed to be 15. Initially, libmad showed me the
17 error that mpg123 used to ignore. Then, I found a quote on that in
18 Shlien, S. (1994): Guide to MPEG-1 Audio Standard.
19 IEEE Transactions on Broadcasting 40, 4
20
21 "To avoid conflicts with the synchronization code, code '1111' is defined
22 to be illegal."
23 */
24 static int check_balloc(mpg123_handle *fr, unsigned int *balloc, unsigned int *end)
25 {
26 unsigned int *ba;
27 for(ba=balloc; ba != end; ++ba)
28 if(*ba == 15)
29 {
30 if(NOQUIET) error("Illegal bit allocation value.");
31 return -1;
32 }
33
34 return 0;
35 }
36
37 static int I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],mpg123_handle *fr)
38 {
39 unsigned int *ba=balloc;
40 unsigned int *sca = (unsigned int *) scale_index;
41
42 if(fr->stereo == 2)
43 {
44 int i;
45 int jsbound = fr->jsbound;
46 for(i=0;i<jsbound;i++)
47 {
48 *ba++ = getbits(fr, 4);
49 *ba++ = getbits(fr, 4);
50 }
51 for(i=jsbound;i<SBLIMIT;i++) *ba++ = getbits(fr, 4);
52
53 if(check_balloc(fr, balloc, ba)) return -1;
54
55 ba = balloc;
56
57 for(i=0;i<jsbound;i++)
58 {
59 if ((*ba++))
60 *sca++ = getbits(fr, 6);
61 if ((*ba++))
62 *sca++ = getbits(fr, 6);
63 }
64 for (i=jsbound;i<SBLIMIT;i++)
65 if((*ba++))
66 {
67 *sca++ = getbits(fr, 6);
68 *sca++ = getbits(fr, 6);
69 }
70 }
71 else
72 {
73 int i;
74 for(i=0;i<SBLIMIT;i++) *ba++ = getbits(fr, 4);
75
76 if(check_balloc(fr, balloc, ba)) return -1;
77
78 ba = balloc;
79 for (i=0;i<SBLIMIT;i++)
80 if ((*ba++))
81 *sca++ = getbits(fr, 6);
82 }
83
84 return 0;
85 }
86
87 /* Something sane in place of undefined (-1)<<n. Well, not really. */
88 #define MINUS_SHIFT(n) ( (int)(((unsigned int)-1)<<(n)) )
89
90 static void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT], unsigned int scale_index[2][SBLIMIT],mpg123_handle *fr)
91 {
92 int i,n;
93 int smpb[2*SBLIMIT]; /* values: 0-65535 */
94 int *sample;
95 register unsigned int *ba;
96 register unsigned int *sca = (unsigned int *) scale_index;
97
98 if(fr->stereo == 2)
99 {
100 int jsbound = fr->jsbound;
101 register real *f0 = fraction[0];
102 register real *f1 = fraction[1];
103 ba = balloc;
104 for(sample=smpb,i=0;i<jsbound;i++)
105 {
106 if((n = *ba++)) *sample++ = getbits(fr, n+1);
107
108 if((n = *ba++)) *sample++ = getbits(fr, n+1);
109 }
110 for(i=jsbound;i<SBLIMIT;i++)
111 if((n = *ba++))
112 *sample++ = getbits(fr, n+1);
113
114 ba = balloc;
115 for(sample=smpb,i=0;i<jsbound;i++)
116 {
117 if((n=*ba++))
118 *f0++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
119 else *f0++ = DOUBLE_TO_REAL(0.0);
120
121 if((n=*ba++))
122 *f1++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
123 else *f1++ = DOUBLE_TO_REAL(0.0);
124 }
125 for(i=jsbound;i<SBLIMIT;i++)
126 {
127 if((n=*ba++))
128 {
129 real samp = DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1);
130 *f0++ = REAL_MUL_SCALE_LAYER12(samp, fr->muls[n+1][*sca++]);
131 *f1++ = REAL_MUL_SCALE_LAYER12(samp, fr->muls[n+1][*sca++]);
132 }
133 else *f0++ = *f1++ = DOUBLE_TO_REAL(0.0);
134 }
135 for(i=fr->down_sample_sblimit;i<32;i++)
136 fraction[0][i] = fraction[1][i] = 0.0;
137 }
138 else
139 {
140 register real *f0 = fraction[0];
141 ba = balloc;
142 for(sample=smpb,i=0;i<SBLIMIT;i++)
143 if ((n = *ba++))
144 *sample++ = getbits(fr, n+1);
145
146 ba = balloc;
147 for(sample=smpb,i=0;i<SBLIMIT;i++)
148 {
149 if((n=*ba++))
150 *f0++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
151 else *f0++ = DOUBLE_TO_REAL(0.0);
152 }
153 for(i=fr->down_sample_sblimit;i<32;i++)
154 fraction[0][i] = DOUBLE_TO_REAL(0.0);
155 }
156 }
157
158 int do_layer1(mpg123_handle *fr)
159 {
160 int clip=0;
161 int i,stereo = fr->stereo;
162 unsigned int balloc[2*SBLIMIT];
163 unsigned int scale_index[2][SBLIMIT];
164 real (*fraction)[SBLIMIT] = fr->layer1.fraction; /* fraction[2][SBLIMIT] */
165 int single = fr->single;
166
167 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
168
169 if(stereo == 1 || single == SINGLE_MIX) /* I don't see mixing handled here */
170 single = SINGLE_LEFT;
171
172 if(I_step_one(balloc,scale_index,fr))
173 {
174 if(NOQUIET) error("Aborting layer I decoding after step one.\n");
175 return clip;
176 }
177
178 for(i=0;i<SCALE_BLOCK;i++)
179 {
180 I_step_two(fraction,balloc,scale_index,fr);
181
182 if(single != SINGLE_STEREO)
183 clip += (fr->synth_mono)(fraction[single], fr);
184 else
185 clip += (fr->synth_stereo)(fraction[0], fraction[1], fr);
186 }
187
188 return clip;
189 }
190
191