Version 0.1.0 from FTP
[asterisk/asterisk.git] / codecs / gsm / src / gsm_decode.c
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$ */
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 }