Coverage Report

Created: 2025-12-14 06:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libsndfile/src/G72x/g72x.c
Line
Count
Source
1
/*
2
 * This source code is a product of Sun Microsystems, Inc. and is provided
3
 * for unrestricted use.  Users may copy or modify this source code without
4
 * charge.
5
 *
6
 * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
7
 * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
8
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
9
 *
10
 * Sun source code is provided with no support and without any obligation on
11
 * the part of Sun Microsystems, Inc. to assist in its use, correction,
12
 * modification or enhancement.
13
 *
14
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
15
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
16
 * OR ANY PART THEREOF.
17
 *
18
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
19
 * or profits or other special, indirect and consequential damages, even if
20
 * Sun has been advised of the possibility of such damages.
21
 *
22
 * Sun Microsystems, Inc.
23
 * 2550 Garcia Avenue
24
 * Mountain View, California  94043
25
 */
26
27
/*
28
 * g72x.c
29
 *
30
 * Common routines for G.721 and G.723 conversions.
31
 */
32
33
#include <stdio.h>
34
#include <stdlib.h>
35
#include <string.h>
36
37
#include "g72x.h"
38
#include "g72x_priv.h"
39
40
static G72x_STATE * g72x_state_new (void) ;
41
static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ;
42
static int pack_bytes (int bits, const short * samples, unsigned char * block) ;
43
44
static
45
short power2 [15] =
46
{ 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
47
  0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
48
} ;
49
50
/*
51
 * quan ()
52
 *
53
 * quantizes the input val against the table of size short integers.
54
 * It returns i if table [i - 1] <= val < table [i].
55
 *
56
 * Using linear search for simple coding.
57
 */
58
static
59
int quan (int val, short *table, int size)
60
212M
{
61
212M
  int   i ;
62
63
1.67G
  for (i = 0 ; i < size ; i++)
64
1.67G
    if (val < *table++)
65
211M
      break ;
66
212M
  return i ;
67
212M
}
68
69
/*
70
 * fmult ()
71
 *
72
 * returns the integer product of the 14-bit integer "an" and
73
 * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
74
 */
75
static
76
int fmult (int an, int srn)
77
195M
{
78
195M
  short   anmag, anexp, anmant ;
79
195M
  short   wanexp, wanmant ;
80
195M
  short   retval ;
81
82
195M
  anmag = (an > 0) ? an : ((-an) & 0x1FFF) ;
83
195M
  anexp = quan (anmag, power2, 15) - 6 ;
84
195M
  anmant = (anmag == 0) ? 32 :
85
195M
        (anexp >= 0) ? anmag >> anexp : anmag << -anexp ;
86
195M
  wanexp = anexp + ((srn >> 6) & 0xF) - 13 ;
87
88
  /*
89
  ** The original was :
90
  **    wanmant = (anmant * (srn & 0x3F) + 0x30) >> 4 ;
91
  ** but could see no valid reason for the + 0x30.
92
  ** Removed it and it improved the SNR of the codec.
93
  */
94
95
195M
  wanmant = (anmant * (srn & 0x3F)) >> 4 ;
96
97
195M
  retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp) ;
98
99
195M
  return (((an ^ srn) < 0) ? -retval : retval) ;
100
195M
}
101
102
static G72x_STATE * g72x_state_new (void)
103
1.20k
{ return calloc (1, sizeof (G72x_STATE)) ;
104
1.20k
}
105
106
/*
107
 * private_init_state ()
108
 *
109
 * This routine initializes and/or resets the G72x_PRIVATE structure
110
 * pointed to by 'state_ptr'.
111
 * All the initial state values are specified in the CCITT G.721 document.
112
 */
