/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_
#define MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_

#include <stddef.h>

#include "modules/audio_coding/codecs/isac/bandwidth_info.h"
#include "typedefs.h"  // NOLINT(build/include)

typedef struct WebRtcISACStruct    ISACStruct;

#if defined(__cplusplus)
extern "C" {
#endif

  /******************************************************************************
   * WebRtcIsac_AssignSize(...)
   *
   * This function returns the size of the ISAC instance, so that the instance
   * can be created outside iSAC.
   *
   * Input:
   *        - samplingRate      : sampling rate of the input/output audio.
   *
   * Output:
   *        - sizeinbytes       : number of bytes needed to allocate for the
   *                              instance.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_AssignSize(
      int* sizeinbytes);


  /******************************************************************************
   * WebRtcIsac_Assign(...)
   *
   * This function assignes the memory already created to the ISAC instance.
   *
   * Input:
   *        - *ISAC_main_inst   : a pointer to the coder instance.
   *        - samplingRate      : sampling rate of the input/output audio.
   *        - ISAC_inst_Addr    : the already allocated memory, where we put the
   *                              iSAC structure.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_Assign(
      ISACStruct** ISAC_main_inst,
      void*        ISAC_inst_Addr);


  /******************************************************************************
   * WebRtcIsac_Create(...)
   *
   * This function creates an ISAC instance, which will contain the state
   * information for one coding/decoding channel.
   *
   * Input:
   *        - *ISAC_main_inst   : a pointer to the coder instance.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_Create(
      ISACStruct** ISAC_main_inst);


  /******************************************************************************
   * WebRtcIsac_Free(...)
   *
   * This function frees the ISAC instance created at the beginning.
   *
   * Input:
   *        - ISAC_main_inst    : an ISAC instance.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_Free(
      ISACStruct* ISAC_main_inst);


  /******************************************************************************
   * WebRtcIsac_EncoderInit(...)
   *
   * This function initializes an ISAC instance prior to the encoder calls.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - CodingMode        : 0 -> Bit rate and frame length are
   *                                automatically adjusted to available bandwidth
   *                                on transmission channel, just valid if codec
   *                                is created to work in wideband mode.
   *                              1 -> User sets a frame length and a target bit
   *                                rate which is taken as the maximum
   *                                short-term average bit rate.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_EncoderInit(
      ISACStruct* ISAC_main_inst,
      int16_t CodingMode);


  /******************************************************************************
   * WebRtcIsac_Encode(...)
   *
   * This function encodes 10ms audio blocks and inserts it into a package.
   * Input speech length has 160 samples if operating at 16 kHz sampling
   * rate, or 320 if operating at 32 kHz sampling rate. The encoder buffers the
   * input audio until the whole frame is buffered then proceeds with encoding.
   *
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - speechIn          : input speech vector.
   *
   * Output:
   *        - encoded           : the encoded data vector
   *
   * Return value:
   *                            : >0 - Length (in bytes) of coded data
   *                            :  0 - The buffer didn't reach the chosen
   *                               frame-size so it keeps buffering speech
   *                               samples.
   *                            : -1 - Error
   */

  int WebRtcIsac_Encode(
      ISACStruct*        ISAC_main_inst,
      const int16_t* speechIn,
      uint8_t* encoded);


  /******************************************************************************
   * WebRtcIsac_DecoderInit(...)
   *
   * This function initializes an ISAC instance prior to the decoder calls.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   */

  void WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst);

  /******************************************************************************
   * WebRtcIsac_UpdateBwEstimate(...)
   *
   * This function updates the estimate of the bandwidth.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - encoded           : encoded ISAC frame(s).
   *        - packet_size       : size of the packet.
   *        - rtp_seq_number    : the RTP number of the packet.
   *        - send_ts           : the RTP send timestamp, given in samples
   *        - arr_ts            : the arrival time of the packet (from NetEq)
   *                              in samples.
   *
   * Return value               : 0 - Ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_UpdateBwEstimate(
      ISACStruct*         ISAC_main_inst,
      const uint8_t* encoded,
      size_t         packet_size,
      uint16_t        rtp_seq_number,
      uint32_t        send_ts,
      uint32_t        arr_ts);


  /******************************************************************************
   * WebRtcIsac_Decode(...)
   *
   * This function decodes an ISAC frame. At 16 kHz sampling rate, the length
   * of the output audio could be either 480 or 960 samples, equivalent to
   * 30 or 60 ms respectively. At 32 kHz sampling rate, the length of the
   * output audio is 960 samples, which is 30 ms.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - encoded           : encoded ISAC frame(s).
   *        - len               : bytes in encoded vector.
   *
   * Output:
   *        - decoded           : The decoded vector.
   *
   * Return value               : >0 - number of samples in decoded vector.
   *                              -1 - Error.
   */

  int WebRtcIsac_Decode(
      ISACStruct*           ISAC_main_inst,
      const uint8_t* encoded,
      size_t         len,
      int16_t*        decoded,
      int16_t*        speechType);


  /******************************************************************************
   * WebRtcIsac_DecodePlc(...)
   *
   * This function conducts PLC for ISAC frame(s). Output speech length
   * will be a multiple of frames, i.e. multiples of 30 ms audio. Therefore,
   * the output is multiple of 480 samples if operating at 16 kHz and multiple
   * of 960 if operating at 32 kHz.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - noOfLostFrames    : Number of PLC frames to produce.
   *
   * Output:
   *        - decoded           : The decoded vector.
   *
   * Return value               : Number of samples in decoded PLC vector
   */

  size_t WebRtcIsac_DecodePlc(
      ISACStruct*  ISAC_main_inst,
      int16_t* decoded,
      size_t  noOfLostFrames);


  /******************************************************************************
   * WebRtcIsac_Control(...)
   *
   * This function sets the limit on the short-term average bit-rate and the
   * frame length. Should be used only in Instantaneous mode. At 16 kHz sampling
   * rate, an average bit-rate between 10000 to 32000 bps is valid and a
   * frame-size of 30 or 60 ms is acceptable. At 32 kHz, an average bit-rate
   * between 10000 to 56000 is acceptable, and the valid frame-size is 30 ms.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - rate              : limit on the short-term average bit rate,
   *                              in bits/second.
   *        - framesize         : frame-size in millisecond.
   *
   * Return value               : 0  - ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_Control(
      ISACStruct*   ISAC_main_inst,
      int32_t rate,
      int framesize);

  void WebRtcIsac_SetInitialBweBottleneck(ISACStruct* ISAC_main_inst,
                                          int bottleneck_bits_per_second);

  /******************************************************************************
   * WebRtcIsac_ControlBwe(...)
   *
   * This function sets the initial values of bottleneck and frame-size if
   * iSAC is used in channel-adaptive mode. Therefore, this API is not
   * applicable if the codec is created to operate in super-wideband mode.
   *
   * Through this API, users can enforce a frame-size for all values of
   * bottleneck. Then iSAC will not automatically change the frame-size.
   *
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - rateBPS           : initial value of bottleneck in bits/second
   *                              10000 <= rateBPS <= 56000 is accepted
   *                              For default bottleneck set rateBPS = 0
   *        - frameSizeMs       : number of milliseconds per frame (30 or 60)
   *        - enforceFrameSize  : 1 to enforce the given frame-size through
   *                              out the adaptation process, 0 to let iSAC
   *                              change the frame-size if required.
   *
   * Return value               : 0  - ok
   *                             -1 - Error
   */

  int16_t WebRtcIsac_ControlBwe(
      ISACStruct* ISAC_main_inst,
      int32_t rateBPS,
      int frameSizeMs,
      int16_t enforceFrameSize);


  /******************************************************************************
   * WebRtcIsac_ReadFrameLen(...)
   *
   * This function returns the length of the frame represented in the packet.
   *
   * Input:
   *        - encoded           : Encoded bit-stream
   *
   * Output:
   *        - frameLength       : Length of frame in packet (in samples)
   *
   */

  int16_t WebRtcIsac_ReadFrameLen(
      ISACStruct*          ISAC_main_inst,
      const uint8_t* encoded,
      int16_t*       frameLength);


  /******************************************************************************
   * WebRtcIsac_version(...)
   *
   * This function returns the version number.
   *
   * Output:
   *        - version      : Pointer to character string
   *
   */

  void WebRtcIsac_version(
      char *version);


  /******************************************************************************
   * WebRtcIsac_GetErrorCode(...)
   *
   * This function can be used to check the error code of an iSAC instance. When
   * a function returns -1 a error code will be set for that instance. The
   * function below extract the code of the last error that occurred in the
   * specified instance.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance
   *
   * Return value               : Error code
   */

  int16_t WebRtcIsac_GetErrorCode(
      ISACStruct* ISAC_main_inst);


  /****************************************************************************
   * WebRtcIsac_GetUplinkBw(...)
   *
   * This function outputs the target bottleneck of the codec. In
   * channel-adaptive mode, the target bottleneck is specified through in-band
   * signalling retreived by bandwidth estimator.
   * In channel-independent, also called instantaneous mode, the target
   * bottleneck is provided to the encoder by calling xxx_control(...). If
   * xxx_control is never called the default values is returned. The default
   * value for bottleneck at 16 kHz encoder sampling rate is 32000 bits/sec,
   * and it is 56000 bits/sec for 32 kHz sampling rate.
   * Note that the output is the iSAC internal operating bottleneck which might
   * differ slightly from the one provided through xxx_control().
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *
   * Output:
   *        - *bottleneck       : bottleneck in bits/sec
   *
   * Return value               : -1 if error happens
   *                               0 bit-rates computed correctly.
   */

  int16_t WebRtcIsac_GetUplinkBw(
      ISACStruct*    ISAC_main_inst,
      int32_t* bottleneck);


  /******************************************************************************
   * WebRtcIsac_SetMaxPayloadSize(...)
   *
   * This function sets a limit for the maximum payload size of iSAC. The same
   * value is used both for 30 and 60 ms packets. If the encoder sampling rate
   * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
   * encoder sampling rate is 32 kHz the maximum payload size is between 120
   * and 600 bytes.
   *
   * If an out of range limit is used, the function returns -1, but the closest
   * valid value will be applied.
   *
   * ---------------
   * IMPORTANT NOTES
   * ---------------
   * The size of a packet is limited to the minimum of 'max-payload-size' and
   * 'max-rate.' For instance, let's assume the max-payload-size is set to
   * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
   * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
   * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
   * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
   * 170 bytes, i.e. min(170, 300).
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *        - maxPayloadBytes   : maximum size of the payload in bytes
   *                              valid values are between 120 and 400 bytes
   *                              if encoder sampling rate is 16 kHz. For
   *                              32 kHz encoder sampling rate valid values
   *                              are between 120 and 600 bytes.
   *
   * Return value               : 0 if successful
   *                             -1 if error happens
   */

  int16_t WebRtcIsac_SetMaxPayloadSize(
      ISACStruct* ISAC_main_inst,
      int16_t maxPayloadBytes);


  /******************************************************************************
   * WebRtcIsac_SetMaxRate(...)
   *
   * This function sets the maximum rate which the codec may not exceed for
   * any signal packet. The maximum rate is defined and payload-size per
   * frame-size in bits per second.
   *
   * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
   * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
   * if the encoder sampling rate is 32 kHz.
   *
   * It is possible to set a maximum rate between 32000 and 53400 bits/sec
   * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
   *
   * If an out of range limit is used, the function returns -1, but the closest
   * valid value will be applied.
   *
   * ---------------
   * IMPORTANT NOTES
   * ---------------
   * The size of a packet is limited to the minimum of 'max-payload-size' and
   * 'max-rate.' For instance, let's assume the max-payload-size is set to
   * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
   * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
   * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
   * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
   * 170 bytes, min(170, 300).
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *        - maxRate           : maximum rate in bits per second,
   *                              valid values are 32000 to 53400 bits/sec in
   *                              wideband mode, and 32000 to 160000 bits/sec in
   *                              super-wideband mode.
   *
   * Return value               : 0 if successful
   *                             -1 if error happens
   */

  int16_t WebRtcIsac_SetMaxRate(
      ISACStruct* ISAC_main_inst,
      int32_t maxRate);


  /******************************************************************************
   * WebRtcIsac_DecSampRate()
   * Return the sampling rate of the decoded audio.
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *
   * Return value               : sampling frequency in Hertz.
   *
   */

  uint16_t WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst);


  /******************************************************************************
   * WebRtcIsac_EncSampRate()
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *
   * Return value               : sampling rate in Hertz.
   *
   */

  uint16_t WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst);


  /******************************************************************************
   * WebRtcIsac_SetDecSampRate()
   * Set the sampling rate of the decoder.  Initialization of the decoder WILL
   * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
   * which is set when the instance is created.
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *        - sampRate          : sampling rate in Hertz.
   *
   * Return value               : 0 if successful
   *                             -1 if failed.
   */

  int16_t WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst,
                                          uint16_t samp_rate_hz);


  /******************************************************************************
   * WebRtcIsac_SetEncSampRate()
   * Set the sampling rate of the encoder. Initialization of the encoder WILL
   * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
   * which is set when the instance is created. The encoding-mode and the
   * bottleneck remain unchanged by this call, however, the maximum rate and
   * maximum payload-size will reset to their default value.
   *
   * Input:
   *        - ISAC_main_inst    : iSAC instance
   *        - sampRate          : sampling rate in Hertz.
   *
   * Return value               : 0 if successful
   *                             -1 if failed.
   */

  int16_t WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst,
                                          uint16_t sample_rate_hz);



  /******************************************************************************
   * WebRtcIsac_GetNewBitStream(...)
   *
   * This function returns encoded data, with the recieved bwe-index in the
   * stream. If the rate is set to a value less than bottleneck of codec
   * the new bistream will be re-encoded with the given target rate.
   * It should always return a complete packet, i.e. only called once
   * even for 60 msec frames.
   *
   * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
   * NOTE 2! Currently not implemented for SWB mode.
   * NOTE 3! Rates larger than the bottleneck of the codec will be limited
   *         to the current bottleneck.
   *
   * Input:
   *        - ISAC_main_inst    : ISAC instance.
   *        - bweIndex          : Index of bandwidth estimate to put in new
   *                              bitstream
   *        - rate              : target rate of the transcoder is bits/sec.
   *                              Valid values are the accepted rate in iSAC,
   *                              i.e. 10000 to 56000.
   *        - isRCU                       : if the new bit-stream is an RCU stream.
   *                              Note that the rate parameter always indicates
   *                              the target rate of the main payload, regardless
   *                              of 'isRCU' value.
   *
   * Output:
   *        - encoded           : The encoded data vector
   *
   * Return value               : >0 - Length (in bytes) of coded data
   *                              -1 - Error  or called in SWB mode
   *                                 NOTE! No error code is written to
   *                                 the struct since it is only allowed to read
   *                                 the struct.
   */
  int16_t WebRtcIsac_GetNewBitStream(
      ISACStruct*    ISAC_main_inst,
      int16_t  bweIndex,
      int16_t  jitterInfo,
      int32_t  rate,
      uint8_t* encoded,
      int16_t  isRCU);



  /****************************************************************************
   * WebRtcIsac_GetDownLinkBwIndex(...)
   *
   * This function returns index representing the Bandwidth estimate from
   * other side to this side.
   *
   * Input:
   *        - ISAC_main_inst    : iSAC struct
   *
   * Output:
   *        - bweIndex          : Bandwidth estimate to transmit to other side.
   *
   */

  int16_t WebRtcIsac_GetDownLinkBwIndex(
      ISACStruct*  ISAC_main_inst,
      int16_t* bweIndex,
      int16_t* jitterInfo);


  /****************************************************************************
   * WebRtcIsac_UpdateUplinkBw(...)
   *
   * This function takes an index representing the Bandwidth estimate from
   * this side to other side and updates BWE.
   *
   * Input:
   *        - ISAC_main_inst    : iSAC struct
   *        - bweIndex          : Bandwidth estimate from other side.
   *
   */

  int16_t WebRtcIsac_UpdateUplinkBw(
      ISACStruct* ISAC_main_inst,
      int16_t bweIndex);


  /****************************************************************************
   * WebRtcIsac_ReadBwIndex(...)
   *
   * This function returns the index of the Bandwidth estimate from the bitstream.
   *
   * Input:
   *        - encoded           : Encoded bitstream
   *
   * Output:
   *        - frameLength       : Length of frame in packet (in samples)
   *        - bweIndex         : Bandwidth estimate in bitstream
   *
   */

  int16_t WebRtcIsac_ReadBwIndex(
      const uint8_t* encoded,
      int16_t*       bweIndex);



  /*******************************************************************************
   * WebRtcIsac_GetNewFrameLen(...)
   *
   * returns the frame lenght (in samples) of the next packet. In the case of channel-adaptive
   * mode, iSAC decides on its frame lenght based on the estimated bottleneck
   * this allows a user to prepare for the next packet (at the encoder)
   *
   * The primary usage is in CE to make the iSAC works in channel-adaptive mode
   *
   * Input:
   *        - ISAC_main_inst     : iSAC struct
   *
   * Return Value                : frame lenght in samples
   *
   */

  int16_t WebRtcIsac_GetNewFrameLen(
      ISACStruct* ISAC_main_inst);


  /****************************************************************************
   *  WebRtcIsac_GetRedPayload(...)
   *
   *  Populates "encoded" with the redundant payload of the recently encoded
   *  frame. This function has to be called once that WebRtcIsac_Encode(...)
   *  returns a positive value. Regardless of the frame-size this function will
   *  be called only once after encoding is completed.
   *
   * Input:
   *      - ISAC_main_inst    : iSAC struct
   *
   * Output:
   *        - encoded            : the encoded data vector
   *
   *
   * Return value:
   *                              : >0 - Length (in bytes) of coded data
   *                              : -1 - Error
   *
   *
   */
  int16_t WebRtcIsac_GetRedPayload(
      ISACStruct*    ISAC_main_inst,
      uint8_t* encoded);


  /****************************************************************************
   * WebRtcIsac_DecodeRcu(...)
   *
   * This function decodes a redundant (RCU) iSAC frame. Function is called in
   * NetEq with a stored RCU payload i case of packet loss. Output speech length
   * will be a multiple of 480 samples: 480 or 960 samples,
   * depending on the framesize (30 or 60 ms).
   *
   * Input:
   *      - ISAC_main_inst     : ISAC instance.
   *      - encoded            : encoded ISAC RCU frame(s)
   *      - len                : bytes in encoded vector
   *
   * Output:
   *      - decoded            : The decoded vector
   *
   * Return value              : >0 - number of samples in decoded vector
   *                             -1 - Error
   */
  int WebRtcIsac_DecodeRcu(
      ISACStruct*           ISAC_main_inst,
      const uint8_t* encoded,
      size_t         len,
      int16_t*        decoded,
      int16_t*        speechType);

  /* Fills in an IsacBandwidthInfo struct. |inst| should be a decoder. */
  void WebRtcIsac_GetBandwidthInfo(ISACStruct* inst, IsacBandwidthInfo* bwinfo);

  /* Uses the values from an IsacBandwidthInfo struct. |inst| should be an
     encoder. */
  void WebRtcIsac_SetBandwidthInfo(ISACStruct* inst,
                                   const IsacBandwidthInfo* bwinfo);

  /* If |inst| is a decoder but not an encoder: tell it what sample rate the
     encoder is using, for bandwidth estimation purposes. */
  void WebRtcIsac_SetEncSampRateInDecoder(ISACStruct* inst, int sample_rate_hz);

#if defined(__cplusplus)
}
#endif



#endif /* MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_ */
