Sat Apr 26 2014 22:02:44

Asterisk developer's documentation


codec_g726.c File Reference

codec_g726.c - translate between signed linear and ITU G.726-32kbps (both RFC3551 and AAL2 codeword packing) More...

#include "asterisk.h"
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/translate.h"
#include "asterisk/utils.h"
#include "log2comp.h"
#include "asterisk/slin.h"
#include "ex_g726.h"
Include dependency graph for codec_g726.c:

Go to the source code of this file.

Data Structures

struct  g726_coder_pvt
struct  g726_state

Defines

#define BUF_SHIFT   5
#define BUFFER_SAMPLES   8096 /* size for the translation buffers */
#define WANT_ASM

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int fmult (int an, int srn)
static int g726_decode (int i, struct g726_state *state_ptr)
static int g726_encode (int sl, struct g726_state *state_ptr)
static void g726_init_state (struct g726_state *state_ptr)
static int g726aal2tolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 decode packed 4-bit G726 values (AAL2 packing) and store in buffer.
static int g726tolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 decode packed 4-bit G726 values (RFC3551 packing) and store in buffer.
static int lintog726_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 compress and store data (4-bit G726 samples, RFC3551 packing) in outbuf
static int lintog726_new (struct ast_trans_pvt *pvt)
 init a new instance of g726_coder_pvt.
static int lintog726aal2_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 compress and store data (4-bit G726 samples, AAL2 packing) in outbuf
static int load_module (void)
static int predictor_pole (struct g726_state *state_ptr)
static int predictor_zero (struct g726_state *state_ptr)
static int quan (int val, int *table, int size)
static int quantize (int d, int y, int *table, int size)
static int reconstruct (int sign, int dqln, int y)
static int reload (void)
static int step_size (struct g726_state *state_ptr)
static int unload_module (void)
static void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "ITU G.726-32kbps G726 Transcoder" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, }
static int _dqlntab [16]
static int _fitab [16]
static int _witab [16]
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_translator g726aal2tolin
static struct ast_translator g726tolin
static struct ast_translator lintog726
static struct ast_translator lintog726aal2
static int qtab_721 [7] = {-124, 80, 178, 246, 300, 349, 400}

Detailed Description

codec_g726.c - translate between signed linear and ITU G.726-32kbps (both RFC3551 and AAL2 codeword packing)

Definition in file codec_g726.c.


Define Documentation

#define BUF_SHIFT   5

Definition at line 62 of file codec_g726.c.

#define BUFFER_SAMPLES   8096 /* size for the translation buffers */

Definition at line 61 of file codec_g726.c.

#define WANT_ASM

Definition at line 45 of file codec_g726.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 878 of file codec_g726.c.

static void __unreg_module ( void  ) [static]

Definition at line 878 of file codec_g726.c.

static int fmult ( int  an,
int  srn 
) [static]

Definition at line 207 of file codec_g726.c.

References ilog2().

Referenced by predictor_pole(), and predictor_zero().

{
   int      anmag, anexp, anmant;
   int      wanexp, wanmant;
   int      retval;

   anmag = (an > 0) ? an : ((-an) & 0x1FFF);
   anexp = ilog2(anmag) - 5;
   anmant = (anmag == 0) ? 32 :
       (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
   wanexp = anexp + ((srn >> 6) & 0xF) - 13;

   wanmant = (anmant * (srn & 077) + 0x30) >> 4;
   retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
       (wanmant >> -wanexp);

   return (((an ^ srn) < 0) ? -retval : retval);
}
static int g726_decode ( int  i,
struct g726_state state_ptr 
) [static]

Definition at line 590 of file codec_g726.c.

References predictor_pole(), predictor_zero(), reconstruct(), step_size(), and update().

Referenced by g726aal2tolin_framein(), and g726tolin_framein().

{
   int      sezi, sez, se; /* ACCUM */
   int      y;       /* MIX */
   int      sr;         /* ADDB */
   int      dq;
   int      dqsez;

   i &= 0x0f;        /* mask to get proper bits */
#ifdef NOT_BLI
   sezi = predictor_zero(state_ptr);
   sez = sezi;
   se = sezi + predictor_pole(state_ptr); /* estimated signal */
#else
   sezi = predictor_zero(state_ptr);
   sez = sezi >> 1;
   se = (sezi + predictor_pole(state_ptr)) >> 1;   /* estimated signal */
#endif

   y = step_size(state_ptr);  /* dynamic quantizer step size */

   dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized diff. */

#ifdef NOT_BLI
   sr = se + dq;           /* reconst. signal */
   dqsez = dq + sez;       /* pole prediction diff. */
#else
   sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;   /* reconst. signal */
   dqsez = sr - se + sez;     /* pole prediction diff. */
#endif

   update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);

#ifdef NOT_BLI
   return (sr >> 10);   /* sr was 26-bit dynamic range */
#else
   return (sr << 2); /* sr was 14-bit dynamic range */
#endif
}
static int g726_encode ( int  sl,
struct g726_state state_ptr 
) [static]

