/*
 *  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 WEBRTC_MODULES_AUDIO_CODING_MAIN_INTERFACE_AUDIO_CODING_MODULE_H
#define WEBRTC_MODULES_AUDIO_CODING_MAIN_INTERFACE_AUDIO_CODING_MODULE_H

#include "audio_coding_module_typedefs.h"
#include "module.h"
#include "module_common_types.h"

namespace webrtc {

// forward declarations
struct CodecInst;

#define WEBRTC_10MS_PCM_AUDIO 960 // 16 bits super wideband 48 Khz

// Callback class used for sending data ready to be packetized
class AudioPacketizationCallback {
 public:
  virtual ~AudioPacketizationCallback() {}

  virtual WebRtc_Word32 SendData(
      FrameType frameType, WebRtc_UWord8 payloadType, WebRtc_UWord32 timeStamp,
      const WebRtc_UWord8* payloadData, WebRtc_UWord16 payloadSize,
      const RTPFragmentationHeader* fragmentation) = 0;
};

// Callback class used for inband Dtmf detection
class AudioCodingFeedback {
 public:
  virtual ~AudioCodingFeedback() {}

  virtual WebRtc_Word32 IncomingDtmf(const WebRtc_UWord8 digitDtmf,
                                     const bool end) = 0;
};

// Callback class used for reporting VAD decision
class ACMVADCallback {
 public:
  virtual ~ACMVADCallback() {}

  virtual WebRtc_Word32 InFrameType(WebRtc_Word16 frameType) = 0;
};

// Callback class used for reporting receiver statistics
class ACMVQMonCallback {
 public:
  virtual ~ACMVQMonCallback() {}

  virtual WebRtc_Word32 NetEqStatistics(
      const WebRtc_Word32 id, // current ACM id
      const WebRtc_UWord16 MIUsValid, // valid voice duration in ms
      const WebRtc_UWord16 MIUsReplaced, // concealed voice duration in ms
      const WebRtc_UWord8 eventFlags, // concealed voice flags
      const WebRtc_UWord16 delayMS) = 0; // average delay in ms
};

class AudioCodingModule: public Module {
 protected:
  AudioCodingModule() {}
  virtual ~AudioCodingModule() {}

 public:
  ///////////////////////////////////////////////////////////////////////////
  // Creation and destruction of a ACM
  //
  static AudioCodingModule* Create(const WebRtc_Word32 id);

  static void Destroy(AudioCodingModule* module);

  ///////////////////////////////////////////////////////////////////////////
  //   Utility functions
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_UWord8 NumberOfCodecs()
  // Returns number of supported codecs.
  //
  // Return value:
  //   number of supported codecs.
  ///
  static WebRtc_UWord8 NumberOfCodecs();

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 Codec()
  // Get supported codec with list number.
  //
  // Input:
  //   -listId             : list number.
  //
  // Output:
  //   -codec              : a structure where the parameters of the codec,
  //                         given by list number is written to.
  //
  // Return value:
  //   -1 if the list number (listId) is invalid.
  //    0 if succeeded.
  //
  static WebRtc_Word32 Codec(const WebRtc_UWord8 listId, CodecInst& codec);

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 Codec()
  // Get supported codec with the given codec name and sampling frequency.
  // If the sampling frequency is -1 then the search will be only based on
  // codec name.
  //
  // Input:
  //   -payloadName        : name of the codec.
  //   -samplingFreqHz     : samling frequency of the codec.
  //
  // Output:
  //   -codec              : a structure where the parameters of the codec,
  //                         given by name is written to.
  //
  // Return value:
  //   -1 if the list number (listId) is invalid.
  //    0 if succeeded.
  //
  static WebRtc_Word32 Codec(const WebRtc_Word8* payloadName, CodecInst& codec,
                             const WebRtc_Word32 samplingFreqHz = -1);

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 Codec()
  //
  // Returns the list number of the given codec name and sampling frequency.
  // If the sampling frequency is -1 then the search will be only based on
  // codec name.
  //
  // Input:
  //   -payloadName        : name of the codec.
  //   -samplingFreqHz     : samling frequency of the codec.
  //
  // Return value:
  //   if the codec is found, the index of the codec in the list,
  //   -1 if the codec is not found.
  //
  static WebRtc_Word32 Codec(const WebRtc_Word8* payloadName,
                             const WebRtc_Word32 samplingFreqHz = -1);

  ///////////////////////////////////////////////////////////////////////////
  // bool IsCodecValid()
  // Checks the validity of the parameters of the given codec.
  //
  // Input:
  //   -codec              : the structur which keeps the parameters of the
  //                         codec.
  //
  // Reurn value:
  //   true if the parameters are valid,
  //   false if any parameter is not valid.
  //
  static bool IsCodecValid(const CodecInst& codec);

  ///////////////////////////////////////////////////////////////////////////
  //   Sender
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 InitializeSender()
  // Any encoder-related state of ACM will be initialized to the
  // same state when ACM is created. This will not interrupt or
  // effect decoding functionality of ACM. ACM will lose all the
  // encoding-related settings by calling this function.
  // For instance, a send codec has to be registered again.
  //
  // Return value:
  //   -1 if failed to initialize,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 InitializeSender() = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ResetEncoder()
  // This API resets the states of encoder. All the encoder settings, such as
  // send-codec or VAD/DTX, will be preserved.
  //
  // Return value:
  //   -1 if failed to initialize,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 ResetEncoder() = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 RegisterSendCodec()
  // Registers a codec, specified by "sendCodec," as sending codec.
  // This API can be called multiple of times to register Codec. The last codec
  // registered overwrites the previous ones.
  // The API can also be used to change payload type for CNG and RED, which are
  // registered by default to default payload types.
  // Note that registering CNG and RED won't overwrite speech codecs.
  // This API can be called to set/change the send payload-type, frame-size
  // or encoding rate (if applicable for the codec).
  //
  // Input:
  //   -sendCodec          : Parameters of the codec to be registered, c.f.
  //                         common_types.h for the definition of
  //                         CodecInst.
  //
  // Return value:
  //   -1 if failed to initialize,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 RegisterSendCodec(const CodecInst& sendCodec) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SendCodec()
  // Get parameters for the codec currently registered as send codec.
  //
  // Output:
  //   -currentSendCodec          : parameters of the send codec.
  //
  // Return value:
  //   -1 if failed to get send codec,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 SendCodec(CodecInst& currentSendCodec) const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SendFrequency()
  // Get the sampling frequency of the current encoder in Hertz.
  //
  // Return value:
  //   positive; sampling frequency [Hz] of the current encoder.
  //   -1 if an error has happened.
  //
  virtual WebRtc_Word32 SendFrequency() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 Bitrate()
  // Get encoding bit-rate in bits per second.
  //
  // Return value:
  //   positive; encoding rate in bits/sec,
  //   -1 if an error is happened.
  //
  virtual WebRtc_Word32 SendBitrate() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetReceivedEstimatedBandwidth()
  // Set available bandwidth [bits/sec] of the up-link channel.
  // This information is used for traffic shaping, and is currently only
  // supported if iSAC is the send codec.
  //
  // Input:
  //   -bw                 : bandwidth in bits/sec estimated for
  //                         up-link.
  // Return value
  //   -1 if error occurred in setting the bandwidth,
  //    0 bandwidth is set successfully.
  //
  virtual WebRtc_Word32 SetReceivedEstimatedBandwidth(
      const WebRtc_Word32 bw) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 RegisterTransportCallback()
  // Register a transport callback which will be called to deliver
  // the encoded buffers whenever Process() is called and a
  // bit-stream is ready.
  //
  // Input:
  //   -transport          : pointer to the callback class
  //                         transport->SendData() is called whenever
  //                         Process() is called and bit-stream is ready
  //                         to deliver.
  //
  // Return value:
  //   -1 if the transport callback could not be registered
  //    0 if registration is successful.
  //
  virtual WebRtc_Word32 RegisterTransportCallback(
      AudioPacketizationCallback* transport) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 Add10MsData()
  // Add 10MS of raw (PCM) audio data to the encoder. If the sampling
  // frequency of the audio does not match the sampling frequency of the
  // current encoder ACM will resample the audio.
  //
  // Input:
  //   -audioFrame         : the input audio frame, containing raw audio
  //                         sampling frequency etc.,
  //                         c.f. module_common_types.h for definition of
  //                         AudioFrame.
  //
  // Return value:
  //      0   successfully added the frame.
  //     -1   some error occurred and data is not added.
  //   < -1   to add the frame to the buffer n samples had to be
  //          overwritten, -n is the return value in this case.
  //
  virtual WebRtc_Word32 Add10MsData(const AudioFrame& audioFrame) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // (FEC) Forward Error Correction
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetFECStatus(const bool enable)
  // configure FEC status i.e. on/off.
  //
  // RFC 2198 describes a solution which has a single payload type which
  // signifies a packet with redundancy. That packet then becomes a container,
  // encapsulating multiple payloads into a single RTP packet.
  // Such a scheme is flexible, since any amount of redundancy may be
  // encapsulated within a single packet.  There is, however, a small overhead
  // since each encapsulated payload must be preceded by a header indicating
  // the type of data enclosed.
  //
  // This means that FEC is actually a RED scheme.
  //
  // Input:
  //   -enableFEC          : if true FEC is enabled, otherwise FEC is
  //                         disabled.
  //
  // Return value:
  //   -1 if failed to set FEC status,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 SetFECStatus(const bool enableFEC) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // bool FECStatus()
  // Get FEC status
  //
  // Return value
  //   true if FEC is enabled,
  //   false if FEC is disabled.
  //
  virtual bool FECStatus() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  //   (VAD) Voice Activity Detection
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetVAD()
  // If DTX is enabled & the codec does not have internal DTX/VAD
  // WebRtc VAD will be automatically enabled and 'enableVAD' is ignored.
  //
  // If DTX is disabled but VAD is enabled no DTX packets are send,
  // regardless of whether the codec has internal DTX/VAD or not. In this
  // case, WebRtc VAD is running to label frames as active/in-active.
  //
  // Inputs:
  //   -enableDTX          : if true DTX is enabled,
  //                         otherwise DTX is disabled.
  //   -enableVAD          : if true VAD is enabled,
  //                         otherwise VAD is disabled.
  //   -vadMode            : determines the aggressiveness of VAD. A more
  //                         aggressive mode results in more frames labeled
  //                         as in-active, c.f. definition of
  //                         ACMVADMode in audio_coding_module_typedefs.h
  //                         for valid values.
  //
  // Return value:
  //   -1 if failed to set up VAD/DTX,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 SetVAD(const bool enableDTX = true,
                               const bool enableVAD = false,
                               const ACMVADMode vadMode = VADNormal) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 VAD()
  // Get VAD status.
  //
  // Outputs:
  //   -dtxEnabled         : is set to true if DTX is enabled, otherwise
  //                         is set to false.
  //   -vadEnabled         : is set to true if VAD is enabled, otherwise
  //                         is set to false.
  //   -vadMode            : is set to the current aggressiveness of VAD.
  //
  // Return value:
  //   -1 if fails to retrieve the setting of DTX/VAD,
  //    0 if succeeeded.
  //
  virtual WebRtc_Word32 VAD(bool& dtxEnabled, bool& vadEnabled,
                            ACMVADMode& vadMode) const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ReplaceInternalDTXWithWebRtc()
  // Used to replace codec internal DTX scheme with WebRtc. This is only
  // supported for G729, where this call replaces AnnexB with WebRtc DTX.
  //
  // Input:
  //   -useWebRtcDTX         : if false (default) the codec built-in DTX/VAD
  //                         scheme is used, otherwise the internal DTX is
  //                         replaced with WebRtc DTX/VAD.
  //
  // Return value:
  //   -1 if failed to replace codec internal DTX with WebRtc,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 ReplaceInternalDTXWithWebRtc(
      const bool useWebRtcDTX = false) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 IsInternalDTXReplacedWithWebRtc()
  // Get status if the codec internal DTX (when such exists) is replaced with
  // WebRtc DTX. This is only supported for G729.
  //
  // Output:
  //   -usesWebRtcDTX        : is set to true if the codec internal DTX is
  //                         replaced with WebRtc DTX/VAD, otherwise it is set
  //                         to false.
  //
  // Return value:
  //   -1 if failed to determine if codec internal DTX is replaced with WebRtc,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 IsInternalDTXReplacedWithWebRtc(
      bool& usesWebRtcDTX) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 RegisterVADCallback()
  // Call this method to register a callback function which is called
  // any time that ACM encounters an empty frame. That is a frame which is
  // recognized inactive. Depending on the codec WebRtc VAD or internal codec
  // VAD is employed to identify a frame as active/inactive.
  //
  // Input:
  //   -vadCallback        : pointer to a callback function.
  //
  // Return value:
  //   -1 if failed to register the callback function.
  //    0 if the callback function is registered successfully.
  //
  virtual WebRtc_Word32 RegisterVADCallback(ACMVADCallback* vadCallback) = 0;

  ///////////////////////////////////////////////////////////////////////////
  //   Receiver
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 InitializeReceiver()
  // Any decoder-related state of ACM will be initialized to the
  // same state when ACM is created. This will not interrupt or
  // effect encoding functionality of ACM. ACM would lose all the
  // decoding-related settings by calling this function.
  // For instance, all registered codecs are deleted and have to be
  // registered again.
  //
  // Return value:
  //   -1 if failed to initialize,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 InitializeReceiver() = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ResetDecoder()
  // This API resets the states of decoders. ACM will not lose any
  // decoder-related settings, such as registered codecs.
  //
  // Return value:
  //   -1 if failed to initialize,
  //    0 if succeeded.
  //
  virtual WebRtc_Word32 ResetDecoder() = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ReceiveFrequency()
  // Get sampling frequency of the last received payload.
  //
  // Return value:
  //   non-negative the sampling frequency in Hertz.
  //   -1 if an error has occurred.
  //
  virtual WebRtc_Word32 ReceiveFrequency() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 PlayoutFrequency()
  // Get sampling frequency of audio played out.
  //
  // Return value:
  //   the sampling frequency in Hertz.
  //
  virtual WebRtc_Word32 PlayoutFrequency() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 RegisterReceiveCodec()
  // Register possible decoders, can be called multiple times for
  // codecs, CNG-NB, CNG-WB, CNG-SWB, AVT and RED.
  //
  // Input:
  //   -receiveCodec       : parameters of the codec to be registered, c.f.
  //                         common_types.h for the definition of
  //                         CodecInst.
  //
  // Return value:
  //   -1 if failed to register the codec
  //    0 if the codec registered successfully.
  //
  virtual WebRtc_Word32 RegisterReceiveCodec(const CodecInst& receiveCodec) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 UnregisterReceiveCodec()
  // Unregister the codec currently registered with a specific payload type
  // from the list of possible receive codecs.
  //
  // Input:
  //   -payloadType        : The number representing the payload type to
  //                         unregister.
  //
  // Output:
  //   -1 if the unregistration fails.
  //    0 if the given codec is successfully unregistered.
  //
  virtual WebRtc_Word32 UnregisterReceiveCodec(
      const WebRtc_Word16 receiveCodec) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ReceiveCodec()
  // Get the codec associated with last received payload.
  //
  // Output:
  //   -currRcvCodec       : parameters of the codec associated with the last
  //                         received payload, c.f. common_types.h for
  //                         the definition of CodecInst.
  //
  // Return value:
  //   -1 if failed to retrieve the codec,
  //    0 if the codec is successfully retrieved.
  //
  virtual WebRtc_Word32 ReceiveCodec(CodecInst& currRcvCodec) const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 IncomingPacket()
  // Call this function to insert a parsed RTP packet into ACM.
  //
  // Inputs:
  //   -incomingPayload    : received payload.
  //   -payloadLengthByte  : the length of payload in bytes.
  //   -rtpInfo            : the relevant information retrieved from RTP
  //                         header.
  //
  // Return value:
  //   -1 if failed to push in the payload
  //    0 if payload is successfully pushed in.
  //
  virtual WebRtc_Word32 IncomingPacket(const WebRtc_Word8* incomingPayload,
                                       const WebRtc_Word32 payloadLengthByte,
                                       const WebRtcRTPHeader& rtpInfo) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 IncomingPayload()
  // Call this API to push incoming payloads when there is no rtp-info.
  // The rtp-info will be created in ACM. One usage for this API is when
  // pre-encoded files are pushed in ACM
  //
  // Inputs:
  //   -incomingPayload    : received payload.
  //   -payloadLenghtByte  : the length, in bytes, of the received payload.
  //   -payloadType        : the payload-type. This specifies which codec has
  //                         to be used to decode the payload.
  //   -timestamp          : send timestamp of the payload. ACM starts with
  //                         a random value and increment it by the
  //                         packet-size, which is given when the codec in
  //                         question is registered by RegisterReceiveCodec().
  //                         Therefore, it is essential to have the timestamp
  //                         if the frame-size differ from the registered
  //                         value or if the incoming payload contains DTX
  //                         packets.
  //
  // Return value:
  //   -1 if failed to push in the payload
  //    0 if payload is successfully pushed in.
  //
  virtual WebRtc_Word32 IncomingPayload(const WebRtc_Word8* incomingPayload,
                                        const WebRtc_Word32 payloadLengthByte,
                                        const WebRtc_UWord8 payloadType,
                                        const WebRtc_UWord32 timestamp = 0) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetMinimumPlayoutDelay()
  // Set Minimum playout delay, used for lip-sync.
  //
  // Input:
  //   -timeMs             : minimum delay in milliseconds.
  //
  // Return value:
  //   -1 if failed to set the delay,
  //    0 if the minimum delay is set.
  //
  virtual WebRtc_Word32 SetMinimumPlayoutDelay(const WebRtc_Word32 timeMs) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 RegisterIncomingMessagesCallback()
  // Used by the module to deliver messages to the codec module/application
  // when a Dtmf tone is detected, as well as when it stopped.
  //
  // Inputs:
  //   -inMsgCallback      : pointer to callback function which will be called
  //                         if Dtmf is detected.
  //   -cpt                : enables CPT (Call Progress Tone) detection for the
  //                         specified country. c.f. definition of ACMCountries
  //                         in audio_coding_module_typedefs.h for valid
  //                         entries. The default value disables CPT
  //                         detection.
  //
  // Return value:
  //   -1 if the message callback could not be registered
  //    0 if registration is successful.
  //
  virtual WebRtc_Word32
      RegisterIncomingMessagesCallback(
          AudioCodingFeedback* inMsgCallback,
          const ACMCountries cpt = ACMDisableCountryDetection) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetDtmfPlayoutStatus()
  // Configure Dtmf playout, i.e. whether out-of-band
  // Dtmf tones are played or not.
  //
  // Input:
  //   -enable             : if true to enable playout out-of-band Dtmf tones,
  //                         false to disable.
  //
  // Return value:
  //   -1 if the method fails, e.g. Dtmf playout is not supported.
  //    0 if the status is set successfully.
  //
  virtual WebRtc_Word32 SetDtmfPlayoutStatus(const bool enable) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // bool DtmfPlayoutStatus()
  // Get Dtmf playout status.
  //
  // Return value:
  //   true if out-of-band Dtmf tones are played,
  //   false if playout of Dtmf tones is disabled.
  //
  virtual bool DtmfPlayoutStatus() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetBackgroundNoiseMode()
  // Sets the mode of the background noise playout in an event of long
  // packetloss burst. For the valid modes see the declaration of
  // ACMBackgroundNoiseMode in audio_coding_module_typedefs.h.
  //
  // Input:
  //   -mode               : the mode for the background noise playout.
  //
  // Return value:
  //   -1 if failed to set the mode.
  //    0 if succeeded in setting the mode.
  //
  virtual WebRtc_Word32 SetBackgroundNoiseMode(
      const ACMBackgroundNoiseMode mode) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 BackgroundNoiseMode()
  // Call this method to get the mode of the background noise playout.
  // Playout of background noise is a result of a long packetloss burst.
  // See ACMBackgroundNoiseMode in audio_coding_module_typedefs.h for
  // possible modes.
  //
  // Output:
  //   -mode             : a reference to ACMBackgroundNoiseMode enumerator.
  //
  // Return value:
  //    0 if the output is a valid mode.
  //   -1 if ACM failed to output a valid mode.
  //
  virtual WebRtc_Word32 BackgroundNoiseMode(ACMBackgroundNoiseMode& mode) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 PlayoutTimestamp()
  // The send timestamp of an RTP packet is associated with the decoded
  // audio of the packet in question. This function returns the timestamp of
  // the latest audio obtained by calling PlayoutData10ms().
  //
  // Input:
  //   -timestamp          : a reference to a WebRtc_UWord32 to receive the
  //                         timestamp.
  // Return value:
  //    0 if the output is a correct timestamp.
  //   -1 if failed to output the correct timestamp.
  //
  //
  virtual WebRtc_Word32 PlayoutTimestamp(WebRtc_UWord32& timestamp) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 DecoderEstimatedBandwidth()
  // Get the estimate of the Bandwidth, in bits/second, based on the incoming
  // stream. This API is useful in one-way communication scenarios, where
  // the bandwidth information is sent in an out-of-band fashion.
  // Currently only supported if iSAC is registered as a reciever.
  //
  // Return value:
  //   >0 bandwidth in bits/second.
  //   -1 if failed to get a bandwidth estimate.
  //
  virtual WebRtc_Word32 DecoderEstimatedBandwidth() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetPlayoutMode()
  // Call this API to set the playout mode. Playout mode could be optimized
  // for i) voice, ii) FAX or iii) streaming. In Voice mode, NetEQ is
  // optimized to deliver highest audio quality while maintaining a minimum
  // delay. In FAX mode, NetEQ is optimized to have few delay changes as
  // possible and maintain a constant delay, perhaps large relative to voice
  // mode, to avoid PLC. In streaming mode, we tolerate a little more delay
  // to acheive better jitter robustness.
  //
  // Input:
  //   -mode               : playout mode. Possible inputs are:
  //                         "voice",
  //                         "fax" and
  //                         "streaming".
  //
  // Return value:
  //   -1 if failed to set the mode,
  //    0 if succeeding.
  //
  virtual WebRtc_Word32 SetPlayoutMode(const AudioPlayoutMode mode) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // AudioPlayoutMode PlayoutMode()
  // Get playout mode, i.e. whether it is speech, FAX or streaming. See
  // audio_coding_module_typedefs.h for definition of AudioPlayoutMode.
  //
  // Return value:
  //   voice:       is for voice output,
  //   fax:         a mode that is optimized for receiving FAX signals.
  //                In this mode NetEq tries to maintain a constant high
  //                delay to avoid PLC if possible.
  //   streaming:   a mode that is suitable for streaminq. In this mode we
  //                accept longer delay to improve jitter robustness.
  //
  virtual AudioPlayoutMode PlayoutMode() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 PlayoutData10Ms(
  // Get 10 milliseconds of raw audio data for playout, at the given sampling
  // frequency. ACM will perform a resampling if required.
  //
  // Input:
  //   -desiredFreqHz      : the desired sampling frequency, in Hertz, of the
  //                         output audio. If set to -1, the function returns the
  //                         audio at the current sampling frequency.
  //
  // Output:
  //   -audioFrame         : output audio frame which contains raw audio data
  //                         and other relevant parameters, c.f.
  //                         module_common_types.h for the definition of
  //                         AudioFrame.
  //
  // Return value:
  //   -1 if the function fails,
  //    0 if the function succeeds.
  //
  virtual WebRtc_Word32
      PlayoutData10Ms(const WebRtc_Word32 desiredFreqHz,
                      AudioFrame &audioFrame) = 0;

  ///////////////////////////////////////////////////////////////////////////
  //   (CNG) Comfort Noise Generation
  //   Generate comfort noise when receiving DTX packets
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word16 SetReceiveVADMode()
  // Configure VAD aggressiveness on the incoming stream.
  //
  // Input:
  //   -mode               : aggressiveness of the VAD on incoming stream.
  //                         See audio_coding_module_typedefs.h for the
  //                         definition of ACMVADMode, and possible
  //                         values for aggressiveness.
  //
  // Return value:
  //   -1 if fails to set the mode,
  //    0 if the mode is set successfully.
  //
  virtual WebRtc_Word16 SetReceiveVADMode(const ACMVADMode mode) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // ACMVADMode ReceiveVADMode()
  // Get VAD aggressiveness on the incoming stream.
  //
  // Return value:
  //   aggressiveness of VAD, running on the incoming stream. A more
  //   aggressive mode means more audio frames will be labeled as in-active.
  //   See audio_coding_module_typedefs.h for the definition of
  //   ACMVADMode.
  //
  virtual ACMVADMode ReceiveVADMode() const = 0;

  ///////////////////////////////////////////////////////////////////////////
  //   Codec specific
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetISACMaxRate()
  // Set the maximum instantaneous rate of iSAC. For a payload of B bits
  // with a frame-size of T sec the instantaneous rate is B/T bist per
  // second. Therefore, (B/T < maxRateBitPerSec) and
  // (B < maxPayloadLenBytes * 8) are always satisfied for iSAC payloads,
  // c.f SetISACMaxPayloadSize().
  //
  // Input:
  //   -maxRateBitPerSec   : maximum instantaneous bit-rate given in bits/sec.
  //
  // Return value:
  //   -1 if failed to set the maximum rate.
  //    0 if the maximum rate is set successfully.
  //
  virtual WebRtc_Word32 SetISACMaxRate(
      const WebRtc_UWord32 maxRateBitPerSec) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 SetISACMaxPayloadSize()
  // Set the maximum payload size of iSAC packets. No iSAC payload,
  // regardless of its frame-size, may exceed the given limit. For
  // an iSAC payload of size B bits and frame-size T sec we have;
  // (B < maxPayloadLenBytes * 8) and (B/T < maxRateBitPerSec), c.f.
  // SetISACMaxRate().
  //
  // Input:
  //   -maxPayloadLenBytes : maximum payload size in bytes.
  //
  // Return value:
  //   -1 if failed to set the maximm  payload-size.
  //    0 if the given linit is seet successfully.
  //
  virtual WebRtc_Word32 SetISACMaxPayloadSize(
      const WebRtc_UWord16 maxPayloadLenBytes) = 0;

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32 ConfigISACBandwidthEstimator()
  // Call this function to configure the bandwidth estimator of ISAC.
  // During the adaptation of bit-rate, iSAC atomatically adjusts the
  // frame-size (either 30 or 60 ms) to save on RTP header. The initial
  // frame-size can be specified by the first argument. The configuration also
  // regards the initial estimate of bandwidths. The estimator starts from
  // this point and converges to the actual bottleneck. This is given by the
  // second parameter. Furthermore, it is also possible to control the
  // adaptation of frame-size. This is specified by the last parameter.
  //
  // Input:
  //   -initFrameSizeMsec  : initial frame-size in milisecods. For iSAC-wb
  //                         30 ms and 60 ms (default) are acceptable values,
  //                         and for iSAC-swb 30 ms is the only acceptable
  //                         value. Zero indiates default value.
  //   -initRateBitPerSec  : initial estimate of the bandwidth. Values
  //                         between 10000 and 58000 are acceptable.
  //   -enforceFrameSize   : if true, the frame-size will not be adapted.
  //
  // Return value:
  //   -1 if failed to configure the bandwidth estimator,
  //    0 if the configuration was successfully applied.
  //
  virtual WebRtc_Word32 ConfigISACBandwidthEstimator(
      const WebRtc_UWord8 initFrameSizeMsec,
      const WebRtc_UWord16 initRateBitPerSec,
      const bool enforceFrameSize = false) = 0;

  ///////////////////////////////////////////////////////////////////////////
  //   statistics
  //

  ///////////////////////////////////////////////////////////////////////////
  // WebRtc_Word32  NetworkStatistics()
  // Get network statistics.
  //
  // Input:
  //   -networkStatistics  : a structure that contains network statistics.
  //
  // Return value:
  //   -1 if failed to set the network statistics,
  //    0 if statistics are set successfully.
  //
  virtual WebRtc_Word32 NetworkStatistics(
      ACMNetworkStatistics& networkStatistics) const = 0;
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_AUDIO_CODING_MAIN_INTERFACE_AUDIO_CODING_MODULE_H
