|
1 /* |
|
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische |
|
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for |
|
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
|
5 */ |
|
6 |
|
7 /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/gsm_decode.c,v 1.2 1996/07/02 09:59:05 jutta Exp $ */ |
|
8 |
|
9 #include "private.h" |
|
10 |
|
11 #include "gsm.h" |
|
12 #include "proto.h" |
|
13 |
|
14 int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) |
|
15 { |
|
16 word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; |
|
17 |
|
18 #ifdef WAV49 |
|
19 if (s->wav_fmt) { |
|
20 |
|
21 uword sr = 0; |
|
22 |
|
23 s->frame_index = !s->frame_index; |
|
24 if (s->frame_index) { |
|
25 |
|
26 sr = *c++; |
|
27 LARc[0] = sr & 0x3f; sr >>= 6; |
|
28 sr |= (uword)*c++ << 2; |
|
29 LARc[1] = sr & 0x3f; sr >>= 6; |
|
30 sr |= (uword)*c++ << 4; |
|
31 LARc[2] = sr & 0x1f; sr >>= 5; |
|
32 LARc[3] = sr & 0x1f; sr >>= 5; |
|
33 sr |= (uword)*c++ << 2; |
|
34 LARc[4] = sr & 0xf; sr >>= 4; |
|
35 LARc[5] = sr & 0xf; sr >>= 4; |
|
36 sr |= (uword)*c++ << 2; /* 5 */ |
|
37 LARc[6] = sr & 0x7; sr >>= 3; |
|
38 LARc[7] = sr & 0x7; sr >>= 3; |
|
39 sr |= (uword)*c++ << 4; |
|
40 Nc[0] = sr & 0x7f; sr >>= 7; |
|
41 bc[0] = sr & 0x3; sr >>= 2; |
|
42 Mc[0] = sr & 0x3; sr >>= 2; |
|
43 sr |= (uword)*c++ << 1; |
|
44 xmaxc[0] = sr & 0x3f; sr >>= 6; |
|
45 xmc[0] = sr & 0x7; sr >>= 3; |
|
46 sr = *c++; |
|
47 xmc[1] = sr & 0x7; sr >>= 3; |
|
48 xmc[2] = sr & 0x7; sr >>= 3; |
|
49 sr |= (uword)*c++ << 2; |
|
50 xmc[3] = sr & 0x7; sr >>= 3; |
|
51 xmc[4] = sr & 0x7; sr >>= 3; |
|
52 xmc[5] = sr & 0x7; sr >>= 3; |
|
53 sr |= (uword)*c++ << 1; /* 10 */ |
|
54 xmc[6] = sr & 0x7; sr >>= 3; |
|
55 xmc[7] = sr & 0x7; sr >>= 3; |
|
56 xmc[8] = sr & 0x7; sr >>= 3; |
|
57 sr = *c++; |
|
58 xmc[9] = sr & 0x7; sr >>= 3; |
|
59 xmc[10] = sr & 0x7; sr >>= 3; |
|
60 sr |= (uword)*c++ << 2; |
|
61 xmc[11] = sr & 0x7; sr >>= 3; |
|
62 xmc[12] = sr & 0x7; sr >>= 3; |
|
63 sr |= (uword)*c++ << 4; |
|
64 Nc[1] = sr & 0x7f; sr >>= 7; |
|
65 bc[1] = sr & 0x3; sr >>= 2; |
|
66 Mc[1] = sr & 0x3; sr >>= 2; |
|
67 sr |= (uword)*c++ << 1; |
|
68 xmaxc[1] = sr & 0x3f; sr >>= 6; |
|
69 xmc[13] = sr & 0x7; sr >>= 3; |
|
70 sr = *c++; /* 15 */ |
|
71 xmc[14] = sr & 0x7; sr >>= 3; |
|
72 xmc[15] = sr & 0x7; sr >>= 3; |
|
73 sr |= (uword)*c++ << 2; |
|
74 xmc[16] = sr & 0x7; sr >>= 3; |
|
75 xmc[17] = sr & 0x7; sr >>= 3; |
|
76 xmc[18] = sr & 0x7; sr >>= 3; |
|
77 sr |= (uword)*c++ << 1; |
|
78 xmc[19] = sr & 0x7; sr >>= 3; |
|
79 xmc[20] = sr & 0x7; sr >>= 3; |
|
80 xmc[21] = sr & 0x7; sr >>= 3; |
|
81 sr = *c++; |
|
82 xmc[22] = sr & 0x7; sr >>= 3; |
|
83 xmc[23] = sr & 0x7; sr >>= 3; |
|
84 sr |= (uword)*c++ << 2; |
|
85 xmc[24] = sr & 0x7; sr >>= 3; |
|
86 xmc[25] = sr & 0x7; sr >>= 3; |
|
87 sr |= (uword)*c++ << 4; /* 20 */ |
|
88 Nc[2] = sr & 0x7f; sr >>= 7; |
|
89 bc[2] = sr & 0x3; sr >>= 2; |
|
90 Mc[2] = sr & 0x3; sr >>= 2; |
|
91 sr |= (uword)*c++ << 1; |
|
92 xmaxc[2] = sr & 0x3f; sr >>= 6; |
|
93 xmc[26] = sr & 0x7; sr >>= 3; |
|
94 sr = *c++; |
|
95 xmc[27] = sr & 0x7; sr >>= 3; |
|
96 xmc[28] = sr & 0x7; sr >>= 3; |
|
97 sr |= (uword)*c++ << 2; |
|
98 xmc[29] = sr & 0x7; sr >>= 3; |
|
99 xmc[30] = sr & 0x7; sr >>= 3; |
|
100 xmc[31] = sr & 0x7; sr >>= 3; |
|
101 sr |= (uword)*c++ << 1; |
|
102 xmc[32] = sr & 0x7; sr >>= 3; |
|
103 xmc[33] = sr & 0x7; sr >>= 3; |
|
104 xmc[34] = sr & 0x7; sr >>= 3; |
|
105 sr = *c++; /* 25 */ |
|
106 xmc[35] = sr & 0x7; sr >>= 3; |
|
107 xmc[36] = sr & 0x7; sr >>= 3; |
|
108 sr |= (uword)*c++ << 2; |
|
109 xmc[37] = sr & 0x7; sr >>= 3; |
|
110 xmc[38] = sr & 0x7; sr >>= 3; |
|
111 sr |= (uword)*c++ << 4; |
|
112 Nc[3] = sr & 0x7f; sr >>= 7; |
|
113 bc[3] = sr & 0x3; sr >>= 2; |
|
114 Mc[3] = sr & 0x3; sr >>= 2; |
|
115 sr |= (uword)*c++ << 1; |
|
116 xmaxc[3] = sr & 0x3f; sr >>= 6; |
|
117 xmc[39] = sr & 0x7; sr >>= 3; |
|
118 sr = *c++; |
|
119 xmc[40] = sr & 0x7; sr >>= 3; |
|
120 xmc[41] = sr & 0x7; sr >>= 3; |
|
121 sr |= (uword)*c++ << 2; /* 30 */ |
|
122 xmc[42] = sr & 0x7; sr >>= 3; |
|
123 xmc[43] = sr & 0x7; sr >>= 3; |
|
124 xmc[44] = sr & 0x7; sr >>= 3; |
|
125 sr |= (uword)*c++ << 1; |
|
126 xmc[45] = sr & 0x7; sr >>= 3; |
|
127 xmc[46] = sr & 0x7; sr >>= 3; |
|
128 xmc[47] = sr & 0x7; sr >>= 3; |
|
129 sr = *c++; |
|
130 xmc[48] = sr & 0x7; sr >>= 3; |
|
131 xmc[49] = sr & 0x7; sr >>= 3; |
|
132 sr |= (uword)*c++ << 2; |
|
133 xmc[50] = sr & 0x7; sr >>= 3; |
|
134 xmc[51] = sr & 0x7; sr >>= 3; |
|
135 |
|
136 s->frame_chain = sr & 0xf; |
|
137 } |
|
138 else { |
|
139 sr = s->frame_chain; |
|
140 sr |= (uword)*c++ << 4; /* 1 */ |
|
141 LARc[0] = sr & 0x3f; sr >>= 6; |
|
142 LARc[1] = sr & 0x3f; sr >>= 6; |
|
143 sr = *c++; |
|
144 LARc[2] = sr & 0x1f; sr >>= 5; |
|
145 sr |= (uword)*c++ << 3; |
|
146 LARc[3] = sr & 0x1f; sr >>= 5; |
|
147 LARc[4] = sr & 0xf; sr >>= 4; |
|
148 sr |= (uword)*c++ << 2; |
|
149 LARc[5] = sr & 0xf; sr >>= 4; |
|
150 LARc[6] = sr & 0x7; sr >>= 3; |
|
151 LARc[7] = sr & 0x7; sr >>= 3; |
|
152 sr = *c++; /* 5 */ |
|
153 Nc[0] = sr & 0x7f; sr >>= 7; |
|
154 sr |= (uword)*c++ << 1; |
|
155 bc[0] = sr & 0x3; sr >>= 2; |
|
156 Mc[0] = sr & 0x3; sr >>= 2; |
|
157 sr |= (uword)*c++ << 5; |
|
158 xmaxc[0] = sr & 0x3f; sr >>= 6; |
|
159 xmc[0] = sr & 0x7; sr >>= 3; |
|
160 xmc[1] = sr & 0x7; sr >>= 3; |
|
161 sr |= (uword)*c++ << 1; |
|
162 xmc[2] = sr & 0x7; sr >>= 3; |
|
163 xmc[3] = sr & 0x7; sr >>= 3; |
|
164 xmc[4] = sr & 0x7; sr >>= 3; |
|
165 sr = *c++; |
|
166 xmc[5] = sr & 0x7; sr >>= 3; |
|
167 xmc[6] = sr & 0x7; sr >>= 3; |
|
168 sr |= (uword)*c++ << 2; /* 10 */ |
|
169 xmc[7] = sr & 0x7; sr >>= 3; |
|
170 xmc[8] = sr & 0x7; sr >>= 3; |
|
171 xmc[9] = sr & 0x7; sr >>= 3; |
|
172 sr |= (uword)*c++ << 1; |
|
173 xmc[10] = sr & 0x7; sr >>= 3; |
|
174 xmc[11] = sr & 0x7; sr >>= 3; |
|
175 xmc[12] = sr & 0x7; sr >>= 3; |
|
176 sr = *c++; |
|
177 Nc[1] = sr & 0x7f; sr >>= 7; |
|
178 sr |= (uword)*c++ << 1; |
|
179 bc[1] = sr & 0x3; sr >>= 2; |
|
180 Mc[1] = sr & 0x3; sr >>= 2; |
|
181 sr |= (uword)*c++ << 5; |
|
182 xmaxc[1] = sr & 0x3f; sr >>= 6; |
|
183 xmc[13] = sr & 0x7; sr >>= 3; |
|
184 xmc[14] = sr & 0x7; sr >>= 3; |
|
185 sr |= (uword)*c++ << 1; /* 15 */ |
|
186 xmc[15] = sr & 0x7; sr >>= 3; |
|
187 xmc[16] = sr & 0x7; sr >>= 3; |
|
188 xmc[17] = sr & 0x7; sr >>= 3; |
|
189 sr = *c++; |
|
190 xmc[18] = sr & 0x7; sr >>= 3; |
|
191 xmc[19] = sr & 0x7; sr >>= 3; |
|
192 sr |= (uword)*c++ << 2; |
|
193 xmc[20] = sr & 0x7; sr >>= 3; |
|
194 xmc[21] = sr & 0x7; sr >>= 3; |
|
195 xmc[22] = sr & 0x7; sr >>= 3; |
|
196 sr |= (uword)*c++ << 1; |
|
197 xmc[23] = sr & 0x7; sr >>= 3; |
|
198 xmc[24] = sr & 0x7; sr >>= 3; |
|
199 xmc[25] = sr & 0x7; sr >>= 3; |
|
200 sr = *c++; |
|
201 Nc[2] = sr & 0x7f; sr >>= 7; |
|
202 sr |= (uword)*c++ << 1; /* 20 */ |
|
203 bc[2] = sr & 0x3; sr >>= 2; |
|
204 Mc[2] = sr & 0x3; sr >>= 2; |
|
205 sr |= (uword)*c++ << 5; |
|
206 xmaxc[2] = sr & 0x3f; sr >>= 6; |
|
207 xmc[26] = sr & 0x7; sr >>= 3; |
|
208 xmc[27] = sr & 0x7; sr >>= 3; |
|
209 sr |= (uword)*c++ << 1; |
|
210 xmc[28] = sr & 0x7; sr >>= 3; |
|
211 xmc[29] = sr & 0x7; sr >>= 3; |
|
212 xmc[30] = sr & 0x7; sr >>= 3; |
|
213 sr = *c++; |
|
214 xmc[31] = sr & 0x7; sr >>= 3; |
|
215 xmc[32] = sr & 0x7; sr >>= 3; |
|
216 sr |= (uword)*c++ << 2; |
|
217 xmc[33] = sr & 0x7; sr >>= 3; |
|
218 xmc[34] = sr & 0x7; sr >>= 3; |
|
219 xmc[35] = sr & 0x7; sr >>= 3; |
|
220 sr |= (uword)*c++ << 1; /* 25 */ |
|
221 xmc[36] = sr & 0x7; sr >>= 3; |
|
222 xmc[37] = sr & 0x7; sr >>= 3; |
|
223 xmc[38] = sr & 0x7; sr >>= 3; |
|
224 sr = *c++; |
|
225 Nc[3] = sr & 0x7f; sr >>= 7; |
|
226 sr |= (uword)*c++ << 1; |
|
227 bc[3] = sr & 0x3; sr >>= 2; |
|
228 Mc[3] = sr & 0x3; sr >>= 2; |
|
229 sr |= (uword)*c++ << 5; |
|
230 xmaxc[3] = sr & 0x3f; sr >>= 6; |
|
231 xmc[39] = sr & 0x7; sr >>= 3; |
|
232 xmc[40] = sr & 0x7; sr >>= 3; |
|
233 sr |= (uword)*c++ << 1; |
|
234 xmc[41] = sr & 0x7; sr >>= 3; |
|
235 xmc[42] = sr & 0x7; sr >>= 3; |
|
236 xmc[43] = sr & 0x7; sr >>= 3; |
|
237 sr = *c++; /* 30 */ |
|
238 xmc[44] = sr & 0x7; sr >>= 3; |
|
239 xmc[45] = sr & 0x7; sr >>= 3; |
|
240 sr |= (uword)*c++ << 2; |
|
241 xmc[46] = sr & 0x7; sr >>= 3; |
|
242 xmc[47] = sr & 0x7; sr >>= 3; |
|
243 xmc[48] = sr & 0x7; sr >>= 3; |
|
244 sr |= (uword)*c++ << 1; |
|
245 xmc[49] = sr & 0x7; sr >>= 3; |
|
246 xmc[50] = sr & 0x7; sr >>= 3; |
|
247 xmc[51] = sr & 0x7; sr >>= 3; |
|
248 } |
|
249 } |
|
250 else |
|
251 #endif |
|
252 { |
|
253 /* GSM_MAGIC = (*c >> 4) & 0xF; */ |
|
254 |
|
255 if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; |
|
256 |
|
257 LARc[0] = (*c++ & 0xF) << 2; /* 1 */ |
|
258 LARc[0] |= (*c >> 6) & 0x3; |
|
259 LARc[1] = *c++ & 0x3F; |
|
260 LARc[2] = (*c >> 3) & 0x1F; |
|
261 LARc[3] = (*c++ & 0x7) << 2; |
|
262 LARc[3] |= (*c >> 6) & 0x3; |
|
263 LARc[4] = (*c >> 2) & 0xF; |
|
264 LARc[5] = (*c++ & 0x3) << 2; |
|
265 LARc[5] |= (*c >> 6) & 0x3; |
|
266 LARc[6] = (*c >> 3) & 0x7; |
|
267 LARc[7] = *c++ & 0x7; |
|
268 Nc[0] = (*c >> 1) & 0x7F; |
|
269 bc[0] = (*c++ & 0x1) << 1; |
|
270 bc[0] |= (*c >> 7) & 0x1; |
|
271 Mc[0] = (*c >> 5) & 0x3; |
|
272 xmaxc[0] = (*c++ & 0x1F) << 1; |
|
273 xmaxc[0] |= (*c >> 7) & 0x1; |
|
274 xmc[0] = (*c >> 4) & 0x7; |
|
275 xmc[1] = (*c >> 1) & 0x7; |
|
276 xmc[2] = (*c++ & 0x1) << 2; |
|
277 xmc[2] |= (*c >> 6) & 0x3; |
|
278 xmc[3] = (*c >> 3) & 0x7; |
|
279 xmc[4] = *c++ & 0x7; |
|
280 xmc[5] = (*c >> 5) & 0x7; |
|
281 xmc[6] = (*c >> 2) & 0x7; |
|
282 xmc[7] = (*c++ & 0x3) << 1; /* 10 */ |
|
283 xmc[7] |= (*c >> 7) & 0x1; |
|
284 xmc[8] = (*c >> 4) & 0x7; |
|
285 xmc[9] = (*c >> 1) & 0x7; |
|
286 xmc[10] = (*c++ & 0x1) << 2; |
|
287 xmc[10] |= (*c >> 6) & 0x3; |
|
288 xmc[11] = (*c >> 3) & 0x7; |
|
289 xmc[12] = *c++ & 0x7; |
|
290 Nc[1] = (*c >> 1) & 0x7F; |
|
291 bc[1] = (*c++ & 0x1) << 1; |
|
292 bc[1] |= (*c >> 7) & 0x1; |
|
293 Mc[1] = (*c >> 5) & 0x3; |
|
294 xmaxc[1] = (*c++ & 0x1F) << 1; |
|
295 xmaxc[1] |= (*c >> 7) & 0x1; |
|
296 xmc[13] = (*c >> 4) & 0x7; |
|
297 xmc[14] = (*c >> 1) & 0x7; |
|
298 xmc[15] = (*c++ & 0x1) << 2; |
|
299 xmc[15] |= (*c >> 6) & 0x3; |
|
300 xmc[16] = (*c >> 3) & 0x7; |
|
301 xmc[17] = *c++ & 0x7; |
|
302 xmc[18] = (*c >> 5) & 0x7; |
|
303 xmc[19] = (*c >> 2) & 0x7; |
|
304 xmc[20] = (*c++ & 0x3) << 1; |
|
305 xmc[20] |= (*c >> 7) & 0x1; |
|
306 xmc[21] = (*c >> 4) & 0x7; |
|
307 xmc[22] = (*c >> 1) & 0x7; |
|
308 xmc[23] = (*c++ & 0x1) << 2; |
|
309 xmc[23] |= (*c >> 6) & 0x3; |
|
310 xmc[24] = (*c >> 3) & 0x7; |
|
311 xmc[25] = *c++ & 0x7; |
|
312 Nc[2] = (*c >> 1) & 0x7F; |
|
313 bc[2] = (*c++ & 0x1) << 1; /* 20 */ |
|
314 bc[2] |= (*c >> 7) & 0x1; |
|
315 Mc[2] = (*c >> 5) & 0x3; |
|
316 xmaxc[2] = (*c++ & 0x1F) << 1; |
|
317 xmaxc[2] |= (*c >> 7) & 0x1; |
|
318 xmc[26] = (*c >> 4) & 0x7; |
|
319 xmc[27] = (*c >> 1) & 0x7; |
|
320 xmc[28] = (*c++ & 0x1) << 2; |
|
321 xmc[28] |= (*c >> 6) & 0x3; |
|
322 xmc[29] = (*c >> 3) & 0x7; |
|
323 xmc[30] = *c++ & 0x7; |
|
324 xmc[31] = (*c >> 5) & 0x7; |
|
325 xmc[32] = (*c >> 2) & 0x7; |
|
326 xmc[33] = (*c++ & 0x3) << 1; |
|
327 xmc[33] |= (*c >> 7) & 0x1; |
|
328 xmc[34] = (*c >> 4) & 0x7; |
|
329 xmc[35] = (*c >> 1) & 0x7; |
|
330 xmc[36] = (*c++ & 0x1) << 2; |
|
331 xmc[36] |= (*c >> 6) & 0x3; |
|
332 xmc[37] = (*c >> 3) & 0x7; |
|
333 xmc[38] = *c++ & 0x7; |
|
334 Nc[3] = (*c >> 1) & 0x7F; |
|
335 bc[3] = (*c++ & 0x1) << 1; |
|
336 bc[3] |= (*c >> 7) & 0x1; |
|
337 Mc[3] = (*c >> 5) & 0x3; |
|
338 xmaxc[3] = (*c++ & 0x1F) << 1; |
|
339 xmaxc[3] |= (*c >> 7) & 0x1; |
|
340 xmc[39] = (*c >> 4) & 0x7; |
|
341 xmc[40] = (*c >> 1) & 0x7; |
|
342 xmc[41] = (*c++ & 0x1) << 2; |
|
343 xmc[41] |= (*c >> 6) & 0x3; |
|
344 xmc[42] = (*c >> 3) & 0x7; |
|
345 xmc[43] = *c++ & 0x7; /* 30 */ |
|
346 xmc[44] = (*c >> 5) & 0x7; |
|
347 xmc[45] = (*c >> 2) & 0x7; |
|
348 xmc[46] = (*c++ & 0x3) << 1; |
|
349 xmc[46] |= (*c >> 7) & 0x1; |
|
350 xmc[47] = (*c >> 4) & 0x7; |
|
351 xmc[48] = (*c >> 1) & 0x7; |
|
352 xmc[49] = (*c++ & 0x1) << 2; |
|
353 xmc[49] |= (*c >> 6) & 0x3; |
|
354 xmc[50] = (*c >> 3) & 0x7; |
|
355 xmc[51] = *c & 0x7; /* 33 */ |
|
356 } |
|
357 |
|
358 Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); |
|
359 |
|
360 return 0; |
|
361 } |