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

#include "acm_generic_codec.h"

namespace webrtc
{

struct ACMISACInst;

enum iSACCodingMode {ADAPTIVE, CHANNEL_INDEPENDENT};


class ACMISAC : public ACMGenericCodec
{
public:
    ACMISAC(WebRtc_Word16 codecID);
    ~ACMISAC();
    // for FEC
    ACMGenericCodec* CreateInstance(void);

    WebRtc_Word16 InternalEncode(
        WebRtc_UWord8* bitstream,
        WebRtc_Word16* bitStreamLenByte);
    
    WebRtc_Word16 InternalInitEncoder(
        WebRtcACMCodecParams *codecParams);

    WebRtc_Word16 InternalInitDecoder(
        WebRtcACMCodecParams *codecParams);

    WebRtc_Word16 DeliverCachedIsacData(
        WebRtc_UWord8*         bitStream,
        WebRtc_Word16*         bitStreamLenByte,
        WebRtc_UWord32*        timestamp,
        WebRtcACMEncodingType* encodingType,
        const WebRtc_UWord16   isacRate,
        const WebRtc_UWord8    isacBWestimate);

    WebRtc_Word16 DeliverCachedData(
        WebRtc_UWord8*         /* bitStream        */,
        WebRtc_Word16*         /* bitStreamLenByte */,
        WebRtc_UWord32*        /* timestamp        */,
        WebRtcACMEncodingType* /* encodingType     */)
    { 
        return -1;
    }

    WebRtc_Word16 UpdateDecoderSampFreq(
        WebRtc_Word16 codecId);

    WebRtc_Word16 UpdateEncoderSampFreq(
        WebRtc_UWord16 sampFreqHz);

    WebRtc_Word16 EncoderSampFreq(
        WebRtc_UWord16& sampFreqHz);

    WebRtc_Word32 ConfigISACBandwidthEstimator(
        const WebRtc_UWord8  initFrameSizeMsec,
        const WebRtc_UWord16 initRateBitPerSec,
        const bool           enforceFrameSize);

    WebRtc_Word32 SetISACMaxPayloadSize(
        const WebRtc_UWord16 maxPayloadLenBytes);

    WebRtc_Word32 SetISACMaxRate(
        const WebRtc_UWord32 maxRateBitPerSec);

    WebRtc_Word16 REDPayloadISAC(
        const WebRtc_Word32  isacRate,
        const WebRtc_Word16  isacBwEstimate,
        WebRtc_UWord8*       payload,
        WebRtc_Word16*       payloadLenBytes);

protected:
    WebRtc_Word16 DecodeSafe(
        WebRtc_UWord8* bitStream,
        WebRtc_Word16  bitStreamLenByte,
        WebRtc_Word16* audio,
        WebRtc_Word16* audioSamples,
        WebRtc_Word8*  speechType);

    WebRtc_Word32 CodecDef(
        WebRtcNetEQ_CodecDef& codecDef, 
        const CodecInst&      codecInst);

    void DestructEncoderSafe();
    
    void DestructDecoderSafe();
    
    WebRtc_Word16 SetBitRateSafe(
        const WebRtc_Word32 bitRate);

    WebRtc_Word32 GetEstimatedBandwidthSafe();

    WebRtc_Word32 SetEstimatedBandwidthSafe(WebRtc_Word32 estimatedBandwidth);

    WebRtc_Word32 GetRedPayloadSafe(
        WebRtc_UWord8* redPayload,
        WebRtc_Word16* payloadBytes);

    WebRtc_Word16 InternalCreateEncoder();
    
    WebRtc_Word16 InternalCreateDecoder();
    
    void InternalDestructEncoderInst(
        void* ptrInst);

    WebRtc_Word16 Transcode(
        WebRtc_UWord8* bitStream,
        WebRtc_Word16* bitStreamLenByte,
        WebRtc_Word16  qBWE,
        WebRtc_Word32  rate,
        bool           isRED);

    WebRtc_Word16 UnregisterFromNetEqSafe(
        ACMNetEQ*     netEq,
        WebRtc_Word16 payloadType);

    void CurrentRate(WebRtc_Word32& rateBitPerSec);

    void UpdateFrameLen();
    
    bool DecoderParamsSafe(
        WebRtcACMCodecParams *decParams,
        const WebRtc_UWord8  payloadType);

    void SaveDecoderParamSafe(
        const WebRtcACMCodecParams* codecParams);

    ACMISACInst* _codecInstPtr;

    bool                  _isEncInitialized;
    iSACCodingMode        _isacCodingMode;
    bool                  _enforceFrameSize;
    WebRtc_Word32         _isacCurrentBN;
    WebRtc_UWord16        _samplesIn10MsAudio;
    WebRtcACMCodecParams  _decoderParams32kHz;
};

} //namespace

#endif // ACM_ISAC_H
