Mercurial > SDL_sound_CoreAudio
comparison decoders/mpglib/layer1.c @ 261:9b6e82f7c853
Initial add.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Thu, 21 Feb 2002 19:46:09 +0000 |
parents | |
children | 52b9f37998db |
comparison
equal
deleted
inserted
replaced
260:44a4730a1e6f | 261:9b6e82f7c853 |
---|---|
1 /* | |
2 * Mpeg Layer-1 audio decoder | |
3 * -------------------------- | |
4 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' | |
5 * near unoptimzed ... | |
6 * | |
7 * may have a few bugs after last optimization ... | |
8 * | |
9 */ | |
10 | |
11 #include "mpg123_sdlsound.h" | |
12 | |
13 void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr) | |
14 { | |
15 unsigned int *ba=balloc; | |
16 unsigned int *sca = (unsigned int *) scale_index; | |
17 | |
18 if(fr->stereo) { | |
19 int i; | |
20 int jsbound = fr->jsbound; | |
21 for (i=0;i<jsbound;i++) { | |
22 *ba++ = getbits(4); | |
23 *ba++ = getbits(4); | |
24 } | |
25 for (i=jsbound;i<SBLIMIT;i++) | |
26 *ba++ = getbits(4); | |
27 | |
28 ba = balloc; | |
29 | |
30 for (i=0;i<jsbound;i++) { | |
31 if ((*ba++)) | |
32 *sca++ = getbits(6); | |
33 if ((*ba++)) | |
34 *sca++ = getbits(6); | |
35 } | |
36 for (i=jsbound;i<SBLIMIT;i++) | |
37 if ((*ba++)) { | |
38 *sca++ = getbits(6); | |
39 *sca++ = getbits(6); | |
40 } | |
41 } | |
42 else { | |
43 int i; | |
44 for (i=0;i<SBLIMIT;i++) | |
45 *ba++ = getbits(4); | |
46 ba = balloc; | |
47 for (i=0;i<SBLIMIT;i++) | |
48 if ((*ba++)) | |
49 *sca++ = getbits(6); | |
50 } | |
51 } | |
52 | |
53 void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT], | |
54 unsigned int scale_index[2][SBLIMIT],struct frame *fr) | |
55 { | |
56 int i,n; | |
57 int smpb[2*SBLIMIT]; /* values: 0-65535 */ | |
58 int *sample; | |
59 register unsigned int *ba; | |
60 register unsigned int *sca = (unsigned int *) scale_index; | |
61 | |
62 if(fr->stereo) { | |
63 int jsbound = fr->jsbound; | |
64 register real *f0 = fraction[0]; | |
65 register real *f1 = fraction[1]; | |
66 ba = balloc; | |
67 for (sample=smpb,i=0;i<jsbound;i++) { | |
68 if ((n = *ba++)) | |
69 *sample++ = getbits(n+1); | |
70 if ((n = *ba++)) | |
71 *sample++ = getbits(n+1); | |
72 } | |
73 for (i=jsbound;i<SBLIMIT;i++) | |
74 if ((n = *ba++)) | |
75 *sample++ = getbits(n+1); | |
76 | |
77 ba = balloc; | |
78 for (sample=smpb,i=0;i<jsbound;i++) { | |
79 if((n=*ba++)) | |
80 *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++]; | |
81 else | |
82 *f0++ = 0.0; | |
83 if((n=*ba++)) | |
84 *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++]; | |
85 else | |
86 *f1++ = 0.0; | |
87 } | |
88 for (i=jsbound;i<SBLIMIT;i++) { | |
89 if ((n=*ba++)) { | |
90 real samp = ( ((-1)<<n) + (*sample++) + 1); | |
91 *f0++ = samp * muls[n+1][*sca++]; | |
92 *f1++ = samp * muls[n+1][*sca++]; | |
93 } | |
94 else | |
95 *f0++ = *f1++ = 0.0; | |
96 } | |
97 } | |
98 else { | |
99 register real *f0 = fraction[0]; | |
100 ba = balloc; | |
101 for (sample=smpb,i=0;i<SBLIMIT;i++) | |
102 if ((n = *ba++)) | |
103 *sample++ = getbits(n+1); | |
104 ba = balloc; | |
105 for (sample=smpb,i=0;i<SBLIMIT;i++) { | |
106 if((n=*ba++)) | |
107 *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++]; | |
108 else | |
109 *f0++ = 0.0; | |
110 } | |
111 } | |
112 } | |
113 | |
114 int do_layer1(struct frame *fr,unsigned char *pcm_sample,int *pcm_point) | |
115 { | |
116 int clip=0; | |
117 int i,stereo = fr->stereo; | |
118 unsigned int balloc[2*SBLIMIT]; | |
119 unsigned int scale_index[2][SBLIMIT]; | |
120 real fraction[2][SBLIMIT]; | |
121 int single = fr->single; | |
122 | |
123 fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32; | |
124 | |
125 if(stereo == 1 || single == 3) | |
126 single = 0; | |
127 | |
128 I_step_one(balloc,scale_index,fr); | |
129 | |
130 for (i=0;i<SCALE_BLOCK;i++) | |
131 { | |
132 I_step_two(fraction,balloc,scale_index,fr); | |
133 | |
134 if(single >= 0) { | |
135 clip += synth_1to1_mono( (real*)fraction[single],pcm_sample,pcm_point); | |
136 } | |
137 else { | |
138 int p1 = *pcm_point; | |
139 clip += synth_1to1( (real*)fraction[0],0,pcm_sample,&p1); | |
140 clip += synth_1to1( (real*)fraction[1],1,pcm_sample,pcm_point); | |
141 } | |
142 } | |
143 | |
144 return clip; | |
145 } | |
146 | |
147 |