Definition at line 636 of file codec_g726.c.

References predictor_pole(), predictor_zero(), quantize(), reconstruct(), step_size(), and update().

Referenced by lintog726_framein(), and lintog726aal2_framein().

{
   int      sezi, se, sez;    /* ACCUM */
   int      d;       /* SUBTA */
   int      sr;         /* ADDB */
   int      y;       /* MIX */
   int      dqsez;         /* ADDC */
   int      dq, i;

#ifdef NOT_BLI
   sl <<= 10;        /* 26-bit dynamic range */

   sezi = predictor_zero(state_ptr);
   sez = sezi;
   se = sezi + predictor_pole(state_ptr); /* estimated signal */
#else
   sl >>= 2;         /* 14-bit dynamic range */

   sezi = predictor_zero(state_ptr);
   sez = sezi >> 1;
   se = (sezi + predictor_pole(state_ptr)) >> 1;   /* estimated signal */
#endif

   d = sl - se;            /* estimation difference */

   /* quantize the prediction difference */
   y = step_size(state_ptr);     /* quantizer step size */
#ifdef NOT_BLI
   d /= 0x1000;
#endif
   i = quantize(d, y, qtab_721, 7); /* i = G726 code */

   dq = reconstruct(i & 8, _dqlntab[i], y);  /* quantized est diff */

#ifdef NOT_BLI
   sr = se + dq;           /* reconst. signal */
   dqsez = dq + sez;       /* pole prediction diff. */
#else
   sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;   /* reconst. signal */
   dqsez = sr - se + sez;        /* pole prediction diff. */
#endif

   update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);

   return i;
}
static void g726_init_state ( struct g726_state state_ptr) [static]

Definition at line 125 of file codec_g726.c.

References g726_state::a, g726_state::ap, g726_state::b, g726_state::dml, g726_state::dms, g726_state::dq, g726_state::pk, g726_state::sr, g726_state::td, g726_state::yl, and g726_state::yu.

Referenced by lintog726_new().

{
   int      cnta;

   state_ptr->yl = 34816;
   state_ptr->yu = 544;
   state_ptr->dms = 0;
   state_ptr->dml = 0;
   state_ptr->ap = 0;
   for (cnta = 0; cnta < 2; cnta++) {
      state_ptr->a[cnta] = 0;
      state_ptr->pk[cnta] = 0;
#ifdef NOT_BLI
      state_ptr->sr[cnta] = 1;
#else
      state_ptr->sr[cnta] = 32;
#endif
   }
   for (cnta = 0; cnta < 6; cnta++) {
      state_ptr->b[cnta] = 0;
#ifdef NOT_BLI
      state_ptr->dq[cnta] = 1;
#else
      state_ptr->dq[cnta] = 32;
#endif
   }
   state_ptr->td = 0;
}
static int g726aal2tolin_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

decode packed 4-bit G726 values (AAL2 packing) and store in buffer.

Definition at line 705 of file codec_g726.c.

References ast_frame::data, ast_frame::datalen, ast_trans_pvt::datalen, g726_coder_pvt::g726, g726_decode(), ast_trans_pvt::i16, ast_trans_pvt::outbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, and ast_trans_pvt::samples.

