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.