113
void private_init_state (G72x_STATE *state_ptr)
114
1.20k
{
115
1.20k
  int   cnta ;
116
117
1.20k
  state_ptr->yl = 34816 ;
118
1.20k
  state_ptr->yu = 544 ;
119
1.20k
  state_ptr->dms = 0 ;
120
1.20k
  state_ptr->dml = 0 ;
121
1.20k
  state_ptr->ap = 0 ;
122
3.60k
  for (cnta = 0 ; cnta < 2 ; cnta++)
123
2.40k
  { state_ptr->a [cnta] = 0 ;
124
2.40k
    state_ptr->pk [cnta] = 0 ;
125
2.40k
    state_ptr->sr [cnta] = 32 ;
126
2.40k
    }
127
8.42k
  for (cnta = 0 ; cnta < 6 ; cnta++)
128
7.21k
  { state_ptr->b [cnta] = 0 ;
129
7.21k
    state_ptr->dq [cnta] = 32 ;
130
7.21k
    }
131
1.20k
  state_ptr->td = 0 ;
132
1.20k
}  /* private_init_state */
133
134
struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
135
1.20k
{ G72x_STATE *pstate ;
136
137
1.20k
  if ((pstate = g72x_state_new ()) == NULL)
138
0
    return NULL ;
139
140
1.20k
  private_init_state (pstate) ;
141
142
1.20k
  pstate->encoder = NULL ;
143
144
1.20k
  switch (codec)
145
1.20k
  { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
146
0
        pstate->decoder = g723_16_decoder ;
147
0
        *blocksize = G723_16_BYTES_PER_BLOCK ;
148
0
        *samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
149
0
        pstate->codec_bits = 2 ;
150
0
        pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
151
0
        pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
152
0
        break ;
153
154
757
    case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
155
757
        pstate->decoder = g723_24_decoder ;
156
757
        *blocksize = G723_24_BYTES_PER_BLOCK ;
157
757
        *samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
158
757
        pstate->codec_bits = 3 ;
159
757
        pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
160
757
        pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
161
757
        break ;
162
163
299
    case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
164
299
        pstate->decoder = g721_decoder ;
165
299
        *blocksize = G721_32_BYTES_PER_BLOCK ;
166
299
        *samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
167
299
        pstate->codec_bits = 4 ;
168
299
        pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
169
299
        pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
170
299
        break ;
171
172
147
    case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
173
147
        pstate->decoder = g723_40_decoder ;
174
147
        *blocksize = G721_40_BYTES_PER_BLOCK ;
175
147
        *samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
176
147
        pstate->codec_bits = 5 ;
177
147
        pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
178
147
        pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
179
147
        break ;
180
181
0
    default :
182
0
        free (pstate) ;
183
0
        return NULL ;
184
1.20k
    } ;
185
186
1.20k
  return pstate ;
187
1.20k
}  /* g72x_reader_init */
188
189
struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock)
190
0
{ G72x_STATE *pstate ;
191
192
0
  if ((pstate = g72x_state_new ()) == NULL)
193
0
    return NULL ;
194
195
0
  private_init_state (pstate) ;
196
0
  pstate->decoder = NULL ;
197
198
0
  switch (codec)
199
0
  { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
200
0
        pstate->encoder = g723_16_encoder ;
201
0
        *blocksize = G723_16_BYTES_PER_BLOCK ;
202
0
        *samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
203
0
        pstate->codec_bits = 2 ;
204
0
        pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
205
0
        pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
206
0
        break ;
207
208
0
    case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
209
0
        pstate->encoder = g723_24_encoder ;
210
0
        *blocksize = G723_24_BYTES_PER_BLOCK ;
211
0
        *samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
212
0
        pstate->codec_bits = 3 ;
213
0
        pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
214
0
        pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
215
0
        break ;
216
217
0
    case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
218
0
        pstate->encoder = g721_encoder ;
219
0
        *blocksize = G721_32_BYTES_PER_BLOCK ;
220
0
        *samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
221
0
        pstate->codec_bits = 4 ;
222
0
        pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
223
0
        pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
224
0
        break ;
225
226
0
    case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
227
0
        pstate->encoder = g723_40_encoder ;
228
0
        *blocksize = G721_40_BYTES_PER_BLOCK ;
229
0
        *samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
230
0
        pstate->codec_bits = 5 ;
231
0
        pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
232
0
        pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
233
0
        break ;
234
235
0
    default :
236
0
        free (pstate) ;
237
0
        return NULL ;
238
0
    } ;
239
240
0
  return pstate ;
241
0
}  /* g72x_writer_init */
242
243
int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples)
244
203k
{ int k, count ;
245
246
203k
  count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ;
247
248
24.5M
  for (k = 0 ; k < count ; k++)
249
24.3M
    samples [k] = pstate->decoder (samples [k], pstate) ;
250
251
203k
  return 0 ;
252
203k
}  /* g72x_decode_block */
253
254
int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block)
255
0
{ int k, count ;
256
257
0
  for (k = 0 ; k < pstate->samplesperblock ; k++)
258
0
    samples [k] = pstate->encoder (samples [k], pstate) ;
259
260
0
  count = pack_bytes (pstate->codec_bits, samples, block) ;
261
262
0
  return count ;
263
0
}  /* g72x_encode_block */
264
265
/*
266
 * predictor_zero ()
267
 *
268
 * computes the estimated signal from 6-zero predictor.
269
 *
270
 */
