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"
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_frame * | lintoadpcm_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_info * | ast_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] |
codec_adpcm.c - translate between signed linear and Dialogic ADPCM
Definition in file codec_adpcm.c.
#define BUFFER_SAMPLES 8096 |
Definition at line 44 of file codec_adpcm.c.
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.
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] |
Definition at line 326 of file codec_adpcm.c.
References AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_translator, and ast_unregister_translator().
{ int res; res = ast_register_translator(&adpcmtolin); if (!res) res = ast_register_translator(&lintoadpcm); else ast_unregister_translator(&adpcmtolin); if (res) return AST_MODULE_LOAD_FAILURE; return AST_MODULE_LOAD_SUCCESS; }
static int reload | ( | void | ) | [static] |
standard module glue
Definition at line 311 of file codec_adpcm.c.
References AST_MODULE_LOAD_SUCCESS.
{ return 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; }
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.
struct ast_module_info* ast_module_info = &__mod_info [static] |
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.