/*
 *  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.
 */

/*
 * Interface for the codec database.
 */

#ifndef CODEC_DB_H
#define CODEC_DB_H

#include "typedefs.h"

#include "webrtc_neteq.h"
#include "codec_db_defines.h"
#include "neteq_defines.h"

#if defined(NETEQ_48KHZ_WIDEBAND)
    #define NUM_CNG_CODECS 4
#elif defined(NETEQ_32KHZ_WIDEBAND)
    #define NUM_CNG_CODECS 3
#elif defined(NETEQ_WIDEBAND)
    #define NUM_CNG_CODECS 2
#else
    #define NUM_CNG_CODECS 1
#endif

typedef struct
{

    WebRtc_Word16 position[NUM_TOTAL_CODECS];
    WebRtc_Word16 nrOfCodecs;

    WebRtc_Word16 payloadType[NUM_CODECS];
    FuncDecode funcDecode[NUM_CODECS];
    FuncDecode funcDecodeRCU[NUM_CODECS];
    FuncDecodePLC funcDecodePLC[NUM_CODECS];
    FuncDecodeInit funcDecodeInit[NUM_CODECS];
    FuncAddLatePkt funcAddLatePkt[NUM_CODECS];
    FuncGetMDinfo funcGetMDinfo[NUM_CODECS];
    FuncGetPitchInfo funcGetPitch[NUM_CODECS];
    FuncUpdBWEst funcUpdBWEst[NUM_CODECS];
    FuncGetErrorCode funcGetErrorCode[NUM_CODECS];
    void * codec_state[NUM_CODECS];
    WebRtc_UWord16 codec_fs[NUM_CODECS];
    WebRtc_Word16 CNGpayloadType[NUM_CNG_CODECS];

} CodecDbInst_t;

#define NO_SPLIT -1 /* codec payload cannot be split */

typedef struct
{
    WebRtc_Word16 deltaBytes;
    WebRtc_Word16 deltaTime;
} SplitInfo_t;

/*
 * Resets the codec database.
 */
int WebRtcNetEQ_DbReset(CodecDbInst_t *inst);

/*
 * Adds a new codec to the database.
 */
int WebRtcNetEQ_DbAdd(CodecDbInst_t *inst, enum WebRtcNetEQDecoder codec,
                      WebRtc_Word16 payloadType, FuncDecode funcDecode,
                      FuncDecode funcDecodeRCU, FuncDecodePLC funcDecodePLC,
                      FuncDecodeInit funcDecodeInit, FuncAddLatePkt funcAddLatePkt,
                      FuncGetMDinfo funcGetMDinfo, FuncGetPitchInfo funcGetPitch,
                      FuncUpdBWEst funcUpdBWEst, FuncGetErrorCode funcGetErrorCode,
                      void* codec_state, WebRtc_UWord16 codec_fs);

/*
 * Removes a codec from the database.
 */
int WebRtcNetEQ_DbRemove(CodecDbInst_t *inst, enum WebRtcNetEQDecoder codec);

/*
 * Get the decoder function pointers for a codec.
 */
int WebRtcNetEQ_DbGetPtrs(CodecDbInst_t *inst, enum WebRtcNetEQDecoder,
                          CodecFuncInst_t *ptr_inst);

/*
 * Returns payload number given a codec identifier.
 */

int WebRtcNetEQ_DbGetPayload(CodecDbInst_t *inst, enum WebRtcNetEQDecoder codecID);

/*
 * Returns codec identifier given a payload number.
 */

int WebRtcNetEQ_DbGetCodec(CodecDbInst_t *inst, int payloadType);

/*
 * Extracts the Payload Split information of the codec with the specified payloadType.
 */

int WebRtcNetEQ_DbGetSplitInfo(SplitInfo_t *inst, enum WebRtcNetEQDecoder codecID,
                               int codedsize);

/*
 * Returns 1 if codec is multiple description type, 0 otherwise.
 */
int WebRtcNetEQ_DbIsMDCodec(enum WebRtcNetEQDecoder codecID);

/*
 * Returns 1 if payload type is registered as a CNG codec, 0 otherwise.
 */
int WebRtcNetEQ_DbIsCNGPayload(CodecDbInst_t *inst, int payloadType);

/*
 * Return the sample rate for the codec with the given payload type, 0 if error.
 */
WebRtc_UWord16 WebRtcNetEQ_DbGetSampleRate(CodecDbInst_t *inst, int payloadType);

#endif

