Coverage Report

Created: 2025-08-28 07:04

/src/libsndfile/src/G72x/g72x.c
Line
Count
Source (jump to first uncovered line)
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
11.6M
{
61
11.6M
  int   i ;
62
63
114M
  for (i = 0 ; i < size ; i++)
64
113M
    if (val < *table++)
65
11.5M
      break ;
66
11.6M
  return i ;
67
11.6M
}
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
10.0M
{
78
10.0M
  short   anmag, anexp, anmant ;
79
10.0M
  short   wanexp, wanmant ;
80
10.0M
  short   retval ;
81
82
10.0M
  anmag = (an > 0) ? an : ((-an) & 0x1FFF) ;
83
10.0M
  anexp = quan (anmag, power2, 15) - 6 ;
84
10.0M
  anmant = (anmag == 0) ? 32 :
85
10.0M
        (anexp >= 0) ? anmag >> anexp : anmag << -anexp ;
86
10.0M
  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
10.0M
  wanmant = (anmant * (srn & 0x3F)) >> 4 ;
96
97
10.0M
  retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp) ;
98
99
10.0M
  return (((an ^ srn) < 0) ? -retval : retval) ;
100
10.0M
}
101
102
static G72x_STATE * g72x_state_new (void)
103
614
{ return calloc (1, sizeof (G72x_STATE)) ;
104
614
}
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
614
{
115
614
  int   cnta ;
116
117
614
  state_ptr->yl = 34816 ;
118
614
  state_ptr->yu = 544 ;
119
614
  state_ptr->dms = 0 ;
120
614
  state_ptr->dml = 0 ;
121
614
  state_ptr->ap = 0 ;
122
1.84k
  for (cnta = 0 ; cnta < 2 ; cnta++)
123
1.22k
  { state_ptr->a [cnta] = 0 ;
124
1.22k
    state_ptr->pk [cnta] = 0 ;
125
1.22k
    state_ptr->sr [cnta] = 32 ;
126
1.22k
    }
127
4.29k
  for (cnta = 0 ; cnta < 6 ; cnta++)
128
3.68k
  { state_ptr->b [cnta] = 0 ;
129
3.68k
    state_ptr->dq [cnta] = 32 ;
130
3.68k
    }
131
614
  state_ptr->td = 0 ;
132
614
}  /* private_init_state */
133
134
struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
135
614
{ G72x_STATE *pstate ;
136
137
614
  if ((pstate = g72x_state_new ()) == NULL)
138
0
    return NULL ;
139
140
614
  private_init_state (pstate) ;
141
142
614
  pstate->encoder = NULL ;
143
144
614
  switch (codec)
145
614
  { 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
403
    case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
155
403
        pstate->decoder = g723_24_decoder ;
156
403
        *blocksize = G723_24_BYTES_PER_BLOCK ;
157
403
        *samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
158
403
        pstate->codec_bits = 3 ;
159
403
        pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
160
403
        pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
161
403
        break ;
162
163
126
    case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
164
126
        pstate->decoder = g721_decoder ;
165
126
        *blocksize = G721_32_BYTES_PER_BLOCK ;
166
126
        *samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
167
126
        pstate->codec_bits = 4 ;
168
126
        pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
169
126
        pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
170
126
        break ;
171
172
85
    case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
173
85
        pstate->decoder = g723_40_decoder ;
174
85
        *blocksize = G721_40_BYTES_PER_BLOCK ;
175
85
        *samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
176
85
        pstate->codec_bits = 5 ;
177
85
        pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
178
85
        pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
179
85
        break ;
180
181
0
    default :
182
0
        free (pstate) ;
183
0
        return NULL ;
184
614
    } ;
185
186
614
  return pstate ;
187
614
}  /* 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
10.4k
{ int k, count ;
245
246
10.4k
  count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ;
247
248
1.26M
  for (k = 0 ; k < count ; k++)
249
1.25M
    samples [k] = pstate->decoder (samples [k], pstate) ;
250
251
10.4k
  return 0 ;
252
10.4k
}  /* 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
1.25M
{
273
1.25M
  int   i ;
274
1.25M
  int   sezi ;
275
276
1.25M
  sezi = fmult (state_ptr->b [0] >> 2, state_ptr->dq [0]) ;
277
7.54M
  for (i = 1 ; i < 6 ; i++)      /* ACCUM */
