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
220 lines
7.2 KiB
C
220 lines
7.2 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.
|
|
*/
|
|
|
|
/*
|
|
* Interface for the actual packet buffer data structure.
|
|
*/
|
|
|
|
#ifndef PACKET_BUFFER_H
|
|
#define PACKET_BUFFER_H
|
|
|
|
#include "typedefs.h"
|
|
|
|
#include "webrtc_neteq.h"
|
|
#include "rtp.h"
|
|
|
|
/* Define minimum allowed buffer memory, in 16-bit words */
|
|
#define PBUFFER_MIN_MEMORY_SIZE 150
|
|
|
|
/****************************/
|
|
/* The packet buffer struct */
|
|
/****************************/
|
|
|
|
typedef struct
|
|
{
|
|
|
|
/* Variables common to the entire buffer */
|
|
WebRtc_UWord16 packSizeSamples; /* packet size in samples of last decoded packet */
|
|
WebRtc_Word16 *startPayloadMemory; /* pointer to the payload memory */
|
|
int memorySizeW16; /* the size (in WebRtc_Word16) of the payload memory */
|
|
WebRtc_Word16 *currentMemoryPos; /* The memory position to insert next payload */
|
|
int numPacketsInBuffer; /* The number of packets in the buffer */
|
|
int insertPosition; /* The position to insert next packet */
|
|
int maxInsertPositions; /* Maximum number of packets allowed */
|
|
|
|
/* Arrays with one entry per packet slot */
|
|
/* NOTE: If these are changed, the changes must be accounted for at the end of
|
|
the function WebRtcNetEQ_GetDefaultCodecSettings(). */
|
|
WebRtc_UWord32 *timeStamp; /* Timestamp in slot n */
|
|
WebRtc_Word16 **payloadLocation; /* Memory location of payload in slot n */
|
|
WebRtc_UWord16 *seqNumber; /* Sequence number in slot n */
|
|
WebRtc_Word16 *payloadType; /* Payload type of packet in slot n */
|
|
WebRtc_Word16 *payloadLengthBytes; /* Payload length of packet in slot n */
|
|
WebRtc_Word16 *rcuPlCntr; /* zero for non-RCU payload, 1 for main payload
|
|
2 for redundant payload */
|
|
int *waitingTime;
|
|
|
|
|
|
/* Statistics counter */
|
|
WebRtc_UWord16 discardedPackets; /* Number of discarded packets */
|
|
|
|
} PacketBuf_t;
|
|
|
|
/*************************/
|
|
/* Function declarations */
|
|
/*************************/
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferInit(...)
|
|
*
|
|
* This function initializes the packet buffer.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance to be initialized
|
|
* - noOfPackets : Maximum number of packets that buffer should hold
|
|
* - memory : Pointer to the storage memory for the payloads
|
|
* - memorySize : The size of the payload memory (in WebRtc_Word16)
|
|
*
|
|
* Output:
|
|
* - bufferInst : Updated buffer instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_PacketBufferInit(PacketBuf_t *bufferInst, int maxNoOfPackets,
|
|
WebRtc_Word16 *pw16_memory, int memorySize);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferFlush(...)
|
|
*
|
|
* This function flushes all the packets in the buffer.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance to be flushed
|
|
*
|
|
* Output:
|
|
* - bufferInst : Flushed buffer instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
*/
|
|
|
|
int WebRtcNetEQ_PacketBufferFlush(PacketBuf_t *bufferInst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferInsert(...)
|
|
*
|
|
* This function inserts an RTP packet into the packet buffer.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance
|
|
* - RTPpacket : An RTP packet struct (with payload, sequence
|
|
* number, etc.)
|
|
*
|
|
* Output:
|
|
* - bufferInst : Updated buffer instance
|
|
* - flushed : 1 if buffer was flushed, 0 otherwise
|
|
*
|
|
* Return value : 0 - Ok
|
|
* -1 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_PacketBufferInsert(PacketBuf_t *bufferInst, const RTPPacket_t *RTPpacket,
|
|
WebRtc_Word16 *flushed);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferExtract(...)
|
|
*
|
|
* This function extracts a payload from the buffer.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance
|
|
* - bufferPosition: Position of the packet that should be extracted
|
|
*
|
|
* Output:
|
|
* - RTPpacket : An RTP packet struct (with payload, sequence
|
|
* number, etc)
|
|
* - bufferInst : Updated buffer instance
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_PacketBufferExtract(PacketBuf_t *bufferInst, RTPPacket_t *RTPpacket,
|
|
int bufferPosition, int *waitingTime);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferFindLowestTimestamp(...)
|
|
*
|
|
* This function finds the next packet with the lowest timestamp.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance
|
|
* - currentTS : The timestamp to compare packet timestamps with
|
|
* - eraseOldPkts : If non-zero, erase packets older than currentTS
|
|
*
|
|
* Output:
|
|
* - timestamp : Lowest timestamp that was found
|
|
* - bufferPosition: Position of this packet (-1 if there are no packets
|
|
* in the buffer)
|
|
* - payloadType : Payload type of the found payload
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_PacketBufferFindLowestTimestamp(PacketBuf_t *bufferInst,
|
|
WebRtc_UWord32 currentTS,
|
|
WebRtc_UWord32 *timestamp,
|
|
int *bufferPosition, int eraseOldPkts,
|
|
WebRtc_Word16 *payloadType);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_PacketBufferGetSize(...)
|
|
*
|
|
* Calculate and return an estimate of the total data length (in samples)
|
|
* currently in the buffer. The estimate is calculated as the number of
|
|
* packets currently in the buffer (which does not have any remaining waiting
|
|
* time), multiplied with the number of samples obtained from the last
|
|
* decoded packet.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance
|
|
*
|
|
* Return value : The buffer size in samples
|
|
*/
|
|
|
|
WebRtc_Word32 WebRtcNetEQ_PacketBufferGetSize(const PacketBuf_t *bufferInst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_IncrementWaitingTimes(...)
|
|
*
|
|
* Increment the waiting time for all packets in the buffer by one.
|
|
*
|
|
* Input:
|
|
* - bufferInst : Buffer instance
|
|
*
|
|
* Return value : n/a
|
|
*/
|
|
|
|
void WebRtcNetEQ_IncrementWaitingTimes(PacketBuf_t *buffer_inst);
|
|
|
|
/****************************************************************************
|
|
* WebRtcNetEQ_GetDefaultCodecSettings(...)
|
|
*
|
|
* Calculates a recommended buffer size for a specific set of codecs.
|
|
*
|
|
* Input:
|
|
* - codecID : An array of codec types that will be used
|
|
* - noOfCodecs : Number of codecs in array codecID
|
|
*
|
|
* Output:
|
|
* - maxBytes : Recommended buffer memory size in bytes
|
|
* - maxSlots : Recommended number of slots in buffer
|
|
*
|
|
* Return value : 0 - Ok
|
|
* <0 - Error
|
|
*/
|
|
|
|
int WebRtcNetEQ_GetDefaultCodecSettings(const enum WebRtcNetEQDecoder *codecID,
|
|
int noOfCodecs, int *maxBytes, int *maxSlots);
|
|
|
|
#endif /* PACKET_BUFFER_H */
|