{
   struct g726_coder_pvt *tmp = pvt->pvt;
   unsigned char *src = f->data.ptr;
   int16_t *dst = pvt->outbuf.i16 + pvt->samples;
   unsigned int i;

   for (i = 0; i < f->datalen; i++) {
      *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726);
      *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726);
   }

   pvt->samples += f->samples;
   pvt->datalen += 2 * f->samples; /* 2 bytes/sample */

   return 0;
}
static int g726tolin_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

decode packed 4-bit G726 values (RFC3551 packing) and store in buffer.

Definition at line 746 of file codec_g726.c.

References ast_frame::data, ast_frame::datalen, ast_trans_pvt::datalen, g726_coder_pvt::g726, g726_decode(), ast_trans_pvt::i16, ast_trans_pvt::outbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, and ast_trans_pvt::samples.

{
   struct g726_coder_pvt *tmp = pvt->pvt;
   unsigned char *src = f->data.ptr;
   int16_t *dst = pvt->outbuf.i16 + pvt->samples;
   unsigned int i;

   for (i = 0; i < f->datalen; i++) {
      *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726);
      *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726);
   }

   pvt->samples += f->samples;
   pvt->datalen += 2 * f->samples; /* 2 bytes/sample */

   return 0;
}
static int lintog726_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

compress and store data (4-bit G726 samples, RFC3551 packing) in outbuf

Definition at line 765 of file codec_g726.c.

References ast_trans_pvt::c, ast_frame::data, ast_trans_pvt::datalen, g726_coder_pvt::g726, g726_encode(), g726_coder_pvt::next_flag, ast_trans_pvt::outbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, and ast_trans_pvt::samples.

{
   struct g726_coder_pvt *tmp = pvt->pvt;
   int16_t *src = f->data.ptr;
   unsigned int i;

   for (i = 0; i < f->samples; i++) {
      unsigned char d = g726_encode(src[i], &tmp->g726); /* this sample */

      if (tmp->next_flag & 0x80) {  /* merge with leftover sample */
         pvt->outbuf.c[pvt->datalen++] = (d << 4) | (tmp->next_flag & 0xf);
         pvt->samples += 2;   /* 2 samples per byte */
         tmp->next_flag = 0;
      } else {
         tmp->next_flag = 0x80 | d;
      }
   }

   return 0;
}
static int lintog726_new ( struct ast_trans_pvt pvt) [static]

init a new instance of g726_coder_pvt.

Definition at line 695 of file codec_g726.c.

References g726_coder_pvt::g726, g726_init_state(), and ast_trans_pvt::pvt.

{
   struct g726_coder_pvt *tmp = pvt->pvt;

   g726_init_state(&tmp->g726);

   return 0;
}
static int lintog726aal2_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

compress and store data (4-bit G726 samples, AAL2 packing) in outbuf

Definition at line 724 of file codec_g726.c.

References ast_trans_pvt::c, ast_frame::data, ast_trans_pvt::datalen, g726_coder_pvt::g726, g726_encode(), g726_coder_pvt::next_flag, ast_trans_pvt::outbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, and ast_trans_pvt::samples.

{
   struct g726_coder_pvt *tmp = pvt->pvt;
   int16_t *src = f->data.ptr;
   unsigned int i;

   for (i = 0; i < f->samples; i++) {
      unsigned char d = g726_encode(src[i], &tmp->g726); /* this sample */

      if (tmp->next_flag & 0x80) {  /* merge with leftover sample */
         pvt->outbuf.c[pvt->datalen++] = ((tmp->next_flag & 0xf)<< 4) | d;
         pvt->samples += 2;   /* 2 samples per byte */
         tmp->next_flag = 0;
      } else {
         tmp->next_flag = 0x80 | d;
      }
   }

   return 0;
}
static int predictor_pole ( struct g726_state state_ptr) [static]

Definition at line 235 of file codec_g726.c.

References g726_state::a, fmult(), and g726_state::sr.

Referenced by g726_decode(), and g726_encode().