278
6.28M
    sezi += fmult (state_ptr->b [i] >> 2, state_ptr->dq [i]) ;
279
1.25M
  return sezi ;
280
1.25M
}
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
1.25M
{
289
1.25M
  return (fmult (state_ptr->a [1] >> 2, state_ptr->sr [1]) +
290
1.25M
      fmult (state_ptr->a [0] >> 2, state_ptr->sr [0])) ;
291
1.25M
}
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
1.25M
{
300
1.25M
  int   y ;
301
1.25M
  int   dif ;
302
1.25M
  int   al ;
303
304
1.25M
  if (state_ptr->ap >= 256)
305
1.02M
    return (state_ptr->yu) ;
306
236k
  else {
307
236k
    y = state_ptr->yl >> 6 ;
308
236k
    dif = state_ptr->yu - y ;
309
236k
    al = state_ptr->ap >> 2 ;
310
236k
    if (dif > 0)
311
97.8k
      y += (dif * al) >> 6 ;
312
139k
    else if (dif < 0)
313
136k
      y += (dif * al + 0x3F) >> 6 ;
314
236k
    return y ;
315
236k
  }
316
1.25M
}
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
1.25M
{
383
1.25M
  short   dql ; /* Log of 'dq' magnitude */
384
1.25M
  short   dex ; /* Integer part of log */
385
1.25M
  short   dqt ;
386
1.25M
  short   dq ;  /* Reconstructed difference signal sample */
387
388
1.25M
  dql = dqln + (y >> 2) ; /* ADDA */
389
390
1.25M
  if (dql < 0)
391
657k
    return ((sign) ? -0x8000 : 0) ;
392
599k
  else    /* ANTILOG */
393
599k
  { dex = (dql >> 7) & 15 ;
394
599k
    dqt = 128 + (dql & 127) ;
395
599k
    dq = (dqt << 7) >> (14 - dex) ;
396
599k
    return ((sign) ? (dq - 0x8000) : dq) ;
397
599k
    }
398
1.25M
}
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
1.25M
{
417
1.25M
  int   cnt ;
418
1.25M
  short   mag, expon ;  /* Adaptive predictor, FLOAT A */
419
1.25M
  short   a2p = 0 ; /* LIMC */
420
1.25M
  short   a1ul ;    /* UPA1 */
421
1.25M
  short   pks1 ;    /* UPA2 */
422
1.25M
  short   fa1 ;
423
1.25M
  char    tr ;    /* tone/transition detector */
424
1.25M
  short   ylint, thr2, dqthr ;
425
1.25M
  short   ylfrac, thr1 ;
426
1.25M
  short   pk0 ;
427
428
1.25M
  pk0 = (dqsez < 0) ? 1 : 0 ;  /* needed in updating predictor poles */
429
430
1.25M
  mag = dq & 0x7FFF ;   /* prediction difference magnitude */
431
  /* TRANS */
432
1.25M
  ylint = state_ptr->yl >> 15 ; /* exponent part of yl */
433
1.25M
  ylfrac = (state_ptr->yl >> 10) & 0x1F ; /* fractional part of yl */
434
1.25M
  thr1 = (32 + ylfrac) << ylint ;   /* threshold */
435
1.25M
  thr2 = (ylint > 9) ? 31 << 10 : thr1 ;  /* limit thr2 to 31 << 10 */
436
1.25M
  dqthr = (thr2 + (thr2 >> 1)) >> 1 ; /* dqthr = 0.75 * thr2 */
437
1.25M
  if (state_ptr->td == 0)    /* signal supposed voice */
438
1.23M
    tr = 0 ;
439
24.6k
  else if (mag <= dqthr)    /* supposed data, but small mag */
440
24.2k
    tr = 0 ;      /* treated as voice */
441
321
  else        /* signal is data (modem) */
442
321
    tr = 1 ;
443
444
  /*
445
   * Quantizer scale factor adaptation.
446
   */
447
448
  /* FUNCTW & FILTD & DELAY */
449
  /* update non-steady state step size multiplier */
450
1.25M
  state_ptr->yu = y + ((wi - y) >> 5) ;
451
452
  /* LIMB */
453
1.25M
  if (state_ptr->yu < 544)  /* 544 <= yu <= 5120 */
454
250k
    state_ptr->yu = 544 ;
455
1.00M
  else if (state_ptr->yu > 5120)
456
95.9k
    state_ptr->yu = 5120 ;
457
458
  /* FILTE & DELAY */
459
  /* update steady state step size multiplier */
460
1.25M
  state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6) ;