271
int predictor_zero (G72x_STATE *state_ptr)
272
24.3M
{
273
24.3M
  int   i ;
274
24.3M
  int   sezi ;
275
276
24.3M
  sezi = fmult (state_ptr->b [0] >> 2, state_ptr->dq [0]) ;
277
146M
  for (i = 1 ; i < 6 ; i++)      /* ACCUM */
278
121M
    sezi += fmult (state_ptr->b [i] >> 2, state_ptr->dq [i]) ;
279
24.3M
  return sezi ;
280
24.3M
}
281
/*
282
 * predictor_pole ()
283
 *
284
 * computes the estimated signal from 2-pole predictor.
285
 *
286
 */
287
int predictor_pole (G72x_STATE *state_ptr)
288
24.3M
{
289
24.3M
  return (fmult (state_ptr->a [1] >> 2, state_ptr->sr [1]) +
290
24.3M
      fmult (state_ptr->a [0] >> 2, state_ptr->sr [0])) ;
291
24.3M
}
292
/*
293
 * step_size ()
294
 *
295
 * computes the quantization step size of the adaptive quantizer.
296
 *
297
 */
298
int step_size (G72x_STATE *state_ptr)
299
24.3M
{
300
24.3M
  int   y ;
301
24.3M
  int   dif ;
302
24.3M
  int   al ;
303
304
24.3M
  if (state_ptr->ap >= 256)
305
20.4M
    return (state_ptr->yu) ;
306
3.96M
  else {
307
3.96M
    y = state_ptr->yl >> 6 ;
308
3.96M
    dif = state_ptr->yu - y ;
309
3.96M
    al = state_ptr->ap >> 2 ;
310
3.96M
    if (dif > 0)
311
1.43M
      y += (dif * al) >> 6 ;
312
2.52M
    else if (dif < 0)
313
2.52M
      y += (dif * al + 0x3F) >> 6 ;
314
3.96M
    return y ;
315
3.96M
  }
316
24.3M
}
317
318
/*
319
 * quantize ()
320
 *
321
 * Given a raw sample, 'd', of the difference signal and a
322
 * quantization step size scale factor, 'y', this routine returns the
323
 * ADPCM codeword to which that sample gets quantized.  The step
324
 * size scale factor division operation is done in the log base 2 domain
325
 * as a subtraction.
326
 */
327
int quantize (
328
  int   d,  /* Raw difference signal sample */
329
  int   y,  /* Step size multiplier */
330
  short *table, /* quantization table */
331
  int   size) /* table size of short integers */
332
0
{
333
0
  short   dqm ; /* Magnitude of 'd' */
334
0
  short   expon ; /* Integer part of base 2 log of 'd' */
335
0
  short   mant ;  /* Fractional part of base 2 log */
336
0
  short   dl ;  /* Log of magnitude of 'd' */
337
0
  short   dln ; /* Step size scale factor normalized log */
338
0
  int   i ;
339
340
  /*
341
   * LOG
342
   *
343
   * Compute base 2 log of 'd', and store in 'dl'.
344
   */
345
0
  dqm = abs (d) ;
346
0
  expon = quan (dqm >> 1, power2, 15) ;
347
0
  mant = ((dqm << 7) >> expon) & 0x7F ; /* Fractional portion. */
348
0
  dl = (expon << 7) + mant ;
349
350
  /*
351
   * SUBTB
352
   *
353
   * "Divide" by step size multiplier.
354
   */
355
0
  dln = dl - (y >> 2) ;
356
357
  /*
358
   * QUAN
359
   *
360
   * Obtain codword i for 'd'.
361
   */
362
0
  i = quan (dln, table, size) ;
363
0
  if (d < 0)     /* take 1's complement of i */
364
0
    return ((size << 1) + 1 - i) ;
365
0
  else if (i == 0)   /* take 1's complement of 0 */
366
0
    return ((size << 1) + 1) ; /* new in 1988 */
367
368
0
  return i ;
369
0
}
370
/*
371
 * reconstruct ()
372
 *
373
 * Returns reconstructed difference signal 'dq' obtained from
374
 * codeword 'i' and quantization step size scale factor 'y'.
375
 * Multiplication is performed in log base 2 domain as addition.
376
 */
