#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"
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 |
#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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .reload = reload, } |
static int | _dqlntab [16] |
static int | _fitab [16] |
static int | _witab [16] |
static struct ast_module_info * | ast_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} |
Definition in file codec_g726.c.
#define BUF_SHIFT 5 |
Definition at line 58 of file codec_g726.c.
#define BUFFER_SAMPLES 8096 |
Definition at line 57 of file codec_g726.c.
#define WANT_ASM |
Definition at line 41 of file codec_g726.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 860 of file codec_g726.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 860 of file codec_g726.c.
static int fmult | ( | int | an, | |
int | srn | |||
) | [static] |
Definition at line 203 of file codec_g726.c.
References ilog2().
Referenced by predictor_pole(), and predictor_zero().
00204 { 00205 int anmag, anexp, anmant; 00206 int wanexp, wanmant; 00207 int retval; 00208 00209 anmag = (an > 0) ? an : ((-an) & 0x1FFF); 00210 anexp = ilog2(anmag) - 5; 00211 anmant = (anmag == 0) ? 32 : 00212 (anexp >= 0) ? anmag >> anexp : anmag << -anexp; 00213 wanexp = anexp + ((srn >> 6) & 0xF) - 13; 00214 00215 wanmant = (anmant * (srn & 077) + 0x30) >> 4; 00216 retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : 00217 (wanmant >> -wanexp); 00218 00219 return (((an ^ srn) < 0) ? -retval : retval); 00220 }
static int g726_decode | ( | int | i, | |
struct g726_state * | state_ptr | |||
) | [static] |
Definition at line 576 of file codec_g726.c.
References predictor_pole(), predictor_zero(), reconstruct(), step_size(), and update().
Referenced by g726aal2tolin_framein(), and g726tolin_framein().
00577 { 00578 int sezi, sez, se; /* ACCUM */ 00579 int y; /* MIX */ 00580 int sr; /* ADDB */ 00581 int dq; 00582 int dqsez; 00583 00584 i &= 0x0f; /* mask to get proper bits */ 00585 #ifdef NOT_BLI 00586 sezi = predictor_zero(state_ptr); 00587 sez = sezi; 00588 se = sezi + predictor_pole(state_ptr); /* estimated signal */ 00589 #else 00590 sezi = predictor_zero(state_ptr); 00591 sez = sezi >> 1; 00592 se = (sezi + predictor_pole(state_ptr)) >> 1; /* estimated signal */ 00593 #endif 00594 00595 y = step_size(state_ptr); /* dynamic quantizer step size */ 00596 00597 dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized diff. */ 00598 00599 #ifdef NOT_BLI 00600 sr = se + dq; /* reconst. signal */ 00601 dqsez = dq + sez; /* pole prediction diff. */ 00602 #else 00603 sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconst. signal */ 00604 dqsez = sr - se + sez; /* pole prediction diff. */ 00605 #endif 00606 00607 update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr); 00608 00609 #ifdef NOT_BLI 00610 return (sr >> 10); /* sr was 26-bit dynamic range */ 00611 #else 00612 return (sr << 2); /* sr was 14-bit dynamic range */ 00613 #endif 00614 }
static int g726_encode | ( | int | sl, | |
struct g726_state * | state_ptr | |||
) | [static] |
Definition at line 622 of file codec_g726.c.
References predictor_pole(), predictor_zero(), quantize(), reconstruct(), step_size(), and update().
Referenced by lintog726_framein(), and lintog726aal2_framein().
00623 { 00624 int sezi, se, sez; /* ACCUM */ 00625 int d; /* SUBTA */ 00626 int sr; /* ADDB */ 00627 int y; /* MIX */ 00628 int dqsez; /* ADDC */ 00629 int dq, i; 00630 00631 #ifdef NOT_BLI 00632 sl <<= 10; /* 26-bit dynamic range */ 00633 00634 sezi = predictor_zero(state_ptr); 00635 sez = sezi; 00636 se = sezi + predictor_pole(state_ptr); /* estimated signal */ 00637 #else 00638 sl >>= 2; /* 14-bit dynamic range */ 00639 00640 sezi = predictor_zero(state_ptr); 00641 sez = sezi >> 1; 00642 se = (sezi + predictor_pole(state_ptr)) >> 1; /* estimated signal */ 00643 #endif 00644 00645 d = sl - se; /* estimation difference */ 00646 00647 /* quantize the prediction difference */ 00648 y = step_size(state_ptr); /* quantizer step size */ 00649 #ifdef NOT_BLI 00650 d /= 0x1000; 00651 #endif 00652 i = quantize(d, y, qtab_721, 7); /* i = G726 code */ 00653 00654 dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized est diff */ 00655 00656 #ifdef NOT_BLI 00657 sr = se + dq; /* reconst. signal */ 00658 dqsez = dq + sez; /* pole prediction diff. */ 00659 #else 00660 sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconst. signal */ 00661 dqsez = sr - se + sez; /* pole prediction diff. */ 00662 #endif 00663 00664 update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr); 00665 00666 return (i); 00667 }
static void g726_init_state | ( | struct g726_state * | state_ptr | ) | [static] |
Definition at line 121 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().
00122 { 00123 int cnta; 00124 00125 state_ptr->yl = 34816; 00126 state_ptr->yu = 544; 00127 state_ptr->dms = 0; 00128 state_ptr->dml = 0; 00129 state_ptr->ap = 0; 00130 for (cnta = 0; cnta < 2; cnta++) { 00131 state_ptr->a[cnta] = 0; 00132 state_ptr->pk[cnta] = 0; 00133 #ifdef NOT_BLI 00134 state_ptr->sr[cnta] = 1; 00135 #else 00136 state_ptr->sr[cnta] = 32; 00137 #endif 00138 } 00139 for (cnta = 0; cnta < 6; cnta++) { 00140 state_ptr->b[cnta] = 0; 00141 #ifdef NOT_BLI 00142 state_ptr->dq[cnta] = 1; 00143 #else 00144 state_ptr->dq[cnta] = 32; 00145 #endif 00146 } 00147 state_ptr->td = 0; 00148 }
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 691 of file codec_g726.c.
References ast_trans_pvt::datalen, f, g726_coder_pvt::g726, g726_decode(), ast_trans_pvt::i16, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00692 { 00693 struct g726_coder_pvt *tmp = pvt->pvt; 00694 unsigned char *src = f->data.ptr; 00695 int16_t *dst = pvt->outbuf.i16 + pvt->samples; 00696 unsigned int i; 00697 00698 for (i = 0; i < f->datalen; i++) { 00699 *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726); 00700 *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726); 00701 } 00702 00703 pvt->samples += f->samples; 00704 pvt->datalen += 2 * f->samples; /* 2 bytes/sample */ 00705 00706 return 0; 00707 }
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 732 of file codec_g726.c.
References ast_trans_pvt::datalen, f, g726_coder_pvt::g726, g726_decode(), ast_trans_pvt::i16, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00733 { 00734 struct g726_coder_pvt *tmp = pvt->pvt; 00735 unsigned char *src = f->data.ptr; 00736 int16_t *dst = pvt->outbuf.i16 + pvt->samples; 00737 unsigned int i; 00738 00739 for (i = 0; i < f->datalen; i++) { 00740 *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726); 00741 *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726); 00742 } 00743 00744 pvt->samples += f->samples; 00745 pvt->datalen += 2 * f->samples; /* 2 bytes/sample */ 00746 00747 return 0; 00748 }
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 751 of file codec_g726.c.
References ast_trans_pvt::c, ast_trans_pvt::datalen, f, g726_coder_pvt::g726, g726_encode(), g726_coder_pvt::next_flag, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00752 { 00753 struct g726_coder_pvt *tmp = pvt->pvt; 00754 int16_t *src = f->data.ptr; 00755 unsigned int i; 00756 00757 for (i = 0; i < f->samples; i++) { 00758 unsigned char d = g726_encode(src[i], &tmp->g726); /* this sample */ 00759 00760 if (tmp->next_flag & 0x80) { /* merge with leftover sample */ 00761 pvt->outbuf.c[pvt->datalen++] = (d << 4) | (tmp->next_flag & 0xf); 00762 pvt->samples += 2; /* 2 samples per byte */ 00763 tmp->next_flag = 0; 00764 } else { 00765 tmp->next_flag = 0x80 | d; 00766 } 00767 } 00768 00769 return 0; 00770 }
static int lintog726_new | ( | struct ast_trans_pvt * | pvt | ) | [static] |
init a new instance of g726_coder_pvt.
Definition at line 681 of file codec_g726.c.
References g726_coder_pvt::g726, g726_init_state(), and ast_trans_pvt::pvt.
00682 { 00683 struct g726_coder_pvt *tmp = pvt->pvt; 00684 00685 g726_init_state(&tmp->g726); 00686 00687 return 0; 00688 }
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 710 of file codec_g726.c.
References ast_trans_pvt::c, ast_trans_pvt::datalen, f, g726_coder_pvt::g726, g726_encode(), g726_coder_pvt::next_flag, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00711 { 00712 struct g726_coder_pvt *tmp = pvt->pvt; 00713 int16_t *src = f->data.ptr; 00714 unsigned int i; 00715 00716 for (i = 0; i < f->samples; i++) { 00717 unsigned char d = g726_encode(src[i], &tmp->g726); /* this sample */ 00718 00719 if (tmp->next_flag & 0x80) { /* merge with leftover sample */ 00720 pvt->outbuf.c[pvt->datalen++] = ((tmp->next_flag & 0xf)<< 4) | d; 00721 pvt->samples += 2; /* 2 samples per byte */ 00722 tmp->next_flag = 0; 00723 } else { 00724 tmp->next_flag = 0x80 | d; 00725 } 00726 } 00727 00728 return 0; 00729 }
static int load_module | ( | void | ) | [static] |
Definition at line 838 of file codec_g726.c.
References AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_translator, g726aal2tolin, g726tolin, lintog726, lintog726aal2, and unload_module.
00839 { 00840 int res = 0; 00841 00842 res |= ast_register_translator(&g726tolin); 00843 res |= ast_register_translator(&lintog726); 00844 00845 res |= ast_register_translator(&g726aal2tolin); 00846 res |= ast_register_translator(&lintog726aal2); 00847 00848 if (res) { 00849 unload_module(); 00850 return AST_MODULE_LOAD_FAILURE; 00851 } 00852 00853 return AST_MODULE_LOAD_SUCCESS; 00854 }
static int predictor_pole | ( | struct g726_state * | state_ptr | ) | [static] |
Definition at line 231 of file codec_g726.c.
References g726_state::a, fmult(), and g726_state::sr.
Referenced by g726_decode(), and g726_encode().
00232 { 00233 return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) + 00234 fmult(state_ptr->a[0] >> 2, state_ptr->sr[0])); 00235 }
static int predictor_zero | ( | struct g726_state * | state_ptr | ) | [static] |
Definition at line 222 of file codec_g726.c.
References g726_state::b, g726_state::dq, and fmult().
Referenced by g726_decode(), and g726_encode().
00223 { 00224 int i; 00225 int sezi; 00226 for (sezi = 0, i = 0; i < 6; i++) /* ACCUM */ 00227 sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]); 00228 return sezi; 00229 }
static int quan | ( | int | val, | |
int * | table, | |||
int | size | |||
) | [static] |
Definition at line 158 of file codec_g726.c.
Referenced by quantize().
00159 { 00160 int i; 00161 00162 for (i = 0; i < size && val >= *table; ++i, ++table) 00163 ; 00164 return (i); 00165 }
static int quantize | ( | int | d, | |
int | y, | |||
int * | table, | |||
int | size | |||
) | [static] |
Definition at line 274 of file codec_g726.c.
References ilog2(), and quan().
Referenced by g726_encode().
00279 { 00280 int dqm; /* Magnitude of 'd' */ 00281 int exp; /* Integer part of base 2 log of 'd' */ 00282 int mant; /* Fractional part of base 2 log */ 00283 int dl; /* Log of magnitude of 'd' */ 00284 int dln; /* Step size scale factor normalized log */ 00285 int i; 00286 00287 /* 00288 * LOG 00289 * 00290 * Compute base 2 log of 'd', and store in 'dl'. 00291 */ 00292 dqm = abs(d); 00293 exp = ilog2(dqm); 00294 if (exp < 0) 00295 exp = 0; 00296 mant = ((dqm << 7) >> exp) & 0x7F; /* Fractional portion. */ 00297 dl = (exp << 7) | mant; 00298 00299 /* 00300 * SUBTB 00301 * 00302 * "Divide" by step size multiplier. 00303 */ 00304 dln = dl - (y >> 2); 00305 00306 /* 00307 * QUAN 00308 * 00309 * Obtain codword i for 'd'. 00310 */ 00311 i = quan(dln, table, size); 00312 if (d < 0) /* take 1's complement of i */ 00313 return ((size << 1) + 1 - i); 00314 else if (i == 0) /* take 1's complement of 0 */ 00315 return ((size << 1) + 1); /* new in 1988 */ 00316 else 00317 return (i); 00318 }
static int reconstruct | ( | int | sign, | |
int | dqln, | |||
int | y | |||
) | [static] |
Definition at line 327 of file codec_g726.c.
Referenced by bridge_p2p_rtp_write(), g726_decode(), and g726_encode().
00331 { 00332 int dql; /* Log of 'dq' magnitude */ 00333 int dex; /* Integer part of log */ 00334 int dqt; 00335 int dq; /* Reconstructed difference signal sample */ 00336 00337 dql = dqln + (y >> 2); /* ADDA */ 00338 00339 if (dql < 0) { 00340 #ifdef NOT_BLI 00341 return (sign) ? -1 : 1; 00342 #else 00343 return (sign) ? -0x8000 : 0; 00344 #endif 00345 } else { /* ANTILOG */ 00346 dex = (dql >> 7) & 15; 00347 dqt = 128 + (dql & 127); 00348 #ifdef NOT_BLI 00349 dq = ((dqt << 19) >> (14 - dex)); 00350 return (sign) ? -dq : dq; 00351 #else 00352 dq = (dqt << 7) >> (14 - dex); 00353 return (sign) ? (dq - 0x8000) : dq; 00354 #endif 00355 } 00356 }
static int reload | ( | void | ) | [static] |
Definition at line 820 of file codec_g726.c.
References AST_MODULE_LOAD_SUCCESS.
00821 { 00822 return AST_MODULE_LOAD_SUCCESS; 00823 }
static int step_size | ( | struct g726_state * | state_ptr | ) | [static] |
Definition at line 245 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().
00246 { 00247 int y; 00248 int dif; 00249 int al; 00250 00251 if (state_ptr->ap >= 256) 00252 return (state_ptr->yu); 00253 else { 00254 y = state_ptr->yl >> 6; 00255 dif = state_ptr->yu - y; 00256 al = state_ptr->ap >> 2; 00257 if (dif > 0) 00258 y += (dif * al) >> 6; 00259 else if (dif < 0) 00260 y += (dif * al + 0x3F) >> 6; 00261 return (y); 00262 } 00263 }
static int unload_module | ( | void | ) | [static] |
Definition at line 825 of file codec_g726.c.
References ast_unregister_translator(), g726aal2tolin, g726tolin, lintog726, and lintog726aal2.
00826 { 00827 int res = 0; 00828 00829 res |= ast_unregister_translator(&g726tolin); 00830 res |= ast_unregister_translator(&lintog726); 00831 00832 res |= ast_unregister_translator(&g726aal2tolin); 00833 res |= ast_unregister_translator(&lintog726aal2); 00834 00835 return res; 00836 }
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 363 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 ast_channel_queue_connected_line_update(), ast_channel_queue_redirecting_update(), ast_channel_set_caller(), ast_channel_set_caller_event(), ast_channel_set_connected_line(), ast_channel_set_redirecting(), ast_channel_update_connected_line(), ast_channel_update_redirecting(), ast_connected_line_build_data(), ast_party_caller_set(), ast_party_connected_line_set(), ast_party_id_set(), ast_party_redirecting_set(), ast_redirecting_build_data(), config_device(), config_line(), connectedline_write(), g726_decode(), g726_encode(), load_pktccops_config(), party_id_build_data(), and redirecting_write().
00372 { 00373 int cnt; 00374 int mag; /* Adaptive predictor, FLOAT A */ 00375 #ifndef NOT_BLI 00376 int exp; 00377 #endif 00378 int a2p=0; /* LIMC */ 00379 int a1ul; /* UPA1 */ 00380 int pks1; /* UPA2 */ 00381 int fa1; 00382 int tr; /* tone/transition detector */ 00383 int ylint, thr2, dqthr; 00384 int ylfrac, thr1; 00385 int pk0; 00386 00387 pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */ 00388 00389 #ifdef NOT_BLI 00390 mag = abs(dq / 0x1000); /* prediction difference magnitude */ 00391 #else 00392 mag = dq & 0x7FFF; /* prediction difference magnitude */ 00393 #endif 00394 /* TRANS */ 00395 ylint = state_ptr->yl >> 15; /* exponent part of yl */ 00396 ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */ 00397 thr1 = (32 + ylfrac) << ylint; /* threshold */ 00398 thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */ 00399 dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */ 00400 if (state_ptr->td == 0) /* signal supposed voice */ 00401 tr = 0; 00402 else if (mag <= dqthr) /* supposed data, but small mag */ 00403 tr = 0; /* treated as voice */ 00404 else /* signal is data (modem) */ 00405 tr = 1; 00406 00407 /* 00408 * Quantizer scale factor adaptation. 00409 */ 00410 00411 /* FUNCTW & FILTD & DELAY */ 00412 /* update non-steady state step size multiplier */ 00413 state_ptr->yu = y + ((wi - y) >> 5); 00414 00415 /* LIMB */ 00416 if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */ 00417 state_ptr->yu = 544; 00418 else if (state_ptr->yu > 5120) 00419 state_ptr->yu = 5120; 00420 00421 /* FILTE & DELAY */ 00422 /* update steady state step size multiplier */ 00423 state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6); 00424 00425 /* 00426 * Adaptive predictor coefficients. 00427 */ 00428 if (tr == 1) { /* reset a's and b's for modem signal */ 00429 state_ptr->a[0] = 0; 00430 state_ptr->a[1] = 0; 00431 state_ptr->b[0] = 0; 00432 state_ptr->b[1] = 0; 00433 state_ptr->b[2] = 0; 00434 state_ptr->b[3] = 0; 00435 state_ptr->b[4] = 0; 00436 state_ptr->b[5] = 0; 00437 } else { /* update a's and b's */ 00438 pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */ 00439 00440 /* update predictor pole a[1] */ 00441 a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7); 00442 if (dqsez != 0) { 00443 fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0]; 00444 if (fa1 < -8191) /* a2p = function of fa1 */ 00445 a2p -= 0x100; 00446 else if (fa1 > 8191) 00447 a2p += 0xFF; 00448 else 00449 a2p += fa1 >> 5; 00450 00451 if (pk0 ^ state_ptr->pk[1]) 00452 /* LIMC */ 00453 if (a2p <= -12160) 00454 a2p = -12288; 00455 else if (a2p >= 12416) 00456 a2p = 12288; 00457 else 00458 a2p -= 0x80; 00459 else if (a2p <= -12416) 00460 a2p = -12288; 00461 else if (a2p >= 12160) 00462 a2p = 12288; 00463 else 00464 a2p += 0x80; 00465 } 00466 00467 /* TRIGB & DELAY */ 00468 state_ptr->a[1] = a2p; 00469 00470 /* UPA1 */ 00471 /* update predictor pole a[0] */ 00472 state_ptr->a[0] -= state_ptr->a[0] >> 8; 00473 if (dqsez != 0) { 00474 if (pks1 == 0) 00475 state_ptr->a[0] += 192; 00476 else 00477 state_ptr->a[0] -= 192; 00478 } 00479 /* LIMD */ 00480 a1ul = 15360 - a2p; 00481 if (state_ptr->a[0] < -a1ul) 00482 state_ptr->a[0] = -a1ul; 00483 else if (state_ptr->a[0] > a1ul) 00484 state_ptr->a[0] = a1ul; 00485 00486 /* UPB : update predictor zeros b[6] */ 00487 for (cnt = 0; cnt < 6; cnt++) { 00488 if (code_size == 5) /* for 40Kbps G.723 */ 00489 state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9; 00490 else /* for G.721 and 24Kbps G.723 */ 00491 state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8; 00492 if (mag) 00493 { /* XOR */ 00494 if ((dq ^ state_ptr->dq[cnt]) >= 0) 00495 state_ptr->b[cnt] += 128; 00496 else 00497 state_ptr->b[cnt] -= 128; 00498 } 00499 } 00500 } 00501 00502 for (cnt = 5; cnt > 0; cnt--) 00503 state_ptr->dq[cnt] = state_ptr->dq[cnt-1]; 00504 #ifdef NOT_BLI 00505 state_ptr->dq[0] = dq; 00506 #else 00507 /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */ 00508 if (mag == 0) { 00509 state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0x20 - 0x400; 00510 } else { 00511 exp = ilog2(mag) + 1; 00512 state_ptr->dq[0] = (dq >= 0) ? 00513 (exp << 6) + ((mag << 6) >> exp) : 00514 (exp << 6) + ((mag << 6) >> exp) - 0x400; 00515 } 00516 #endif 00517 00518 state_ptr->sr[1] = state_ptr->sr[0]; 00519 #ifdef NOT_BLI 00520 state_ptr->sr[0] = sr; 00521 #else 00522 /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ 00523 if (sr == 0) { 00524 state_ptr->sr[0] = 0x20; 00525 } else if (sr > 0) { 00526 exp = ilog2(sr) + 1; 00527 state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp); 00528 } else if (sr > -0x8000) { 00529 mag = -sr; 00530 exp = ilog2(mag) + 1; 00531 state_ptr->sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400; 00532 } else 00533 state_ptr->sr[0] = 0x20 - 0x400; 00534 #endif 00535 00536 /* DELAY A */ 00537 state_ptr->pk[1] = state_ptr->pk[0]; 00538 state_ptr->pk[0] = pk0; 00539 00540 /* TONE */ 00541 if (tr == 1) /* this sample has been treated as data */ 00542 state_ptr->td = 0; /* next one will be treated as voice */ 00543 else if (a2p < -11776) /* small sample-to-sample correlation */ 00544 state_ptr->td = 1; /* signal may be data */ 00545 else /* signal is voice */ 00546 state_ptr->td = 0; 00547 00548 /* 00549 * Adaptation speed control. 00550 */ 00551 state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */ 00552 state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */ 00553 00554 if (tr == 1) 00555 state_ptr->ap = 256; 00556 else if (y < 1536) /* SUBTC */ 00557 state_ptr->ap += (0x200 - state_ptr->ap) >> 4; 00558 else if (state_ptr->td == 1) 00559 state_ptr->ap += (0x200 - state_ptr->ap) >> 4; 00560 else if (abs((state_ptr->dms << 2) - state_ptr->dml) >= 00561 (state_ptr->dml >> 3)) 00562 state_ptr->ap += (0x200 - state_ptr->ap) >> 4; 00563 else 00564 state_ptr->ap += (-state_ptr->ap) >> 4; 00565 }
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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .reload = reload, } [static] |
Definition at line 860 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 99 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 110 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 103 of file codec_g726.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 860 of file codec_g726.c.
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} [static] |
Definition at line 94 of file codec_g726.c.