ReactOS 0.4.16-dev-297-gc569aee
layer1.c
Go to the documentation of this file.
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*/
24static 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#define NEED_BITS(fr, num) \
38 if((fr)->bits_avail < num) \
39 { \
40 if(NOQUIET) \
41 error2("%u bits needed, %li available", num, (fr)->bits_avail); \
42 return -1; \
43 } \
44
45static int I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],mpg123_handle *fr)
46{
47 unsigned int *ba=balloc;
48 unsigned int *sca = (unsigned int *) scale_index;
49
50 if(fr->stereo == 2)
51 {
52 int i;
53 int jsbound = fr->jsbound;
54 unsigned int needbits = jsbound*2*4 + (SBLIMIT-jsbound)*4;
55
56 NEED_BITS(fr, needbits);
57 needbits = 0;
58 for(i=0;i<jsbound;i++)
59 {
60 ba[0] = getbits_fast(fr, 4);
61 ba[1] = getbits_fast(fr, 4);
62 needbits += ((ba[0]?1:0)+(ba[1]?1:0))*6;
63 ba+=2;
64 }
65 for(i=jsbound;i<SBLIMIT;i++)
66 {
67 *ba = getbits_fast(fr, 4);
68 needbits += (*ba?1:0)*12;
69 ++ba;
70 }
71
72 if(check_balloc(fr, balloc, ba)) return -1;
73
74 ba = balloc;
75 NEED_BITS(fr, needbits)
76 for(i=0;i<jsbound;i++)
77 {
78 if ((*ba++))
79 *sca++ = getbits_fast(fr, 6);
80 if ((*ba++))
81 *sca++ = getbits_fast(fr, 6);
82 }
83 for (i=jsbound;i<SBLIMIT;i++) if((*ba++))
84 {
85 *sca++ = getbits_fast(fr, 6);
86 *sca++ = getbits_fast(fr, 6);
87 }
88 }
89 else
90 {
91 int i;
92 unsigned int needbits = SBLIMIT*4;
93
94 NEED_BITS(fr, needbits)
95 needbits = 0;
96 for(i=0;i<SBLIMIT;i++)
97 {
98 *ba = getbits_fast(fr, 4);
99 needbits += (*ba?1:0)*6;
100 ++ba;
101 }
102
103 if(check_balloc(fr, balloc, ba)) return -1;
104
105 ba = balloc;
106 NEED_BITS(fr, needbits)
107 for (i=0;i<SBLIMIT;i++)
108 if ((*ba++))
109 *sca++ = getbits_fast(fr, 6);
110 }
111
112 return 0;
113}
114
115/* Something sane in place of undefined (-1)<<n. Well, not really. */
116#define MINUS_SHIFT(n) ( (int)(((unsigned int)-1)<<(n)) )
117
118static int I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT], unsigned int scale_index[2][SBLIMIT],mpg123_handle *fr)
119{
120 int i,n;
121 int smpb[2*SBLIMIT]; /* values: 0-65535 */
122 int *sample;
123 register unsigned int *ba;
124 register unsigned int *sca = (unsigned int *) scale_index;
125
126 if(fr->stereo == 2)
127 {
128 unsigned int needbits = 0;
129 int jsbound = fr->jsbound;
130 register real *f0 = fraction[0];
131 register real *f1 = fraction[1];
132
133 ba = balloc;
134 for(sample=smpb,i=0;i<jsbound;i++)
135 {
136 if((n=*ba++))
137 needbits += n+1;
138 if((n=*ba++))
139 needbits += n+1;
140 }
141 for(i=jsbound;i<SBLIMIT;i++)
142 if((n = *ba++))
143 needbits += n+1;
144 NEED_BITS(fr, needbits)
145
146 ba = balloc;
147 for(sample=smpb,i=0;i<jsbound;i++)
148 {
149 if((n = *ba++)) *sample++ = getbits(fr, n+1);
150
151 if((n = *ba++)) *sample++ = getbits(fr, n+1);
152 }
153 for(i=jsbound;i<SBLIMIT;i++)
154 if((n = *ba++))
155 *sample++ = getbits(fr, n+1);
156
157 ba = balloc;
158 for(sample=smpb,i=0;i<jsbound;i++)
159 {
160 if((n=*ba++))
161 *f0++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
162 else *f0++ = DOUBLE_TO_REAL(0.0);
163
164 if((n=*ba++))
165 *f1++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
166 else *f1++ = DOUBLE_TO_REAL(0.0);
167 }
168 for(i=jsbound;i<SBLIMIT;i++)
169 {
170 if((n=*ba++))
171 {
172 real samp = DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1);
173 *f0++ = REAL_MUL_SCALE_LAYER12(samp, fr->muls[n+1][*sca++]);
174 *f1++ = REAL_MUL_SCALE_LAYER12(samp, fr->muls[n+1][*sca++]);
175 }
176 else *f0++ = *f1++ = DOUBLE_TO_REAL(0.0);
177 }
178 for(i=fr->down_sample_sblimit;i<32;i++)
179 fraction[0][i] = fraction[1][i] = 0.0;
180 }
181 else
182 {
183 unsigned int needbits = 0;
184 register real *f0 = fraction[0];
185
186 ba = balloc;
187 for(sample=smpb,i=0;i<SBLIMIT;i++)
188 if((n = *ba++))
189 needbits += n+1;
190 NEED_BITS(fr, needbits);
191
192 ba = balloc;
193 for(sample=smpb,i=0;i<SBLIMIT;i++)
194 if ((n = *ba++))
195 *sample++ = getbits(fr, n+1);
196
197
198 ba = balloc;
199 for(sample=smpb,i=0;i<SBLIMIT;i++)
200 {
201 if((n=*ba++))
202 *f0++ = REAL_MUL_SCALE_LAYER12(DOUBLE_TO_REAL_15(MINUS_SHIFT(n) + (*sample++) + 1), fr->muls[n+1][*sca++]);
203 else *f0++ = DOUBLE_TO_REAL(0.0);
204 }
205 for(i=fr->down_sample_sblimit;i<32;i++)
206 fraction[0][i] = DOUBLE_TO_REAL(0.0);
207 }
208 return 0;
209}
210
212{
213 int clip=0;
214 int i,stereo = fr->stereo;
215 unsigned int balloc[2*SBLIMIT];
216 unsigned int scale_index[2][SBLIMIT];
217 real (*fraction)[SBLIMIT] = fr->layer1.fraction; /* fraction[2][SBLIMIT] */
218 int single = fr->single;
219
220 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
221
222 if(stereo == 1 || single == SINGLE_MIX) /* I don't see mixing handled here */
223 single = SINGLE_LEFT;
224
225 if(I_step_one(balloc,scale_index,fr))
226 {
227 if(NOQUIET)
228 error("Aborting layer I decoding after step one.");
229 return clip;
230 }
231
232 for(i=0;i<SCALE_BLOCK;i++)
233 {
234 if(I_step_two(fraction,balloc,scale_index,fr))
235 {
236 if(NOQUIET)
237 error("Aborting layer I decoding after step two.");
238 return clip;
239 }
240
241 if(single != SINGLE_STEREO)
242 clip += (fr->synth_mono)(fraction[single], fr);
243 else
244 clip += (fr->synth_stereo)(fraction[0], fraction[1], fr);
245 }
246
247 return clip;
248}
249
250
#define SINGLE_LEFT
Definition: frame.h:189
#define SINGLE_STEREO
Definition: frame.h:188
#define SINGLE_MIX
Definition: frame.h:191
static unsigned int getbits(mpg123_handle *fr, int number_of_bits)
Definition: getbits.h:32
#define getbits_fast(fr, nob)
Definition: getbits.h:89
GLuint GLuint end
Definition: gl.h:1545
GLdouble n
Definition: glext.h:7729
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define do_layer1
Definition: intsym.h:174
#define NEED_BITS(fr, num)
Definition: layer1.c:37
static int I_step_two(real fraction[2][SBLIMIT], unsigned int balloc[2 *SBLIMIT], unsigned int scale_index[2][SBLIMIT], mpg123_handle *fr)
Definition: layer1.c:118
static int check_balloc(mpg123_handle *fr, unsigned int *balloc, unsigned int *end)
Definition: layer1.c:24
#define MINUS_SHIFT(n)
Definition: layer1.c:116
static int I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT], mpg123_handle *fr)
Definition: layer1.c:45
#define error(str)
Definition: mkdosfs.c:1605
#define REAL_MUL_SCALE_LAYER12(x, y)
#define DOUBLE_TO_REAL_15(x)
#define real
#define DOUBLE_TO_REAL(x)
#define SBLIMIT
#define NOQUIET
#define MPG_MD_JOINT_STEREO
#define SCALE_BLOCK
#define f1(x, y, z)
Definition: sha1.c:30
func_synth_mono synth_mono
Definition: frame.h:182
func_synth_stereo synth_stereo
Definition: frame.h:181
int down_sample_sblimit
Definition: frame.h:194
struct mpg123_handle_struct::@3460 layer1
real muls[27][64]
Definition: frame.h:145