
This is a copy of http://review.webrtc.org/864014/ This adds a FuncDurationEst to each codec instance which estimates the duration of a packet given the packet contents and the duration of the previous packet. By default, this simply returns the duration of the previous packet (which is what is currently assumed to be the duration of all future packets). This patch also provides an initial implementation of this function for G.711 which returns the actual number of samples in the packet. BUG=issue1015 Review URL: https://webrtc-codereview.appspot.com/935016 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3129 4adac7df-926f-26a2-2b94-8c16560cd09d
227 lines
7.6 KiB
C
227 lines
7.6 KiB
C
/*
|
|
* Copyright (c) 2012 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.
|
|
*/
|
|
|
|
/*
|
|
* This is the main API for NetEQ. Helper macros are located in webrtc_neteq_help_macros.h,
|
|
* while some internal API functions are found in webrtc_neteq_internal.h.
|
|
*/
|
|
|
|
#include "typedefs.h"
|
|
|
|
#ifndef WEBRTC_NETEQ_H
|
|
#define WEBRTC_NETEQ_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
/**********************************************************
|
|
* Definitions
|
|
*/
|
|
|
|
enum WebRtcNetEQDecoder
|
|
{
|
|
kDecoderReservedStart,
|
|
kDecoderPCMu,
|
|
kDecoderPCMa,
|
|
kDecoderPCMu_2ch,
|
|
kDecoderPCMa_2ch,
|
|
kDecoderILBC,
|
|
kDecoderISAC,
|
|
kDecoderISACswb,
|
|
kDecoderPCM16B,
|
|
kDecoderPCM16Bwb,
|
|
kDecoderPCM16Bswb32kHz,
|
|
kDecoderPCM16Bswb48kHz,
|
|
kDecoderPCM16B_2ch,
|
|
kDecoderPCM16Bwb_2ch,
|
|
kDecoderPCM16Bswb32kHz_2ch,
|
|
kDecoderG722,
|
|
kDecoderG722_2ch,
|
|
kDecoderRED,
|
|
kDecoderAVT,
|
|
kDecoderCNG,
|
|
kDecoderArbitrary,
|
|
kDecoderG729,
|
|
kDecoderG729_1,
|
|
kDecoderG726_16,
|
|
kDecoderG726_24,
|
|
kDecoderG726_32,
|
|
kDecoderG726_40,
|
|
kDecoderG722_1_16,
|
|
kDecoderG722_1_24,
|
|
kDecoderG722_1_32,
|
|
kDecoderG722_1C_24,
|
|
kDecoderG722_1C_32,
|
|
kDecoderG722_1C_48,
|
|
kDecoderOpus,
|
|
kDecoderOpus_2ch,
|
|
kDecoderSPEEX_8,
|
|
kDecoderSPEEX_16,
|
|
kDecoderCELT_32,
|
|
kDecoderCELT_32_2ch,
|
|
kDecoderGSMFR,
|
|
kDecoderAMR,
|
|
kDecoderAMRWB,
|
|
kDecoderReservedEnd
|
|
};
|
|
|
|
enum WebRtcNetEQNetworkType
|
|
{
|
|
kUDPNormal,
|
|
kUDPVideoSync,
|
|
kTCPNormal,
|
|
kTCPLargeJitter,
|
|
kTCPXLargeJitter
|
|
};
|
|
|
|
enum WebRtcNetEQOutputType
|
|
{
|
|
kOutputNormal,
|
|
kOutputPLC,
|
|
kOutputCNG,
|
|
kOutputPLCtoCNG,
|
|
kOutputVADPassive
|
|
};
|
|
|
|
enum WebRtcNetEQPlayoutMode
|
|
{
|
|
kPlayoutOn, kPlayoutOff, kPlayoutFax, kPlayoutStreaming
|
|
};
|
|
|
|
/* Available modes for background noise (inserted after long expands) */
|
|
enum WebRtcNetEQBGNMode
|
|
{
|
|
kBGNOn, /* default "normal" behavior with eternal noise */
|
|
kBGNFade, /* noise fades to zero after some time */
|
|
kBGNOff
|
|
/* background noise is always zero */
|
|
};
|
|
|
|
/*************************************************
|
|
* Definitions of decoder calls and the default
|
|
* API function calls for each codec
|
|
*/
|
|
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncDecode)(void* state, WebRtc_Word16* encoded,
|
|
WebRtc_Word16 len, WebRtc_Word16* decoded,
|
|
WebRtc_Word16* speechType);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncDecodePLC)(void* state, WebRtc_Word16* decoded,
|
|
WebRtc_Word16 frames);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncDecodeInit)(void* state);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncAddLatePkt)(void* state, WebRtc_Word16* encoded,
|
|
WebRtc_Word16 len);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncGetMDinfo)(void* state);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncGetPitchInfo)(void* state, WebRtc_Word16* encoded,
|
|
WebRtc_Word16* length);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncUpdBWEst)(void* state, const WebRtc_UWord16 *encoded,
|
|
WebRtc_Word32 packet_size,
|
|
WebRtc_UWord16 rtp_seq_number,
|
|
WebRtc_UWord32 send_ts,
|
|
WebRtc_UWord32 arr_ts);
|
|
typedef int (*WebRtcNetEQ_FuncDurationEst)(void* state, const uint8_t* payload,
|
|
int payload_length_bytes);
|
|
typedef WebRtc_Word16 (*WebRtcNetEQ_FuncGetErrorCode)(void* state);
|
|
|
|
/**********************************************************
|
|
* Structures
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
enum WebRtcNetEQDecoder codec;
|
|
WebRtc_Word16 payloadType;
|
|
WebRtcNetEQ_FuncDecode funcDecode;
|
|
WebRtcNetEQ_FuncDecode funcDecodeRCU;
|
|
WebRtcNetEQ_FuncDecodePLC funcDecodePLC;
|
|
WebRtcNetEQ_FuncDecodeInit funcDecodeInit;
|
|
WebRtcNetEQ_FuncAddLatePkt funcAddLatePkt;
|
|
WebRtcNetEQ_FuncGetMDinfo funcGetMDinfo;
|
|
WebRtcNetEQ_FuncGetPitchInfo funcGetPitch;
|
|
WebRtcNetEQ_FuncUpdBWEst funcUpdBWEst;
|
|
WebRtcNetEQ_FuncDurationEst funcDurationEst;
|
|
WebRtcNetEQ_FuncGetErrorCode funcGetErrorCode;
|
|
void* codec_state;
|
|
WebRtc_UWord16 codec_fs;
|
|
} WebRtcNetEQ_CodecDef;
|
|
|
|
typedef struct
|
|
{
|
|
WebRtc_UWord16 fraction_lost;
|
|
WebRtc_UWord32 cum_lost;
|
|
WebRtc_UWord32 ext_max;
|
|
WebRtc_UWord32 jitter;
|
|
} WebRtcNetEQ_RTCPStat;
|
|
|
|
/**********************************************************
|
|
* NETEQ Functions
|
|
*/
|
|
|
|
/* Info functions */
|
|
|
|
#define WEBRTC_NETEQ_MAX_ERROR_NAME 40
|
|
int WebRtcNetEQ_GetErrorCode(void *inst);
|
|
int WebRtcNetEQ_GetErrorName(int errorCode, char *errorName, int maxStrLen);
|
|
|
|
/* Instance memory assign functions */
|
|
|
|
int WebRtcNetEQ_AssignSize(int *sizeinbytes);
|
|
int WebRtcNetEQ_Assign(void **inst, void *NETEQ_inst_Addr);
|
|
int WebRtcNetEQ_GetRecommendedBufferSize(void *inst, const enum WebRtcNetEQDecoder *codec,
|
|
int noOfCodecs, enum WebRtcNetEQNetworkType nwType,
|
|
int *MaxNoOfPackets, int *sizeinbytes);
|
|
int WebRtcNetEQ_AssignBuffer(void *inst, int MaxNoOfPackets, void *NETEQ_Buffer_Addr,
|
|
int sizeinbytes);
|
|
|
|
/* Init functions */
|
|
|
|
int WebRtcNetEQ_Init(void *inst, WebRtc_UWord16 fs);
|
|
int WebRtcNetEQ_SetAVTPlayout(void *inst, int PlayoutAVTon);
|
|
int WebRtcNetEQ_SetExtraDelay(void *inst, int DelayInMs);
|
|
int WebRtcNetEQ_SetPlayoutMode(void *inst, enum WebRtcNetEQPlayoutMode playoutMode);
|
|
int WebRtcNetEQ_SetBGNMode(void *inst, enum WebRtcNetEQBGNMode bgnMode);
|
|
int WebRtcNetEQ_GetBGNMode(const void *inst, enum WebRtcNetEQBGNMode *bgnMode);
|
|
|
|
/* Codec Database functions */
|
|
|
|
int WebRtcNetEQ_CodecDbReset(void *inst);
|
|
int WebRtcNetEQ_CodecDbAdd(void *inst, WebRtcNetEQ_CodecDef *codecInst);
|
|
int WebRtcNetEQ_CodecDbRemove(void *inst, enum WebRtcNetEQDecoder codec);
|
|
int WebRtcNetEQ_CodecDbGetSizeInfo(void *inst, WebRtc_Word16 *UsedEntries,
|
|
WebRtc_Word16 *MaxEntries);
|
|
int WebRtcNetEQ_CodecDbGetCodecInfo(void *inst, WebRtc_Word16 Entry,
|
|
enum WebRtcNetEQDecoder *codec);
|
|
|
|
/* Real-time functions */
|
|
|
|
int WebRtcNetEQ_RecIn(void *inst, WebRtc_Word16 *p_w16datagramstart, WebRtc_Word16 w16_RTPlen,
|
|
WebRtc_UWord32 uw32_timeRec);
|
|
int WebRtcNetEQ_RecOut(void *inst, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len);
|
|
int WebRtcNetEQ_GetRTCPStats(void *inst, WebRtcNetEQ_RTCPStat *RTCP_inst);
|
|
int WebRtcNetEQ_GetRTCPStatsNoReset(void *inst, WebRtcNetEQ_RTCPStat *RTCP_inst);
|
|
int WebRtcNetEQ_GetSpeechTimeStamp(void *inst, WebRtc_UWord32 *timestamp);
|
|
int WebRtcNetEQ_GetSpeechOutputType(void *inst, enum WebRtcNetEQOutputType *outputType);
|
|
|
|
/* VQmon related functions */
|
|
int WebRtcNetEQ_VQmonRecOutStatistics(void *inst, WebRtc_UWord16 *validVoiceDurationMs,
|
|
WebRtc_UWord16 *concealedVoiceDurationMs,
|
|
WebRtc_UWord8 *concealedVoiceFlags);
|
|
int WebRtcNetEQ_VQmonGetConfiguration(void *inst, WebRtc_UWord16 *absMaxDelayMs,
|
|
WebRtc_UWord8 *adaptationRate);
|
|
int WebRtcNetEQ_VQmonGetRxStatistics(void *inst, WebRtc_UWord16 *avgDelayMs,
|
|
WebRtc_UWord16 *maxDelayMs);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|