Home | History | Annotate | Download | only in include
      1 /*
      2  *  Copyright (c) 2011 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 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_
     12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_
     13 
     14 #include <stddef.h>
     15 
     16 #include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
     17 #include "webrtc/typedefs.h"
     18 
     19 typedef struct WebRtcISACStruct    ISACStruct;
     20 
     21 #if defined(__cplusplus)
     22 extern "C" {
     23 #endif
     24 
     25   /******************************************************************************
     26    * WebRtcIsac_AssignSize(...)
     27    *
     28    * This function returns the size of the ISAC instance, so that the instance
     29    * can be created outside iSAC.
     30    *
     31    * Input:
     32    *        - samplingRate      : sampling rate of the input/output audio.
     33    *
     34    * Output:
     35    *        - sizeinbytes       : number of bytes needed to allocate for the
     36    *                              instance.
     37    *
     38    * Return value               : 0 - Ok
     39    *                             -1 - Error
     40    */
     41 
     42   int16_t WebRtcIsac_AssignSize(
     43       int* sizeinbytes);
     44 
     45 
     46   /******************************************************************************
     47    * WebRtcIsac_Assign(...)
     48    *
     49    * This function assignes the memory already created to the ISAC instance.
     50    *
     51    * Input:
     52    *        - *ISAC_main_inst   : a pointer to the coder instance.
     53    *        - samplingRate      : sampling rate of the input/output audio.
     54    *        - ISAC_inst_Addr    : the already allocated memory, where we put the
     55    *                              iSAC structure.
     56    *
     57    * Return value               : 0 - Ok
     58    *                             -1 - Error
     59    */
     60 
     61   int16_t WebRtcIsac_Assign(
     62       ISACStruct** ISAC_main_inst,
     63       void*        ISAC_inst_Addr);
     64 
     65 
     66   /******************************************************************************
     67    * WebRtcIsac_Create(...)
     68    *
     69    * This function creates an ISAC instance, which will contain the state
     70    * information for one coding/decoding channel.
     71    *
     72    * Input:
     73    *        - *ISAC_main_inst   : a pointer to the coder instance.
     74    *
     75    * Return value               : 0 - Ok
     76    *                             -1 - Error
     77    */
     78 
     79   int16_t WebRtcIsac_Create(
     80       ISACStruct** ISAC_main_inst);
     81 
     82 
     83   /******************************************************************************
     84    * WebRtcIsac_Free(...)
     85    *
     86    * This function frees the ISAC instance created at the beginning.
     87    *
     88    * Input:
     89    *        - ISAC_main_inst    : an ISAC instance.
     90    *
     91    * Return value               : 0 - Ok
     92    *                             -1 - Error
     93    */
     94 
     95   int16_t WebRtcIsac_Free(
     96       ISACStruct* ISAC_main_inst);
     97 
     98 
     99   /******************************************************************************
    100    * WebRtcIsac_EncoderInit(...)
    101    *
    102    * This function initializes an ISAC instance prior to the encoder calls.
    103    *
    104    * Input:
    105    *        - ISAC_main_inst    : ISAC instance.
    106    *        - CodingMode        : 0 -> Bit rate and frame length are
    107    *                                automatically adjusted to available bandwidth
    108    *                                on transmission channel, just valid if codec
    109    *                                is created to work in wideband mode.
    110    *                              1 -> User sets a frame length and a target bit
    111    *                                rate which is taken as the maximum
    112    *                                short-term average bit rate.
    113    *
    114    * Return value               : 0 - Ok
    115    *                             -1 - Error
    116    */
    117 
    118   int16_t WebRtcIsac_EncoderInit(
    119       ISACStruct* ISAC_main_inst,
    120       int16_t CodingMode);
    121 
    122 
    123   /******************************************************************************
    124    * WebRtcIsac_Encode(...)
    125    *
    126    * This function encodes 10ms audio blocks and inserts it into a package.
    127    * Input speech length has 160 samples if operating at 16 kHz sampling
    128    * rate, or 320 if operating at 32 kHz sampling rate. The encoder buffers the
    129    * input audio until the whole frame is buffered then proceeds with encoding.
    130    *
    131    *
    132    * Input:
    133    *        - ISAC_main_inst    : ISAC instance.
    134    *        - speechIn          : input speech vector.
    135    *
    136    * Output:
    137    *        - encoded           : the encoded data vector
    138    *
    139    * Return value:
    140    *                            : >0 - Length (in bytes) of coded data
    141    *                            :  0 - The buffer didn't reach the chosen
    142    *                               frame-size so it keeps buffering speech
    143    *                               samples.
    144    *                            : -1 - Error
    145    */
    146 
    147   int WebRtcIsac_Encode(
    148       ISACStruct*        ISAC_main_inst,
    149       const int16_t* speechIn,
    150       uint8_t* encoded);
    151 
    152 
    153   /******************************************************************************
    154    * WebRtcIsac_DecoderInit(...)
    155    *
    156    * This function initializes an ISAC instance prior to the decoder calls.
    157    *
    158    * Input:
    159    *        - ISAC_main_inst    : ISAC instance.
    160    */
    161 
    162   void WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst);
    163 
    164   /******************************************************************************
    165    * WebRtcIsac_UpdateBwEstimate(...)
    166    *
    167    * This function updates the estimate of the bandwidth.
    168    *
    169    * Input:
    170    *        - ISAC_main_inst    : ISAC instance.
    171    *        - encoded           : encoded ISAC frame(s).
    172    *        - packet_size       : size of the packet.
    173    *        - rtp_seq_number    : the RTP number of the packet.
    174    *        - send_ts           : the RTP send timestamp, given in samples
    175    *        - arr_ts            : the arrival time of the packet (from NetEq)
    176    *                              in samples.
    177    *
    178    * Return value               : 0 - Ok
    179    *                             -1 - Error
    180    */
    181 
    182   int16_t WebRtcIsac_UpdateBwEstimate(
    183       ISACStruct*         ISAC_main_inst,
    184       const uint8_t* encoded,
    185       size_t         packet_size,
    186       uint16_t        rtp_seq_number,
    187       uint32_t        send_ts,
    188       uint32_t        arr_ts);
    189 
    190 
    191   /******************************************************************************
    192    * WebRtcIsac_Decode(...)
    193    *
    194    * This function decodes an ISAC frame. At 16 kHz sampling rate, the length
    195    * of the output audio could be either 480 or 960 samples, equivalent to
    196    * 30 or 60 ms respectively. At 32 kHz sampling rate, the length of the
    197    * output audio is 960 samples, which is 30 ms.
    198    *
    199    * Input:
    200    *        - ISAC_main_inst    : ISAC instance.
    201    *        - encoded           : encoded ISAC frame(s).
    202    *        - len               : bytes in encoded vector.
    203    *
    204    * Output:
    205    *        - decoded           : The decoded vector.
    206    *
    207    * Return value               : >0 - number of samples in decoded vector.
    208    *                              -1 - Error.
    209    */
    210 
    211   int WebRtcIsac_Decode(
    212       ISACStruct*           ISAC_main_inst,
    213       const uint8_t* encoded,
    214       size_t         len,
    215       int16_t*        decoded,
    216       int16_t*        speechType);
    217 
    218 
    219   /******************************************************************************
    220    * WebRtcIsac_DecodePlc(...)
    221    *
    222    * This function conducts PLC for ISAC frame(s). Output speech length
    223    * will be a multiple of frames, i.e. multiples of 30 ms audio. Therefore,
    224    * the output is multiple of 480 samples if operating at 16 kHz and multiple
    225    * of 960 if operating at 32 kHz.
    226    *
    227    * Input:
    228    *        - ISAC_main_inst    : ISAC instance.
    229    *        - noOfLostFrames    : Number of PLC frames to produce.
    230    *
    231    * Output:
    232    *        - decoded           : The decoded vector.
    233    *
    234    * Return value               : Number of samples in decoded PLC vector
    235    */
    236 
    237   size_t WebRtcIsac_DecodePlc(
    238       ISACStruct*  ISAC_main_inst,
    239       int16_t* decoded,
    240       size_t  noOfLostFrames);
    241 
    242 
    243   /******************************************************************************
    244    * WebRtcIsac_Control(...)
    245    *
    246    * This function sets the limit on the short-term average bit-rate and the
    247    * frame length. Should be used only in Instantaneous mode. At 16 kHz sampling
    248    * rate, an average bit-rate between 10000 to 32000 bps is valid and a
    249    * frame-size of 30 or 60 ms is acceptable. At 32 kHz, an average bit-rate
    250    * between 10000 to 56000 is acceptable, and the valid frame-size is 30 ms.
    251    *
    252    * Input:
    253    *        - ISAC_main_inst    : ISAC instance.
    254    *        - rate              : limit on the short-term average bit rate,
    255    *                              in bits/second.
    256    *        - framesize         : frame-size in millisecond.
    257    *
    258    * Return value               : 0  - ok
    259    *                             -1 - Error
    260    */
    261 
    262   int16_t WebRtcIsac_Control(
    263       ISACStruct*   ISAC_main_inst,
    264       int32_t rate,
    265       int framesize);
    266 
    267   void WebRtcIsac_SetInitialBweBottleneck(ISACStruct* ISAC_main_inst,
    268                                           int bottleneck_bits_per_second);
    269 
    270   /******************************************************************************
    271    * WebRtcIsac_ControlBwe(...)
    272    *
    273    * This function sets the initial values of bottleneck and frame-size if
    274    * iSAC is used in channel-adaptive mode. Therefore, this API is not
    275    * applicable if the codec is created to operate in super-wideband mode.
    276    *
    277    * Through this API, users can enforce a frame-size for all values of
    278    * bottleneck. Then iSAC will not automatically change the frame-size.
    279    *
    280    *
    281    * Input:
    282    *        - ISAC_main_inst    : ISAC instance.
    283    *        - rateBPS           : initial value of bottleneck in bits/second
    284    *                              10000 <= rateBPS <= 56000 is accepted
    285    *                              For default bottleneck set rateBPS = 0
    286    *        - frameSizeMs       : number of milliseconds per frame (30 or 60)
    287    *        - enforceFrameSize  : 1 to enforce the given frame-size through
    288    *                              out the adaptation process, 0 to let iSAC
    289    *                              change the frame-size if required.
    290    *
    291    * Return value               : 0  - ok
    292    *                             -1 - Error
    293    */
    294 
    295   int16_t WebRtcIsac_ControlBwe(
    296       ISACStruct* ISAC_main_inst,
    297       int32_t rateBPS,
    298       int frameSizeMs,
    299       int16_t enforceFrameSize);
    300 
    301 
    302   /******************************************************************************
    303    * WebRtcIsac_ReadFrameLen(...)
    304    *
    305    * This function returns the length of the frame represented in the packet.
    306    *
    307    * Input:
    308    *        - encoded           : Encoded bit-stream
    309    *
    310    * Output:
    311    *        - frameLength       : Length of frame in packet (in samples)
    312    *
    313    */
    314 
    315   int16_t WebRtcIsac_ReadFrameLen(
    316       ISACStruct*          ISAC_main_inst,
    317       const uint8_t* encoded,
    318       int16_t*       frameLength);
    319 
    320 
    321   /******************************************************************************
    322    * WebRtcIsac_version(...)
    323    *
    324    * This function returns the version number.
    325    *
    326    * Output:
    327    *        - version      : Pointer to character string
    328    *
    329    */
    330 
    331   void WebRtcIsac_version(
    332       char *version);
    333 
    334 
    335   /******************************************************************************
    336    * WebRtcIsac_GetErrorCode(...)
    337    *
    338    * This function can be used to check the error code of an iSAC instance. When
    339    * a function returns -1 a error code will be set for that instance. The
    340    * function below extract the code of the last error that occurred in the
    341    * specified instance.
    342    *
    343    * Input:
    344    *        - ISAC_main_inst    : ISAC instance
    345    *
    346    * Return value               : Error code
    347    */
    348 
    349   int16_t WebRtcIsac_GetErrorCode(
    350       ISACStruct* ISAC_main_inst);
    351 
    352 
    353   /****************************************************************************
    354    * WebRtcIsac_GetUplinkBw(...)
    355    *
    356    * This function outputs the target bottleneck of the codec. In
    357    * channel-adaptive mode, the target bottleneck is specified through in-band
    358    * signalling retreived by bandwidth estimator.
    359    * In channel-independent, also called instantaneous mode, the target
    360    * bottleneck is provided to the encoder by calling xxx_control(...). If
    361    * xxx_control is never called the default values is returned. The default
    362    * value for bottleneck at 16 kHz encoder sampling rate is 32000 bits/sec,
    363    * and it is 56000 bits/sec for 32 kHz sampling rate.
    364    * Note that the output is the iSAC internal operating bottleneck which might
    365    * differ slightly from the one provided through xxx_control().
    366    *
    367    * Input:
    368    *        - ISAC_main_inst    : iSAC instance
    369    *
    370    * Output:
    371    *        - *bottleneck       : bottleneck in bits/sec
    372    *
    373    * Return value               : -1 if error happens
    374    *                               0 bit-rates computed correctly.
    375    */
    376 
    377   int16_t WebRtcIsac_GetUplinkBw(
    378       ISACStruct*    ISAC_main_inst,
    379       int32_t* bottleneck);
    380 
    381 
    382   /******************************************************************************
    383    * WebRtcIsac_SetMaxPayloadSize(...)
    384    *
    385    * This function sets a limit for the maximum payload size of iSAC. The same
    386    * value is used both for 30 and 60 ms packets. If the encoder sampling rate
    387    * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
    388    * encoder sampling rate is 32 kHz the maximum payload size is between 120
    389    * and 600 bytes.
    390    *
    391    * If an out of range limit is used, the function returns -1, but the closest
    392    * valid value will be applied.
    393    *
    394    * ---------------
    395    * IMPORTANT NOTES
    396    * ---------------
    397    * The size of a packet is limited to the minimum of 'max-payload-size' and
    398    * 'max-rate.' For instance, let's assume the max-payload-size is set to
    399    * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
    400    * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
    401    * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
    402    * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
    403    * 170 bytes, i.e. min(170, 300).
    404    *
    405    * Input:
    406    *        - ISAC_main_inst    : iSAC instance
    407    *        - maxPayloadBytes   : maximum size of the payload in bytes
    408    *                              valid values are between 120 and 400 bytes
    409    *                              if encoder sampling rate is 16 kHz. For
    410    *                              32 kHz encoder sampling rate valid values
    411    *                              are between 120 and 600 bytes.
    412    *
    413    * Return value               : 0 if successful
    414    *                             -1 if error happens
    415    */
    416 
    417   int16_t WebRtcIsac_SetMaxPayloadSize(
    418       ISACStruct* ISAC_main_inst,
    419       int16_t maxPayloadBytes);
    420 
    421 
    422   /******************************************************************************
    423    * WebRtcIsac_SetMaxRate(...)
    424    *
    425    * This function sets the maximum rate which the codec may not exceed for
    426    * any signal packet. The maximum rate is defined and payload-size per
    427    * frame-size in bits per second.
    428    *
    429    * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
    430    * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
    431    * if the encoder sampling rate is 32 kHz.
    432    *
    433    * It is possible to set a maximum rate between 32000 and 53400 bits/sec
    434    * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
    435    *
    436    * If an out of range limit is used, the function returns -1, but the closest
    437    * valid value will be applied.
    438    *
    439    * ---------------
    440    * IMPORTANT NOTES
    441    * ---------------
    442    * The size of a packet is limited to the minimum of 'max-payload-size' and
    443    * 'max-rate.' For instance, let's assume the max-payload-size is set to
    444    * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
    445    * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
    446    * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
    447    * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
    448    * 170 bytes, min(170, 300).
    449    *
    450    * Input:
    451    *        - ISAC_main_inst    : iSAC instance
    452    *        - maxRate           : maximum rate in bits per second,
    453    *                              valid values are 32000 to 53400 bits/sec in
    454    *                              wideband mode, and 32000 to 160000 bits/sec in
    455    *                              super-wideband mode.
    456    *
    457    * Return value               : 0 if successful
    458    *                             -1 if error happens
    459    */
    460 
    461   int16_t WebRtcIsac_SetMaxRate(
    462       ISACStruct* ISAC_main_inst,
    463       int32_t maxRate);
    464 
    465 
    466   /******************************************************************************
    467    * WebRtcIsac_DecSampRate()
    468    * Return the sampling rate of the decoded audio.
    469    *
    470    * Input:
    471    *        - ISAC_main_inst    : iSAC instance
    472    *
    473    * Return value               : sampling frequency in Hertz.
    474    *
    475    */
    476 
    477   uint16_t WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst);
    478 
    479 
    480   /******************************************************************************
    481    * WebRtcIsac_EncSampRate()
    482    *
    483    * Input:
    484    *        - ISAC_main_inst    : iSAC instance
    485    *
    486    * Return value               : sampling rate in Hertz.
    487    *
    488    */
    489 
    490   uint16_t WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst);
    491 
    492 
    493   /******************************************************************************
    494    * WebRtcIsac_SetDecSampRate()
    495    * Set the sampling rate of the decoder.  Initialization of the decoder WILL
    496    * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
    497    * which is set when the instance is created.
    498    *
    499    * Input:
    500    *        - ISAC_main_inst    : iSAC instance
    501    *        - sampRate          : sampling rate in Hertz.
    502    *
    503    * Return value               : 0 if successful
    504    *                             -1 if failed.
    505    */
    506 
    507   int16_t WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst,
    508                                           uint16_t samp_rate_hz);
    509 
    510 
    511   /******************************************************************************
    512    * WebRtcIsac_SetEncSampRate()
    513    * Set the sampling rate of the encoder. Initialization of the encoder WILL
    514    * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
    515    * which is set when the instance is created. The encoding-mode and the
    516    * bottleneck remain unchanged by this call, however, the maximum rate and
    517    * maximum payload-size will reset to their default value.
    518    *
    519    * Input:
    520    *        - ISAC_main_inst    : iSAC instance
    521    *        - sampRate          : sampling rate in Hertz.
    522    *
    523    * Return value               : 0 if successful
    524    *                             -1 if failed.
    525    */
    526 
    527   int16_t WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst,
    528                                           uint16_t sample_rate_hz);
    529 
    530 
    531 
    532   /******************************************************************************
    533    * WebRtcIsac_GetNewBitStream(...)
    534    *
    535    * This function returns encoded data, with the recieved bwe-index in the
    536    * stream. If the rate is set to a value less than bottleneck of codec
    537    * the new bistream will be re-encoded with the given target rate.
    538    * It should always return a complete packet, i.e. only called once
    539    * even for 60 msec frames.
    540    *
    541    * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
    542    * NOTE 2! Currently not implemented for SWB mode.
    543    * NOTE 3! Rates larger than the bottleneck of the codec will be limited
    544    *         to the current bottleneck.
    545    *
    546    * Input:
    547    *        - ISAC_main_inst    : ISAC instance.
    548    *        - bweIndex          : Index of bandwidth estimate to put in new
    549    *                              bitstream
    550    *        - rate              : target rate of the transcoder is bits/sec.
    551    *                              Valid values are the accepted rate in iSAC,
    552    *                              i.e. 10000 to 56000.
    553    *        - isRCU                       : if the new bit-stream is an RCU stream.
    554    *                              Note that the rate parameter always indicates
    555    *                              the target rate of the main payload, regardless
    556    *                              of 'isRCU' value.
    557    *
    558    * Output:
    559    *        - encoded           : The encoded data vector
    560    *
    561    * Return value               : >0 - Length (in bytes) of coded data
    562    *                              -1 - Error  or called in SWB mode
    563    *                                 NOTE! No error code is written to
    564    *                                 the struct since it is only allowed to read
    565    *                                 the struct.
    566    */
    567   int16_t WebRtcIsac_GetNewBitStream(
    568       ISACStruct*    ISAC_main_inst,
    569       int16_t  bweIndex,
    570       int16_t  jitterInfo,
    571       int32_t  rate,
    572       uint8_t* encoded,
    573       int16_t  isRCU);
    574 
    575 
    576 
    577   /****************************************************************************
    578    * WebRtcIsac_GetDownLinkBwIndex(...)
    579    *
    580    * This function returns index representing the Bandwidth estimate from
    581    * other side to this side.
    582    *
    583    * Input:
    584    *        - ISAC_main_inst    : iSAC struct
    585    *
    586    * Output:
    587    *        - bweIndex          : Bandwidth estimate to transmit to other side.
    588    *
    589    */
    590 
    591   int16_t WebRtcIsac_GetDownLinkBwIndex(
    592       ISACStruct*  ISAC_main_inst,
    593       int16_t* bweIndex,
    594       int16_t* jitterInfo);
    595 
    596 
    597   /****************************************************************************
    598    * WebRtcIsac_UpdateUplinkBw(...)
    599    *
    600    * This function takes an index representing the Bandwidth estimate from
    601    * this side to other side and updates BWE.
    602    *
    603    * Input:
    604    *        - ISAC_main_inst    : iSAC struct
    605    *        - bweIndex          : Bandwidth estimate from other side.
    606    *
    607    */
    608 
    609   int16_t WebRtcIsac_UpdateUplinkBw(
    610       ISACStruct* ISAC_main_inst,
    611       int16_t bweIndex);
    612 
    613 
    614   /****************************************************************************
    615    * WebRtcIsac_ReadBwIndex(...)
    616    *
    617    * This function returns the index of the Bandwidth estimate from the bitstream.
    618    *
    619    * Input:
    620    *        - encoded           : Encoded bitstream
    621    *
    622    * Output:
    623    *        - frameLength       : Length of frame in packet (in samples)
    624    *        - bweIndex         : Bandwidth estimate in bitstream
    625    *
    626    */
    627 
    628   int16_t WebRtcIsac_ReadBwIndex(
    629       const uint8_t* encoded,
    630       int16_t*       bweIndex);
    631 
    632 
    633 
    634   /*******************************************************************************
    635    * WebRtcIsac_GetNewFrameLen(...)
    636    *
    637    * returns the frame lenght (in samples) of the next packet. In the case of channel-adaptive
    638    * mode, iSAC decides on its frame lenght based on the estimated bottleneck
    639    * this allows a user to prepare for the next packet (at the encoder)
    640    *
    641    * The primary usage is in CE to make the iSAC works in channel-adaptive mode
    642    *
    643    * Input:
    644    *        - ISAC_main_inst     : iSAC struct
    645    *
    646    * Return Value                : frame lenght in samples
    647    *
    648    */
    649 
    650   int16_t WebRtcIsac_GetNewFrameLen(
    651       ISACStruct* ISAC_main_inst);
    652 
    653 
    654   /****************************************************************************
    655    *  WebRtcIsac_GetRedPayload(...)
    656    *
    657    *  Populates "encoded" with the redundant payload of the recently encoded
    658    *  frame. This function has to be called once that WebRtcIsac_Encode(...)
    659    *  returns a positive value. Regardless of the frame-size this function will
    660    *  be called only once after encoding is completed.
    661    *
    662    * Input:
    663    *      - ISAC_main_inst    : iSAC struct
    664    *
    665    * Output:
    666    *        - encoded            : the encoded data vector
    667    *
    668    *
    669    * Return value:
    670    *                              : >0 - Length (in bytes) of coded data
    671    *                              : -1 - Error
    672    *
    673    *
    674    */
    675   int16_t WebRtcIsac_GetRedPayload(
    676       ISACStruct*    ISAC_main_inst,
    677       uint8_t* encoded);
    678 
    679 
    680   /****************************************************************************
    681    * WebRtcIsac_DecodeRcu(...)
    682    *
    683    * This function decodes a redundant (RCU) iSAC frame. Function is called in
    684    * NetEq with a stored RCU payload i case of packet loss. Output speech length
    685    * will be a multiple of 480 samples: 480 or 960 samples,
    686    * depending on the framesize (30 or 60 ms).
    687    *
    688    * Input:
    689    *      - ISAC_main_inst     : ISAC instance.
    690    *      - encoded            : encoded ISAC RCU frame(s)
    691    *      - len                : bytes in encoded vector
    692    *
    693    * Output:
    694    *      - decoded            : The decoded vector
    695    *
    696    * Return value              : >0 - number of samples in decoded vector
    697    *                             -1 - Error
    698    */
    699   int WebRtcIsac_DecodeRcu(
    700       ISACStruct*           ISAC_main_inst,
    701       const uint8_t* encoded,
    702       size_t         len,
    703       int16_t*        decoded,
    704       int16_t*        speechType);
    705 
    706   /* Fills in an IsacBandwidthInfo struct. |inst| should be a decoder. */
    707   void WebRtcIsac_GetBandwidthInfo(ISACStruct* inst, IsacBandwidthInfo* bwinfo);
    708 
    709   /* Uses the values from an IsacBandwidthInfo struct. |inst| should be an
    710      encoder. */
    711   void WebRtcIsac_SetBandwidthInfo(ISACStruct* inst,
    712                                    const IsacBandwidthInfo* bwinfo);
    713 
    714   /* If |inst| is a decoder but not an encoder: tell it what sample rate the
    715      encoder is using, for bandwidth estimation purposes. */
    716   void WebRtcIsac_SetEncSampRateInDecoder(ISACStruct* inst, int sample_rate_hz);
    717 
    718 #if defined(__cplusplus)
    719 }
    720 #endif
    721 
    722 
    723 
    724 #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_ */
    725