Thu Apr 28 2011 16:57:08

Asterisk developer's documentation


codec_adpcm.c File Reference

codec_adpcm.c - translate between signed linear and Dialogic ADPCM 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 "asterisk/slin.h"
#include "ex_adpcm.h"
Include dependency graph for codec_adpcm.c:

Go to the source code of this file.

Data Structures

struct  adpcm_decoder_pvt
 Workspace for translating ADPCM signals to signed linear. More...
struct  adpcm_encoder_pvt
 Workspace for translating signed linear signals to ADPCM. More...
struct  adpcm_state

Defines

#define BUFFER_SAMPLES   8096

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int adpcm (short csig, struct adpcm_state *state)
static int adpcmtolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 decode 4-bit adpcm frame data and store in output buffer
static short decode (int encoded, struct adpcm_state *state)
static int lintoadpcm_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
 fill input buffer with 16-bit signed linear PCM values.
static struct ast_framelintoadpcm_frameout (struct ast_trans_pvt *pvt)
 convert inbuf and store into frame
static int load_module (void)
static int reload (void)
 standard module glue
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Adaptive Differential PCM Coder/Decoder" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, }
static struct ast_translator adpcmtolin
static struct ast_module_infoast_module_info = &__mod_info
static int indsft [8] = { -1, -1, -1, -1, 2, 4, 6, 8 }
static struct ast_translator lintoadpcm
static int stpsz [49]

Detailed Description

codec_adpcm.c - translate between signed linear and Dialogic ADPCM

Definition in file codec_adpcm.c.


Define Documentation

#define BUFFER_SAMPLES   8096

Definition at line 44 of file codec_adpcm.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 344 of file codec_adpcm.c.

static void __unreg_module ( void  ) [static]

Definition at line 344 of file codec_adpcm.c.

static int adpcm ( short  csig,
struct adpcm_state state 
) [inline, static]

Definition at line 162 of file codec_adpcm.c.

References decode(), adpcm_state::signal, and adpcm_state::ssindex.

Referenced by lintoadpcm_frameout().

{
   int diff;
   int step;
   int encoded;

   /* 
    * Clip csig if too large or too small
    */
   csig >>= 4;

   step = stpsz[state->ssindex];
   diff = csig - state->signal;

#ifdef NOT_BLI
   if (diff < 0) {
      encoded = (-diff << 2) / step;
      if (encoded > 7)
         encoded = 7;
      encoded |= 0x08;
   } else {
      encoded = (diff << 2) / step;
      if (encoded > 7)
         encoded = 7;
   }
#else /* BLI code */
   if (diff < 0) {
      encoded = 8;
      diff = -diff;
   } else
      encoded = 0;
   if (diff >= step) {
      encoded |= 4;
      diff -= step;
   }
   step >>= 1;
   if (diff >= step) {
      encoded |= 2;
      diff -= step;
   }
   step >>= 1;
   if (diff >= step)
      encoded |= 1;
#endif /* NOT_BLI */

   /* feedback to state */
   decode(encoded, state);
   
   return encoded;
}
static int adpcmtolin_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

decode 4-bit adpcm frame data and store in output buffer

Definition at line 227 of file codec_adpcm.c.

References ast_frame::data, ast_trans_pvt::datalen, ast_frame::datalen, decode(), ast_trans_pvt::i16, ast_trans_pvt::outbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, ast_trans_pvt::samples, and adpcm_decoder_pvt::state.

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

   while (x--) {
      *dst++ = decode((*src >> 4) & 0xf, &tmp->state);
      *dst++ = decode(*src++ & 0x0f, &tmp->state);
   }
   pvt->samples += f->samples;
   pvt->datalen += 2*f->samples;
   return 0;
}
static short decode ( int  encoded,
struct adpcm_state state 
) [inline, static]

Definition at line 89 of file codec_adpcm.c.

References adpcm_state::next_flag, adpcm_state::signal, adpcm_state::ssindex, and adpcm_state::zero_count.

Referenced by adpcm(), and adpcmtolin_framein().

