
Adding new statistics API to NetEQ, reporting the waiting time for each frame. The output is raw waiting time for the frames that have been decoded since the last statistics report (or maximum 100 frames). The statistics are reset on each query. Implemented functionality in ACM to query NetEQ for the raw waiting times, and process it to produce max, average and median. Updating common_types.h and VoiceEngine tests to include the new metrics. Unit tests are also added for NetEQ and AcmNetEq. Review URL: http://webrtc-codereview.appspot.com/328011 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1251 4adac7df-926f-26a2-2b94-8c16560cd09d
285 lines
8.6 KiB
C
285 lines
8.6 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
|
|
};
|
|
|
|
enum { kLenWaitingTimes = 100 };
|
|
|
|
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 */
|
|
|
|
int waiting_times[kLenWaitingTimes]; /* Waiting time statistics storage. */
|
|
int len_waiting_times;
|
|
int next_waiting_time_index;
|
|
|
|
WebRtc_UWord32 externalTS;
|
|
WebRtc_UWord32 internalTS;
|
|
WebRtc_Word16 TSscalingInitialized;
|
|
enum TsScaling scalingFactor;
|
|
|
|
#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_ResetWaitingTimeStats(...)
|
|
*
|
|
* Reset waiting-time statistics.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance.
|
|
*
|
|
* Return value : n/a
|
|
*/
|
|
void WebRtcNetEQ_ResetWaitingTimeStats(MCUInst_t *inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_LogWaitingTime(...)
|
|
*
|
|
* Log waiting-time to the statistics.
|
|
*
|
|
* Input:
|
|
* - inst : MCU instance.
|
|
* - waiting_time : Waiting time in "RecOut calls" (i.e., 1 call = 10 ms).
|
|
*
|
|
* Return value : n/a
|
|
*/
|
|
void WebRtcNetEQ_StoreWaitingTime(MCUInst_t *inst, int waiting_time);
|
|
|
|
/****************************************************************************
|
|
* 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
|