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

#include "audio_coding_module.h"
#include "audio_coding_module_typedefs.h"
#include "engine_configurations.h"
#include "module_common_types.h"
#include "typedefs.h"
#include "webrtc_neteq.h"
#include "webrtc_vad.h"

namespace webrtc {

class CriticalSectionWrapper;
class RWLockWrapper;
struct CodecInst;
enum AudioPlayoutMode;
enum ACMSpeechType;

#define MAX_NUM_SLAVE_NETEQ 1

class ACMNetEQ
{
public:
    // Constructor of the class
    ACMNetEQ();

    // Destructor of the class.
    ~ACMNetEQ();

    //
    // GetVersion()
    // Fills the version array with the NetEQ version and updates the
    // remainingBufferInBytes and position variables accordingly.
    //
    // Output:
    //   - version               : An array to be filled with the version
    //                             data.
    //
    // Input/Output:
    //   - remainingBuffInBytes  : The number of free bytes at the end of
    //                             the version array.
    //   - position              : Position where the free space starts.
    //
    // Return value              : 0 if ok.
    //                            -1 if NetEQ returned an error.
    //
    static WebRtc_Word32 GetVersion(
        WebRtc_Word8*   version,
        WebRtc_UWord32& remainingBuffInBytes,
        WebRtc_UWord32& position);

    //
    // Init()
    // Allocates memory for NetEQ and VAD and initializes them.
    //
    // Return value              : 0 if ok.
    //                            -1 if NetEQ or VAD returned an error or
    //                            if out of memory.
    //
    WebRtc_Word32 Init();

    //
    // RecIn()
    // Gives the payload to NetEQ.
    //
    // Input:
    //   - incomingPayload       : Incoming audio payload.
    //   - payloadLength         : Length of incoming audio payload.
    //   - rtpInfo               : RTP header for the incoming payload containing
    //                             information about payload type, sequence number,
    //                             timestamp, ssrc and marker bit.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 RecIn(
        const WebRtc_Word8*    incomingPayload,
        const WebRtc_Word32    payloadLength,
        const WebRtcRTPHeader&   rtpInfo);

    //
    // RecOut()
    // Asks NetEQ for 10 ms of decoded audio.
    //
    // Input:
    //   -audioFrame             : an audio frame were output data and
    //                             associated parameters are written to.
    //
    // Return value              : 0 if ok.
    //                            -1 if NetEQ returned an error.
    //
    WebRtc_Word32 RecOut(
        AudioFrame& audioFrame);

    //
    // AddCodec()
    // Adds a new codec to the NetEQ codec database.
    //
    // Input:
    //   - codecDef              : The codec to be added.
    //   - toMaster              : true if the codec has to be added to Master
    //                             NetEq, otherwise will be added to the Slave
    //                             NetEQ.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 AddCodec(
        WebRtcNetEQ_CodecDef *codecDef,
        bool                  toMaster = true);

    //
    // AllocatePacketBuffer()
    // Allocates the NetEQ packet buffer.
    //
    // Input:
    //   - usedCodecs            : An array of the codecs to be used by NetEQ.
    //   - noOfCodecs            : Number of codecs in usedCodecs.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 AllocatePacketBuffer(
        const WebRtcNetEQDecoder* usedCodecs,
        WebRtc_Word16    noOfCodecs);

    //
    // SetExtraDelay()
    // Sets an delayInMS milliseconds extra delay in NetEQ.
    //
    // Input:
    //   - delayInMS             : Extra delay in milliseconds.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 SetExtraDelay(
        const WebRtc_Word32 delayInMS);

    //
    // SetAVTPlayout()
    // Enable/disable playout of AVT payloads.
    //
    // Input:
    //   - enable                : Enable if true, disable if false.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 SetAVTPlayout(
        const bool enable);

    //
    // AVTPlayout()
    // Get the current AVT playout state.
    //
    // Return value              : True if AVT playout is enabled.
    //                             False if AVT playout is disabled.
    //
    bool AVTPlayout() const;

    //
    // CurrentSampFreqHz()
    // Get the current sampling frequency in Hz.
    //
    // Return value              : Sampling frequency in Hz.
    //
    WebRtc_Word32 CurrentSampFreqHz() const;

    //
    // SetPlayoutMode()
    // Sets the playout mode to voice or fax.
    //
    // Input:
    //   - mode                  : The playout mode to be used, voice,
    //                             fax, or streaming.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 SetPlayoutMode(
        const AudioPlayoutMode mode);

    //
    // PlayoutMode()
    // Get the current playout mode.
    //
    // Return value              : The current playout mode.
    //
    AudioPlayoutMode PlayoutMode() const;

    //
    // NetworkStatistics()
    // Get the current network statistics from NetEQ.
    //
    // Output:
    //   - statistics            : The current network statistics.
    //
    // Return value              : 0 if ok.
    //                            <0 if NetEQ returned an error.
    //
    WebRtc_Word32 NetworkStatistics(
        ACMNetworkStatistics* statistics) const;

    //
    // VADMode()
    // Get the current VAD Mode.
    //
    // Return value              : The current VAD mode.
    //
    ACMVADMode VADMode() const;

    //
    // SetVADMode()
    // Set the VAD mode.
    //
    // Input:
    //   - mode                  : The new VAD mode.
    //
    // Return value              : 0 if ok.
    //                            -1 if an error occurred.
    //
    WebRtc_Word16 SetVADMode(
        const ACMVADMode mode);

    //
    // DecodeLock()
    // Get the decode lock used to protect decoder instances while decoding.
    //
    // Return value              : Pointer to the decode lock.
    //
    RWLockWrapper* DecodeLock() const
    {
        return _decodeLock;
    }

    //
    // FlushBuffers()
    // Flushes the NetEQ packet and speech buffers.
    //
    // Return value              : 0 if ok.
    //                            -1 if NetEQ returned an error.
    //
    WebRtc_Word32 FlushBuffers();

    //
    // RemoveCodec()
    // Removes a codec from the NetEQ codec database.
    //
    // Input:
    //   - codecIdx              : Codec to be removed.
    //
    // Return value              : 0 if ok.
    //                            -1 if an error occurred.
    //
    WebRtc_Word16 RemoveCodec(
        WebRtcNetEQDecoder codecIdx,
        bool isStereo = false);


    //
    // SetBackgroundNoiseMode()
    // Set the mode of the background noise.
    //
    // Input:
    //   - mode                  : an enumerator specifying the mode of the
    //                             background noise.
    //
    // Return value              : 0 if succeeded,
    //                            -1 if failed to set the mode.
    //
    WebRtc_Word16 SetBackgroundNoiseMode(
        const ACMBackgroundNoiseMode mode);

    //
    // BackgroundNoiseMode()
    // return the mode of the background noise.
    //
    // Return value              : The mode of background noise.
    //
    WebRtc_Word16 BackgroundNoiseMode(
        ACMBackgroundNoiseMode& mode);

    void SetUniqueId(
        WebRtc_Word32 id);

    WebRtc_Word32 PlayoutTimestamp(
        WebRtc_UWord32& timestamp);

    void SetReceivedStereo(
        bool receivedStereo);

    WebRtc_UWord8 NumSlaves();

    enum JB {masterJB = 0, slaveJB = 1};

    WebRtc_Word16 AddSlave(
        const WebRtcNetEQDecoder*    usedCodecs,
        WebRtc_Word16       noOfCodecs);