{
   return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
         fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
}
static int predictor_zero ( struct g726_state state_ptr) [static]

Definition at line 226 of file codec_g726.c.

References g726_state::b, g726_state::dq, and fmult().

Referenced by g726_decode(), and g726_encode().

{
   int      i;
   int      sezi;
   for (sezi = 0, i = 0; i < 6; i++)         /* ACCUM */
      sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
   return sezi;
}
static int quan ( int  val,
int *  table,
int  size 
) [static]

Definition at line 162 of file codec_g726.c.

References table.

Referenced by quantize().

{
   int      i;

   for (i = 0; i < size && val >= *table; ++i, ++table)
      ;
   return i;
}
static int quantize ( int  d,
int  y,
int *  table,
int  size 
) [static]

Definition at line 278 of file codec_g726.c.

References ilog2(), and quan().

Referenced by g726_encode().

{
   int      dqm;  /* Magnitude of 'd' */
   int      exp;  /* Integer part of base 2 log of 'd' */
   int      mant; /* Fractional part of base 2 log */
   int      dl;      /* Log of magnitude of 'd' */
   int      dln;  /* Step size scale factor normalized log */
   int      i;

   /*
    * LOG
    *
    * Compute base 2 log of 'd', and store in 'dl'.
    */
   dqm = abs(d);
   exp = ilog2(dqm);
   if (exp < 0) {
      exp = 0;
   }
   mant = ((dqm << 7) >> exp) & 0x7F;  /* Fractional portion. */
   dl = (exp << 7) | mant;

   /*
    * SUBTB
    *
    * "Divide" by step size multiplier.
    */
   dln = dl - (y >> 2);

   /*
    * QUAN
    *
    * Obtain codword i for 'd'.
    */
   i = quan(dln, table, size);
   if (d < 0) {         /* take 1's complement of i */
      return ((size << 1) + 1 - i);
   } else if (i == 0) {    /* take 1's complement of 0 */
      return ((size << 1) + 1); /* new in 1988 */
   } else {
      return i;
   }
}
static int reconstruct ( int  sign,
int  dqln,
int  y 
) [static]

Definition at line 333 of file codec_g726.c.

Referenced by bridge_p2p_rtp_write(), g726_decode(), and g726_encode().

{
   int      dql;  /* Log of 'dq' magnitude */
   int      dex;  /* Integer part of log */
   int      dqt;
   int      dq;   /* Reconstructed difference signal sample */

   dql = dqln + (y >> 2);  /* ADDA */

   if (dql < 0) {
#ifdef NOT_BLI
      return (sign) ? -1 : 1;
#else
      return (sign) ? -0x8000 : 0;
#endif
   } else {    /* ANTILOG */
      dex = (dql >> 7) & 15;
      dqt = 128 + (dql & 127);
#ifdef NOT_BLI
      dq = ((dqt << 19) >> (14 - dex));
      return (sign) ? -dq : dq;
#else
      dq = (dqt << 7) >> (14 - dex);
      return (sign) ? (dq - 0x8000) : dq;
#endif
   }
}
static int reload ( void  ) [static]

Definition at line 826 of file codec_g726.c.

References AST_MODULE_LOAD_SUCCESS.

static int step_size ( struct g726_state state_ptr) [static]

Definition at line 249 of file codec_g726.c.

References g726_state::ap, g726_state::yl, and g726_state::yu.

Referenced by g726_decode(), g726_encode(), and smb_pitch_shift().

{
   int y, dif, al;

   if (state_ptr->ap >= 256) {
      return state_ptr->yu;
   }

   y = state_ptr->yl >> 6;
   dif = state_ptr->yu - y;
   al = state_ptr->ap >> 2;

   if (dif > 0) {
      y += (dif * al) >> 6;
   } else if (dif < 0) {
      y += (dif * al + 0x3F) >> 6;
   }
   return y;
}
static int unload_module ( void  ) [static]

Definition at line 831 of file codec_g726.c.

References ast_unregister_translator().

Referenced by load_module().

static void update ( int  code_size,
int  y,
int  wi,
int  fi,
int  dq,
int  sr,
int  dqsez,
struct g726_state state_ptr 
) [static]