461
462
  /*
463
   * Adaptive predictor coefficients.
464
   */
465
1.25M
  if (tr == 1) {     /* reset a's and b's for modem signal */
466
321
    state_ptr->a [0] = 0 ;
467
321
    state_ptr->a [1] = 0 ;
468
321
    state_ptr->b [0] = 0 ;
469
321
    state_ptr->b [1] = 0 ;
470
321
    state_ptr->b [2] = 0 ;
471
321
    state_ptr->b [3] = 0 ;
472
321
    state_ptr->b [4] = 0 ;
473
321
    state_ptr->b [5] = 0 ;
474
321
    }
475
1.25M
  else      /* update a's and b's */
476
1.25M
  { pks1 = pk0 ^ state_ptr->pk [0] ;    /* UPA2 */
477
478
    /* update predictor pole a [1] */
479
1.25M
    a2p = state_ptr->a [1] - (state_ptr->a [1] >> 7) ;
480
1.25M
    if (dqsez != 0)
481
907k
    { fa1 = (pks1) ? state_ptr->a [0] : -state_ptr->a [0] ;
482
907k
      if (fa1 < -8191)  /* a2p = function of fa1 */
483
117k
        a2p -= 0x100 ;
484
790k
      else if (fa1 > 8191)
485
40.5k
        a2p += 0xFF ;
486
750k
      else
487
750k
        a2p += fa1 >> 5 ;
488
489
907k
      if (pk0 ^ state_ptr->pk [1])
490
438k
      { /* LIMC */
491
438k
        if (a2p <= -12160)
492
5.13k
          a2p = -12288 ;
493
432k
        else if (a2p >= 12416)
494
0
          a2p = 12288 ;
495
432k
        else
496
432k
          a2p -= 0x80 ;
497
438k
        }
498
469k
      else if (a2p <= -12416)
499
7.04k
        a2p = -12288 ;
500
462k
      else if (a2p >= 12160)
501
312
        a2p = 12288 ;
502
462k
      else
503
462k
        a2p += 0x80 ;
504
907k
    }
505
506
    /* TRIGB & DELAY */
507
1.25M
    state_ptr->a [1] = a2p ;
508
509
    /* UPA1 */
510
    /* update predictor pole a [0] */
511
1.25M
    state_ptr->a [0] -= state_ptr->a [0] >> 8 ;
512
1.25M
    if (dqsez != 0)
513
907k
    { if (pks1 == 0)
514
453k
        state_ptr->a [0] += 192 ;
515
454k
      else
516
454k
        state_ptr->a [0] -= 192 ;
517
907k
      } ;
518
519
    /* LIMD */
520
1.25M
    a1ul = 15360 - a2p ;
521
1.25M
    if (state_ptr->a [0] < -a1ul)
522
5.78k
      state_ptr->a [0] = -a1ul ;
523
1.25M
    else if (state_ptr->a [0] > a1ul)
524
3.23k
      state_ptr->a [0] = a1ul ;
525
526
    /* UPB : update predictor zeros b [6] */
527
8.79M
    for (cnt = 0 ; cnt < 6 ; cnt++)
528
7.54M
    { if (code_size == 5)    /* for 40Kbps G.723 */
529
5.05M
        state_ptr->b [cnt] -= state_ptr->b [cnt] >> 9 ;
530
2.48M
      else      /* for G.721 and 24Kbps G.723 */
531
2.48M
        state_ptr->b [cnt] -= state_ptr->b [cnt] >> 8 ;
532
7.54M
      if (dq & 0x7FFF)      /* XOR */
533
3.59M
      { if ((dq ^ state_ptr->dq [cnt]) >= 0)
534
1.72M
          state_ptr->b [cnt] += 128 ;
535
1.86M
        else
536
1.86M
          state_ptr->b [cnt] -= 128 ;
537
3.59M
        }
538
7.54M
      }
539
1.25M
    }
