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

#include <stdio.h>
#include <vector>

#include "webrtc_neteq.h"
#include "webrtc_neteq_internal.h"

#include "NETEQTEST_RTPpacket.h"

#ifdef WIN32
#define WINDOWS_TIMING // complexity measurement only implemented for windows
//TODO(hlundin):Add complexity testing for Linux.
#include <windows.h>
#endif

class NETEQTEST_NetEQClass
{
public:
    NETEQTEST_NetEQClass();
    NETEQTEST_NetEQClass(enum WebRtcNetEQDecoder *usedCodec, int noOfCodecs, 
        WebRtc_UWord16 fs = 8000, WebRtcNetEQNetworkType nwType = kTCPLargeJitter);
    ~NETEQTEST_NetEQClass();

    int assign();
    int init(WebRtc_UWord16 fs = 8000);
    int assignBuffer(enum WebRtcNetEQDecoder *usedCodec, int noOfCodecs, WebRtcNetEQNetworkType nwType = kTCPLargeJitter);
    int loadCodec(WebRtcNetEQ_CodecDef & codecInst);
    int recIn(NETEQTEST_RTPpacket & rtp);
    WebRtc_Word16 recOut(WebRtc_Word16 *outData, void *msInfo = NULL, enum WebRtcNetEQOutputType *outputType = NULL);
    WebRtc_UWord32 getSpeechTimeStamp();
    WebRtcNetEQOutputType getOutputType();

    void * instance() { return (_inst); };
    void usePreparseRTP( bool useIt = true ) { _preparseRTP = useIt; };
    bool usingPreparseRTP() { return (_preparseRTP); };
    void setMaster( bool isMaster = true ) { _isMaster = isMaster; };
    void setSlave() { _isMaster = false; };
    bool isMaster() { return (_isMaster); };
    bool isSlave() { return (!_isMaster); };

#ifdef WINDOWS_TIMING
    double getRecInTime() { return (static_cast<double>( _totTimeRecIn.QuadPart )); };
    double getRecOutTime() { return (static_cast<double>( _totTimeRecOut.QuadPart )); };
#else
    double getRecInTime() { return (0.0); };
    double getRecOutTime() { return (0.0); };

#endif

    void printError();
    void printError(NETEQTEST_RTPpacket & rtp);

private:
    void *          _inst;
    WebRtc_Word8 *    _instMem;
    WebRtc_Word8 *    _bufferMem;
    bool            _preparseRTP;
    int             _fsmult;
    bool            _isMaster;
#ifdef WINDOWS_TIMING
    LARGE_INTEGER   _totTimeRecIn;
    LARGE_INTEGER   _totTimeRecOut;
#endif
};



//class NETEQTEST_NetEQVector
//{
//public:
//    NETEQTEST_NetEQVector(int numChannels);
//    NETEQTEST_NetEQVector(int numChannels, enum WebRtcNetEQDecoder *usedCodec, int noOfCodecs, 
//        WebRtc_UWord16 fs = 8000, WebRtcNetEQNetworkType nwType = kTCPLargeJitter);
//    ~NETEQTEST_NetEQVector();
//
//private:
//    std::vector<NETEQTEST_NetEQClass *> channels;
//};

#endif //NETEQTEST_NETEQCLASS_H