377
int
378
reconstruct (
379
  int   sign, /* 0 for non-negative value */
380
  int   dqln, /* G.72x codeword */
381
  int   y)  /* Step size multiplier */
382
24.3M
{
383
24.3M
  short   dql ; /* Log of 'dq' magnitude */
384
24.3M
  short   dex ; /* Integer part of log */
385
24.3M
  short   dqt ;
386
24.3M
  short   dq ;  /* Reconstructed difference signal sample */
387
388
24.3M
  dql = dqln + (y >> 2) ; /* ADDA */
389
390
24.3M
  if (dql < 0)
391
18.2M
    return ((sign) ? -0x8000 : 0) ;
392
6.17M
  else    /* ANTILOG */
393
6.17M
  { dex = (dql >> 7) & 15 ;
394
6.17M
    dqt = 128 + (dql & 127) ;
395
6.17M
    dq = (dqt << 7) >> (14 - dex) ;
396
6.17M
    return ((sign) ? (dq - 0x8000) : dq) ;
397
6.17M
    }
398
24.3M
}
399
400
401
/*
402
 * update ()
403
 *
404
 * updates the state variables for each output code
405
 */
406
void
407
update (
408
  int   code_size,  /* distinguish 723_40 with others */
409
  int   y,    /* quantizer step size */
410
  int   wi,   /* scale factor multiplier */
411
  int   fi,   /* for long/short term energies */
412
  int   dq,   /* quantized prediction difference */
413
  int   sr,   /* reconstructed signal */
414
  int   dqsez,    /* difference from 2-pole predictor */
415
  G72x_STATE *state_ptr)  /* coder state pointer */
416
24.3M
{
417
24.3M
  int   cnt ;
418
24.3M
  short   mag, expon ;  /* Adaptive predictor, FLOAT A */
419
24.3M
  short   a2p = 0 ; /* LIMC */
420
24.3M
  short   a1ul ;    /* UPA1 */
421
24.3M
  short   pks1 ;    /* UPA2 */
422
24.3M
  short   fa1 ;
423
24.3M
  char    tr ;    /* tone/transition detector */
424
24.3M
  short   ylint, thr2, dqthr ;
425
24.3M
  short   ylfrac, thr1 ;
426
24.3M
  short   pk0 ;
427
428
24.3M
  pk0 = (dqsez < 0) ? 1 : 0 ;  /* needed in updating predictor poles */
429
430
24.3M
  mag = dq & 0x7FFF ;   /* prediction difference magnitude */
431
  /* TRANS */
432
24.3M
  ylint = state_ptr->yl >> 15 ; /* exponent part of yl */
433
24.3M
  ylfrac = (state_ptr->yl >> 10) & 0x1F ; /* fractional part of yl */
434
24.3M
  thr1 = (32 + ylfrac) << ylint ;   /* threshold */
435
24.3M
  thr2 = (ylint > 9) ? 31 << 10 : thr1 ;  /* limit thr2 to 31 << 10 */
436
24.3M
  dqthr = (thr2 + (thr2 >> 1)) >> 1 ; /* dqthr = 0.75 * thr2 */
437
24.3M
  if (state_ptr->td == 0)    /* signal supposed voice */
438
23.3M
    tr = 0 ;
439
994k
  else if (mag <= dqthr)    /* supposed data, but small mag */
440
992k
    tr = 0 ;      /* treated as voice */
441
1.92k
  else        /* signal is data (modem) */
442
1.92k
    tr = 1 ;
443
444
  /*
445
   * Quantizer scale factor adaptation.
446
   */
447
448
  /* FUNCTW & FILTD & DELAY */
449
  /* update non-steady state step size multiplier */
450
24.3M
  state_ptr->yu = y + ((wi - y) >> 5) ;
451
452
  /* LIMB */
453
24.3M
  if (state_ptr->yu < 544)  /* 544 <= yu <= 5120 */
454
11.8M
    state_ptr->yu = 544 ;
455
12.5M
  else if (state_ptr->yu > 5120)
456
781k
    state_ptr->yu = 5120 ;
457
458
  /* FILTE & DELAY */
459
  /* update steady state step size multiplier */
460
24.3M
  state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6) ;
