Coverage Report

Created: 2025-08-26 06:36

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