g723_24.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  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.  * g723_24.c
  28.  *
  29.  * Description:
  30.  *
  31.  * g723_24_encoder(), g723_24_decoder()
  32.  *
  33.  * These routines comprise an implementation of the CCITT G.723 24 Kbps
  34.  * ADPCM coding algorithm.  Essentially, this implementation is identical to
  35.  * the bit level description except for a few deviations which take advantage
  36.  * of workstation attributes, such as hardware 2's complement arithmetic.
  37.  *
  38.  */
  39. #include "g72x.h"
  40. /*
  41.  * Maps G.723_24 code word to reconstructed scale factor normalized log
  42.  * magnitude values.
  43.  */
  44. static short _dqlntab[8] = { -2048, 135, 273, 373, 373, 273, 135, -2048};
  45. /* Maps G.723_24 code word to log of scale factor multiplier. */
  46. static short _witab[8] = { -128, 960, 4384, 18624, 18624, 4384, 960, -128};
  47. /*
  48.  * Maps G.723_24 code words to a set of values whose long and short
  49.  * term averages are computed and then compared to give an indication
  50.  * how stationary (steady state) the signal is.
  51.  */
  52. static short _fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
  53. static short qtab_723_24[3] = {8, 218, 331};
  54. /*
  55.  * g723_24_encoder()
  56.  *
  57.  * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
  58.  * Returns -1 if invalid input coding value.
  59.  */
  60. int
  61. g723_24_encoder(
  62.     int sl,
  63.     int in_coding,
  64.     struct g72x_state *state_ptr)
  65. {
  66.     short sei, sezi, se, sez;  /* ACCUM */
  67.     short d;  /* SUBTA */
  68.     short y;  /* MIX */
  69.     short sr;  /* ADDB */
  70.     short dqsez;  /* ADDC */
  71.     short dq, i;
  72.     switch (in_coding)
  73.     { /* linearize input sample to 14-bit PCM */
  74.         case AUDIO_ENCODING_ALAW:
  75.         sl = alaw2linear(sl) >> 2;
  76.         break;
  77.         case AUDIO_ENCODING_ULAW:
  78.         sl = ulaw2linear(sl) >> 2;
  79.         break;
  80.         case AUDIO_ENCODING_LINEAR:
  81.         sl >>= 2;  /* sl of 14-bit dynamic range */
  82.         break;
  83.         default:
  84.         return ( -1);
  85.     }
  86.     sezi = predictor_zero(state_ptr);
  87.     sez = sezi >> 1;
  88.     sei = sezi + predictor_pole(state_ptr);
  89.     se = sei >> 1;  /* se = estimated signal */
  90.     d = sl - se;  /* d = estimation diff. */
  91.     /* quantize prediction difference d */
  92.     y = step_size(state_ptr);  /* quantizer step size */
  93.     i = quantize(d, y, qtab_723_24, 3);  /* i = ADPCM code */
  94.     dq = reconstruct(i & 4, _dqlntab[i], y);  /* quantized diff. */
  95.     sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;  /* reconstructed signal */
  96.     dqsez = sr + sez - se;  /* pole prediction diff. */
  97.     update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
  98.     return (i);
  99. }
  100. /*
  101.  * g723_24_decoder()
  102.  *
  103.  * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
  104.  * the resulting 16-bit linear PCM, A-law or u-law sample value.
  105.  * -1 is returned if the output coding is unknown.
  106.  */
  107. int
  108. g723_24_decoder(
  109.     int i,
  110.     int out_coding,
  111.     struct g72x_state *state_ptr)
  112. {
  113.     short sezi, sei, sez, se;  /* ACCUM */
  114.     short y;  /* MIX */
  115.     short sr;  /* ADDB */
  116.     short dq;
  117.     short dqsez;
  118.     i &= 0x07;  /* mask to get proper bits */
  119.     sezi = predictor_zero(state_ptr);
  120.     sez = sezi >> 1;
  121.     sei = sezi + predictor_pole(state_ptr);
  122.     se = sei >> 1;  /* se = estimated signal */
  123.     y = step_size(state_ptr);  /* adaptive quantizer step size */
  124.     dq = reconstruct(i & 0x04, _dqlntab[i], y);  /* unquantize pred diff */
  125.     sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq);  /* reconst. signal */
  126.     dqsez = sr - se + sez;  /* pole prediction diff. */
  127.     update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
  128.     switch (out_coding)
  129.     {
  130.         case AUDIO_ENCODING_ALAW:
  131.         return (tandem_adjust_alaw(sr, se, y, i, 4, qtab_723_24));
  132.         case AUDIO_ENCODING_ULAW:
  133.         return (tandem_adjust_ulaw(sr, se, y, i, 4, qtab_723_24));
  134.         case AUDIO_ENCODING_LINEAR:
  135.         return (sr << 2);  /* sr was of 14-bit dynamic range */
  136.         default:
  137.         return ( -1);
  138.     }
  139. }