540
541
7.54M
  for (cnt = 5 ; cnt > 0 ; cnt--)
542
6.28M
    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
1.25M
  if (mag == 0)
545
657k
    state_ptr->dq [0] = (dq >= 0) ? 0x20 : 0xFC20 ;
546
599k
  else
547
599k
  { expon = quan (mag, power2, 15) ;
548
599k
    state_ptr->dq [0] = (dq >= 0) ?
549
317k
      (expon << 6) + ((mag << 6) >> expon) :
550
599k
      (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
551
599k
    }
552
553
1.25M
  state_ptr->sr [1] = state_ptr->sr [0] ;
554
  /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
555
1.25M
  if (sr == 0)
556
300k
    state_ptr->sr [0] = 0x20 ;
557
956k
  else if (sr > 0)
558
483k
  { expon = quan (sr, power2, 15) ;
559
483k
    state_ptr->sr [0] = (expon << 6) + ((sr << 6) >> expon) ;
560
483k
    }
561
472k
  else if (sr > -32768)
562
472k
  { mag = -sr ;
563
472k
    expon = quan (mag, power2, 15) ;
564
472k
    state_ptr->sr [0] = (expon << 6) + ((mag << 6) >> expon) - 0x400 ;
565
472k
    }
566
200
  else
567
200
    state_ptr->sr [0] = (short) 0xFC20 ;
568
569
  /* DELAY A */
570
1.25M
  state_ptr->pk [1] = state_ptr->pk [0] ;
571
1.25M
  state_ptr->pk [0] = pk0 ;
572
573
  /* TONE */
574
1.25M
  if (tr == 1)    /* this sample has been treated as data */
575
321
    state_ptr->td = 0 ;  /* next one will be treated as voice */
576
1.25M
  else if (a2p < -11776)  /* small sample-to-sample correlation */
577
24.6k
    state_ptr->td = 1 ;  /* signal may be data */
578
1.23M
  else        /* signal is voice */
579
1.23M
    state_ptr->td = 0 ;
580
581
  /*
582
   * Adaptation speed control.
583
   */
584
1.25M
  state_ptr->dms += (fi - state_ptr->dms) >> 5 ;    /* FILTA */
585
1.25M
  state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7) ; /* FILTB */
586
587
1.25M
  if (tr == 1)
588
321
    state_ptr->ap = 256 ;
589
1.25M
  else if (y < 1536)          /* SUBTC */
590
330k
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
591
926k
  else if (state_ptr->td == 1)
592
23.2k
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
593
902k
  else if (abs ((state_ptr->dms << 2) - state_ptr->dml) >= (state_ptr->dml >> 3))
594
632k
    state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ;
595
269k
  else
596
269k
    state_ptr->ap += (-state_ptr->ap) >> 4 ;
597
598
1.25M
  return ;
599
1.25M
} /* update */
600
601
/*------------------------------------------------------------------------------
602
*/
603
604
static int
605
unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
606
10.4k
{ unsigned int  in_buffer = 0 ;
607
10.4k
  unsigned char in_byte ;
608
10.4k
  int       k, in_bits = 0, bindex = 0 ;
609
610
1.26M
  for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++)
611
1.25M
  { if (in_bits < bits)
612
687k
    { in_byte = block [bindex++] ;
613
614
687k
      in_buffer |= (in_byte << in_bits) ;
615
687k
      in_bits += 8 ;
616
687k
      }
617
1.25M
    samples [k] = in_buffer & ((1 << bits) - 1) ;
618
1.25M
    in_buffer >>= bits ;
619
1.25M
    in_bits -= bits ;
620
1.25M
    } ;
621
622
10.4k
  return k ;
623
10.4k
} /* 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