| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * SpanDSP - a series of DSP components for telephony |    2  * SpanDSP - a series of DSP components for telephony | 
|    3  * |    3  * | 
|    4  * g722_decode.c - The ITU G.722 codec, decode part. |    4  * g722_decode.c - The ITU G.722 codec, decode part. | 
|    5  * |    5  * | 
|    6  * Written by Steve Underwood <steveu@coppice.org> |    6  * Written by Steve Underwood <steveu@coppice.org> | 
|    7  * |    7  * | 
|    8  * Copyright (C) 2005 Steve Underwood |    8  * Copyright (C) 2005 Steve Underwood | 
|    9  * |    9  * | 
|   10  *  Despite my general liking of the GPL, I place my own contributions  |   10  *  Despite my general liking of the GPL, I place my own contributions | 
|   11  *  to this code in the public domain for the benefit of all mankind - |   11  *  to this code in the public domain for the benefit of all mankind - | 
|   12  *  even the slimy ones who might try to proprietize my work and use it |   12  *  even the slimy ones who might try to proprietize my work and use it | 
|   13  *  to my detriment. |   13  *  to my detriment. | 
|   14  * |   14  * | 
|   15  * Based in part on a single channel G.722 codec which is: |   15  * Based in part on a single channel G.722 codec which is: | 
|   16  * |   16  * | 
|   17  * Copyright (c) CMU 1993 |   17  * Copyright (c) CMU 1993 | 
|   18  * Computer Science, Speech Group |   18  * Computer Science, Speech Group | 
|   19  * Chengxiang Lu and Alex Hauptmann |   19  * Chengxiang Lu and Alex Hauptmann | 
|   20  * |   20  * | 
|   21  * $Id: g722_decode.c,v 1.15 2006/07/07 16:37:49 steveu Exp $ |   21  * $Id: g722_decode.c,v 1.15 2006/07/07 16:37:49 steveu Exp $ | 
|   22  * |   22  * | 
|   23  * Modifications for WebRtc, 2011/04/28, by tlegrand: |   23  * Modifications for WebRtc, 2011/04/28, by tlegrand: | 
|   24  * -Removed usage of inttypes.h and tgmath.h |   24  * -Removed usage of inttypes.h and tgmath.h | 
|   25  * -Changed to use WebRtc types |   25  * -Changed to use WebRtc types | 
|   26  * -Changed __inline__ to __inline |   26  * -Changed __inline__ to __inline | 
|   27  * -Added saturation check on output |   27  * -Added saturation check on output | 
|   28  */ |   28  */ | 
|   29  |   29  | 
|   30 /*! \file */ |   30 /*! \file */ | 
|   31  |   31  | 
|   32  |   32  | 
|   33 #ifdef HAVE_CONFIG_H |  | 
|   34 #include <config.h> |  | 
|   35 #endif |  | 
|   36  |  | 
|   37 #include <memory.h> |   33 #include <memory.h> | 
|   38 #include <stdio.h> |   34 #include <stdio.h> | 
|   39 #include <stdlib.h> |   35 #include <stdlib.h> | 
|   40  |   36  | 
|   41 #include "g722_enc_dec.h" |   37 #include "g722_enc_dec.h" | 
|   42 #include "webrtc/typedefs.h" |   38 #include "webrtc/typedefs.h" | 
|   43  |   39  | 
|   44 #if !defined(FALSE) |   40 #if !defined(FALSE) | 
|   45 #define FALSE 0 |   41 #define FALSE 0 | 
|   46 #endif |   42 #endif | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  118         wd3 = (s->band[band].b[i]*32640) >> 15; |  114         wd3 = (s->band[band].b[i]*32640) >> 15; | 
|  119         s->band[band].bp[i] = saturate(wd2 + wd3); |  115         s->band[band].bp[i] = saturate(wd2 + wd3); | 
|  120     } |  116     } | 
|  121  |  117  | 
|  122     /* Block 4, DELAYA */ |  118     /* Block 4, DELAYA */ | 
|  123     for (i = 6;  i > 0;  i--) |  119     for (i = 6;  i > 0;  i--) | 
|  124     { |  120     { | 
|  125         s->band[band].d[i] = s->band[band].d[i - 1]; |  121         s->band[band].d[i] = s->band[band].d[i - 1]; | 
|  126         s->band[band].b[i] = s->band[band].bp[i]; |  122         s->band[band].b[i] = s->band[band].bp[i]; | 
|  127     } |  123     } | 
|  128      |  124  | 
|  129     for (i = 2;  i > 0;  i--) |  125     for (i = 2;  i > 0;  i--) | 
|  130     { |  126     { | 
|  131         s->band[band].r[i] = s->band[band].r[i - 1]; |  127         s->band[band].r[i] = s->band[band].r[i - 1]; | 
|  132         s->band[band].p[i] = s->band[band].p[i - 1]; |  128         s->band[band].p[i] = s->band[band].p[i - 1]; | 
|  133         s->band[band].a[i] = s->band[band].ap[i]; |  129         s->band[band].a[i] = s->band[band].ap[i]; | 
|  134     } |  130     } | 
|  135  |  131  | 
|  136     /* Block 4, FILTEP */ |  132     /* Block 4, FILTEP */ | 
|  137     wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]); |  133     wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]); | 
|  138     wd1 = (s->band[band].a[1]*wd1) >> 15; |  134     wd1 = (s->band[band].a[1]*wd1) >> 15; | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  194     { |  190     { | 
|  195         2048, 2093, 2139, 2186, 2233, 2282, 2332, |  191         2048, 2093, 2139, 2186, 2233, 2282, 2332, | 
|  196         2383, 2435, 2489, 2543, 2599, 2656, 2714, |  192         2383, 2435, 2489, 2543, 2599, 2656, 2714, | 
|  197         2774, 2834, 2896, 2960, 3025, 3091, 3158, |  193         2774, 2834, 2896, 2960, 3025, 3091, 3158, | 
|  198         3228, 3298, 3371, 3444, 3520, 3597, 3676, |  194         3228, 3298, 3371, 3444, 3520, 3597, 3676, | 
|  199         3756, 3838, 3922, 4008 |  195         3756, 3838, 3922, 4008 | 
|  200     }; |  196     }; | 
|  201     static const int wh[3] = {0, -214, 798}; |  197     static const int wh[3] = {0, -214, 798}; | 
|  202     static const int rh2[4] = {2, 1, 2, 1}; |  198     static const int rh2[4] = {2, 1, 2, 1}; | 
|  203     static const int qm2[4] = {-7408, -1616,  7408,   1616}; |  199     static const int qm2[4] = {-7408, -1616,  7408,   1616}; | 
|  204     static const int qm4[16] =  |  200     static const int qm4[16] = | 
|  205     { |  201     { | 
|  206               0, -20456, -12896,  -8968,  |  202               0, -20456, -12896,  -8968, | 
|  207           -6288,  -4240,  -2584,  -1200, |  203           -6288,  -4240,  -2584,  -1200, | 
|  208           20456,  12896,   8968,   6288, |  204           20456,  12896,   8968,   6288, | 
|  209            4240,   2584,   1200,      0 |  205            4240,   2584,   1200,      0 | 
|  210     }; |  206     }; | 
|  211     static const int qm5[32] = |  207     static const int qm5[32] = | 
|  212     { |  208     { | 
|  213            -280,   -280, -23352, -17560, |  209            -280,   -280, -23352, -17560, | 
|  214          -14120, -11664,  -9752,  -8184, |  210          -14120, -11664,  -9752,  -8184, | 
|  215           -6864,  -5712,  -4696,  -3784, |  211           -6864,  -5712,  -4696,  -3784, | 
|  216           -2960,  -2208,  -1520,   -880, |  212           -2960,  -2208,  -1520,   -880, | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  316  |  312  | 
|  317         /* Block 3L, LOGSCL */ |  313         /* Block 3L, LOGSCL */ | 
|  318         wd2 = rl42[wd1]; |  314         wd2 = rl42[wd1]; | 
|  319         wd1 = (s->band[0].nb*127) >> 7; |  315         wd1 = (s->band[0].nb*127) >> 7; | 
|  320         wd1 += wl[wd2]; |  316         wd1 += wl[wd2]; | 
|  321         if (wd1 < 0) |  317         if (wd1 < 0) | 
|  322             wd1 = 0; |  318             wd1 = 0; | 
|  323         else if (wd1 > 18432) |  319         else if (wd1 > 18432) | 
|  324             wd1 = 18432; |  320             wd1 = 18432; | 
|  325         s->band[0].nb = wd1; |  321         s->band[0].nb = wd1; | 
|  326              |  322  | 
|  327         /* Block 3L, SCALEL */ |  323         /* Block 3L, SCALEL */ | 
|  328         wd1 = (s->band[0].nb >> 6) & 31; |  324         wd1 = (s->band[0].nb >> 6) & 31; | 
|  329         wd2 = 8 - (s->band[0].nb >> 11); |  325         wd2 = 8 - (s->band[0].nb >> 11); | 
|  330         wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2); |  326         wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2); | 
|  331         s->band[0].det = wd3 << 2; |  327         s->band[0].det = wd3 << 2; | 
|  332  |  328  | 
|  333         block4(s, 0, dlowt); |  329         block4(s, 0, dlowt); | 
|  334          |  330  | 
|  335         if (!s->eight_k) |  331         if (!s->eight_k) | 
|  336         { |  332         { | 
|  337             /* Block 2H, INVQAH */ |  333             /* Block 2H, INVQAH */ | 
|  338             wd2 = qm2[ihigh]; |  334             wd2 = qm2[ihigh]; | 
|  339             dhigh = (s->band[1].det*wd2) >> 15; |  335             dhigh = (s->band[1].det*wd2) >> 15; | 
|  340             /* Block 5H, RECONS */ |  336             /* Block 5H, RECONS */ | 
|  341             rhigh = dhigh + s->band[1].s; |  337             rhigh = dhigh + s->band[1].s; | 
|  342             /* Block 6H, LIMIT */ |  338             /* Block 6H, LIMIT */ | 
|  343             if (rhigh > 16383) |  339             if (rhigh > 16383) | 
|  344                 rhigh = 16383; |  340                 rhigh = 16383; | 
|  345             else if (rhigh < -16384) |  341             else if (rhigh < -16384) | 
|  346                 rhigh = -16384; |  342                 rhigh = -16384; | 
|  347  |  343  | 
|  348             /* Block 2H, INVQAH */ |  344             /* Block 2H, INVQAH */ | 
|  349             wd2 = rh2[ihigh]; |  345             wd2 = rh2[ihigh]; | 
|  350             wd1 = (s->band[1].nb*127) >> 7; |  346             wd1 = (s->band[1].nb*127) >> 7; | 
|  351             wd1 += wh[wd2]; |  347             wd1 += wh[wd2]; | 
|  352             if (wd1 < 0) |  348             if (wd1 < 0) | 
|  353                 wd1 = 0; |  349                 wd1 = 0; | 
|  354             else if (wd1 > 22528) |  350             else if (wd1 > 22528) | 
|  355                 wd1 = 22528; |  351                 wd1 = 22528; | 
|  356             s->band[1].nb = wd1; |  352             s->band[1].nb = wd1; | 
|  357              |  353  | 
|  358             /* Block 3H, SCALEH */ |  354             /* Block 3H, SCALEH */ | 
|  359             wd1 = (s->band[1].nb >> 6) & 31; |  355             wd1 = (s->band[1].nb >> 6) & 31; | 
|  360             wd2 = 10 - (s->band[1].nb >> 11); |  356             wd2 = 10 - (s->band[1].nb >> 11); | 
|  361             wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2); |  357             wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2); | 
|  362             s->band[1].det = wd3 << 2; |  358             s->band[1].det = wd3 << 2; | 
|  363  |  359  | 
|  364             block4(s, 1, dhigh); |  360             block4(s, 1, dhigh); | 
|  365         } |  361         } | 
|  366  |  362  | 
|  367         if (s->itu_test_mode) |  363         if (s->itu_test_mode) | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  395                 /* WebRtc, tlegrand: added saturation */ |  391                 /* WebRtc, tlegrand: added saturation */ | 
|  396                 amp[outlen++] = saturate(xout1 >> 11); |  392                 amp[outlen++] = saturate(xout1 >> 11); | 
|  397                 amp[outlen++] = saturate(xout2 >> 11); |  393                 amp[outlen++] = saturate(xout2 >> 11); | 
|  398             } |  394             } | 
|  399         } |  395         } | 
|  400     } |  396     } | 
|  401     return outlen; |  397     return outlen; | 
|  402 } |  398 } | 
|  403 /*- End of function --------------------------------------------------------*/ |  399 /*- End of function --------------------------------------------------------*/ | 
|  404 /*- End of file ------------------------------------------------------------*/ |  400 /*- End of file ------------------------------------------------------------*/ | 
| OLD | NEW |