Definition at line 369 of file codec_g726.c.

References g726_state::a, g726_state::ap, g726_state::b, g726_state::dml, g726_state::dms, g726_state::dq, ilog2(), g726_state::pk, g726_state::sr, g726_state::td, g726_state::yl, and g726_state::yu.

Referenced by config_device(), config_line(), connectedline_write(), g726_decode(), g726_encode(), load_pktccops_config(), and redirecting_write().

{
   int      cnt;
   int      mag;     /* Adaptive predictor, FLOAT A */
#ifndef NOT_BLI
   int      exp;
#endif
   int      a2p=0;      /* LIMC */
   int      a1ul;    /* UPA1 */
   int      pks1;    /* UPA2 */
   int      fa1;
   int      tr;         /* tone/transition detector */
   int      ylint, thr2, dqthr;
   int      ylfrac, thr1;
   int      pk0;

   pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */

#ifdef NOT_BLI
   mag = abs(dq / 0x1000); /* prediction difference magnitude */
#else
   mag = dq & 0x7FFF;      /* prediction difference magnitude */
#endif
   /* TRANS */
   ylint = state_ptr->yl >> 15;  /* exponent part of yl */
   ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
   thr1 = (32 + ylfrac) << ylint;      /* threshold */
   thr2 = (ylint > 9) ? 31 << 10 : thr1;  /* limit thr2 to 31 << 10 */
   dqthr = (thr2 + (thr2 >> 1)) >> 1;  /* dqthr = 0.75 * thr2 */
   if (state_ptr->td == 0) {     /* signal supposed voice */
      tr = 0;
   } else if (mag <= dqthr) {    /* supposed data, but small mag */
      tr = 0;        /* treated as voice */
   } else {          /* signal is data (modem) */
      tr = 1;
   }
   /*
    * Quantizer scale factor adaptation.
    */

   /* FUNCTW & FILTD & DELAY */
   /* update non-steady state step size multiplier */
   state_ptr->yu = y + ((wi - y) >> 5);

   /* LIMB */
   if (state_ptr->yu < 544) { /* 544 <= yu <= 5120 */
      state_ptr->yu = 544;
   } else if (state_ptr->yu > 5120) {
      state_ptr->yu = 5120;
   }

   /* FILTE & DELAY */
   /* update steady state step size multiplier */
   state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);

   /*
    * Adaptive predictor coefficients.
    */
   if (tr == 1) {       /* reset a's and b's for modem signal */
      state_ptr->a[0] = 0;
      state_ptr->a[1] = 0;
      state_ptr->b[0] = 0;
      state_ptr->b[1] = 0;
      state_ptr->b[2] = 0;
      state_ptr->b[3] = 0;
      state_ptr->b[4] = 0;
      state_ptr->b[5] = 0;
   } else {       /* update a's and b's */
      pks1 = pk0 ^ state_ptr->pk[0];      /* UPA2 */

      /* update predictor pole a[1] */
      a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
      if (dqsez != 0) {
         fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
         if (fa1 < -8191) {   /* a2p = function of fa1 */
            a2p -= 0x100;
         } else if (fa1 > 8191) {
            a2p += 0xFF;
         } else {
            a2p += fa1 >> 5;
         }

         if (pk0 ^ state_ptr->pk[1]) {
            /* LIMC */
            if (a2p <= -12160) {
               a2p = -12288;
            } else if (a2p >= 12416) {
               a2p = 12288;
            } else {
               a2p -= 0x80;
            }
         } else if (a2p <= -12416) {
            a2p = -12288;
         } else if (a2p >= 12160) {
            a2p = 12288;
         } else {
            a2p += 0x80;
         }
      }

      /* TRIGB & DELAY */
      state_ptr->a[1] = a2p;

      /* UPA1 */
      /* update predictor pole a[0] */
      state_ptr->a[0] -= state_ptr->a[0] >> 8;
      if (dqsez != 0) {
         if (pks1 == 0)
            state_ptr->a[0] += 192;
         else
            state_ptr->a[0] -= 192;
      }
      /* LIMD */
      a1ul = 15360 - a2p;
      if (state_ptr->a[0] < -a1ul) {
         state_ptr->a[0] = -a1ul;
      } else if (state_ptr->a[0] > a1ul) {
         state_ptr->a[0] = a1ul;
      }

      /* UPB : update predictor zeros b[6] */
      for (cnt = 0; cnt < 6; cnt++) {
         if (code_size == 5) {      /* for 40Kbps G.723 */
            state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
         } else {       /* for G.721 and 24Kbps G.723 */
            state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
         }
         if (mag) {  /* XOR */
            if ((dq ^ state_ptr->dq[cnt]) >= 0) {
               state_ptr->b[cnt] += 128;
            } else {
               state_ptr->b[cnt] -= 128;
            }
         }
      }
   }

   for (cnt = 5; cnt > 0; cnt--)
      state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
