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