xref: /third_party/libsnd/src/GSM610/gsm_encode.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#include "gsm.h"
9
10void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
11{
12	int16_t		LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ;
13
14	Gsm_Coder (s, source, LARc, Nc, bc, Mc, xmaxc, xmc) ;
15
16
17	/*	variable	size
18
19		GSM_MAGIC	4
20
21		LARc [0]		6
22		LARc [1]		6
23		LARc [2]		5
24		LARc [3]		5
25		LARc [4]		4
26		LARc [5]		4
27		LARc [6]		3
28		LARc [7]		3
29
30		Nc [0]		7
31		bc [0]		2
32		Mc [0]		2
33		xmaxc [0]	6
34		xmc [0]		3
35		xmc [1]		3
36		xmc [2]		3
37		xmc [3]		3
38		xmc [4]		3
39		xmc [5]		3
40		xmc [6]		3
41		xmc [7]		3
42		xmc [8]		3
43		xmc [9]		3
44		xmc [10]		3
45		xmc [11]		3
46		xmc [12]		3
47
48		Nc [1]		7
49		bc [1]		2
50		Mc [1]		2
51		xmaxc [1]	6
52		xmc [13]		3
53		xmc [14]		3
54		xmc [15]		3
55		xmc [16]		3
56		xmc [17]		3
57		xmc [18]		3
58		xmc [19]		3
59		xmc [20]		3
60		xmc [21]		3
61		xmc [22]		3
62		xmc [23]		3
63		xmc [24]		3
64		xmc [25]		3
65
66		Nc [2]		7
67		bc [2]		2
68		Mc [2]		2
69		xmaxc [2]	6
70		xmc [26]		3
71		xmc [27]		3
72		xmc [28]		3
73		xmc [29]		3
74		xmc [30]		3
75		xmc [31]		3
76		xmc [32]		3
77		xmc [33]		3
78		xmc [34]		3
79		xmc [35]		3
80		xmc [36]		3
81		xmc [37]		3
82		xmc [38]		3
83
84		Nc [3]		7
85		bc [3]		2
86		Mc [3]		2
87		xmaxc [3]	6
88		xmc [39]		3
89		xmc [40]		3
90		xmc [41]		3
91		xmc [42]		3
92		xmc [43]		3
93		xmc [44]		3
94		xmc [45]		3
95		xmc [46]		3
96		xmc [47]		3
97		xmc [48]		3
98		xmc [49]		3
99		xmc [50]		3
100		xmc [51]		3
101	*/
102
103#ifdef WAV49
104
105	if (s->wav_fmt)
106	{	s->frame_index = !s->frame_index ;
107		if (s->frame_index)
108		{	uint16_t sr ;
109
110			sr = 0 ;
111			sr = sr >> 6 | LARc [0] << 10 ;
112			sr = sr >> 6 | LARc [1] << 10 ;
113			*c++ = sr >> 4 ;
114			sr = sr >> 5 | LARc [2] << 11 ;
115			*c++ = sr >> 7 ;
116			sr = sr >> 5 | LARc [3] << 11 ;
117			sr = sr >> 4 | LARc [4] << 12 ;
118			*c++ = sr >> 6 ;
119			sr = sr >> 4 | LARc [5] << 12 ;
120			sr = sr >> 3 | LARc [6] << 13 ;
121			*c++ = sr >> 7 ;
122			sr = sr >> 3 | LARc [7] << 13 ;
123			sr = sr >> 7 | Nc [0] << 9 ;
124			*c++ = sr >> 5 ;
125			sr = sr >> 2 | bc [0] << 14 ;
126			sr = sr >> 2 | Mc [0] << 14 ;
127			sr = sr >> 6 | xmaxc [0] << 10 ;
128			*c++ = sr >> 3 ;
129			sr = sr >> 3 | xmc [0] << 13 ;
130			*c++ = sr >> 8 ;
131			sr = sr >> 3 | xmc [1] << 13 ;
132			sr = sr >> 3 | xmc [2] << 13 ;
133			sr = sr >> 3 | xmc [3] << 13 ;
134			*c++ = sr >> 7 ;
135			sr = sr >> 3 | xmc [4] << 13 ;
136			sr = sr >> 3 | xmc [5] << 13 ;
137			sr = sr >> 3 | xmc [6] << 13 ;
138			*c++ = sr >> 6 ;
139			sr = sr >> 3 | xmc [7] << 13 ;
140			sr = sr >> 3 | xmc [8] << 13 ;
141			*c++ = sr >> 8 ;
142			sr = sr >> 3 | xmc [9] << 13 ;
143			sr = sr >> 3 | xmc [10] << 13 ;
144			sr = sr >> 3 | xmc [11] << 13 ;
145			*c++ = sr >> 7 ;
146			sr = sr >> 3 | xmc [12] << 13 ;
147			sr = sr >> 7 | Nc [1] << 9 ;
148			*c++ = sr >> 5 ;
149			sr = sr >> 2 | bc [1] << 14 ;
150			sr = sr >> 2 | Mc [1] << 14 ;
151			sr = sr >> 6 | xmaxc [1] << 10 ;
152			*c++ = sr >> 3 ;
153			sr = sr >> 3 | xmc [13] << 13 ;
154			*c++ = sr >> 8 ;
155			sr = sr >> 3 | xmc [14] << 13 ;
156			sr = sr >> 3 | xmc [15] << 13 ;
157			sr = sr >> 3 | xmc [16] << 13 ;
158			*c++ = sr >> 7 ;
159			sr = sr >> 3 | xmc [17] << 13 ;
160			sr = sr >> 3 | xmc [18] << 13 ;
161			sr = sr >> 3 | xmc [19] << 13 ;
162			*c++ = sr >> 6 ;
163			sr = sr >> 3 | xmc [20] << 13 ;
164			sr = sr >> 3 | xmc [21] << 13 ;
165			*c++ = sr >> 8 ;
166			sr = sr >> 3 | xmc [22] << 13 ;
167			sr = sr >> 3 | xmc [23] << 13 ;
168			sr = sr >> 3 | xmc [24] << 13 ;
169			*c++ = sr >> 7 ;
170			sr = sr >> 3 | xmc [25] << 13 ;
171			sr = sr >> 7 | Nc [2] << 9 ;
172			*c++ = sr >> 5 ;
173			sr = sr >> 2 | bc [2] << 14 ;
174			sr = sr >> 2 | Mc [2] << 14 ;
175			sr = sr >> 6 | xmaxc [2] << 10 ;
176			*c++ = sr >> 3 ;
177			sr = sr >> 3 | xmc [26] << 13 ;
178			*c++ = sr >> 8 ;
179			sr = sr >> 3 | xmc [27] << 13 ;
180			sr = sr >> 3 | xmc [28] << 13 ;
181			sr = sr >> 3 | xmc [29] << 13 ;
182			*c++ = sr >> 7 ;
183			sr = sr >> 3 | xmc [30] << 13 ;
184			sr = sr >> 3 | xmc [31] << 13 ;
185			sr = sr >> 3 | xmc [32] << 13 ;
186			*c++ = sr >> 6 ;
187			sr = sr >> 3 | xmc [33] << 13 ;
188			sr = sr >> 3 | xmc [34] << 13 ;
189			*c++ = sr >> 8 ;
190			sr = sr >> 3 | xmc [35] << 13 ;
191			sr = sr >> 3 | xmc [36] << 13 ;
192			sr = sr >> 3 | xmc [37] << 13 ;
193			*c++ = sr >> 7 ;
194			sr = sr >> 3 | xmc [38] << 13 ;
195			sr = sr >> 7 | Nc [3] << 9 ;
196			*c++ = sr >> 5 ;
197			sr = sr >> 2 | bc [3] << 14 ;
198			sr = sr >> 2 | Mc [3] << 14 ;
199			sr = sr >> 6 | xmaxc [3] << 10 ;
200			*c++ = sr >> 3 ;
201			sr = sr >> 3 | xmc [39] << 13 ;
202			*c++ = sr >> 8 ;
203			sr = sr >> 3 | xmc [40] << 13 ;
204			sr = sr >> 3 | xmc [41] << 13 ;
205			sr = sr >> 3 | xmc [42] << 13 ;
206			*c++ = sr >> 7 ;
207			sr = sr >> 3 | xmc [43] << 13 ;
208			sr = sr >> 3 | xmc [44] << 13 ;
209			sr = sr >> 3 | xmc [45] << 13 ;
210			*c++ = sr >> 6 ;
211			sr = sr >> 3 | xmc [46] << 13 ;
212			sr = sr >> 3 | xmc [47] << 13 ;
213			*c++ = sr >> 8 ;
214			sr = sr >> 3 | xmc [48] << 13 ;
215			sr = sr >> 3 | xmc [49] << 13 ;
216			sr = sr >> 3 | xmc [50] << 13 ;
217			*c++ = sr >> 7 ;
218			sr = sr >> 3 | xmc [51] << 13 ;
219			sr = sr >> 4 ;
220			*c = sr >> 8 ;
221			s->frame_chain = *c ;
222		}
223		else {
224			uint16_t sr ;
225
226			sr = 0 ;
227			sr = sr >> 4 | s->frame_chain << 12 ;
228			sr = sr >> 6 | LARc [0] << 10 ;
229			*c++ = sr >> 6 ;
230			sr = sr >> 6 | LARc [1] << 10 ;
231			*c++ = sr >> 8 ;
232			sr = sr >> 5 | LARc [2] << 11 ;
233			sr = sr >> 5 | LARc [3] << 11 ;
234			*c++ = sr >> 6 ;
235			sr = sr >> 4 | LARc [4] << 12 ;
236			sr = sr >> 4 | LARc [5] << 12 ;
237			*c++ = sr >> 6 ;
238			sr = sr >> 3 | LARc [6] << 13 ;
239			sr = sr >> 3 | LARc [7] << 13 ;
240			*c++ = sr >> 8 ;
241			sr = sr >> 7 | Nc [0] << 9 ;
242			sr = sr >> 2 | bc [0] << 14 ;
243			*c++ = sr >> 7 ;
244			sr = sr >> 2 | Mc [0] << 14 ;
245			sr = sr >> 6 | xmaxc [0] << 10 ;
246			*c++ = sr >> 7 ;
247			sr = sr >> 3 | xmc [0] << 13 ;
248			sr = sr >> 3 | xmc [1] << 13 ;
249			sr = sr >> 3 | xmc [2] << 13 ;
250			*c++ = sr >> 6 ;
251			sr = sr >> 3 | xmc [3] << 13 ;
252			sr = sr >> 3 | xmc [4] << 13 ;
253			*c++ = sr >> 8 ;
254			sr = sr >> 3 | xmc [5] << 13 ;
255			sr = sr >> 3 | xmc [6] << 13 ;
256			sr = sr >> 3 | xmc [7] << 13 ;
257			*c++ = sr >> 7 ;
258			sr = sr >> 3 | xmc [8] << 13 ;
259			sr = sr >> 3 | xmc [9] << 13 ;
260			sr = sr >> 3 | xmc [10] << 13 ;
261			*c++ = sr >> 6 ;
262			sr = sr >> 3 | xmc [11] << 13 ;
263			sr = sr >> 3 | xmc [12] << 13 ;
264			*c++ = sr >> 8 ;
265			sr = sr >> 7 | Nc [1] << 9 ;
266			sr = sr >> 2 | bc [1] << 14 ;
267			*c++ = sr >> 7 ;
268			sr = sr >> 2 | Mc [1] << 14 ;
269			sr = sr >> 6 | xmaxc [1] << 10 ;
270			*c++ = sr >> 7 ;
271			sr = sr >> 3 | xmc [13] << 13 ;
272			sr = sr >> 3 | xmc [14] << 13 ;
273			sr = sr >> 3 | xmc [15] << 13 ;
274			*c++ = sr >> 6 ;
275			sr = sr >> 3 | xmc [16] << 13 ;
276			sr = sr >> 3 | xmc [17] << 13 ;
277			*c++ = sr >> 8 ;
278			sr = sr >> 3 | xmc [18] << 13 ;
279			sr = sr >> 3 | xmc [19] << 13 ;
280			sr = sr >> 3 | xmc [20] << 13 ;
281			*c++ = sr >> 7 ;
282			sr = sr >> 3 | xmc [21] << 13 ;
283			sr = sr >> 3 | xmc [22] << 13 ;
284			sr = sr >> 3 | xmc [23] << 13 ;
285			*c++ = sr >> 6 ;
286			sr = sr >> 3 | xmc [24] << 13 ;
287			sr = sr >> 3 | xmc [25] << 13 ;
288			*c++ = sr >> 8 ;
289			sr = sr >> 7 | Nc [2] << 9 ;
290			sr = sr >> 2 | bc [2] << 14 ;
291			*c++ = sr >> 7 ;
292			sr = sr >> 2 | Mc [2] << 14 ;
293			sr = sr >> 6 | xmaxc [2] << 10 ;
294			*c++ = sr >> 7 ;
295			sr = sr >> 3 | xmc [26] << 13 ;
296			sr = sr >> 3 | xmc [27] << 13 ;
297			sr = sr >> 3 | xmc [28] << 13 ;
298			*c++ = sr >> 6 ;
299			sr = sr >> 3 | xmc [29] << 13 ;
300			sr = sr >> 3 | xmc [30] << 13 ;
301			*c++ = sr >> 8 ;
302			sr = sr >> 3 | xmc [31] << 13 ;
303			sr = sr >> 3 | xmc [32] << 13 ;
304			sr = sr >> 3 | xmc [33] << 13 ;
305			*c++ = sr >> 7 ;
306			sr = sr >> 3 | xmc [34] << 13 ;
307			sr = sr >> 3 | xmc [35] << 13 ;
308			sr = sr >> 3 | xmc [36] << 13 ;
309			*c++ = sr >> 6 ;
310			sr = sr >> 3 | xmc [37] << 13 ;
311			sr = sr >> 3 | xmc [38] << 13 ;
312			*c++ = sr >> 8 ;
313			sr = sr >> 7 | Nc [3] << 9 ;
314			sr = sr >> 2 | bc [3] << 14 ;
315			*c++ = sr >> 7 ;
316			sr = sr >> 2 | Mc [3] << 14 ;
317			sr = sr >> 6 | xmaxc [3] << 10 ;
318			*c++ = sr >> 7 ;
319			sr = sr >> 3 | xmc [39] << 13 ;
320			sr = sr >> 3 | xmc [40] << 13 ;
321			sr = sr >> 3 | xmc [41] << 13 ;
322			*c++ = sr >> 6 ;
323			sr = sr >> 3 | xmc [42] << 13 ;
324			sr = sr >> 3 | xmc [43] << 13 ;
325			*c++ = sr >> 8 ;
326			sr = sr >> 3 | xmc [44] << 13 ;
327			sr = sr >> 3 | xmc [45] << 13 ;
328			sr = sr >> 3 | xmc [46] << 13 ;
329			*c++ = sr >> 7 ;
330			sr = sr >> 3 | xmc [47] << 13 ;
331			sr = sr >> 3 | xmc [48] << 13 ;
332			sr = sr >> 3 | xmc [49] << 13 ;
333			*c++ = sr >> 6 ;
334			sr = sr >> 3 | xmc [50] << 13 ;
335			sr = sr >> 3 | xmc [51] << 13 ;
336			*c++ = sr >> 8 ;
337		}
338	}
339
340	else
341
342#endif	/* WAV49 */
343	{
344
345		*c++ = ((GSM_MAGIC & 0xF) << 4)		/* 1 */
346				| ((LARc [0] >> 2) & 0xF) ;
347		*c++ = ((LARc [0] & 0x3) << 6)
348				| (LARc [1] & 0x3F) ;
349		*c++ = ((LARc [2] & 0x1F) << 3)
350				| ((LARc [3] >> 2) & 0x7) ;
351		*c++ = ((LARc [3] & 0x3) << 6)
352				| ((LARc [4] & 0xF) << 2)
353				| ((LARc [5] >> 2) & 0x3) ;
354		*c++ = ((LARc [5] & 0x3) << 6)
355				| ((LARc [6] & 0x7) << 3)
356				| (LARc [7] & 0x7) ;
357		*c++ = ((Nc [0] & 0x7F) << 1)
358				| ((bc [0] >> 1) & 0x1) ;
359		*c++ = ((bc [0] & 0x1) << 7)
360				| ((Mc [0] & 0x3) << 5)
361				| ((xmaxc [0] >> 1) & 0x1F) ;
362		*c++ = ((xmaxc [0] & 0x1) << 7)
363				| ((xmc [0] & 0x7) << 4)
364				| ((xmc [1] & 0x7) << 1)
365				| ((xmc [2] >> 2) & 0x1) ;
366		*c++ = ((xmc [2] & 0x3) << 6)
367				| ((xmc [3] & 0x7) << 3)
368				| (xmc [4] & 0x7) ;
369		*c++ = ((xmc [5] & 0x7) << 5)			/* 10 */
370				| ((xmc [6] & 0x7) << 2)
371				| ((xmc [7] >> 1) & 0x3) ;
372		*c++ = ((xmc [7] & 0x1) << 7)
373				| ((xmc [8] & 0x7) << 4)
374				| ((xmc [9] & 0x7) << 1)
375				| ((xmc [10] >> 2) & 0x1) ;
376		*c++ = ((xmc [10] & 0x3) << 6)
377				| ((xmc [11] & 0x7) << 3)
378				| (xmc [12] & 0x7) ;
379		*c++ = ((Nc [1] & 0x7F) << 1)
380				| ((bc [1] >> 1) & 0x1) ;
381		*c++ = ((bc [1] & 0x1) << 7)
382				| ((Mc [1] & 0x3) << 5)
383				| ((xmaxc [1] >> 1) & 0x1F) ;
384		*c++ = ((xmaxc [1] & 0x1) << 7)
385				| ((xmc [13] & 0x7) << 4)
386				| ((xmc [14] & 0x7) << 1)
387				| ((xmc [15] >> 2) & 0x1) ;
388		*c++ = ((xmc [15] & 0x3) << 6)
389				| ((xmc [16] & 0x7) << 3)
390				| (xmc [17] & 0x7) ;
391		*c++ = ((xmc [18] & 0x7) << 5)
392				| ((xmc [19] & 0x7) << 2)
393				| ((xmc [20] >> 1) & 0x3) ;
394		*c++ = ((xmc [20] & 0x1) << 7)
395				| ((xmc [21] & 0x7) << 4)
396				| ((xmc [22] & 0x7) << 1)
397				| ((xmc [23] >> 2) & 0x1) ;
398		*c++ = ((xmc [23] & 0x3) << 6)
399				| ((xmc [24] & 0x7) << 3)
400				| (xmc [25] & 0x7) ;
401		*c++ = ((Nc [2] & 0x7F) << 1)			/* 20 */
402				| ((bc [2] >> 1) & 0x1) ;
403		*c++ = ((bc [2] & 0x1) << 7)
404				| ((Mc [2] & 0x3) << 5)
405				| ((xmaxc [2] >> 1) & 0x1F) ;
406		*c++ = ((xmaxc [2] & 0x1) << 7)
407				| ((xmc [26] & 0x7) << 4)
408				| ((xmc [27] & 0x7) << 1)
409				| ((xmc [28] >> 2) & 0x1) ;
410		*c++ = ((xmc [28] & 0x3) << 6)
411				| ((xmc [29] & 0x7) << 3)
412				| (xmc [30] & 0x7) ;
413		*c++ = ((xmc [31] & 0x7) << 5)
414				| ((xmc [32] & 0x7) << 2)
415				| ((xmc [33] >> 1) & 0x3) ;
416		*c++ = ((xmc [33] & 0x1) << 7)
417				| ((xmc [34] & 0x7) << 4)
418				| ((xmc [35] & 0x7) << 1)
419				| ((xmc [36] >> 2) & 0x1) ;
420		*c++ = ((xmc [36] & 0x3) << 6)
421				| ((xmc [37] & 0x7) << 3)
422				| (xmc [38] & 0x7) ;
423		*c++ = ((Nc [3] & 0x7F) << 1)
424				| ((bc [3] >> 1) & 0x1) ;
425		*c++ = ((bc [3] & 0x1) << 7)
426				| ((Mc [3] & 0x3) << 5)
427				| ((xmaxc [3] >> 1) & 0x1F) ;
428		*c++ = ((xmaxc [3] & 0x1) << 7)
429				| ((xmc [39] & 0x7) << 4)
430				| ((xmc [40] & 0x7) << 1)
431				| ((xmc [41] >> 2) & 0x1) ;
432		*c++ = ((xmc [41] & 0x3) << 6)			/* 30 */
433				| ((xmc [42] & 0x7) << 3)
434				| (xmc [43] & 0x7) ;
435		*c++ = ((xmc [44] & 0x7) << 5)
436				| ((xmc [45] & 0x7) << 2)
437				| ((xmc [46] >> 1) & 0x3) ;
438		*c++ = ((xmc [46] & 0x1) << 7)
439				| ((xmc [47] & 0x7) << 4)
440				| ((xmc [48] & 0x7) << 1)
441				| ((xmc [49] >> 2) & 0x1) ;
442		*c++ = ((xmc [49] & 0x3) << 6)
443				| ((xmc [50] & 0x7) << 3)
444				| (xmc [51] & 0x7) ;
445
446	}
447}
448
449