blob: 6c5672b8296cce31c266a7500019451317f071a7 [file] [log] [blame]
Alexandre Lision8af73cb2013-12-10 14:11:20 -05001/*
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_implode.c,v 1.2 1996/07/02 14:32:43 jutta Exp jutta $ */
8
9#include "private.h"
10
11#include "gsm.h"
12#include "proto.h"
13
14void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
15{
16 /* variable size index
17
18 GSM_MAGIC 4 -
19
20 LARc[0] 6 0
21 LARc[1] 6 1
22 LARc[2] 5 2
23 LARc[3] 5 3
24 LARc[4] 4 4
25 LARc[5] 4 5
26 LARc[6] 3 6
27 LARc[7] 3 7
28
29 Nc[0] 7 8
30 bc[0] 2 9
31 Mc[0] 2 10
32 xmaxc[0] 6 11
33 xmc[0] 3 12
34 xmc[1] 3 13
35 xmc[2] 3 14
36 xmc[3] 3 15
37 xmc[4] 3 16
38 xmc[5] 3 17
39 xmc[6] 3 18
40 xmc[7] 3 19
41 xmc[8] 3 20
42 xmc[9] 3 21
43 xmc[10] 3 22
44 xmc[11] 3 23
45 xmc[12] 3 24
46
47 Nc[1] 7 25
48 bc[1] 2 26
49 Mc[1] 2 27
50 xmaxc[1] 6 28
51 xmc[13] 3 29
52 xmc[14] 3 30
53 xmc[15] 3 31
54 xmc[16] 3 32
55 xmc[17] 3 33
56 xmc[18] 3 34
57 xmc[19] 3 35
58 xmc[20] 3 36
59 xmc[21] 3 37
60 xmc[22] 3 38
61 xmc[23] 3 39
62 xmc[24] 3 40
63 xmc[25] 3 41
64
65 Nc[2] 7 42
66 bc[2] 2 43
67 Mc[2] 2 44
68 xmaxc[2] 6 45
69 xmc[26] 3 46
70 xmc[27] 3 47
71 xmc[28] 3 48
72 xmc[29] 3 49
73 xmc[30] 3 50
74 xmc[31] 3 51
75 xmc[32] 3 52
76 xmc[33] 3 53
77 xmc[34] 3 54
78 xmc[35] 3 55
79 xmc[36] 3 56
80 xmc[37] 3 57
81 xmc[38] 3 58
82
83 Nc[3] 7 59
84 bc[3] 2 60
85 Mc[3] 2 61
86 xmaxc[3] 6 62
87 xmc[39] 3 63
88 xmc[40] 3 64
89 xmc[41] 3 65
90 xmc[42] 3 66
91 xmc[43] 3 67
92 xmc[44] 3 68
93 xmc[45] 3 69
94 xmc[46] 3 70
95 xmc[47] 3 71
96 xmc[48] 3 72
97 xmc[49] 3 73
98 xmc[50] 3 74
99 xmc[51] 3 75
100 */
101
102 /* There are 76 parameters per frame. The first eight are
103 * unique. The remaining 68 are four identical subframes of
104 * 17 parameters each. gsm_implode converts from a representation
105 * of these parameters as values in one array of signed words
106 * to the "packed" version of a GSM frame.
107 */
108
109# define LARc source
110# define Nc *((gsm_signal (*) [17])(source + 8))
111# define bc *((gsm_signal (*) [17])(source + 9))
112# define Mc *((gsm_signal (*) [17])(source + 10))
113# define xmaxc *((gsm_signal (*) [17])(source + 11))
114
115#ifdef WAV49
116 if (s->wav_fmt) {
117
118 uword sr = 0;
119 if (s->frame_index) {
120 sr = sr >> 6 | LARc[0] << 10;
121 sr = sr >> 6 | LARc[1] << 10;
122 *c++ = sr >> 4;
123 sr = sr >> 5 | LARc[2] << 11;
124 *c++ = sr >> 7;
125 sr = sr >> 5 | LARc[3] << 11;
126 sr = sr >> 4 | LARc[4] << 12;
127 *c++ = sr >> 6;
128 sr = sr >> 4 | LARc[5] << 12;
129 sr = sr >> 3 | LARc[6] << 13;
130 *c++ = sr >> 7;
131 sr = sr >> 3 | LARc[7] << 13;
132 sr = sr >> 7 | Nc[0] << 9;
133 *c++ = sr >> 5;
134 sr = sr >> 2 | bc[0] << 14;
135 sr = sr >> 2 | Mc[0] << 14;
136 sr = sr >> 6 | xmaxc[0] << 10;
137 *c++ = sr >> 3;
138#undef xmc
139#define xmc (source + 12)
140
141 sr = sr >> 3 | xmc[0] << 13;
142 *c++ = sr >> 8;
143 sr = sr >> 3 | xmc[1] << 13;
144 sr = sr >> 3 | xmc[2] << 13;
145 sr = sr >> 3 | xmc[3] << 13;
146 *c++ = sr >> 7;
147 sr = sr >> 3 | xmc[4] << 13;
148 sr = sr >> 3 | xmc[5] << 13;
149 sr = sr >> 3 | xmc[6] << 13;
150 *c++ = sr >> 6;
151 sr = sr >> 3 | xmc[7] << 13;
152 sr = sr >> 3 | xmc[8] << 13;
153 *c++ = sr >> 8;
154 sr = sr >> 3 | xmc[9] << 13;
155 sr = sr >> 3 | xmc[10] << 13;
156 sr = sr >> 3 | xmc[11] << 13;
157 *c++ = sr >> 7;
158 sr = sr >> 3 | xmc[12] << 13;
159 sr = sr >> 7 | Nc[1] << 9;
160 *c++ = sr >> 5;
161 sr = sr >> 2 | bc[1] << 14;
162 sr = sr >> 2 | Mc[1] << 14;
163 sr = sr >> 6 | xmaxc[1] << 10;
164 *c++ = sr >> 3;
165#undef xmc
166#define xmc (source + 29 - 13)
167
168 sr = sr >> 3 | xmc[13] << 13;
169 *c++ = sr >> 8;
170 sr = sr >> 3 | xmc[14] << 13;
171 sr = sr >> 3 | xmc[15] << 13;
172 sr = sr >> 3 | xmc[16] << 13;
173 *c++ = sr >> 7;
174 sr = sr >> 3 | xmc[17] << 13;
175 sr = sr >> 3 | xmc[18] << 13;
176 sr = sr >> 3 | xmc[19] << 13;
177 *c++ = sr >> 6;
178 sr = sr >> 3 | xmc[20] << 13;
179 sr = sr >> 3 | xmc[21] << 13;
180 *c++ = sr >> 8;
181 sr = sr >> 3 | xmc[22] << 13;
182 sr = sr >> 3 | xmc[23] << 13;
183 sr = sr >> 3 | xmc[24] << 13;
184 *c++ = sr >> 7;
185 sr = sr >> 3 | xmc[25] << 13;
186 sr = sr >> 7 | Nc[2] << 9;
187 *c++ = sr >> 5;
188 sr = sr >> 2 | bc[2] << 14;
189 sr = sr >> 2 | Mc[2] << 14;
190 sr = sr >> 6 | xmaxc[2] << 10;
191 *c++ = sr >> 3;
192#undef xmc
193#define xmc (source + 46 - 26)
194
195 sr = sr >> 3 | xmc[26] << 13;
196 *c++ = sr >> 8;
197 sr = sr >> 3 | xmc[27] << 13;
198 sr = sr >> 3 | xmc[28] << 13;
199 sr = sr >> 3 | xmc[29] << 13;
200 *c++ = sr >> 7;
201 sr = sr >> 3 | xmc[30] << 13;
202 sr = sr >> 3 | xmc[31] << 13;
203 sr = sr >> 3 | xmc[32] << 13;
204 *c++ = sr >> 6;
205 sr = sr >> 3 | xmc[33] << 13;
206 sr = sr >> 3 | xmc[34] << 13;
207 *c++ = sr >> 8;
208 sr = sr >> 3 | xmc[35] << 13;
209 sr = sr >> 3 | xmc[36] << 13;
210 sr = sr >> 3 | xmc[37] << 13;
211 *c++ = sr >> 7;
212 sr = sr >> 3 | xmc[38] << 13;
213 sr = sr >> 7 | Nc[3] << 9;
214 *c++ = sr >> 5;
215 sr = sr >> 2 | bc[3] << 14;
216 sr = sr >> 2 | Mc[3] << 14;
217 sr = sr >> 6 | xmaxc[3] << 10;
218 *c++ = sr >> 3;
219#undef xmc
220#define xmc (source + 63 - 39)
221
222 sr = sr >> 3 | xmc[39] << 13;
223 *c++ = sr >> 8;
224 sr = sr >> 3 | xmc[40] << 13;
225 sr = sr >> 3 | xmc[41] << 13;
226 sr = sr >> 3 | xmc[42] << 13;
227 *c++ = sr >> 7;
228 sr = sr >> 3 | xmc[43] << 13;
229 sr = sr >> 3 | xmc[44] << 13;
230 sr = sr >> 3 | xmc[45] << 13;
231 *c++ = sr >> 6;
232 sr = sr >> 3 | xmc[46] << 13;
233 sr = sr >> 3 | xmc[47] << 13;
234 *c++ = sr >> 8;
235 sr = sr >> 3 | xmc[48] << 13;
236 sr = sr >> 3 | xmc[49] << 13;
237 sr = sr >> 3 | xmc[50] << 13;
238 *c++ = sr >> 7;
239 sr = sr >> 3 | xmc[51] << 13;
240 sr = sr >> 4;
241 *c = sr >> 8;
242 s->frame_chain = *c;
243 }
244 else {
245 sr = sr >> 4 | s->frame_chain << 12;
246 sr = sr >> 6 | LARc[0] << 10;
247 *c++ = sr >> 6;
248 sr = sr >> 6 | LARc[1] << 10;
249 *c++ = sr >> 8;
250 sr = sr >> 5 | LARc[2] << 11;
251 sr = sr >> 5 | LARc[3] << 11;
252 *c++ = sr >> 6;
253 sr = sr >> 4 | LARc[4] << 12;
254 sr = sr >> 4 | LARc[5] << 12;
255 *c++ = sr >> 6;
256 sr = sr >> 3 | LARc[6] << 13;
257 sr = sr >> 3 | LARc[7] << 13;
258 *c++ = sr >> 8;
259 sr = sr >> 7 | Nc[0] << 9;
260 sr = sr >> 2 | bc[0] << 14;
261 *c++ = sr >> 7;
262 sr = sr >> 2 | Mc[0] << 14;
263 sr = sr >> 6 | xmaxc[0] << 10;
264 *c++ = sr >> 7;
265#undef xmc
266#define xmc (source + 12)
267
268 sr = sr >> 3 | xmc[0] << 13;
269 sr = sr >> 3 | xmc[1] << 13;
270 sr = sr >> 3 | xmc[2] << 13;
271 *c++ = sr >> 6;
272 sr = sr >> 3 | xmc[3] << 13;
273 sr = sr >> 3 | xmc[4] << 13;
274 *c++ = sr >> 8;
275 sr = sr >> 3 | xmc[5] << 13;
276 sr = sr >> 3 | xmc[6] << 13;
277 sr = sr >> 3 | xmc[7] << 13;
278 *c++ = sr >> 7;
279 sr = sr >> 3 | xmc[8] << 13;
280 sr = sr >> 3 | xmc[9] << 13;
281 sr = sr >> 3 | xmc[10] << 13;
282 *c++ = sr >> 6;
283 sr = sr >> 3 | xmc[11] << 13;
284 sr = sr >> 3 | xmc[12] << 13;
285 *c++ = sr >> 8;
286 sr = sr >> 7 | Nc[1] << 9;
287 sr = sr >> 2 | bc[1] << 14;
288 *c++ = sr >> 7;
289 sr = sr >> 2 | Mc[1] << 14;
290 sr = sr >> 6 | xmaxc[1] << 10;
291 *c++ = sr >> 7;
292#undef xmc
293#define xmc (source + 29 - 13)
294
295 sr = sr >> 3 | xmc[13] << 13;
296 sr = sr >> 3 | xmc[14] << 13;
297 sr = sr >> 3 | xmc[15] << 13;
298 *c++ = sr >> 6;
299 sr = sr >> 3 | xmc[16] << 13;
300 sr = sr >> 3 | xmc[17] << 13;
301 *c++ = sr >> 8;
302 sr = sr >> 3 | xmc[18] << 13;
303 sr = sr >> 3 | xmc[19] << 13;
304 sr = sr >> 3 | xmc[20] << 13;
305 *c++ = sr >> 7;
306 sr = sr >> 3 | xmc[21] << 13;
307 sr = sr >> 3 | xmc[22] << 13;
308 sr = sr >> 3 | xmc[23] << 13;
309 *c++ = sr >> 6;
310 sr = sr >> 3 | xmc[24] << 13;
311 sr = sr >> 3 | xmc[25] << 13;
312 *c++ = sr >> 8;
313 sr = sr >> 7 | Nc[2] << 9;
314 sr = sr >> 2 | bc[2] << 14;
315 *c++ = sr >> 7;
316 sr = sr >> 2 | Mc[2] << 14;
317 sr = sr >> 6 | xmaxc[2] << 10;
318 *c++ = sr >> 7;
319#undef xmc
320#define xmc (source + 46 - 26)
321
322 sr = sr >> 3 | xmc[26] << 13;
323 sr = sr >> 3 | xmc[27] << 13;
324 sr = sr >> 3 | xmc[28] << 13;
325 *c++ = sr >> 6;
326 sr = sr >> 3 | xmc[29] << 13;
327 sr = sr >> 3 | xmc[30] << 13;
328 *c++ = sr >> 8;
329 sr = sr >> 3 | xmc[31] << 13;
330 sr = sr >> 3 | xmc[32] << 13;
331 sr = sr >> 3 | xmc[33] << 13;
332 *c++ = sr >> 7;
333 sr = sr >> 3 | xmc[34] << 13;
334 sr = sr >> 3 | xmc[35] << 13;
335 sr = sr >> 3 | xmc[36] << 13;
336 *c++ = sr >> 6;
337 sr = sr >> 3 | xmc[37] << 13;
338 sr = sr >> 3 | xmc[38] << 13;
339 *c++ = sr >> 8;
340 sr = sr >> 7 | Nc[3] << 9;
341 sr = sr >> 2 | bc[3] << 14;
342 *c++ = sr >> 7;
343 sr = sr >> 2 | Mc[3] << 14;
344 sr = sr >> 6 | xmaxc[3] << 10;
345 *c++ = sr >> 7;
346#undef xmc
347#define xmc (source + 63 - 39)
348
349 sr = sr >> 3 | xmc[39] << 13;
350 sr = sr >> 3 | xmc[40] << 13;
351 sr = sr >> 3 | xmc[41] << 13;
352 *c++ = sr >> 6;
353 sr = sr >> 3 | xmc[42] << 13;
354 sr = sr >> 3 | xmc[43] << 13;
355 *c++ = sr >> 8;
356 sr = sr >> 3 | xmc[44] << 13;
357 sr = sr >> 3 | xmc[45] << 13;
358 sr = sr >> 3 | xmc[46] << 13;
359 *c++ = sr >> 7;
360 sr = sr >> 3 | xmc[47] << 13;
361 sr = sr >> 3 | xmc[48] << 13;
362 sr = sr >> 3 | xmc[49] << 13;
363 *c++ = sr >> 6;
364 sr = sr >> 3 | xmc[50] << 13;
365 sr = sr >> 3 | xmc[51] << 13;
366 *c++ = sr >> 8;
367 }
368 }
369 else
370#endif
371 {
372
373 *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */
374 | ((LARc[0] >> 2) & 0xF);
375 *c++ = ((LARc[0] & 0x3) << 6)
376 | (LARc[1] & 0x3F);
377 *c++ = ((LARc[2] & 0x1F) << 3)
378 | ((LARc[3] >> 2) & 0x7);
379 *c++ = ((LARc[3] & 0x3) << 6)
380 | ((LARc[4] & 0xF) << 2)
381 | ((LARc[5] >> 2) & 0x3);
382 *c++ = ((LARc[5] & 0x3) << 6)
383 | ((LARc[6] & 0x7) << 3)
384 | (LARc[7] & 0x7);
385
386
387 *c++ = ((Nc[0] & 0x7F) << 1)
388
389
390 | ((bc[0] >> 1) & 0x1);
391 *c++ = ((bc[0] & 0x1) << 7)
392
393
394 | ((Mc[0] & 0x3) << 5)
395
396 | ((xmaxc[0] >> 1) & 0x1F);
397 *c++ = ((xmaxc[0] & 0x1) << 7)
398
399#undef xmc
400#define xmc (source + 12)
401
402 | ((xmc[0] & 0x7) << 4)
403 | ((xmc[1] & 0x7) << 1)
404 | ((xmc[2] >> 2) & 0x1);
405 *c++ = ((xmc[2] & 0x3) << 6)
406 | ((xmc[3] & 0x7) << 3)
407 | (xmc[4] & 0x7);
408 *c++ = ((xmc[5] & 0x7) << 5) /* 10 */
409 | ((xmc[6] & 0x7) << 2)
410 | ((xmc[7] >> 1) & 0x3);
411 *c++ = ((xmc[7] & 0x1) << 7)
412 | ((xmc[8] & 0x7) << 4)
413 | ((xmc[9] & 0x7) << 1)
414 | ((xmc[10] >> 2) & 0x1);
415 *c++ = ((xmc[10] & 0x3) << 6)
416 | ((xmc[11] & 0x7) << 3)
417 | (xmc[12] & 0x7);
418
419
420 *c++ = ((Nc[1] & 0x7F) << 1)
421
422
423 | ((bc[1] >> 1) & 0x1);
424 *c++ = ((bc[1] & 0x1) << 7)
425
426
427 | ((Mc[1] & 0x3) << 5)
428
429
430 | ((xmaxc[1] >> 1) & 0x1F);
431 *c++ = ((xmaxc[1] & 0x1) << 7)
432
433#undef xmc
434#define xmc (source + 29 - 13)
435
436 | ((xmc[13] & 0x7) << 4)
437 | ((xmc[14] & 0x7) << 1)
438 | ((xmc[15] >> 2) & 0x1);
439 *c++ = ((xmc[15] & 0x3) << 6)
440 | ((xmc[16] & 0x7) << 3)
441 | (xmc[17] & 0x7);
442 *c++ = ((xmc[18] & 0x7) << 5)
443 | ((xmc[19] & 0x7) << 2)
444 | ((xmc[20] >> 1) & 0x3);
445 *c++ = ((xmc[20] & 0x1) << 7)
446 | ((xmc[21] & 0x7) << 4)
447 | ((xmc[22] & 0x7) << 1)
448 | ((xmc[23] >> 2) & 0x1);
449 *c++ = ((xmc[23] & 0x3) << 6)
450 | ((xmc[24] & 0x7) << 3)
451 | (xmc[25] & 0x7);
452
453
454 *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */
455
456
457 | ((bc[2] >> 1) & 0x1);
458 *c++ = ((bc[2] & 0x1) << 7)
459
460
461 | ((Mc[2] & 0x3) << 5)
462
463
464 | ((xmaxc[2] >> 1) & 0x1F);
465 *c++ = ((xmaxc[2] & 0x1) << 7)
466
467#undef xmc
468#define xmc (source + 46 - 26)
469
470 | ((xmc[26] & 0x7) << 4)
471 | ((xmc[27] & 0x7) << 1)
472 | ((xmc[28] >> 2) & 0x1);
473 *c++ = ((xmc[28] & 0x3) << 6)
474 | ((xmc[29] & 0x7) << 3)
475 | (xmc[30] & 0x7);
476 *c++ = ((xmc[31] & 0x7) << 5)
477 | ((xmc[32] & 0x7) << 2)
478 | ((xmc[33] >> 1) & 0x3);
479 *c++ = ((xmc[33] & 0x1) << 7)
480 | ((xmc[34] & 0x7) << 4)
481 | ((xmc[35] & 0x7) << 1)
482 | ((xmc[36] >> 2) & 0x1);
483 *c++ = ((xmc[36] & 0x3) << 6)
484 | ((xmc[37] & 0x7) << 3)
485 | (xmc[38] & 0x7);
486
487
488 *c++ = ((Nc[3] & 0x7F) << 1)
489
490
491 | ((bc[3] >> 1) & 0x1);
492 *c++ = ((bc[3] & 0x1) << 7)
493
494
495 | ((Mc[3] & 0x3) << 5)
496
497
498 | ((xmaxc[3] >> 1) & 0x1F);
499 *c++ = ((xmaxc[3] & 0x1) << 7)
500
501#undef xmc
502#define xmc (source + 63 - 39)
503
504 | ((xmc[39] & 0x7) << 4)
505 | ((xmc[40] & 0x7) << 1)
506 | ((xmc[41] >> 2) & 0x1);
507 *c++ = ((xmc[41] & 0x3) << 6) /* 30 */
508 | ((xmc[42] & 0x7) << 3)
509 | (xmc[43] & 0x7);
510 *c++ = ((xmc[44] & 0x7) << 5)
511 | ((xmc[45] & 0x7) << 2)
512 | ((xmc[46] >> 1) & 0x3);
513 *c++ = ((xmc[46] & 0x1) << 7)
514 | ((xmc[47] & 0x7) << 4)
515 | ((xmc[48] & 0x7) << 1)
516 | ((xmc[49] >> 2) & 0x1);
517 *c++ = ((xmc[49] & 0x3) << 6)
518 | ((xmc[50] & 0x7) << 3)
519 | (xmc[51] & 0x7);
520 }
521}