g72x.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:17k
源码类别:

Audio

开发平台:

Unix_Linux

  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.  * g72x.c
  28.  *
  29.  * Common routines for G.721 and G.723 conversions.
  30.  */
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include "g72x.h"
  35. #include "g72x_priv.h"
  36. static G72x_STATE * g72x_state_new (void) ;
  37. static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ;
  38. static int pack_bytes (int bits, const short * samples, unsigned char * block) ;
  39. static
  40. short power2 [15] =
  41. { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
  42. 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
  43. } ;
  44. /*
  45.  * quan()
  46.  *
  47.  * quantizes the input val against the table of size short integers.
  48.  * It returns i if table[i - 1] <= val < table[i].
  49.  *
  50.  * Using linear search for simple coding.
  51.  */
  52. static
  53. int quan (int val, short *table, int size)
  54. {
  55. int i;
  56. for (i = 0; i < size; i++)
  57. if (val < *table++)
  58. break;
  59. return (i);
  60. }
  61. /*
  62.  * fmult()
  63.  *
  64.  * returns the integer product of the 14-bit integer "an" and
  65.  * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
  66.  */
  67. static
  68. int fmult (int an, int srn)
  69. {
  70. short anmag, anexp, anmant;
  71. short wanexp, wanmant;
  72. short retval;
  73. anmag = (an > 0) ? an : ((-an) & 0x1FFF);
  74. anexp = quan(anmag, power2, 15) - 6;
  75. anmant = (anmag == 0) ? 32 :
  76.     (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
  77. wanexp = anexp + ((srn >> 6) & 0xF) - 13;
  78. /*
  79. ** The original was :
  80. ** wanmant = (anmant * (srn & 0x3F) + 0x30) >> 4 ;
  81. ** but could see no valid reason for the + 0x30.
  82. ** Removed it and it improved the SNR of the codec.
  83. */
  84. wanmant = (anmant * (srn & 0x3F)) >> 4 ;
  85. retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
  86.     (wanmant >> -wanexp);
  87. return (((an ^ srn) < 0) ? -retval : retval);
  88. }
  89. static G72x_STATE * g72x_state_new (void)
  90. { return calloc (1, sizeof (G72x_STATE)) ;
  91. }
  92. /*
  93.  * private_init_state()
  94.  *
  95.  * This routine initializes and/or resets the G72x_PRIVATE structure
  96.  * pointed to by 'state_ptr'.
  97.  * All the initial state values are specified in the CCITT G.721 document.
  98.  */
  99. void private_init_state (G72x_STATE *state_ptr)
  100. {
  101. int cnta;
  102. state_ptr->yl = 34816;
  103. state_ptr->yu = 544;
  104. state_ptr->dms = 0;
  105. state_ptr->dml = 0;
  106. state_ptr->ap = 0;
  107. for (cnta = 0; cnta < 2; cnta++) {
  108. state_ptr->a[cnta] = 0;
  109. state_ptr->pk[cnta] = 0;
  110. state_ptr->sr[cnta] = 32;
  111. }
  112. for (cnta = 0; cnta < 6; cnta++) {
  113. state_ptr->b[cnta] = 0;
  114. state_ptr->dq[cnta] = 32;
  115. }
  116. state_ptr->td = 0;
  117. } /* private_init_state */
  118. struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock)
  119. { G72x_STATE *pstate ;
  120. if ((pstate = g72x_state_new ()) == NULL)
  121. return NULL ;
  122. private_init_state (pstate) ;
  123. pstate->encoder = NULL ;
  124. switch (codec)
  125. { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
  126. pstate->decoder = g723_16_decoder ;
  127. *blocksize = G723_16_BYTES_PER_BLOCK ;
  128. *samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
  129. pstate->codec_bits = 2 ;
  130. pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
  131. pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
  132. break ;
  133. case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
  134. pstate->decoder = g723_24_decoder ;
  135. *blocksize = G723_24_BYTES_PER_BLOCK ;
  136. *samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
  137. pstate->codec_bits = 3 ;
  138. pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
  139. pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
  140. break ;
  141. case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
  142. pstate->decoder = g721_decoder ;
  143. *blocksize = G721_32_BYTES_PER_BLOCK ;
  144. *samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
  145. pstate->codec_bits = 4 ;
  146. pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
  147. pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
  148. break ;
  149. case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
  150. pstate->decoder = g723_40_decoder ;
  151. *blocksize = G721_40_BYTES_PER_BLOCK ;
  152. *samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
  153. pstate->codec_bits = 5 ;
  154. pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
  155. pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
  156. break ;
  157. default :
  158. free (pstate) ;
  159. return NULL ;
  160. } ;
  161. return pstate ;
  162. } /* g72x_reader_init */
  163. struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock)
  164. { G72x_STATE *pstate ;
  165. if ((pstate = g72x_state_new ()) == NULL)
  166. return NULL ;
  167. private_init_state (pstate) ;
  168. pstate->decoder = NULL ;
  169. switch (codec)
  170. { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
  171. pstate->encoder = g723_16_encoder ;
  172. *blocksize = G723_16_BYTES_PER_BLOCK ;
  173. *samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
  174. pstate->codec_bits = 2 ;
  175. pstate->blocksize = G723_16_BYTES_PER_BLOCK ;
  176. pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
  177. break ;
  178. case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */
  179. pstate->encoder = g723_24_encoder ;
  180. *blocksize = G723_24_BYTES_PER_BLOCK ;
  181. *samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
  182. pstate->codec_bits = 3 ;
  183. pstate->blocksize = G723_24_BYTES_PER_BLOCK ;
  184. pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
  185. break ;
  186. case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
  187. pstate->encoder = g721_encoder ;
  188. *blocksize = G721_32_BYTES_PER_BLOCK ;
  189. *samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
  190. pstate->codec_bits = 4 ;
  191. pstate->blocksize = G721_32_BYTES_PER_BLOCK ;
  192. pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
  193. break ;
  194. case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
  195. pstate->encoder = g723_40_encoder ;
  196. *blocksize = G721_40_BYTES_PER_BLOCK ;
  197. *samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
  198. pstate->codec_bits = 5 ;
  199. pstate->blocksize = G721_40_BYTES_PER_BLOCK ;
  200. pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
  201. break ;
  202. default :
  203. free (pstate) ;
  204. return NULL ;
  205. } ;
  206. return pstate ;
  207. } /* g72x_writer_init */
  208. int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples)
  209. { int k, count ;
  210. count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ;
  211. for (k = 0 ; k < count ; k++)
  212. samples [k] = pstate->decoder (samples [k], pstate) ;
  213. return 0 ;
  214. } /* g72x_decode_block */
  215. int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block)
  216. { int k, count ;
  217. for (k = 0 ; k < pstate->samplesperblock ; k++)
  218. samples [k] = pstate->encoder (samples [k], pstate) ;
  219. count = pack_bytes (pstate->codec_bits, samples, block) ;
  220. return count ;
  221. } /* g72x_encode_block */
  222. /*
  223.  * predictor_zero()
  224.  *
  225.  * computes the estimated signal from 6-zero predictor.
  226.  *
  227.  */
  228. int  predictor_zero (G72x_STATE *state_ptr)
  229. {
  230. int i;
  231. int sezi;
  232. sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
  233. for (i = 1; i < 6; i++) /* ACCUM */
  234. sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
  235. return (sezi);
  236. }
  237. /*
  238.  * predictor_pole()
  239.  *
  240.  * computes the estimated signal from 2-pole predictor.
  241.  *
  242.  */
  243. int  predictor_pole(G72x_STATE *state_ptr)
  244. {
  245. return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
  246.     fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
  247. }
  248. /*
  249.  * step_size()
  250.  *
  251.  * computes the quantization step size of the adaptive quantizer.
  252.  *
  253.  */
  254. int  step_size (G72x_STATE *state_ptr)
  255. {
  256. int y;
  257. int dif;
  258. int al;
  259. if (state_ptr->ap >= 256)
  260. return (state_ptr->yu);
  261. else {
  262. y = state_ptr->yl >> 6;
  263. dif = state_ptr->yu - y;
  264. al = state_ptr->ap >> 2;
  265. if (dif > 0)
  266. y += (dif * al) >> 6;
  267. else if (dif < 0)
  268. y += (dif * al + 0x3F) >> 6;
  269. return (y);
  270. }
  271. }
  272. /*
  273.  * quantize()
  274.  *
  275.  * Given a raw sample, 'd', of the difference signal and a
  276.  * quantization step size scale factor, 'y', this routine returns the
  277.  * ADPCM codeword to which that sample gets quantized.  The step
  278.  * size scale factor division operation is done in the log base 2 domain
  279.  * as a subtraction.
  280.  */
  281. int quantize(
  282. int d, /* Raw difference signal sample */
  283. int y, /* Step size multiplier */
  284. short *table, /* quantization table */
  285. int size) /* table size of short integers */
  286. {
  287. short dqm; /* Magnitude of 'd' */
  288. short expon; /* Integer part of base 2 log of 'd' */
  289. short mant; /* Fractional part of base 2 log */
  290. short dl; /* Log of magnitude of 'd' */
  291. short dln; /* Step size scale factor normalized log */
  292. int i;
  293. /*
  294.  * LOG
  295.  *
  296.  * Compute base 2 log of 'd', and store in 'dl'.
  297.  */
  298. dqm = abs(d);
  299. expon = quan(dqm >> 1, power2, 15);
  300. mant = ((dqm << 7) >> expon) & 0x7F; /* Fractional portion. */
  301. dl = (expon << 7) + mant;
  302. /*
  303.  * SUBTB
  304.  *
  305.  * "Divide" by step size multiplier.
  306.  */
  307. dln = dl - (y >> 2);
  308. /*
  309.  * QUAN
  310.  *
  311.  * Obtain codword i for 'd'.
  312.  */
  313. i = quan(dln, table, size);
  314. if (d < 0) /* take 1's complement of i */
  315. return ((size << 1) + 1 - i);
  316. else if (i == 0) /* take 1's complement of 0 */
  317. return ((size << 1) + 1); /* new in 1988 */
  318. else
  319. return (i);
  320. }
  321. /*
  322.  * reconstruct()
  323.  *
  324.  * Returns reconstructed difference signal 'dq' obtained from
  325.  * codeword 'i' and quantization step size scale factor 'y'.
  326.  * Multiplication is performed in log base 2 domain as addition.
  327.  */
  328. int
  329. reconstruct(
  330. int sign, /* 0 for non-negative value */
  331. int dqln, /* G.72x codeword */
  332. int y) /* Step size multiplier */
  333. {
  334. short dql; /* Log of 'dq' magnitude */
  335. short dex; /* Integer part of log */
  336. short dqt;
  337. short dq; /* Reconstructed difference signal sample */
  338. dql = dqln + (y >> 2); /* ADDA */
  339. if (dql < 0) {
  340. return ((sign) ? -0x8000 : 0);
  341. } else { /* ANTILOG */
  342. dex = (dql >> 7) & 15;
  343. dqt = 128 + (dql & 127);
  344. dq = (dqt << 7) >> (14 - dex);
  345. return ((sign) ? (dq - 0x8000) : dq);
  346. }
  347. }
  348. /*
  349.  * update()
  350.  *
  351.  * updates the state variables for each output code
  352.  */
  353. void
  354. update(
  355. int code_size, /* distinguish 723_40 with others */
  356. int y, /* quantizer step size */
  357. int wi, /* scale factor multiplier */
  358. int fi, /* for long/short term energies */
  359. int dq, /* quantized prediction difference */
  360. int sr, /* reconstructed signal */
  361. int dqsez, /* difference from 2-pole predictor */
  362. G72x_STATE *state_ptr) /* coder state pointer */
  363. {
  364. int cnt;
  365. short mag, expon; /* Adaptive predictor, FLOAT A */
  366. short a2p = 0; /* LIMC */
  367. short a1ul; /* UPA1 */
  368. short pks1; /* UPA2 */
  369. short fa1;
  370. char tr; /* tone/transition detector */
  371. short ylint, thr2, dqthr;
  372. short   ylfrac, thr1;
  373. short pk0;
  374. pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */
  375. mag = dq & 0x7FFF; /* prediction difference magnitude */
  376. /* TRANS */
  377. ylint = state_ptr->yl >> 15; /* exponent part of yl */
  378. ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
  379. thr1 = (32 + ylfrac) << ylint; /* threshold */
  380. thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */
  381. dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */
  382. if (state_ptr->td == 0) /* signal supposed voice */
  383. tr = 0;
  384. else if (mag <= dqthr) /* supposed data, but small mag */
  385. tr = 0; /* treated as voice */
  386. else /* signal is data (modem) */
  387. tr = 1;
  388. /*
  389.  * Quantizer scale factor adaptation.
  390.  */
  391. /* FUNCTW & FILTD & DELAY */
  392. /* update non-steady state step size multiplier */
  393. state_ptr->yu = y + ((wi - y) >> 5);
  394. /* LIMB */
  395. if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */
  396. state_ptr->yu = 544;
  397. else if (state_ptr->yu > 5120)
  398. state_ptr->yu = 5120;
  399. /* FILTE & DELAY */
  400. /* update steady state step size multiplier */
  401. state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
  402. /*
  403.  * Adaptive predictor coefficients.
  404.  */
  405. if (tr == 1) { /* reset a's and b's for modem signal */
  406. state_ptr->a[0] = 0;
  407. state_ptr->a[1] = 0;
  408. state_ptr->b[0] = 0;
  409. state_ptr->b[1] = 0;
  410. state_ptr->b[2] = 0;
  411. state_ptr->b[3] = 0;
  412. state_ptr->b[4] = 0;
  413. state_ptr->b[5] = 0;
  414. } else { /* update a's and b's */
  415. pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */
  416. /* update predictor pole a[1] */
  417. a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
  418. if (dqsez != 0) {
  419. fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
  420. if (fa1 < -8191) /* a2p = function of fa1 */
  421. a2p -= 0x100;
  422. else if (fa1 > 8191)
  423. a2p += 0xFF;
  424. else
  425. a2p += fa1 >> 5;
  426. if (pk0 ^ state_ptr->pk[1])
  427. { /* LIMC */
  428. if (a2p <= -12160)
  429. a2p = -12288;
  430. else if (a2p >= 12416)
  431. a2p = 12288;
  432. else
  433. a2p -= 0x80;
  434. }
  435. else if (a2p <= -12416)
  436. a2p = -12288;
  437. else if (a2p >= 12160)
  438. a2p = 12288;
  439. else
  440. a2p += 0x80;
  441. }
  442. /* TRIGB & DELAY */
  443. state_ptr->a[1] = a2p;
  444. /* UPA1 */
  445. /* update predictor pole a[0] */
  446. state_ptr->a[0] -= state_ptr->a[0] >> 8;
  447. if (dqsez != 0)
  448. { if (pks1 == 0)
  449. state_ptr->a[0] += 192;
  450. else
  451. state_ptr->a[0] -= 192;
  452. } ;
  453. /* LIMD */
  454. a1ul = 15360 - a2p;
  455. if (state_ptr->a[0] < -a1ul)
  456. state_ptr->a[0] = -a1ul;
  457. else if (state_ptr->a[0] > a1ul)
  458. state_ptr->a[0] = a1ul;
  459. /* UPB : update predictor zeros b[6] */
  460. for (cnt = 0; cnt < 6; cnt++) {
  461. if (code_size == 5) /* for 40Kbps G.723 */
  462. state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
  463. else /* for G.721 and 24Kbps G.723 */
  464. state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
  465. if (dq & 0x7FFF) { /* XOR */
  466. if ((dq ^ state_ptr->dq[cnt]) >= 0)
  467. state_ptr->b[cnt] += 128;
  468. else
  469. state_ptr->b[cnt] -= 128;
  470. }
  471. }
  472. }
  473. for (cnt = 5; cnt > 0; cnt--)
  474. state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
  475. /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
  476. if (mag == 0) {
  477. state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
  478. } else {
  479. expon = quan(mag, power2, 15);
  480. state_ptr->dq[0] = (dq >= 0) ?
  481.     (expon << 6) + ((mag << 6) >> expon) :
  482.     (expon << 6) + ((mag << 6) >> expon) - 0x400;
  483. }
  484. state_ptr->sr[1] = state_ptr->sr[0];
  485. /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
  486. if (sr == 0) {
  487. state_ptr->sr[0] = 0x20;
  488. } else if (sr > 0) {
  489. expon = quan(sr, power2, 15);
  490. state_ptr->sr[0] = (expon << 6) + ((sr << 6) >> expon);
  491. } else if (sr > -32768) {
  492. mag = -sr;
  493. expon = quan(mag, power2, 15);
  494. state_ptr->sr[0] =  (expon << 6) + ((mag << 6) >> expon) - 0x400;
  495. } else
  496. state_ptr->sr[0] = (short) 0xFC20;
  497. /* DELAY A */
  498. state_ptr->pk[1] = state_ptr->pk[0];
  499. state_ptr->pk[0] = pk0;
  500. /* TONE */
  501. if (tr == 1) /* this sample has been treated as data */
  502. state_ptr->td = 0; /* next one will be treated as voice */
  503. else if (a2p < -11776) /* small sample-to-sample correlation */
  504. state_ptr->td = 1; /* signal may be data */
  505. else /* signal is voice */
  506. state_ptr->td = 0;
  507. /*
  508.  * Adaptation speed control.
  509.  */
  510. state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */
  511. state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */
  512. if (tr == 1)
  513. state_ptr->ap = 256;
  514. else if (y < 1536) /* SUBTC */
  515. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  516. else if (state_ptr->td == 1)
  517. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  518. else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
  519.     (state_ptr->dml >> 3))
  520. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  521. else
  522. state_ptr->ap += (-state_ptr->ap) >> 4;
  523. return ;
  524. } /* update */
  525. /*------------------------------------------------------------------------------
  526. */
  527. static int
  528. unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples)
  529. { unsigned int    in_buffer = 0 ;
  530. unsigned char in_byte ;
  531. int k, in_bits = 0, bindex = 0 ;
  532. for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++)
  533. { if (in_bits < bits)
  534. { in_byte = block [bindex++] ;
  535. in_buffer |= (in_byte << in_bits);
  536. in_bits += 8;
  537. }
  538. samples [k] = in_buffer & ((1 << bits) - 1);
  539. in_buffer >>= bits;
  540. in_bits -= bits;
  541. } ;
  542. return k ;
  543. } /* unpack_bytes */
  544. static int
  545. pack_bytes (int bits, const short * samples, unsigned char * block)
  546. {
  547. unsigned int out_buffer = 0 ;
  548. int k, bindex = 0, out_bits = 0 ;
  549. unsigned char out_byte ;
  550. for (k = 0 ; k < G72x_BLOCK_SIZE ; k++)
  551. { out_buffer |= (samples [k] << out_bits) ;
  552. out_bits += bits ;
  553. if (out_bits >= 8)
  554. { out_byte = out_buffer & 0xFF ;
  555. out_bits -= 8 ;
  556. out_buffer >>= 8 ;
  557. block [bindex++] = out_byte ;
  558. }
  559. } ;
  560. return bindex ;
  561. } /* pack_bytes */