Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 /*
     12  * isacfix.c
     13  *
     14  * This C file contains the functions for the ISAC API
     15  *
     16  */
     17 
     18 #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
     19 
     20 #include <assert.h>
     21 #include <stdlib.h>
     22 
     23 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h"
     24 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
     25 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h"
     26 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
     27 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h"
     28 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/structs.h"
     29 #include "webrtc/system_wrappers/interface/cpu_features_wrapper.h"
     30 
     31 // Declare function pointers.
     32 FilterMaLoopFix WebRtcIsacfix_FilterMaLoopFix;
     33 Spec2Time WebRtcIsacfix_Spec2Time;
     34 Time2Spec WebRtcIsacfix_Time2Spec;
     35 MatrixProduct1 WebRtcIsacfix_MatrixProduct1;
     36 MatrixProduct2 WebRtcIsacfix_MatrixProduct2;
     37 
     38 /**************************************************************************
     39  * WebRtcIsacfix_AssignSize(...)
     40  *
     41  * Functions used when malloc is not allowed
     42  * Returns number of bytes needed to allocate for iSAC struct.
     43  *
     44  */
     45 
     46 int16_t WebRtcIsacfix_AssignSize(int *sizeinbytes) {
     47   *sizeinbytes=sizeof(ISACFIX_SubStruct)*2/sizeof(int16_t);
     48   return(0);
     49 }
     50 
     51 /***************************************************************************
     52  * WebRtcIsacfix_Assign(...)
     53  *
     54  * Functions used when malloc is not allowed
     55  * Place struct at given address
     56  *
     57  * If successful, Return 0, else Return -1
     58  */
     59 
     60 int16_t WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst, void *ISACFIX_inst_Addr) {
     61   if (ISACFIX_inst_Addr!=NULL) {
     62     *inst = (ISACFIX_MainStruct*)ISACFIX_inst_Addr;
     63     (*(ISACFIX_SubStruct**)inst)->errorcode = 0;
     64     (*(ISACFIX_SubStruct**)inst)->initflag = 0;
     65     (*(ISACFIX_SubStruct**)inst)->ISACenc_obj.SaveEnc_ptr = NULL;
     66     return(0);
     67   } else {
     68     return(-1);
     69   }
     70 }
     71 
     72 
     73 #ifndef ISACFIX_NO_DYNAMIC_MEM
     74 
     75 /****************************************************************************
     76  * WebRtcIsacfix_Create(...)
     77  *
     78  * This function creates a ISAC instance, which will contain the state
     79  * information for one coding/decoding channel.
     80  *
     81  * Input:
     82  *      - *ISAC_main_inst   : a pointer to the coder instance.
     83  *
     84  * Return value             :  0 - Ok
     85  *                            -1 - Error
     86  */
     87 
     88 int16_t WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst)
     89 {
     90   ISACFIX_SubStruct *tempo;
     91   tempo = malloc(1 * sizeof(ISACFIX_SubStruct));
     92   *ISAC_main_inst = (ISACFIX_MainStruct *)tempo;
     93   if (*ISAC_main_inst!=NULL) {
     94     (*(ISACFIX_SubStruct**)ISAC_main_inst)->errorcode = 0;
     95     (*(ISACFIX_SubStruct**)ISAC_main_inst)->initflag = 0;
     96     (*(ISACFIX_SubStruct**)ISAC_main_inst)->ISACenc_obj.SaveEnc_ptr = NULL;
     97     WebRtcSpl_Init();
     98     return(0);
     99   } else {
    100     return(-1);
    101   }
    102 }
    103 
    104 
    105 /****************************************************************************
    106  * WebRtcIsacfix_CreateInternal(...)
    107  *
    108  * This function creates the memory that is used to store data in the encoder
    109  *
    110  * Input:
    111  *      - *ISAC_main_inst   : a pointer to the coder instance.
    112  *
    113  * Return value             :  0 - Ok
    114  *                            -1 - Error
    115  */
    116 
    117 int16_t WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst)
    118 {
    119   ISACFIX_SubStruct *ISAC_inst;
    120 
    121   /* typecast pointer to real structure */
    122   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    123 
    124   /* Allocate memory for storing encoder data */
    125   ISAC_inst->ISACenc_obj.SaveEnc_ptr = malloc(1 * sizeof(ISAC_SaveEncData_t));
    126 
    127   if (ISAC_inst->ISACenc_obj.SaveEnc_ptr!=NULL) {
    128     return(0);
    129   } else {
    130     return(-1);
    131   }
    132 }
    133 
    134 
    135 #endif
    136 
    137 
    138 
    139 /****************************************************************************
    140  * WebRtcIsacfix_Free(...)
    141  *
    142  * This function frees the ISAC instance created at the beginning.
    143  *
    144  * Input:
    145  *      - ISAC_main_inst    : a ISAC instance.
    146  *
    147  * Return value             :  0 - Ok
    148  *                            -1 - Error
    149  */
    150 
    151 int16_t WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst)
    152 {
    153   free(ISAC_main_inst);
    154   return(0);
    155 }
    156 
    157 /****************************************************************************
    158  * WebRtcIsacfix_FreeInternal(...)
    159  *
    160  * This function frees the internal memory for storing encoder data.
    161  *
    162  * Input:
    163  *       - ISAC_main_inst    : a ISAC instance.
    164  *
    165  * Return value              :  0 - Ok
    166  *                             -1 - Error
    167  */
    168 
    169 int16_t WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst)
    170 {
    171   ISACFIX_SubStruct *ISAC_inst;
    172 
    173   /* typecast pointer to real structure */
    174   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    175 
    176   /* Release memory */
    177   free(ISAC_inst->ISACenc_obj.SaveEnc_ptr);
    178 
    179   return(0);
    180 }
    181 
    182 /****************************************************************************
    183  * WebRtcIsacfix_InitNeon(...)
    184  *
    185  * This function initializes function pointers for ARM Neon platform.
    186  */
    187 
    188 #if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON)
    189 static void WebRtcIsacfix_InitNeon(void) {
    190   WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon;
    191   WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon;
    192   WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeNeon;
    193   WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecNeon;
    194   WebRtcIsacfix_CalculateResidualEnergy =
    195       WebRtcIsacfix_CalculateResidualEnergyNeon;
    196   WebRtcIsacfix_AllpassFilter2FixDec16 =
    197       WebRtcIsacfix_AllpassFilter2FixDec16Neon;
    198   WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1Neon;
    199   WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2Neon;
    200 }
    201 #endif
    202 
    203 /****************************************************************************
    204  * WebRtcIsacfix_InitMIPS(...)
    205  *
    206  * This function initializes function pointers for MIPS platform.
    207  */
    208 
    209 #if defined(MIPS32_LE)
    210 static void WebRtcIsacfix_InitMIPS(void) {
    211   WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrMIPS;
    212   WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopMIPS;
    213   WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeMIPS;
    214   WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecMIPS;
    215   WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1MIPS;
    216   WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2MIPS;
    217 #if defined(MIPS_DSP_R1_LE)
    218   WebRtcIsacfix_AllpassFilter2FixDec16 =
    219       WebRtcIsacfix_AllpassFilter2FixDec16MIPS;
    220   WebRtcIsacfix_HighpassFilterFixDec32 =
    221       WebRtcIsacfix_HighpassFilterFixDec32MIPS;
    222 #endif
    223 #if defined(MIPS_DSP_R2_LE)
    224   WebRtcIsacfix_CalculateResidualEnergy =
    225       WebRtcIsacfix_CalculateResidualEnergyMIPS;
    226 #endif
    227 }
    228 #endif
    229 
    230 /****************************************************************************
    231  * WebRtcIsacfix_EncoderInit(...)
    232  *
    233  * This function initializes a ISAC instance prior to the encoder calls.
    234  *
    235  * Input:
    236  *      - ISAC_main_inst    : ISAC instance.
    237  *      - CodingMode        : 0 -> Bit rate and frame length are automatically
    238  *                                 adjusted to available bandwidth on
    239  *                                 transmission channel.
    240  *                            1 -> User sets a frame length and a target bit
    241  *                                 rate which is taken as the maximum short-term
    242  *                                 average bit rate.
    243  *
    244  * Return value             :  0 - Ok
    245  *                            -1 - Error
    246  */
    247 
    248 int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
    249                                   int16_t  CodingMode)
    250 {
    251   int k;
    252   int16_t statusInit;
    253   ISACFIX_SubStruct *ISAC_inst;
    254 
    255   statusInit = 0;
    256   /* typecast pointer to rela structure */
    257   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    258 
    259   /* flag encoder init */
    260   ISAC_inst->initflag |= 2;
    261 
    262   if (CodingMode == 0)
    263     /* Adaptive mode */
    264     ISAC_inst->ISACenc_obj.new_framelength  = INITIAL_FRAMESAMPLES;
    265   else if (CodingMode == 1)
    266     /* Instantaneous mode */
    267     ISAC_inst->ISACenc_obj.new_framelength = 480;    /* default for I-mode */
    268   else {
    269     ISAC_inst->errorcode = ISAC_DISALLOWED_CODING_MODE;
    270     statusInit = -1;
    271   }
    272 
    273   ISAC_inst->CodingMode = CodingMode;
    274 
    275   WebRtcIsacfix_InitMaskingEnc(&ISAC_inst->ISACenc_obj.maskfiltstr_obj);
    276   WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACenc_obj.prefiltbankstr_obj);
    277   WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACenc_obj.pitchfiltstr_obj);
    278   WebRtcIsacfix_InitPitchAnalysis(&ISAC_inst->ISACenc_obj.pitchanalysisstr_obj);
    279 
    280 
    281   WebRtcIsacfix_InitBandwidthEstimator(&ISAC_inst->bwestimator_obj);
    282   WebRtcIsacfix_InitRateModel(&ISAC_inst->ISACenc_obj.rate_data_obj);
    283 
    284 
    285   ISAC_inst->ISACenc_obj.buffer_index   = 0;
    286   ISAC_inst->ISACenc_obj.frame_nb    = 0;
    287   ISAC_inst->ISACenc_obj.BottleNeck      = 32000; /* default for I-mode */
    288   ISAC_inst->ISACenc_obj.MaxDelay    = 10;    /* default for I-mode */
    289   ISAC_inst->ISACenc_obj.current_framesamples = 0;
    290   ISAC_inst->ISACenc_obj.s2nr     = 0;
    291   ISAC_inst->ISACenc_obj.MaxBits    = 0;
    292   ISAC_inst->ISACenc_obj.bitstr_seed   = 4447;
    293   ISAC_inst->ISACenc_obj.payloadLimitBytes30  = STREAM_MAXW16_30MS << 1;
    294   ISAC_inst->ISACenc_obj.payloadLimitBytes60  = STREAM_MAXW16_60MS << 1;
    295   ISAC_inst->ISACenc_obj.maxPayloadBytes      = STREAM_MAXW16_60MS << 1;
    296   ISAC_inst->ISACenc_obj.maxRateInBytes       = STREAM_MAXW16_30MS << 1;
    297   ISAC_inst->ISACenc_obj.enforceFrameSize     = 0;
    298 
    299   /* Init the bistream data area to zero */
    300   for (k=0; k<STREAM_MAXW16_60MS; k++){
    301     ISAC_inst->ISACenc_obj.bitstr_obj.stream[k] = 0;
    302   }
    303 
    304 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    305   WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACenc_obj.interpolatorstr_obj);
    306 #endif
    307 
    308   // Initiaze function pointers.
    309   WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrC;
    310   WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopC;
    311   WebRtcIsacfix_CalculateResidualEnergy =
    312       WebRtcIsacfix_CalculateResidualEnergyC;
    313   WebRtcIsacfix_AllpassFilter2FixDec16 = WebRtcIsacfix_AllpassFilter2FixDec16C;
    314   WebRtcIsacfix_HighpassFilterFixDec32 = WebRtcIsacfix_HighpassFilterFixDec32C;
    315   WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecC;
    316   WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeC;
    317   WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1C;
    318   WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2C;
    319 
    320 #ifdef WEBRTC_DETECT_ARM_NEON
    321   if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) {
    322     WebRtcIsacfix_InitNeon();
    323   }
    324 #elif defined(WEBRTC_ARCH_ARM_NEON)
    325   WebRtcIsacfix_InitNeon();
    326 #endif
    327 
    328 #if defined(MIPS32_LE)
    329   WebRtcIsacfix_InitMIPS();
    330 #endif
    331 
    332   return statusInit;
    333 }
    334 
    335 /****************************************************************************
    336  * WebRtcIsacfix_Encode(...)
    337  *
    338  * This function encodes 10ms frame(s) and inserts it into a package.
    339  * Input speech length has to be 160 samples (10ms). The encoder buffers those
    340  * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
    341  * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
    342  *
    343  * Input:
    344  *      - ISAC_main_inst    : ISAC instance.
    345  *      - speechIn          : input speech vector.
    346  *
    347  * Output:
    348  *      - encoded           : the encoded data vector
    349  *
    350  * Return value:
    351  *                          : >0 - Length (in bytes) of coded data
    352  *                          :  0 - The buffer didn't reach the chosen framesize
    353  *                            so it keeps buffering speech samples.
    354  *                          : -1 - Error
    355  */
    356 
    357 int16_t WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
    358                              const int16_t    *speechIn,
    359                              uint8_t* encoded)
    360 {
    361   ISACFIX_SubStruct *ISAC_inst;
    362   int16_t stream_len, stream_len_even;
    363 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    364   int k;
    365 #endif
    366 
    367   /* typecast pointer to rela structure */
    368   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    369 
    370 
    371   /* check if encoder initiated */
    372   if ((ISAC_inst->initflag & 2) != 2) {
    373     ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
    374     return (-1);
    375   }
    376 
    377   stream_len = WebRtcIsacfix_EncodeImpl((int16_t*)speechIn,
    378                                         &ISAC_inst->ISACenc_obj,
    379                                         &ISAC_inst->bwestimator_obj,
    380                                         ISAC_inst->CodingMode);
    381   if (stream_len<0) {
    382     ISAC_inst->errorcode = - stream_len;
    383     return -1;
    384   }
    385 
    386   /* One would think that only even stream lengths would make sense here. We do
    387      in fact observe odd lengths, however, and in those cases we copy an extra
    388      byte. */
    389   stream_len_even = stream_len % 2 == 0 ? stream_len : stream_len + 1;
    390 
    391 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    392   /* The encoded data vector is supposesd to be big-endian, but our internal
    393      representation is little-endian. So byteswap. */
    394   for (k = 0; k < stream_len_even / 2; ++k) {
    395     uint16_t s = ISAC_inst->ISACenc_obj.bitstr_obj.stream[k];
    396     /* In big-endian, we have... */
    397     encoded[2 * k] = s >> 8;  /* ...most significant byte at low address... */
    398     encoded[2 * k + 1] = s;  /* ...least significant byte at high address. */
    399   }
    400 #else
    401   /* The encoded data vector and our internal representation are both
    402      big-endian. */
    403   memcpy(encoded, ISAC_inst->ISACenc_obj.bitstr_obj.stream, stream_len_even);
    404 #endif
    405 
    406 
    407 
    408   return stream_len;
    409 
    410 }
    411 
    412 
    413 
    414 
    415 /****************************************************************************
    416  * WebRtcIsacfix_EncodeNb(...)
    417  *
    418  * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts
    419  * it into a package. Input speech length has to be 80 samples (10ms). The encoder
    420  * interpolates into wide-band (16 kHz sampling) buffers those
    421  * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples
    422  * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
    423  *
    424  * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
    425  *
    426  * Input:
    427  *      - ISAC_main_inst    : ISAC instance.
    428  *      - speechIn          : input speech vector.
    429  *
    430  * Output:
    431  *      - encoded           : the encoded data vector
    432  *
    433  * Return value:
    434  *                          : >0 - Length (in bytes) of coded data
    435  *                          :  0 - The buffer didn't reach the chosen framesize
    436  *                            so it keeps buffering speech samples.
    437  *                          : -1 - Error
    438  */
    439 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    440 int16_t WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst,
    441                                const int16_t    *speechIn,
    442                                int16_t          *encoded)
    443 {
    444   ISACFIX_SubStruct *ISAC_inst;
    445   int16_t stream_len;
    446   int16_t speechInWB[FRAMESAMPLES_10ms];
    447   int16_t Vector_Word16_1[FRAMESAMPLES_10ms/2];
    448   int16_t Vector_Word16_2[FRAMESAMPLES_10ms/2];
    449 
    450   int k;
    451 
    452 
    453   /* typecast pointer to rela structure */
    454   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    455 
    456 
    457   /* check if encoder initiated */
    458   if ((ISAC_inst->initflag & 2) != 2) {
    459     ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
    460     return (-1);
    461   }
    462 
    463 
    464   /* Oversample to WB */
    465 
    466   /* Form polyphase signals, and compensate for DC offset */
    467   for (k=0;k<FRAMESAMPLES_10ms/2;k++) {
    468     Vector_Word16_1[k] = speechIn[k] + 1;
    469     Vector_Word16_2[k] = speechIn[k];
    470   }
    471   WebRtcIsacfix_FilterAndCombine2(Vector_Word16_1, Vector_Word16_2, speechInWB, &ISAC_inst->ISACenc_obj.interpolatorstr_obj, FRAMESAMPLES_10ms);
    472 
    473 
    474   /* Encode WB signal */
    475   stream_len = WebRtcIsacfix_EncodeImpl((int16_t*)speechInWB,
    476                                         &ISAC_inst->ISACenc_obj,
    477                                         &ISAC_inst->bwestimator_obj,
    478                                         ISAC_inst->CodingMode);
    479   if (stream_len<0) {
    480     ISAC_inst->errorcode = - stream_len;
    481     return -1;
    482   }
    483 
    484 
    485   /* convert from bytes to int16_t */
    486 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    487   for (k=0;k<(stream_len+1)>>1;k++) {
    488     encoded[k] = (int16_t)(((uint16_t)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8)
    489                                  | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
    490   }
    491 
    492 #else
    493   WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
    494 #endif
    495 
    496 
    497 
    498   return stream_len;
    499 }
    500 #endif  /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
    501 
    502 
    503 /****************************************************************************
    504  * WebRtcIsacfix_GetNewBitStream(...)
    505  *
    506  * This function returns encoded data, with the recieved bwe-index in the
    507  * stream. It should always return a complete packet, i.e. only called once
    508  * even for 60 msec frames
    509  *
    510  * Input:
    511  *      - ISAC_main_inst    : ISAC instance.
    512  *      - bweIndex          : index of bandwidth estimate to put in new bitstream
    513  *
    514  * Output:
    515  *      - encoded           : the encoded data vector
    516  *
    517  * Return value:
    518  *                          : >0 - Length (in bytes) of coded data
    519  *                          : -1 - Error
    520  */
    521 
    522 int16_t WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst,
    523                                       int16_t      bweIndex,
    524                                       float              scale,
    525                                       int16_t        *encoded)
    526 {
    527   ISACFIX_SubStruct *ISAC_inst;
    528   int16_t stream_len;
    529 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    530   int k;
    531 #endif
    532 
    533   /* typecast pointer to rela structure */
    534   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    535 
    536 
    537   /* check if encoder initiated */
    538   if ((ISAC_inst->initflag & 2) != 2) {
    539     ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
    540     return (-1);
    541   }
    542 
    543   stream_len = WebRtcIsacfix_EncodeStoredData(&ISAC_inst->ISACenc_obj,
    544                                               bweIndex,
    545                                               scale);
    546   if (stream_len<0) {
    547     ISAC_inst->errorcode = - stream_len;
    548     return -1;
    549   }
    550 
    551 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    552   for (k=0;k<(stream_len+1)>>1;k++) {
    553     encoded[k] = (int16_t)( ( (uint16_t)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 )
    554                                   | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
    555   }
    556 
    557 #else
    558   WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
    559 #endif
    560 
    561   return stream_len;
    562 
    563 }
    564 
    565 
    566 
    567 /****************************************************************************
    568  * WebRtcIsacfix_DecoderInit(...)
    569  *
    570  * This function initializes a ISAC instance prior to the decoder calls.
    571  *
    572  * Input:
    573  *      - ISAC_main_inst    : ISAC instance.
    574  *
    575  * Return value
    576  *                          :  0 - Ok
    577  *                            -1 - Error
    578  */
    579 
    580 int16_t WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct *ISAC_main_inst)
    581 {
    582   ISACFIX_SubStruct *ISAC_inst;
    583 
    584   /* typecast pointer to real structure */
    585   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    586 
    587   /* flag decoder init */
    588   ISAC_inst->initflag |= 1;
    589 
    590   WebRtcIsacfix_InitMaskingDec(&ISAC_inst->ISACdec_obj.maskfiltstr_obj);
    591   WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACdec_obj.postfiltbankstr_obj);
    592   WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACdec_obj.pitchfiltstr_obj);
    593 
    594   /* TS */
    595   WebRtcIsacfix_InitPlc( &ISAC_inst->ISACdec_obj.plcstr_obj );
    596 
    597 
    598 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    599   WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACdec_obj.decimatorstr_obj);
    600 #endif
    601 
    602   return 0;
    603 }
    604 
    605 
    606 /****************************************************************************
    607  * WebRtcIsacfix_UpdateBwEstimate1(...)
    608  *
    609  * This function updates the estimate of the bandwidth.
    610  *
    611  * Input:
    612  *      - ISAC_main_inst    : ISAC instance.
    613  *      - encoded           : encoded ISAC frame(s).
    614  *      - packet_size       : size of the packet.
    615  *      - rtp_seq_number    : the RTP number of the packet.
    616  *      - arr_ts            : the arrival time of the packet (from NetEq)
    617  *                            in samples.
    618  *
    619  * Return value             :  0 - Ok
    620  *                            -1 - Error
    621  */
    622 
    623 int16_t WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst,
    624                                         const uint16_t   *encoded,
    625                                         int32_t          packet_size,
    626                                         uint16_t         rtp_seq_number,
    627                                         uint32_t         arr_ts)
    628 {
    629   ISACFIX_SubStruct *ISAC_inst;
    630   Bitstr_dec streamdata;
    631 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    632   int k;
    633 #endif
    634   int16_t err;
    635 
    636   /* typecast pointer to real structure */
    637   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    638 
    639   /* Sanity check of packet length */
    640   if (packet_size <= 0) {
    641     /* return error code if the packet length is null or less */
    642     ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
    643     return -1;
    644   } else if (packet_size > (STREAM_MAXW16<<1)) {
    645     /* return error code if length of stream is too long */
    646     ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    647     return -1;
    648   }
    649 
    650   /* check if decoder initiated */
    651   if ((ISAC_inst->initflag & 1) != 1) {
    652     ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
    653     return (-1);
    654   }
    655 
    656   streamdata.W_upper = 0xFFFFFFFF;
    657   streamdata.streamval = 0;
    658   streamdata.stream_index = 0;
    659   streamdata.full = 1;
    660 
    661 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    662   for (k=0; k<5; k++) {
    663     streamdata.stream[k] = (uint16_t) (((uint16_t)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
    664   }
    665 #else
    666   memcpy(streamdata.stream, encoded, 5);
    667 #endif
    668 
    669   err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
    670                                         &streamdata,
    671                                         packet_size,
    672                                         rtp_seq_number,
    673                                         0,
    674                                         arr_ts);
    675 
    676 
    677   if (err < 0)
    678   {
    679     /* return error code if something went wrong */
    680     ISAC_inst->errorcode = -err;
    681     return -1;
    682   }
    683 
    684 
    685   return 0;
    686 }
    687 
    688 /****************************************************************************
    689  * WebRtcIsacfix_UpdateBwEstimate(...)
    690  *
    691  * This function updates the estimate of the bandwidth.
    692  *
    693  * Input:
    694  *      - ISAC_main_inst    : ISAC instance.
    695  *      - encoded           : encoded ISAC frame(s).
    696  *      - packet_size       : size of the packet.
    697  *      - rtp_seq_number    : the RTP number of the packet.
    698  *      - send_ts           : Send Time Stamp from RTP header
    699  *      - arr_ts            : the arrival time of the packet (from NetEq)
    700  *                            in samples.
    701  *
    702  * Return value             :  0 - Ok
    703  *                            -1 - Error
    704  */
    705 
    706 int16_t WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst,
    707                                        const uint16_t   *encoded,
    708                                        int32_t          packet_size,
    709                                        uint16_t         rtp_seq_number,
    710                                        uint32_t         send_ts,
    711                                        uint32_t         arr_ts)
    712 {
    713   ISACFIX_SubStruct *ISAC_inst;
    714   Bitstr_dec streamdata;
    715 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    716   int k;
    717 #endif
    718   int16_t err;
    719 
    720   /* typecast pointer to real structure */
    721   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    722 
    723   /* Sanity check of packet length */
    724   if (packet_size <= 0) {
    725     /* return error code if the packet length is null  or less */
    726     ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
    727     return -1;
    728   } else if (packet_size > (STREAM_MAXW16<<1)) {
    729     /* return error code if length of stream is too long */
    730     ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    731     return -1;
    732   }
    733 
    734   /* check if decoder initiated */
    735   if ((ISAC_inst->initflag & 1) != 1) {
    736     ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
    737     return (-1);
    738   }
    739 
    740   streamdata.W_upper = 0xFFFFFFFF;
    741   streamdata.streamval = 0;
    742   streamdata.stream_index = 0;
    743   streamdata.full = 1;
    744 
    745 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    746   for (k=0; k<5; k++) {
    747     streamdata.stream[k] = (uint16_t) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
    748   }
    749 #else
    750   memcpy(streamdata.stream, encoded, 5);
    751 #endif
    752 
    753   err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
    754                                         &streamdata,
    755                                         packet_size,
    756                                         rtp_seq_number,
    757                                         send_ts,
    758                                         arr_ts);
    759 
    760   if (err < 0)
    761   {
    762     /* return error code if something went wrong */
    763     ISAC_inst->errorcode = -err;
    764     return -1;
    765   }
    766 
    767 
    768   return 0;
    769 }
    770 
    771 /****************************************************************************
    772  * WebRtcIsacfix_Decode(...)
    773  *
    774  * This function decodes a ISAC frame. Output speech length
    775  * will be a multiple of 480 samples: 480 or 960 samples,
    776  * depending on the framesize (30 or 60 ms).
    777  *
    778  * Input:
    779  *      - ISAC_main_inst    : ISAC instance.
    780  *      - encoded           : encoded ISAC frame(s)
    781  *      - len               : bytes in encoded vector
    782  *
    783  * Output:
    784  *      - decoded           : The decoded vector
    785  *
    786  * Return value             : >0 - number of samples in decoded vector
    787  *                            -1 - Error
    788  */
    789 
    790 
    791 int16_t WebRtcIsacfix_Decode(ISACFIX_MainStruct *ISAC_main_inst,
    792                              const uint16_t   *encoded,
    793                              int16_t          len,
    794                              int16_t          *decoded,
    795                              int16_t     *speechType)
    796 {
    797   ISACFIX_SubStruct *ISAC_inst;
    798   /* number of samples (480 or 960), output from decoder */
    799   /* that were actually used in the encoder/decoder (determined on the fly) */
    800   int16_t     number_of_samples;
    801 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    802   int k;
    803 #endif
    804   int16_t declen = 0;
    805 
    806   /* typecast pointer to real structure */
    807   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    808 
    809   /* check if decoder initiated */
    810   if ((ISAC_inst->initflag & 1) != 1) {
    811     ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
    812     return (-1);
    813   }
    814 
    815   /* Sanity check of packet length */
    816   if (len <= 0) {
    817     /* return error code if the packet length is null  or less */
    818     ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
    819     return -1;
    820   } else if (len > (STREAM_MAXW16<<1)) {
    821     /* return error code if length of stream is too long */
    822     ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    823     return -1;
    824   }
    825 
    826   ISAC_inst->ISACdec_obj.bitstr_obj.stream_size = (len + 1) >> 1;
    827 
    828   /* convert bitstream from int16_t to bytes */
    829 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    830   for (k=0; k<(len>>1); k++) {
    831     (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (uint16_t) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
    832   }
    833   if (len & 0x0001)
    834     (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (uint16_t) ((encoded[k] & 0xFF)<<8);
    835 #endif
    836 
    837   /* added for NetEq purposes (VAD/DTX related) */
    838   *speechType=1;
    839 
    840   declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples);
    841 
    842   if (declen < 0) {
    843     /* Some error inside the decoder */
    844     ISAC_inst->errorcode = -declen;
    845     memset(decoded, 0, sizeof(int16_t) * MAX_FRAMESAMPLES);
    846     return -1;
    847   }
    848 
    849   /* error check */
    850 
    851   if (declen & 0x0001) {
    852     if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) {
    853       ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    854       memset(decoded, 0, sizeof(int16_t) * number_of_samples);
    855       return -1;
    856     }
    857   } else {
    858     if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) {
    859       ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    860       memset(decoded, 0, sizeof(int16_t) * number_of_samples);
    861       return -1;
    862     }
    863   }
    864 
    865   return number_of_samples;
    866 }
    867 
    868 
    869 
    870 
    871 
    872 /****************************************************************************
    873  * WebRtcIsacfix_DecodeNb(...)
    874  *
    875  * This function decodes a ISAC frame in narrow-band (8 kHz sampling).
    876  * Output speech length will be a multiple of 240 samples: 240 or 480 samples,
    877  * depending on the framesize (30 or 60 ms).
    878  *
    879  * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
    880  *
    881  * Input:
    882  *      - ISAC_main_inst    : ISAC instance.
    883  *      - encoded           : encoded ISAC frame(s)
    884  *      - len               : bytes in encoded vector
    885  *
    886  * Output:
    887  *      - decoded           : The decoded vector
    888  *
    889  * Return value             : >0 - number of samples in decoded vector
    890  *                            -1 - Error
    891  */
    892 
    893 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    894 int16_t WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct *ISAC_main_inst,
    895                                const uint16_t   *encoded,
    896                                int16_t          len,
    897                                int16_t          *decoded,
    898                                int16_t    *speechType)
    899 {
    900   ISACFIX_SubStruct *ISAC_inst;
    901   /* twice the number of samples (480 or 960), output from decoder */
    902   /* that were actually used in the encoder/decoder (determined on the fly) */
    903   int16_t     number_of_samples;
    904 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    905   int k;
    906 #endif
    907   int16_t declen = 0;
    908   int16_t dummy[FRAMESAMPLES/2];
    909 
    910 
    911   /* typecast pointer to real structure */
    912   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
    913 
    914   /* check if decoder initiated */
    915   if ((ISAC_inst->initflag & 1) != 1) {
    916     ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
    917     return (-1);
    918   }
    919 
    920   if (len == 0)
    921   {  /* return error code if the packet length is null */
    922 
    923     ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
    924     return -1;
    925   }
    926 
    927   ISAC_inst->ISACdec_obj.bitstr_obj.stream_size = (len + 1) >> 1;
    928 
    929   /* convert bitstream from int16_t to bytes */
    930 #ifndef WEBRTC_ARCH_BIG_ENDIAN
    931   for (k=0; k<(len>>1); k++) {
    932     (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (uint16_t) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
    933   }
    934   if (len & 0x0001)
    935     (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (uint16_t) ((encoded[k] & 0xFF)<<8);
    936 #endif
    937 
    938   /* added for NetEq purposes (VAD/DTX related) */
    939   *speechType=1;
    940 
    941   declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples);
    942 
    943   if (declen < 0) {
    944     /* Some error inside the decoder */
    945     ISAC_inst->errorcode = -declen;
    946     memset(decoded, 0, sizeof(int16_t) * FRAMESAMPLES);
    947     return -1;
    948   }
    949 
    950   /* error check */
    951 
    952   if (declen & 0x0001) {
    953     if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) {
    954       ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    955       memset(decoded, 0, sizeof(int16_t) * number_of_samples);
    956       return -1;
    957     }
    958   } else {
    959     if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) {
    960       ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
    961       memset(decoded, 0, sizeof(int16_t) * number_of_samples);
    962       return -1;
    963     }
    964   }
    965 
    966   WebRtcIsacfix_SplitAndFilter2(decoded, decoded, dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
    967 
    968   if (number_of_samples>FRAMESAMPLES) {
    969     WebRtcIsacfix_SplitAndFilter2(decoded + FRAMESAMPLES, decoded + FRAMESAMPLES/2,
    970                                   dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
    971   }
    972 
    973   return number_of_samples/2;
    974 }
    975 #endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
    976 
    977 
    978 /****************************************************************************
    979  * WebRtcIsacfix_DecodePlcNb(...)
    980  *
    981  * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling).
    982  * Output speech length  will be "240*noOfLostFrames" samples
    983  * that is equevalent of "30*noOfLostFrames" millisecond.
    984  *
    985  * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
    986  *
    987  * Input:
    988  *      - ISAC_main_inst    : ISAC instance.
    989  *      - noOfLostFrames    : Number of PLC frames (240 sample=30ms) to produce
    990  *
    991  * Output:
    992  *      - decoded           : The decoded vector
    993  *
    994  * Return value             : >0 - number of samples in decoded PLC vector
    995  *                            -1 - Error
    996  */
    997 
    998 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
    999 int16_t WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct *ISAC_main_inst,
   1000                                   int16_t          *decoded,
   1001                                   int16_t noOfLostFrames )
   1002 {
   1003   int16_t no_of_samples, declen, k, ok;
   1004   int16_t outframeNB[FRAMESAMPLES];
   1005   int16_t outframeWB[FRAMESAMPLES];
   1006   int16_t dummy[FRAMESAMPLES/2];
   1007 
   1008 
   1009   ISACFIX_SubStruct *ISAC_inst;
   1010   /* typecast pointer to real structure */
   1011   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1012 
   1013   /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
   1014   if (noOfLostFrames > 2){
   1015     noOfLostFrames = 2;
   1016   }
   1017 
   1018   k = 0;
   1019   declen = 0;
   1020   while( noOfLostFrames > 0 )
   1021   {
   1022     ok = WebRtcIsacfix_DecodePlcImpl( outframeWB, &ISAC_inst->ISACdec_obj, &no_of_samples );
   1023     if(ok)
   1024       return -1;
   1025 
   1026     WebRtcIsacfix_SplitAndFilter2(outframeWB, &(outframeNB[k*240]), dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
   1027 
   1028     declen += no_of_samples;
   1029     noOfLostFrames--;
   1030     k++;
   1031   }
   1032 
   1033   declen>>=1;
   1034 
   1035   for (k=0;k<declen;k++) {
   1036     decoded[k] = outframeNB[k];
   1037   }
   1038 
   1039   return declen;
   1040 }
   1041 #endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
   1042 
   1043 
   1044 
   1045 
   1046 /****************************************************************************
   1047  * WebRtcIsacfix_DecodePlc(...)
   1048  *
   1049  * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling).
   1050  * Output speech length  will be "480*noOfLostFrames" samples
   1051  * that is equevalent of "30*noOfLostFrames" millisecond.
   1052  *
   1053  * Input:
   1054  *      - ISAC_main_inst    : ISAC instance.
   1055  *      - noOfLostFrames    : Number of PLC frames (480sample = 30ms)
   1056  *                                to produce
   1057  *
   1058  * Output:
   1059  *      - decoded           : The decoded vector
   1060  *
   1061  * Return value             : >0 - number of samples in decoded PLC vector
   1062  *                            -1 - Error
   1063  */
   1064 
   1065 int16_t WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct *ISAC_main_inst,
   1066                                 int16_t          *decoded,
   1067                                 int16_t noOfLostFrames)
   1068 {
   1069 
   1070   int16_t no_of_samples, declen, k, ok;
   1071   int16_t outframe16[MAX_FRAMESAMPLES];
   1072 
   1073   ISACFIX_SubStruct *ISAC_inst;
   1074   /* typecast pointer to real structure */
   1075   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1076 
   1077   /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
   1078   if (noOfLostFrames > 2) {
   1079     noOfLostFrames = 2;
   1080   }
   1081   k = 0;
   1082   declen = 0;
   1083   while( noOfLostFrames > 0 )
   1084   {
   1085     ok = WebRtcIsacfix_DecodePlcImpl( &(outframe16[k*480]), &ISAC_inst->ISACdec_obj, &no_of_samples );
   1086     if(ok)
   1087       return -1;
   1088     declen += no_of_samples;
   1089     noOfLostFrames--;
   1090     k++;
   1091   }
   1092 
   1093   for (k=0;k<declen;k++) {
   1094     decoded[k] = outframe16[k];
   1095   }
   1096 
   1097   return declen;
   1098 }
   1099 
   1100 
   1101 /****************************************************************************
   1102  * WebRtcIsacfix_Control(...)
   1103  *
   1104  * This function sets the limit on the short-term average bit rate and the
   1105  * frame length. Should be used only in Instantaneous mode.
   1106  *
   1107  * Input:
   1108  *      - ISAC_main_inst    : ISAC instance.
   1109  *      - rate              : limit on the short-term average bit rate,
   1110  *                            in bits/second (between 10000 and 32000)
   1111  *      - framesize         : number of milliseconds per frame (30 or 60)
   1112  *
   1113  * Return value             : 0  - ok
   1114  *                            -1 - Error
   1115  */
   1116 
   1117 int16_t WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst,
   1118                               int16_t          rate,
   1119                               int16_t          framesize)
   1120 {
   1121   ISACFIX_SubStruct *ISAC_inst;
   1122   /* typecast pointer to real structure */
   1123   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1124 
   1125   if (ISAC_inst->CodingMode == 0)
   1126   {
   1127     /* in adaptive mode */
   1128     ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
   1129     return -1;
   1130   }
   1131 
   1132 
   1133   if (rate >= 10000 && rate <= 32000)
   1134     ISAC_inst->ISACenc_obj.BottleNeck = rate;
   1135   else {
   1136     ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
   1137     return -1;
   1138   }
   1139 
   1140 
   1141 
   1142   if (framesize  == 30 || framesize == 60)
   1143     ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * framesize;
   1144   else {
   1145     ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
   1146     return -1;
   1147   }
   1148 
   1149   return 0;
   1150 }
   1151 
   1152 
   1153 /****************************************************************************
   1154  * WebRtcIsacfix_ControlBwe(...)
   1155  *
   1156  * This function sets the initial values of bottleneck and frame-size if
   1157  * iSAC is used in channel-adaptive mode. Through this API, users can
   1158  * enforce a frame-size for all values of bottleneck. Then iSAC will not
   1159  * automatically change the frame-size.
   1160  *
   1161  *
   1162  * Input:
   1163  *  - ISAC_main_inst : ISAC instance.
   1164  *      - rateBPS           : initial value of bottleneck in bits/second
   1165  *                            10000 <= rateBPS <= 32000 is accepted
   1166  *                            For default bottleneck set rateBPS = 0
   1167  *      - frameSizeMs       : number of milliseconds per frame (30 or 60)
   1168  *      - enforceFrameSize  : 1 to enforce the given frame-size through out
   1169  *                            the adaptation process, 0 to let iSAC change
   1170  *                            the frame-size if required.
   1171  *
   1172  * Return value    : 0  - ok
   1173  *         -1 - Error
   1174  */
   1175 
   1176 int16_t WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst,
   1177                                  int16_t rateBPS,
   1178                                  int16_t frameSizeMs,
   1179                                  int16_t enforceFrameSize)
   1180 {
   1181   ISACFIX_SubStruct *ISAC_inst;
   1182   /* Typecast pointer to real structure */
   1183   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1184 
   1185   /* check if encoder initiated */
   1186   if ((ISAC_inst->initflag & 2) != 2) {
   1187     ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
   1188     return (-1);
   1189   }
   1190 
   1191   /* Check that we are in channel-adaptive mode, otherwise, return -1 */
   1192   if (ISAC_inst->CodingMode != 0) {
   1193     ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
   1194     return (-1);
   1195   }
   1196 
   1197   /* Set struct variable if enforceFrameSize is set. ISAC will then keep the */
   1198   /* chosen frame size.                                                      */
   1199   ISAC_inst->ISACenc_obj.enforceFrameSize = (enforceFrameSize != 0)? 1:0;
   1200 
   1201   /* Set initial rate, if value between 10000 and 32000,                */
   1202   /* if rateBPS is 0, keep the default initial bottleneck value (15000) */
   1203   if ((rateBPS >= 10000) && (rateBPS <= 32000)) {
   1204     ISAC_inst->bwestimator_obj.sendBwAvg = (((uint32_t)rateBPS) << 7);
   1205   } else if (rateBPS != 0) {
   1206     ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
   1207     return -1;
   1208   }
   1209 
   1210   /* Set initial framesize. If enforceFrameSize is set the frame size will not change */
   1211   if ((frameSizeMs  == 30) || (frameSizeMs == 60)) {
   1212     ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * frameSizeMs;
   1213   } else {
   1214     ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
   1215     return -1;
   1216   }
   1217 
   1218   return 0;
   1219 }
   1220 
   1221 
   1222 
   1223 
   1224 
   1225 /****************************************************************************
   1226  * WebRtcIsacfix_GetDownLinkBwIndex(...)
   1227  *
   1228  * This function returns index representing the Bandwidth estimate from
   1229  * other side to this side.
   1230  *
   1231  * Input:
   1232  *      - ISAC_main_inst: iSAC struct
   1233  *
   1234  * Output:
   1235  *      - rateIndex     : Bandwidth estimate to transmit to other side.
   1236  *
   1237  */
   1238 
   1239 int16_t WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst,
   1240                                          int16_t*     rateIndex)
   1241 {
   1242   ISACFIX_SubStruct *ISAC_inst;
   1243 
   1244   /* typecast pointer to real structure */
   1245   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1246 
   1247   /* Call function to get Bandwidth Estimate */
   1248   *rateIndex = WebRtcIsacfix_GetDownlinkBwIndexImpl(&ISAC_inst->bwestimator_obj);
   1249 
   1250   return 0;
   1251 }
   1252 
   1253 
   1254 /****************************************************************************
   1255  * WebRtcIsacfix_UpdateUplinkBw(...)
   1256  *
   1257  * This function takes an index representing the Bandwidth estimate from
   1258  * this side to other side and updates BWE.
   1259  *
   1260  * Input:
   1261  *      - ISAC_main_inst: iSAC struct
   1262  *      - rateIndex     : Bandwidth estimate from other side.
   1263  *
   1264  */
   1265 
   1266 int16_t WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst,
   1267                                      int16_t     rateIndex)
   1268 {
   1269   int16_t err = 0;
   1270   ISACFIX_SubStruct *ISAC_inst;
   1271 
   1272   /* typecast pointer to real structure */
   1273   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1274 
   1275   /* Call function to update BWE with received Bandwidth Estimate */
   1276   err = WebRtcIsacfix_UpdateUplinkBwRec(&ISAC_inst->bwestimator_obj, rateIndex);
   1277   if (err < 0) {
   1278     ISAC_inst->errorcode = -err;
   1279     return (-1);
   1280   }
   1281 
   1282   return 0;
   1283 }
   1284 
   1285 /****************************************************************************
   1286  * WebRtcIsacfix_ReadFrameLen(...)
   1287  *
   1288  * This function returns the length of the frame represented in the packet.
   1289  *
   1290  * Input:
   1291  *      - encoded       : Encoded bitstream
   1292  *
   1293  * Output:
   1294  *      - frameLength   : Length of frame in packet (in samples)
   1295  *
   1296  */
   1297 
   1298 int16_t WebRtcIsacfix_ReadFrameLen(const int16_t* encoded,
   1299                                    int16_t* frameLength)
   1300 {
   1301   Bitstr_dec streamdata;
   1302 #ifndef WEBRTC_ARCH_BIG_ENDIAN
   1303   int k;
   1304 #endif
   1305   int16_t err;
   1306 
   1307   streamdata.W_upper = 0xFFFFFFFF;
   1308   streamdata.streamval = 0;
   1309   streamdata.stream_index = 0;
   1310   streamdata.full = 1;
   1311 
   1312 #ifndef WEBRTC_ARCH_BIG_ENDIAN
   1313   for (k=0; k<5; k++) {
   1314     streamdata.stream[k] = (uint16_t) (((uint16_t)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
   1315   }
   1316 #else
   1317   memcpy(streamdata.stream, encoded, 5);
   1318 #endif
   1319 
   1320   /* decode frame length */
   1321   err = WebRtcIsacfix_DecodeFrameLen(&streamdata, frameLength);
   1322   if (err<0)  // error check
   1323     return err;
   1324 
   1325   return 0;
   1326 }
   1327 
   1328 
   1329 /****************************************************************************
   1330  * WebRtcIsacfix_ReadBwIndex(...)
   1331  *
   1332  * This function returns the index of the Bandwidth estimate from the bitstream.
   1333  *
   1334  * Input:
   1335  *      - encoded       : Encoded bitstream
   1336  *
   1337  * Output:
   1338  *      - frameLength   : Length of frame in packet (in samples)
   1339  *      - rateIndex     : Bandwidth estimate in bitstream
   1340  *
   1341  */
   1342 
   1343 int16_t WebRtcIsacfix_ReadBwIndex(const int16_t* encoded,
   1344                                   int16_t* rateIndex)
   1345 {
   1346   Bitstr_dec streamdata;
   1347 #ifndef WEBRTC_ARCH_BIG_ENDIAN
   1348   int k;
   1349 #endif
   1350   int16_t err;
   1351 
   1352   streamdata.W_upper = 0xFFFFFFFF;
   1353   streamdata.streamval = 0;
   1354   streamdata.stream_index = 0;
   1355   streamdata.full = 1;
   1356 
   1357 #ifndef WEBRTC_ARCH_BIG_ENDIAN
   1358   for (k=0; k<5; k++) {
   1359     streamdata.stream[k] = (uint16_t) (((uint16_t)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
   1360   }
   1361 #else
   1362   memcpy(streamdata.stream, encoded, 5);
   1363 #endif
   1364 
   1365   /* decode frame length, needed to get to the rateIndex in the bitstream */
   1366   err = WebRtcIsacfix_DecodeFrameLen(&streamdata, rateIndex);
   1367   if (err<0)  // error check
   1368     return err;
   1369 
   1370   /* decode BW estimation */
   1371   err = WebRtcIsacfix_DecodeSendBandwidth(&streamdata, rateIndex);
   1372   if (err<0)  // error check
   1373     return err;
   1374 
   1375   return 0;
   1376 }
   1377 
   1378 
   1379 
   1380 
   1381 /****************************************************************************
   1382  * WebRtcIsacfix_GetErrorCode(...)
   1383  *
   1384  * This function can be used to check the error code of an iSAC instance. When
   1385  * a function returns -1 a error code will be set for that instance. The
   1386  * function below extract the code of the last error that occured in the
   1387  * specified instance.
   1388  *
   1389  * Input:
   1390  *      - ISAC_main_inst    : ISAC instance
   1391  *
   1392  * Return value             : Error code
   1393  */
   1394 
   1395 int16_t WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst)
   1396 {
   1397   ISACFIX_SubStruct *ISAC_inst;
   1398   /* typecast pointer to real structure */
   1399   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1400 
   1401   return ISAC_inst->errorcode;
   1402 }
   1403 
   1404 
   1405 
   1406 /****************************************************************************
   1407  * WebRtcIsacfix_GetUplinkBw(...)
   1408  *
   1409  * This function returns the inst quantized iSAC send bitrate
   1410  *
   1411  * Input:
   1412  *      - ISAC_main_inst    : iSAC instance
   1413  *
   1414  * Return value             : bitrate
   1415  */
   1416 
   1417 int32_t WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst)
   1418 {
   1419   ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1420   BwEstimatorstr * bw = (BwEstimatorstr*)&(ISAC_inst->bwestimator_obj);
   1421 
   1422   return (int32_t) WebRtcIsacfix_GetUplinkBandwidth(bw);
   1423 }
   1424 
   1425 /****************************************************************************
   1426  * WebRtcIsacfix_GetNewFrameLen(...)
   1427  *
   1428  * This function return the next frame length (in samples) of iSAC.
   1429  *
   1430  * Input:
   1431  *      - ISAC_main_inst    : iSAC instance
   1432  *
   1433  * Return value             :  frame lenght in samples
   1434  */
   1435 
   1436 int16_t WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst)
   1437 {
   1438   ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1439   return ISAC_inst->ISACenc_obj.new_framelength;
   1440 }
   1441 
   1442 
   1443 /****************************************************************************
   1444  * WebRtcIsacfix_SetMaxPayloadSize(...)
   1445  *
   1446  * This function sets a limit for the maximum payload size of iSAC. The same
   1447  * value is used both for 30 and 60 msec packets.
   1448  * The absolute max will be valid until next time the function is called.
   1449  * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate()
   1450  *
   1451  * Input:
   1452  *      - ISAC_main_inst    : iSAC instance
   1453  *      - maxPayloadBytes   : maximum size of the payload in bytes
   1454  *                            valid values are between 100 and 400 bytes
   1455  *
   1456  *
   1457  * Return value             : 0 if sucessful
   1458  *                           -1 if error happens
   1459  */
   1460 
   1461 int16_t WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst,
   1462                                         int16_t maxPayloadBytes)
   1463 {
   1464   ISACFIX_SubStruct *ISAC_inst;
   1465 
   1466   /* typecast pointer to real structure */
   1467   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1468 
   1469   if((maxPayloadBytes < 100) || (maxPayloadBytes > 400))
   1470   {
   1471     /* maxPayloadBytes is out of valid range */
   1472     return -1;
   1473   }
   1474   else
   1475   {
   1476     /* Set new absolute max, which will not change unless this function
   1477        is called again with a new value */
   1478     ISAC_inst->ISACenc_obj.maxPayloadBytes = maxPayloadBytes;
   1479 
   1480     /* Set new maximum values for 30 and 60 msec packets */
   1481     if (maxPayloadBytes < ISAC_inst->ISACenc_obj.maxRateInBytes) {
   1482       ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxPayloadBytes;
   1483     } else {
   1484       ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxRateInBytes;
   1485     }
   1486 
   1487     if ( maxPayloadBytes < (ISAC_inst->ISACenc_obj.maxRateInBytes << 1)) {
   1488       ISAC_inst->ISACenc_obj.payloadLimitBytes60 = maxPayloadBytes;
   1489     } else {
   1490       ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (ISAC_inst->ISACenc_obj.maxRateInBytes << 1);
   1491     }
   1492   }
   1493   return 0;
   1494 }
   1495 
   1496 
   1497 /****************************************************************************
   1498  * WebRtcIsacfix_SetMaxRate(...)
   1499  *
   1500  * This function sets the maximum rate which the codec may not exceed for a
   1501  * singel packet. The maximum rate is set in bits per second.
   1502  * The codec has an absolute maximum rate of 53400 bits per second (200 bytes
   1503  * per 30 msec).
   1504  * It is possible to set a maximum rate between 32000 and 53400 bits per second.
   1505  *
   1506  * The rate limit is valid until next time the function is called.
   1507  *
   1508  * NOTE! Packet size will never go above the value set if calling
   1509  * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes).
   1510  *
   1511  * Input:
   1512  *      - ISAC_main_inst    : iSAC instance
   1513  *      - maxRateInBytes    : maximum rate in bits per second,
   1514  *                            valid values are 32000 to 53400 bits
   1515  *
   1516  * Return value             : 0 if sucessful
   1517  *                           -1 if error happens
   1518  */
   1519 
   1520 int16_t WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst,
   1521                                  int32_t maxRate)
   1522 {
   1523   ISACFIX_SubStruct *ISAC_inst;
   1524   int16_t maxRateInBytes;
   1525 
   1526   /* typecast pointer to real structure */
   1527   ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
   1528 
   1529   if((maxRate < 32000) || (maxRate > 53400))
   1530   {
   1531     /* maxRate is out of valid range */
   1532     return -1;
   1533   }
   1534   else
   1535   {
   1536     /* Calculate maximum number of bytes per 30 msec packets for the given
   1537        maximum rate. Multiply with 30/1000 to get number of bits per 30 msec,
   1538        divide by 8 to get number of bytes per 30 msec:
   1539        maxRateInBytes = floor((maxRate * 30/1000) / 8); */
   1540     maxRateInBytes = (int16_t)( WebRtcSpl_DivW32W16ResW16(WEBRTC_SPL_MUL(maxRate, 3), 800) );
   1541 
   1542     /* Store the value for usage in the WebRtcIsacfix_SetMaxPayloadSize-function */
   1543     ISAC_inst->ISACenc_obj.maxRateInBytes = maxRateInBytes;
   1544 
   1545     /* For 30 msec packets: if the new limit is below the maximum
   1546        payload size, set a new limit */
   1547     if (maxRateInBytes < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
   1548       ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxRateInBytes;
   1549     } else {
   1550       ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
   1551     }
   1552 
   1553     /* For 60 msec packets: if the new limit (times 2) is below the
   1554        maximum payload size, set a new limit */
   1555     if ( (maxRateInBytes << 1) < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
   1556       ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (maxRateInBytes << 1);
   1557     } else {
   1558       ISAC_inst->ISACenc_obj.payloadLimitBytes60 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
   1559     }
   1560   }
   1561 
   1562   return 0;
   1563 }
   1564 
   1565 
   1566 
   1567 /****************************************************************************
   1568  * WebRtcIsacfix_version(...)
   1569  *
   1570  * This function returns the version number.
   1571  *
   1572  * Output:
   1573  *      - version  : Pointer to character string
   1574  *
   1575  */
   1576 
   1577 void WebRtcIsacfix_version(char *version)
   1578 {
   1579   strcpy(version, "3.6.0");
   1580 }
   1581