461
462
  /*
463
   * Adaptive predictor coefficients.
464
   */
465
24.3M
  if (tr == 1) {     /* reset a's and b's for modem signal */
466
1.92k
    state_ptr->a [0] = 0 ;
467
1.92k
    state_ptr->a [1] = 0 ;
468
1.92k
    state_ptr->b [0] = 0 ;
469
1.92k
    state_ptr->b [1] = 0 ;
470
1.92k
    state_ptr->b [2] = 0 ;
471
1.92k
    state_ptr->b [3] = 0 ;
472
1.92k
    state_ptr->b [4] = 0 ;
473
1.92k
    state_ptr->b [5] = 0 ;
474
1.92k
    }
475
24.3M
  else      /* update a's and b's */
476
24.3M
  { pks1 = pk0 ^ state_ptr->pk [0] ;    /* UPA2 */
477
478
    /* update predictor pole a [1] */
479
24.3M
    a2p = state_ptr->a [1] - (state_ptr->a [1] >> 7) ;
480
24.3M
    if (dqsez != 0)
481
9.90M
    { fa1 = (pks1) ? state_ptr->a [0] : -state_ptr->a [0] ;
482
9.90M
      if (fa1 < -8191)  /* a2p = function of fa1 */
483
1.99M
        a2p -= 0x100 ;
484
7.91M
      else if (fa1 > 8191)
485
874k
        a2p += 0xFF ;
486
7.03M
      else
487
7.03M
        a2p += fa1 >> 5 ;
488
489
9.90M
      if (pk0 ^ state_ptr->pk [1])
490
5.15M
      { /* LIMC */
491
5.15M
        if (a2p <= -12160)
492
304k
          a2p = -12288 ;
493
4.85M
        else if (a2p >= 12416)
494
0
          a2p = 12288 ;
495
4.85M
        else
496
4.85M
          a2p -= 0x80 ;
497
5.15M
        }
498
4.75M
      else if (a2p <= -12416)
499
351k
        a2p = -12288 ;
500
4.39M
      else if (a2p >= 12160)
501
2.13k
        a2p = 12288 ;
502
4.39M
      else
503
4.39M
        a2p += 0x80 ;
504
9.90M
    }
505
506
    /* TRIGB & DELAY */
507
24.3M
    state_ptr->a [1] = a2p ;
508
509
    /* UPA1 */
510
    /* update predictor pole a [0] */
511
24.3M
    state_ptr->a [0] -= state_ptr->a [0] >> 8 ;
512
24.3M
    if (dqsez != 0)
513
9.90M
    { if (pks1 == 0)
514
5.07M
        state_ptr->a [0] += 192 ;
515
4.83M
      else
516
4.83M
        state_ptr->a [0] -= 192 ;
517
9.90M
      } ;
518
519
    /* LIMD */
520
24.3M
    a1ul = 15360 - a2p ;
521
24.3M
    if (state_ptr->a [0] < -a1ul)
522
29.6k
      state_ptr->a [0] = -a1ul ;
523
24.3M
    else if (state_ptr->a [0] > a1ul)
524
30.0k
      state_ptr->a [0] = a1ul ;
525
526
    /* UPB : update predictor zeros b [6] */
527
170M
    for (cnt = 0 ; cnt < 6 ; cnt++)
528
146M
    { if (code_size == 5)    /* for 40Kbps G.723 */
529
12.0M
        state_ptr->b [cnt] -= state_ptr->b [cnt] >> 9 ;
530
134M
      else      /* for G.721 and 24Kbps G.723 */
531
134M
        state_ptr->b [cnt] -= state_ptr->b [cnt] >> 8 ;
532
146M
      if (dq & 0x7FFF)      /* XOR */
533
37.0M
      { if ((dq ^ state_ptr->dq [cnt]) >= 0)
534
17.9M
          state_ptr->b [cnt] += 128 ;
535
19.0M
        else
536
19.0M
          state_ptr->b [cnt] -= 128 ;
537
37.0M
        }
538
146M
      }
539
24.3M
    }
540
541
146M
  for (cnt = 5 ; cnt > 0 ; cnt--)
542
121M
    state_ptr->dq [cnt] = state_ptr->dq [cnt - 1] ;
543
  /* FLOAT A : convert dq [0] to 4-bit exp, 6-bit mantissa f.p. */
544
24.3M
  if (mag == 0)
