00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "asterisk.h"
00035
00036 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 362307 $")
00037
00038 #include "asterisk/lock.h"
00039 #include "asterisk/linkedlists.h"
00040 #include "asterisk/module.h"
00041 #include "asterisk/config.h"
00042 #include "asterisk/translate.h"
00043 #include "asterisk/utils.h"
00044
00045 #define WANT_ASM
00046 #include "log2comp.h"
00047
00048
00049
00050
00051 #if defined(NOT_BLI)
00052 # if defined(_MSC_VER)
00053 typedef __int64 sint64;
00054 # elif defined(__GNUC__)
00055 typedef long long sint64;
00056 # else
00057 # error 64-bit integer type is not defined for your compiler/platform
00058 # endif
00059 #endif
00060
00061 #define BUFFER_SAMPLES 8096
00062 #define BUF_SHIFT 5
00063
00064
00065 #include "asterisk/slin.h"
00066 #include "ex_g726.h"
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 struct g726_state {
00078 long yl;
00079 int yu;
00080 int dms;
00081 int dml;
00082 int ap;
00083 int a[2];
00084
00085 int b[6];
00086
00087 int pk[2];
00088
00089 int dq[6];
00090
00091
00092 int sr[2];
00093
00094
00095 int td;
00096 };
00097
00098 static int qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
00099
00100
00101
00102
00103 static int _dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
00104 425, 373, 323, 273, 213, 135, 4, -2048};
00105
00106
00107 static int _witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
00108 1122, 355, 198, 112, 64, 41, 18, -12};
00109
00110
00111
00112
00113
00114 static int _fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
00115 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 static void g726_init_state(struct g726_state *state_ptr)
00126 {
00127 int cnta;
00128
00129 state_ptr->yl = 34816;
00130 state_ptr->yu = 544;
00131 state_ptr->dms = 0;
00132 state_ptr->dml = 0;
00133 state_ptr->ap = 0;
00134 for (cnta = 0; cnta < 2; cnta++) {
00135 state_ptr->a[cnta] = 0;
00136 state_ptr->pk[cnta] = 0;
00137 #ifdef NOT_BLI
00138 state_ptr->sr[cnta] = 1;
00139 #else
00140 state_ptr->sr[cnta] = 32;
00141 #endif
00142 }
00143 for (cnta = 0; cnta < 6; cnta++) {
00144 state_ptr->b[cnta] = 0;
00145 #ifdef NOT_BLI
00146 state_ptr->dq[cnta] = 1;
00147 #else
00148 state_ptr->dq[cnta] = 32;
00149 #endif
00150 }
00151 state_ptr->td = 0;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 static int quan(int val, int *table, int size)
00163 {
00164 int i;
00165
00166 for (i = 0; i < size && val >= *table; ++i, ++table)
00167 ;
00168 return i;
00169 }
00170
00171 #ifdef NOT_BLI
00172
00173
00174
00175
00176
00177
00178
00179 static int predictor_zero(struct g726_state *state_ptr)
00180 {
00181 int i;
00182 sint64 sezi;
00183 for (sezi = 0, i = 0; i < 6; i++)
00184 sezi += (sint64)state_ptr->b[i] * state_ptr->dq[i];
00185 return (int)(sezi >> 13) / 2 ;
00186 }
00187
00188
00189
00190
00191
00192
00193
00194 static int predictor_pole(struct g726_state *state_ptr)
00195 {
00196 return (int)(((sint64)state_ptr->a[1] * state_ptr->sr[1] +
00197 (sint64)state_ptr->a[0] * state_ptr->sr[0]) >> 13) / 2 ;
00198 }
00199
00200 #else
00201
00202
00203
00204
00205
00206
00207 static int fmult(int an, int srn)
00208 {
00209 int anmag, anexp, anmant;
00210 int wanexp, wanmant;
00211 int retval;
00212
00213 anmag = (an > 0) ? an : ((-an) & 0x1FFF);
00214 anexp = ilog2(anmag) - 5;
00215 anmant = (anmag == 0) ? 32 :
00216 (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
00217 wanexp = anexp + ((srn >> 6) & 0xF) - 13;
00218
00219 wanmant = (anmant * (srn & 077) + 0x30) >> 4;
00220 retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
00221 (wanmant >> -wanexp);
00222
00223 return (((an ^ srn) < 0) ? -retval : retval);
00224 }
00225
00226 static int predictor_zero(struct g726_state *state_ptr)
00227 {
00228 int i;
00229 int sezi;
00230 for (sezi = 0, i = 0; i < 6; i++)
00231 sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
00232 return sezi;
00233 }
00234
00235 static int predictor_pole(struct g726_state *state_ptr)
00236 {
00237 return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
00238 fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
00239 }
00240
00241 #endif
00242
00243
00244
00245
00246
00247
00248
00249 static int step_size(struct g726_state *state_ptr)
00250 {
00251 int y, dif, al;
00252
00253 if (state_ptr->ap >= 256) {
00254 return state_ptr->yu;
00255 }
00256
00257 y = state_ptr->yl >> 6;
00258 dif = state_ptr->yu - y;
00259 al = state_ptr->ap >> 2;
00260
00261 if (dif > 0) {
00262 y += (dif * al) >> 6;
00263 } else if (dif < 0) {
00264 y += (dif * al + 0x3F) >> 6;
00265 }
00266 return y;
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 static int quantize(
00279 int d,
00280 int y,
00281 int *table,
00282 int size)
00283 {
00284 int dqm;
00285 int exp;
00286 int mant;
00287 int dl;
00288 int dln;
00289 int i;
00290
00291
00292
00293
00294
00295
00296 dqm = abs(d);
00297 exp = ilog2(dqm);
00298 if (exp < 0) {
00299 exp = 0;
00300 }
00301 mant = ((dqm << 7) >> exp) & 0x7F;
00302 dl = (exp << 7) | mant;
00303
00304
00305
00306
00307
00308
00309 dln = dl - (y >> 2);
00310
00311
00312
00313
00314
00315
00316 i = quan(dln, table, size);
00317 if (d < 0) {
00318 return ((size << 1) + 1 - i);
00319 } else if (i == 0) {
00320 return ((size << 1) + 1);
00321 } else {
00322 return i;
00323 }
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333 static int reconstruct(
00334 int sign,
00335 int dqln,
00336 int y)
00337 {
00338 int dql;
00339 int dex;
00340 int dqt;
00341 int dq;
00342
00343 dql = dqln + (y >> 2);
00344
00345 if (dql < 0) {
00346 #ifdef NOT_BLI
00347 return (sign) ? -1 : 1;
00348 #else
00349 return (sign) ? -0x8000 : 0;
00350 #endif
00351 } else {
00352 dex = (dql >> 7) & 15;
00353 dqt = 128 + (dql & 127);
00354 #ifdef NOT_BLI
00355 dq = ((dqt << 19) >> (14 - dex));
00356 return (sign) ? -dq : dq;
00357 #else
00358 dq = (dqt << 7) >> (14 - dex);
00359 return (sign) ? (dq - 0x8000) : dq;
00360 #endif
00361 }
00362 }
00363
00364
00365
00366
00367
00368
00369 static void update(
00370 int code_size,
00371 int y,
00372 int wi,
00373 int fi,
00374 int dq,
00375 int sr,
00376 int dqsez,
00377 struct g726_state *state_ptr)
00378 {
00379 int cnt;
00380 int mag;
00381 #ifndef NOT_BLI
00382 int exp;
00383 #endif
00384 int a2p=0;
00385 int a1ul;
00386 int pks1;
00387 int fa1;
00388 int tr;
00389 int ylint, thr2, dqthr;
00390 int ylfrac, thr1;
00391 int pk0;
00392
00393 pk0 = (dqsez < 0) ? 1 : 0;
00394
00395 #ifdef NOT_BLI
00396 mag = abs(dq / 0x1000);
00397 #else
00398 mag = dq & 0x7FFF;
00399 #endif
00400
00401 ylint = state_ptr->yl >> 15;
00402 ylfrac = (state_ptr->yl >> 10) & 0x1F;
00403 thr1 = (32 + ylfrac) << ylint;
00404 thr2 = (ylint > 9) ? 31 << 10 : thr1;
00405 dqthr = (thr2 + (thr2 >> 1)) >> 1;
00406 if (state_ptr->td == 0) {
00407 tr = 0;
00408 } else if (mag <= dqthr) {
00409 tr = 0;
00410 } else {
00411 tr = 1;
00412 }
00413
00414
00415
00416
00417
00418
00419 state_ptr->yu = y + ((wi - y) >> 5);
00420
00421
00422 if (state_ptr->yu < 544) {
00423 state_ptr->yu = 544;
00424 } else if (state_ptr->yu > 5120) {
00425 state_ptr->yu = 5120;
00426 }
00427
00428
00429
00430 state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
00431
00432
00433
00434
00435 if (tr == 1) {
00436 state_ptr->a[0] = 0;
00437 state_ptr->a[1] = 0;
00438 state_ptr->b[0] = 0;
00439 state_ptr->b[1] = 0;
00440 state_ptr->b[2] = 0;
00441 state_ptr->b[3] = 0;
00442 state_ptr->b[4] = 0;
00443 state_ptr->b[5] = 0;
00444 } else {
00445 pks1 = pk0 ^ state_ptr->pk[0];
00446
00447
00448 a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
00449 if (dqsez != 0) {
00450 fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
00451 if (fa1 < -8191) {
00452 a2p -= 0x100;
00453 } else if (fa1 > 8191) {
00454 a2p += 0xFF;
00455 } else {
00456 a2p += fa1 >> 5;
00457 }
00458
00459 if (pk0 ^ state_ptr->pk[1]) {
00460
00461 if (a2p <= -12160) {
00462 a2p = -12288;
00463 } else if (a2p >= 12416) {
00464 a2p = 12288;
00465 } else {
00466 a2p -= 0x80;
00467 }
00468 } else if (a2p <= -12416) {
00469 a2p = -12288;
00470 } else if (a2p >= 12160) {
00471 a2p = 12288;
00472 } else {
00473 a2p += 0x80;
00474 }
00475 }
00476
00477
00478 state_ptr->a[1] = a2p;
00479
00480
00481
00482 state_ptr->a[0] -= state_ptr->a[0] >> 8;
00483 if (dqsez != 0) {
00484 if (pks1 == 0)
00485 state_ptr->a[0] += 192;
00486 else
00487 state_ptr->a[0] -= 192;
00488 }
00489
00490 a1ul = 15360 - a2p;
00491 if (state_ptr->a[0] < -a1ul) {
00492 state_ptr->a[0] = -a1ul;
00493 } else if (state_ptr->a[0] > a1ul) {
00494 state_ptr->a[0] = a1ul;
00495 }
00496
00497
00498 for (cnt = 0; cnt < 6; cnt++) {
00499 if (code_size == 5) {
00500 state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
00501 } else {
00502 state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
00503 }
00504 if (mag) {
00505 if ((dq ^ state_ptr->dq[cnt]) >= 0) {
00506 state_ptr->b[cnt] += 128;
00507 } else {
00508 state_ptr->b[cnt] -= 128;
00509 }
00510 }
00511 }
00512 }
00513
00514 for (cnt = 5; cnt > 0; cnt--)
00515 state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
00516 #ifdef NOT_BLI
00517 state_ptr->dq[0] = dq;
00518 #else
00519
00520 if (mag == 0) {
00521 state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0x20 - 0x400;
00522 } else {
00523 exp = ilog2(mag) + 1;
00524 state_ptr->dq[0] = (dq >= 0) ?
00525 (exp << 6) + ((mag << 6) >> exp) :
00526 (exp << 6) + ((mag << 6) >> exp) - 0x400;
00527 }
00528 #endif
00529
00530 state_ptr->sr[1] = state_ptr->sr[0];
00531 #ifdef NOT_BLI
00532 state_ptr->sr[0] = sr;
00533 #else
00534
00535 if (sr == 0) {
00536 state_ptr->sr[0] = 0x20;
00537 } else if (sr > 0) {
00538 exp = ilog2(sr) + 1;
00539 state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp);
00540 } else if (sr > -0x8000) {
00541 mag = -sr;
00542 exp = ilog2(mag) + 1;
00543 state_ptr->sr[0] = (exp << 6) + ((mag << 6) >> exp) - 0x400;
00544 } else
00545 state_ptr->sr[0] = 0x20 - 0x400;
00546 #endif
00547
00548
00549 state_ptr->pk[1] = state_ptr->pk[0];
00550 state_ptr->pk[0] = pk0;
00551
00552
00553 if (tr == 1) {
00554 state_ptr->td = 0;
00555 } else if (a2p < -11776) {
00556 state_ptr->td = 1;
00557 } else {
00558 state_ptr->td = 0;
00559 }
00560
00561
00562
00563
00564 state_ptr->dms += (fi - state_ptr->dms) >> 5;
00565 state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7);
00566
00567 if (tr == 1) {
00568 state_ptr->ap = 256;
00569 } else if (y < 1536) {
00570 state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
00571 } else if (state_ptr->td == 1) {
00572 state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
00573 } else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
00574 (state_ptr->dml >> 3)) {
00575 state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
00576 } else {
00577 state_ptr->ap += (-state_ptr->ap) >> 4;
00578 }
00579 }
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590 static int g726_decode(int i, struct g726_state *state_ptr)
00591 {
00592 int sezi, sez, se;
00593 int y;
00594 int sr;
00595 int dq;
00596 int dqsez;
00597
00598 i &= 0x0f;
00599 #ifdef NOT_BLI
00600 sezi = predictor_zero(state_ptr);
00601 sez = sezi;
00602 se = sezi + predictor_pole(state_ptr);
00603 #else
00604 sezi = predictor_zero(state_ptr);
00605 sez = sezi >> 1;
00606 se = (sezi + predictor_pole(state_ptr)) >> 1;
00607 #endif
00608
00609 y = step_size(state_ptr);
00610
00611 dq = reconstruct(i & 8, _dqlntab[i], y);
00612
00613 #ifdef NOT_BLI
00614 sr = se + dq;
00615 dqsez = dq + sez;
00616 #else
00617 sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;
00618 dqsez = sr - se + sez;
00619 #endif
00620
00621 update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
00622
00623 #ifdef NOT_BLI
00624 return (sr >> 10);
00625 #else
00626 return (sr << 2);
00627 #endif
00628 }
00629
00630
00631
00632
00633
00634
00635
00636 static int g726_encode(int sl, struct g726_state *state_ptr)
00637 {
00638 int sezi, se, sez;
00639 int d;
00640 int sr;
00641 int y;
00642 int dqsez;
00643 int dq, i;
00644
00645 #ifdef NOT_BLI
00646 sl <<= 10;
00647
00648 sezi = predictor_zero(state_ptr);
00649 sez = sezi;
00650 se = sezi + predictor_pole(state_ptr);
00651 #else
00652 sl >>= 2;
00653
00654 sezi = predictor_zero(state_ptr);
00655 sez = sezi >> 1;
00656 se = (sezi + predictor_pole(state_ptr)) >> 1;
00657 #endif
00658
00659 d = sl - se;
00660
00661
00662 y = step_size(state_ptr);
00663 #ifdef NOT_BLI
00664 d /= 0x1000;
00665 #endif
00666 i = quantize(d, y, qtab_721, 7);
00667
00668 dq = reconstruct(i & 8, _dqlntab[i], y);
00669
00670 #ifdef NOT_BLI
00671 sr = se + dq;
00672 dqsez = dq + sez;
00673 #else
00674 sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;
00675 dqsez = sr - se + sez;
00676 #endif
00677
00678 update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
00679
00680 return i;
00681 }
00682
00683
00684
00685
00686
00687
00688 struct g726_coder_pvt {
00689
00690 unsigned char next_flag;
00691 struct g726_state g726;
00692 };
00693
00694
00695 static int lintog726_new(struct ast_trans_pvt *pvt)
00696 {
00697 struct g726_coder_pvt *tmp = pvt->pvt;
00698
00699 g726_init_state(&tmp->g726);
00700
00701 return 0;
00702 }
00703
00704
00705 static int g726aal2tolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
00706 {
00707 struct g726_coder_pvt *tmp = pvt->pvt;
00708 unsigned char *src = f->data.ptr;
00709 int16_t *dst = pvt->outbuf.i16 + pvt->samples;
00710 unsigned int i;
00711
00712 for (i = 0; i < f->datalen; i++) {
00713 *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726);
00714 *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726);
00715 }
00716
00717 pvt->samples += f->samples;
00718 pvt->datalen += 2 * f->samples;
00719
00720 return 0;
00721 }
00722
00723
00724 static int lintog726aal2_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
00725 {
00726 struct g726_coder_pvt *tmp = pvt->pvt;
00727 int16_t *src = f->data.ptr;
00728 unsigned int i;
00729
00730 for (i = 0; i < f->samples; i++) {
00731 unsigned char d = g726_encode(src[i], &tmp->g726);
00732
00733 if (tmp->next_flag & 0x80) {
00734 pvt->outbuf.c[pvt->datalen++] = ((tmp->next_flag & 0xf)<< 4) | d;
00735 pvt->samples += 2;
00736 tmp->next_flag = 0;
00737 } else {
00738 tmp->next_flag = 0x80 | d;
00739 }
00740 }
00741
00742 return 0;
00743 }
00744
00745
00746 static int g726tolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
00747 {
00748 struct g726_coder_pvt *tmp = pvt->pvt;
00749 unsigned char *src = f->data.ptr;
00750 int16_t *dst = pvt->outbuf.i16 + pvt->samples;
00751 unsigned int i;
00752
00753 for (i = 0; i < f->datalen; i++) {
00754 *dst++ = g726_decode(src[i] & 0x0f, &tmp->g726);
00755 *dst++ = g726_decode((src[i] >> 4) & 0xf, &tmp->g726);
00756 }
00757
00758 pvt->samples += f->samples;
00759 pvt->datalen += 2 * f->samples;
00760
00761 return 0;
00762 }
00763
00764
00765 static int lintog726_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
00766 {
00767 struct g726_coder_pvt *tmp = pvt->pvt;
00768 int16_t *src = f->data.ptr;
00769 unsigned int i;
00770
00771 for (i = 0; i < f->samples; i++) {
00772 unsigned char d = g726_encode(src[i], &tmp->g726);
00773
00774 if (tmp->next_flag & 0x80) {
00775 pvt->outbuf.c[pvt->datalen++] = (d << 4) | (tmp->next_flag & 0xf);
00776 pvt->samples += 2;
00777 tmp->next_flag = 0;
00778 } else {
00779 tmp->next_flag = 0x80 | d;
00780 }
00781 }
00782
00783 return 0;
00784 }
00785
00786 static struct ast_translator g726tolin = {
00787 .name = "g726tolin",
00788 .newpvt = lintog726_new,
00789 .framein = g726tolin_framein,
00790 .sample = g726_sample,
00791 .desc_size = sizeof(struct g726_coder_pvt),
00792 .buffer_samples = BUFFER_SAMPLES,
00793 .buf_size = BUFFER_SAMPLES * 2,
00794 };
00795
00796 static struct ast_translator lintog726 = {
00797 .name = "lintog726",
00798 .newpvt = lintog726_new,
00799 .framein = lintog726_framein,
00800 .sample = slin8_sample,
00801 .desc_size = sizeof(struct g726_coder_pvt),
00802 .buffer_samples = BUFFER_SAMPLES,
00803 .buf_size = BUFFER_SAMPLES/2,
00804 };
00805
00806 static struct ast_translator g726aal2tolin = {
00807 .name = "g726aal2tolin",
00808 .newpvt = lintog726_new,
00809 .framein = g726aal2tolin_framein,
00810 .sample = g726_sample,
00811 .desc_size = sizeof(struct g726_coder_pvt),
00812 .buffer_samples = BUFFER_SAMPLES,
00813 .buf_size = BUFFER_SAMPLES * 2,
00814 };
00815
00816 static struct ast_translator lintog726aal2 = {
00817 .name = "lintog726aal2",
00818 .newpvt = lintog726_new,
00819 .framein = lintog726aal2_framein,
00820 .sample = slin8_sample,
00821 .desc_size = sizeof(struct g726_coder_pvt),
00822 .buffer_samples = BUFFER_SAMPLES,
00823 .buf_size = BUFFER_SAMPLES / 2,
00824 };
00825
00826 static int reload(void)
00827 {
00828 return AST_MODULE_LOAD_SUCCESS;
00829 }
00830
00831 static int unload_module(void)
00832 {
00833 int res = 0;
00834
00835 res |= ast_unregister_translator(&g726tolin);
00836 res |= ast_unregister_translator(&lintog726);
00837
00838 res |= ast_unregister_translator(&g726aal2tolin);
00839 res |= ast_unregister_translator(&lintog726aal2);
00840
00841 return res;
00842 }
00843
00844 static int load_module(void)
00845 {
00846 int res = 0;
00847
00848 ast_format_set(&g726tolin.src_format, AST_FORMAT_G726, 0);
00849 ast_format_set(&g726tolin.dst_format, AST_FORMAT_SLINEAR, 0);
00850
00851 ast_format_set(&lintog726.src_format, AST_FORMAT_SLINEAR, 0);
00852 ast_format_set(&lintog726.dst_format, AST_FORMAT_G726, 0);
00853
00854 ast_format_set(&g726aal2tolin.src_format, AST_FORMAT_G726_AAL2, 0);
00855 ast_format_set(&g726aal2tolin.dst_format, AST_FORMAT_SLINEAR, 0);
00856
00857 ast_format_set(&lintog726aal2.src_format, AST_FORMAT_SLINEAR, 0);
00858 ast_format_set(&lintog726aal2.dst_format, AST_FORMAT_G726_AAL2, 0);
00859
00860 res |= ast_register_translator(&g726tolin);
00861 res |= ast_register_translator(&lintog726);
00862
00863 res |= ast_register_translator(&g726aal2tolin);
00864 res |= ast_register_translator(&lintog726aal2);
00865
00866 if (res) {
00867 unload_module();
00868 return AST_MODULE_LOAD_FAILURE;
00869 }
00870
00871 return AST_MODULE_LOAD_SUCCESS;
00872 }
00873
00874 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "ITU G.726-32kbps G726 Transcoder",
00875 .load = load_module,
00876 .unload = unload_module,
00877 .reload = reload,
00878 );