{
   int diff;
   int step;
   int sign;

   step = stpsz[state->ssindex];

   sign = encoded & 0x08;
   encoded &= 0x07;
#ifdef NOT_BLI
   diff = (((encoded << 1) + 1) * step) >> 3;
#else /* BLI code */
   diff = step >> 3;
   if (encoded & 4)
      diff += step;
   if (encoded & 2)
      diff += step >> 1;
   if (encoded & 1)
      diff += step >> 2;
   if ((encoded >> 1) & step & 0x1)
      diff++;
#endif
   if (sign)
      diff = -diff;

   if (state->next_flag & 0x1)
      state->signal -= 8;
   else if (state->next_flag & 0x2)
      state->signal += 8;

   state->signal += diff;

   if (state->signal > 2047)
      state->signal = 2047;
   else if (state->signal < -2047)
      state->signal = -2047;

   state->next_flag = 0;

#ifdef AUTO_RETURN
   if (encoded)
      state->zero_count = 0;
   else if (++(state->zero_count) == 24) {
      state->zero_count = 0;
      if (state->signal > 0)
         state->next_flag = 0x1;
      else if (state->signal < 0)
         state->next_flag = 0x2;
   }
#endif

   state->ssindex += indsft[encoded];
   if (state->ssindex < 0)
      state->ssindex = 0;
   else if (state->ssindex > 48)
      state->ssindex = 48;

   return state->signal << 4;
}
static int lintoadpcm_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

fill input buffer with 16-bit signed linear PCM values.

Definition at line 244 of file codec_adpcm.c.

References ast_frame::data, ast_frame::datalen, adpcm_encoder_pvt::inbuf, ast_frame::ptr, ast_trans_pvt::pvt, ast_frame::samples, and ast_trans_pvt::samples.

{
   struct adpcm_encoder_pvt *tmp = pvt->pvt;

   memcpy(&tmp->inbuf[pvt->samples], f->data.ptr, f->datalen);
   pvt->samples += f->samples;
   return 0;
}
static struct ast_frame* lintoadpcm_frameout ( struct ast_trans_pvt pvt) [static, read]

convert inbuf and store into frame

Definition at line 254 of file codec_adpcm.c.

References adpcm(), ast_trans_frameout(), ast_trans_pvt::c, f, adpcm_encoder_pvt::inbuf, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, ast_trans_pvt::samples, ast_frame::samples, and adpcm_encoder_pvt::state.

{
   struct adpcm_encoder_pvt *tmp = pvt->pvt;
   struct ast_frame *f;
   int i;
   int samples = pvt->samples;   /* save original number */
  
   if (samples < 2)
      return NULL;

   pvt->samples &= ~1; /* atomic size is 2 samples */

   for (i = 0; i < pvt->samples; i += 2) {
      pvt->outbuf.c[i/2] =
         (adpcm(tmp->inbuf[i  ], &tmp->state) << 4) |
         (adpcm(tmp->inbuf[i+1], &tmp->state)     );
   };

   f = ast_trans_frameout(pvt, pvt->samples/2, 0);

   /*
    * If there is a left over sample, move it to the beginning
    * of the input buffer.
    */

   if (samples & 1) {   /* move the leftover sample at beginning */
      tmp->inbuf[0] = tmp->inbuf[samples - 1];
      pvt->samples = 1;
   }
   return f;
}
static int load_module ( void  ) [static]
static int reload ( void  ) [static]

standard module glue

Definition at line 311 of file codec_adpcm.c.

References AST_MODULE_LOAD_SUCCESS.

static int unload_module ( void  ) [static]

Definition at line 316 of file codec_adpcm.c.

References ast_unregister_translator().

{
   int res;

   res = ast_unregister_translator(&lintoadpcm);
   res |= ast_unregister_translator(&adpcmtolin);

   return res;
}

Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Adaptive Differential PCM Coder/Decoder" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } [static]

Definition at line 344 of file codec_adpcm.c.

struct ast_translator adpcmtolin [static]

Definition at line 287 of file codec_adpcm.c.

Definition at line 344 of file codec_adpcm.c.

int indsft[8] = { -1, -1, -1, -1, 2, 4, 6, 8 } [static]

Definition at line 54 of file codec_adpcm.c.

struct ast_translator lintoadpcm [static]

Definition at line 298 of file codec_adpcm.c.

int stpsz[49] [static]

Definition at line 60 of file codec_adpcm.c.