256 lines
7.7 KiB
C
256 lines
7.7 KiB
C
/*
|
|
* 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.
|
|
*/
|
|
|
|
/*
|
|
* MCU struct and functions related to the MCU side operations.
|
|
*/
|
|
|
|
#ifndef MCU_H
|
|
#define MCU_H
|
|
|
|
#include "typedefs.h"
|
|
|
|
#include "codec_db.h"
|
|
#include "rtcp.h"
|
|
#include "packet_buffer.h"
|
|
#include "buffer_stats.h"
|
|
#include "neteq_statistics.h"
|
|
|
|
#ifdef NETEQ_ATEVENT_DECODE
|
|
#include "dtmf_buffer.h"
|
|
#endif
|
|
|
|
#define MAX_ONE_DESC 5 /* cannot do more than this many consecutive one-descriptor decodings */
|
|
#define MAX_LOSS_REPORT_PERIOD 60 /* number of seconds between auto-reset */
|
|
|
|
enum TsScaling
|
|
{
|
|
kTSnoScaling = 0,
|
|
kTSscalingTwo,
|
|
kTSscalingTwoThirds,
|
|
kTSscalingFourThirds
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
|
|
WebRtc_Word16 current_Codec;
|
|
WebRtc_Word16 current_Payload;
|
|
WebRtc_UWord32 timeStamp; /* Next timestamp that should be played */
|
|
WebRtc_Word16 millisecondsPerCall;
|
|
WebRtc_UWord16 timestampsPerCall; /* Output chunk size */
|
|
WebRtc_UWord16 fs;
|
|
WebRtc_UWord32 ssrc; /* Current ssrc */
|
|
WebRtc_Word16 new_codec;
|
|
WebRtc_Word16 first_packet;
|
|
|
|
/* MCU/DSP Communication layer */
|
|
WebRtc_Word16 *pw16_readAddress;
|
|
WebRtc_Word16 *pw16_writeAddress;
|
|
void *main_inst;
|
|
|
|
CodecDbInst_t codec_DB_inst; /* Information about all the codecs, i.e. which
|
|
functions to use and which codpoints that
|
|
have been assigned */
|
|
SplitInfo_t PayloadSplit_inst; /* Information about how the current codec
|
|
payload should be splitted */
|
|
WebRtcNetEQ_RTCP_t RTCP_inst; /* RTCP statistics */
|
|
PacketBuf_t PacketBuffer_inst; /* The packet buffer */
|
|
BufstatsInst_t BufferStat_inst; /* Statistics that are used to make decision
|
|
for what the DSP should perform */
|
|
#ifdef NETEQ_ATEVENT_DECODE
|
|
dtmf_inst_t DTMF_inst;
|
|
#endif
|
|
int NoOfExpandCalls;
|
|
WebRtc_Word16 AVT_PlayoutOn;
|
|
enum WebRtcNetEQPlayoutMode NetEqPlayoutMode;
|
|
|
|
WebRtc_Word16 one_desc; /* Number of times running on one desc */
|
|
|
|
WebRtc_UWord32 lostTS; /* Number of timestamps lost */
|
|
WebRtc_UWord32 lastReportTS; /* Timestamp elapsed since last report was given */
|
|
|
|
WebRtc_UWord32 externalTS;
|
|
WebRtc_UWord32 internalTS;
|
|
WebRtc_Word16 TSscalingInitialized;
|
|
enum TsScaling scalingFactor;
|
|
|
|
MCUStats_t statInst;
|
|
|
|
#ifdef NETEQ_STEREO
|
|
int usingStereo;
|
|
#endif
|
|
|
|
} MCUInst_t;
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_McuReset(...)
|
|
*
|
|
* Reset the MCU instance.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_McuReset(MCUInst_t *inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_ResetMcuInCallStats(...)
|
|
*
|
|
* Reset MCU-side statistics variables for the in-call statistics.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_ResetMcuInCallStats(MCUInst_t *inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_ResetMcuJitterStat(...)
|
|
*
|
|
* Reset MCU-side statistics variables for the post-call statistics.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_ResetMcuJitterStat(MCUInst_t *inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_McuAddressInit(...)
|
|
*
|
|
* Initializes MCU with read address and write address.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
* - Data2McuAddress : Pointer to MCU address
|
|
* - Data2DspAddress : Pointer to DSP address
|
|
* - main_inst : Pointer to NetEQ main instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_McuAddressInit(MCUInst_t *inst, void * Data2McuAddress,
|
|
void * Data2DspAddress, void *main_inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_McuSetFs(...)
|
|
*
|
|
* Initializes MCU with read address and write address.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
* - fs_hz : Sample rate in Hz -- 8000, 16000, 32000, (48000)
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_McuSetFs(MCUInst_t *inst, WebRtc_UWord16 fs_hz);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_SignalMcu(...)
|
|
*
|
|
* Signal the MCU that data is available and ask for a RecOut decision.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
int WebRtcNetEQ_SignalMcu(MCUInst_t *inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_RecInInternal(...)
|
|
*
|
|
* This function inserts a packet into the jitter buffer.
|
|
*
|
|
* Input:
|
|
* - MCU_inst : MCU instance
|
|
* - RTPpacket : The RTP packet, parsed into NetEQ's internal RTP struct
|
|
* - uw32_timeRec : Time stamp for the arrival of the packet (not RTP timestamp)
|
|
*
|
|
* Return value : 0 - Ok
|
|
* -1 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_RecInInternal(MCUInst_t *MCU_inst, RTPPacket_t *RTPpacket,
|
|
WebRtc_UWord32 uw32_timeRec);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_RecInInternal(...)
|
|
*
|
|
* Split the packet according to split_inst and inserts the parts into
|
|
* Buffer_inst.
|
|
*
|
|
* Input:
|
|
* - MCU_inst : MCU instance
|
|
* - RTPpacket : The RTP packet, parsed into NetEQ's internal RTP struct
|
|
* - uw32_timeRec : Time stamp for the arrival of the packet (not RTP timestamp)
|
|
*
|
|
* Return value : 0 - Ok
|
|
* -1 - Error
|
|
*/
|
|
int WebRtcNetEQ_SplitAndInsertPayload(RTPPacket_t *packet, PacketBuf_t *Buffer_inst,
|
|
SplitInfo_t *split_inst, WebRtc_Word16 *flushed);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_GetTimestampScaling(...)
|
|
*
|
|
* Update information about timestamp scaling for a payload type
|
|
* in MCU_inst->scalingFactor.
|
|
*
|
|
* Input:
|
|
* - MCU_inst : MCU instance
|
|
* - rtpPayloadType : RTP payload number
|
|
*
|
|
* Return value : 0 - Ok
|
|
* -1 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_GetTimestampScaling(MCUInst_t *MCU_inst, int rtpPayloadType);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_ScaleTimestampExternalToInternal(...)
|
|
*
|
|
* Convert from external to internal timestamp using current scaling info.
|
|
*
|
|
* Input:
|
|
* - MCU_inst : MCU instance
|
|
* - externalTS : External timestamp
|
|
*
|
|
* Return value : Internal timestamp
|
|
*/
|
|
|
|
WebRtc_UWord32 WebRtcNetEQ_ScaleTimestampExternalToInternal(const MCUInst_t *MCU_inst,
|
|
WebRtc_UWord32 externalTS);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_ScaleTimestampInternalToExternal(...)
|
|
*
|
|
* Convert from external to internal timestamp using current scaling info.
|
|
*
|
|
* Input:
|
|
* - MCU_inst : MCU instance
|
|
* - externalTS : Internal timestamp
|
|
*
|
|
* Return value : External timestamp
|
|
*/
|
|
|
|
WebRtc_UWord32 WebRtcNetEQ_ScaleTimestampInternalToExternal(const MCUInst_t *MCU_inst,
|
|
WebRtc_UWord32 internalTS);
|
|
#endif
|