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