545
18.2M
    state_ptr->dq [0] = (dq >= 0) ? 0x20 : 0xFC20 ;
546
6.17M
  else
547
6.17M
  { expon = quan (mag, power2, 15) ;
548
6.17M
    state_ptr->dq [0] = (dq >= 0) ?
549
3.28M
      (expon << 6) + ((mag << 6) >> expon) :
550
6.17M
      (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
551
6.17M
    }
552
553
24.3M
  state_ptr->sr [1] = state_ptr->sr [0] ;
554
  /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
555
24.3M
  if (sr == 0)
556
13.6M
    state_ptr->sr [0] = 0x20 ;
557
10.7M
  else if (sr > 0)
558
5.49M
  { expon = quan (sr, power2, 15) ;
559
5.49M
    state_ptr->sr [0] = (expon << 6) + ((sr << 6) >> expon) ;
560
5.49M
    }
561
5.28M
  else if (sr > -32768)
562
5.28M
  { mag = -sr ;
563
5.28M
    expon = quan (mag, power2, 15) ;
564
5.28M
    state_ptr->sr [0] = (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
565
5.28M
    }
566
269
  else
567
269
    state_ptr->sr [0] = (short) 0xFC20 ;
568
569
  /* DELAY A */
570
24.3M
  state_ptr->pk [1] = state_ptr->pk [0] ;
571
24.3M
  state_ptr->pk [0] = pk0 ;
572
573
  /* TONE */
574
24.3M
  if (tr == 1)    /* this sample has been treated as data */
575
1.92k
    state_ptr->td = 0 ;  /* next one will be treated as voice */
576
24.3M
  else if (a2p < -11776)  /* small sample-to-sample correlation */
577
994k
    state_ptr->td = 1 ;  /* signal may be data */
578
23.3M
  else        /* signal is voice */
579
23.3M
    state_ptr->td = 0 ;
580
581
  /*
582
   * Adaptation speed control.
583
   */
584
24.3M
  state_ptr->dms += (fi - state_ptr->dms) >> 5 ;    /* FILTA */
585
24.3M
  state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7) ; /* FILTB */
586
587
24.3M
  if (tr == 1)
588
1.92k
    state_ptr->ap = 256 ;
589
24.3M
  else if (y < 1536)          /* SUBTC */
590
13.9M
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
591
10.4M
  else if (state_ptr->td == 1)
592
987k
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
593
9.49M
  else if (abs ((state_ptr->dms << 2) - state_ptr->dml) >= (state_ptr->dml >> 3))
594
5.45M
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
595
4.03M
  else
596
4.03M
    state_ptr->ap += (-state_ptr->ap) >> 4 ;
597
598
24.3M
  return ;
599
24.3M
} /* update */
600
601
/*------------------------------------------------------------------------------
602
*/
603
604
static int
605
unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
606
203k
{ unsigned int  in_buffer = 0 ;
607
203k
  unsigned char in_byte ;
608
203k
  int       k, in_bits = 0, bindex = 0 ;
609
610
24.5M
  for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++)
611
24.3M
  { if (in_bits < bits)
612
9.74M
    { in_byte = block [bindex++] ;
613
614
9.74M
      in_buffer |= (in_byte << in_bits) ;
615
9.74M
      in_bits += 8 ;
616
9.74M
      }
617
24.3M
    samples [k] = in_buffer & ((1 << bits) - 1) ;
618
24.3M
    in_buffer >>= bits ;
619
24.3M
    in_bits -= bits ;
620
24.3M
    } ;
621
622
203k
  return k ;
623
203k
} /* unpack_bytes */
624
625
static int
626
pack_bytes (int bits, const short * samples, unsigned char * block)
627
0
{
628
0
  unsigned int  out_buffer = 0 ;
629
0
  int       k, bindex = 0, out_bits = 0 ;
630
0
  unsigned char out_byte ;
631
632
0
  for (k = 0 ; k < G72x_BLOCK_SIZE ; k++)
633
0
  { out_buffer |= (samples [k] << out_bits) ;
634
0
    out_bits += bits ;
635
0
    if (out_bits >= 8)
636
0
    { out_byte = out_buffer & 0xFF ;
637
0
      out_bits -= 8 ;
638
0
      out_buffer >>= 8 ;
639
0
      block [bindex++] = out_byte ;
640
0
      }
641
0
    } ;
642
643
0
  return bindex ;
644
0
} /* pack_bytes */
645