#ifdef NOT_BLI
   state_ptr->dq[0] = dq;
#else
   /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
   if (mag == 0) {
      state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0x20 - 0x400;
   } else {
      exp = ilog2(mag) + 1;
      state_ptr->dq[0] = (dq >= 0) ?
          (exp << 6) + ((mag << 6) >> exp) :
          (exp << 6) + ((mag << 6) >> exp) - 0x400;
   }
#endif

   state_ptr->sr[1] = state_ptr->sr[0];
#ifdef NOT_BLI
   state_ptr->sr[0] = sr;
#else
   /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
   if (sr == 0) {
      state_ptr->sr[0] = 0x20;
   } else if (sr > 0) {
      exp = ilog2(sr) + 1;
      state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp);
   } else if (sr > -0x8000) {
      mag = -sr;
      exp = ilog2(mag) + 1;
      state_ptr->sr[0] =  (exp << 6) + ((mag << 6) >> exp) - 0x400;
   } else
      state_ptr->sr[0] = 0x20 - 0x400;
#endif

   /* DELAY A */
   state_ptr->pk[1] = state_ptr->pk[0];
   state_ptr->pk[0] = pk0;

   /* TONE */
   if (tr == 1) {    /* this sample has been treated as data */
      state_ptr->td = 0;   /* next one will be treated as voice */
   } else if (a2p < -11776) { /* small sample-to-sample correlation */
      state_ptr->td = 1;   /* signal may be data */
   } else {          /* signal is voice */
      state_ptr->td = 0;
   }

   /*
    * Adaptation speed control.
    */
   state_ptr->dms += (fi - state_ptr->dms) >> 5;      /* FILTA */
   state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7);   /* FILTB */

   if (tr == 1) {
      state_ptr->ap = 256;
   } else if (y < 1536) {              /* SUBTC */
      state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
   } else if (state_ptr->td == 1) {
      state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
   } else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
       (state_ptr->dml >> 3)) {
      state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
   } else {
      state_ptr->ap += (-state_ptr->ap) >> 4;
   }
}

Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "ITU G.726-32kbps G726 Transcoder" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } [static]

Definition at line 878 of file codec_g726.c.

int _dqlntab[16] [static]
Initial value:
 {-2048, 4, 135, 213, 273, 323, 373, 425,
            425, 373, 323, 273, 213, 135, 4, -2048}

Definition at line 103 of file codec_g726.c.

int _fitab[16] [static]
Initial value:
 {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
            0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0}

Definition at line 114 of file codec_g726.c.

int _witab[16] [static]
Initial value:
 {-12, 18, 41, 64, 112, 198, 355, 1122,
            1122, 355, 198, 112, 64, 41, 18, -12}

Definition at line 107 of file codec_g726.c.

Definition at line 878 of file codec_g726.c.

struct ast_translator g726aal2tolin [static]

Definition at line 806 of file codec_g726.c.

struct ast_translator g726tolin [static]

Definition at line 786 of file codec_g726.c.

struct ast_translator lintog726 [static]

Definition at line 796 of file codec_g726.c.

struct ast_translator lintog726aal2 [static]

Definition at line 816 of file codec_g726.c.

int qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400} [static]

Definition at line 98 of file codec_g726.c.