
During call setup Opus should always be signaled as a 48000 Hz stereo codec, not depending on what we plan to send, or how we plan to decode received packets. The previous implementation had different payload types for mono and stereo, which breaks the proposed standard. While working on this CL I ran in to the problem reported earlier, that we could get a crash related to deleting decoder memory. This should now be solved in Patch Set 3. BUG=issue1013, issue1112 Review URL: https://webrtc-codereview.appspot.com/933022 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3177 4adac7df-926f-26a2-2b94-8c16560cd09d
226 lines
7.6 KiB
C
226 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,
|
|
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
|