private:
    //
    // RTPPack()
    // Creates a Word16 RTP packet out of the payload data in Word16 and
    // a WebRtcRTPHeader.
    //
    // Input:
    //   - payload               : Payload to be packetized.
    //   - payloadLengthW8       : Length of the payload in bytes.
    //   - rtpInfo               : RTP header struct.
    //
    // Output:
    //   - rtpPacket             : The RTP packet.
    //
    static void RTPPack(
        WebRtc_Word16*         rtpPacket,
        const WebRtc_Word8*    payload,
        const WebRtc_Word32    payloadLengthW8,
        const WebRtcRTPHeader& rtpInfo);

    void LogError(
        const WebRtc_Word8* neteqFuncName,
        const WebRtc_Word16 idx) const;

    WebRtc_Word16 InitByIdxSafe(
        const WebRtc_Word16 idx);

    // EnableVAD()
    // Enable VAD.
    //
    // Return value              : 0 if ok.
    //                            -1 if an error occurred.
    //
    WebRtc_Word16 EnableVAD();

    WebRtc_Word16 EnableVADByIdxSafe(
        const WebRtc_Word16 idx);

    WebRtc_Word16 AllocatePacketBufferByIdxSafe(
        const WebRtcNetEQDecoder* usedCodecs,
        WebRtc_Word16       noOfCodecs,
        const WebRtc_Word16 idx);

    void*                   _inst[MAX_NUM_SLAVE_NETEQ + 1];
    void*                   _instMem[MAX_NUM_SLAVE_NETEQ + 1];

    WebRtc_Word16*          _netEqPacketBuffer[MAX_NUM_SLAVE_NETEQ + 1];

    WebRtc_Word32           _id;
    float                   _currentSampFreqKHz;
    bool                    _avtPlayout;
    AudioPlayoutMode        _playoutMode;
    CriticalSectionWrapper* _netEqCritSect;

    WebRtcVadInst*          _ptrVADInst[MAX_NUM_SLAVE_NETEQ + 1];

    bool                    _vadStatus;
    ACMVADMode              _vadMode;
    RWLockWrapper*          _decodeLock;
    bool                    _isInitialized[MAX_NUM_SLAVE_NETEQ + 1];
    WebRtc_UWord8           _numSlaves;
    bool                    _receivedStereo;
    void*                   _masterSlaveInfo;
    AudioFrame::VADActivity _previousAudioActivity;
    WebRtc_Word32           _extraDelay;

    CriticalSectionWrapper* _callbackCritSect;
};

} //namespace webrtc

#endif  // WEBRTC_MODULES_AUDIO_CODING_MAIN_SOURCE_ACM_NETEQ_H_
