git-svn-id: http://webrtc.googlecode.com/svn/trunk@4 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
415
modules/rtp_rtcp/source/rtcp_utility.h
Normal file
415
modules/rtp_rtcp/source/rtcp_utility.h
Normal file
@@ -0,0 +1,415 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
|
||||
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
|
||||
|
||||
#include <cstddef> // size_t, ptrdiff_t
|
||||
|
||||
#include "typedefs.h"
|
||||
#include "rtp_rtcp_config.h"
|
||||
#include "rtp_rtcp_defines.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace RTCPUtility {
|
||||
// CNAME
|
||||
class RTCPCnameInformation
|
||||
{
|
||||
public:
|
||||
RTCPCnameInformation();
|
||||
~RTCPCnameInformation();
|
||||
|
||||
WebRtc_UWord8 name[RTCP_CNAME_SIZE];
|
||||
WebRtc_UWord8 length;
|
||||
};
|
||||
|
||||
struct RTCPPacketRR
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord8 NumberOfReportBlocks;
|
||||
};
|
||||
struct RTCPPacketSR
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord8 NumberOfReportBlocks;
|
||||
|
||||
// sender info
|
||||
WebRtc_UWord32 NTPMostSignificant;
|
||||
WebRtc_UWord32 NTPLeastSignificant;
|
||||
WebRtc_UWord32 RTPTimestamp;
|
||||
WebRtc_UWord32 SenderPacketCount;
|
||||
WebRtc_UWord32 SenderOctetCount;
|
||||
};
|
||||
struct RTCPPacketReportBlockItem
|
||||
{
|
||||
// report block
|
||||
WebRtc_UWord32 SSRC;
|
||||
WebRtc_UWord8 FractionLost;
|
||||
WebRtc_UWord32 CumulativeNumOfPacketsLost;
|
||||
WebRtc_UWord32 ExtendedHighestSequenceNumber;
|
||||
WebRtc_UWord32 Jitter;
|
||||
WebRtc_UWord32 LastSR;
|
||||
WebRtc_UWord32 DelayLastSR;
|
||||
};
|
||||
|
||||
struct RTCPPacketSDESCName
|
||||
{
|
||||
// RFC3550
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord8 CName[RTCP_CNAME_SIZE];
|
||||
WebRtc_UWord8 CNameLength;
|
||||
};
|
||||
|
||||
struct RTCPPacketBYE
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
};
|
||||
struct RTCPPacketXR
|
||||
{
|
||||
// RFC 3611
|
||||
WebRtc_UWord32 OriginatorSSRC;
|
||||
};
|
||||
struct RTCPPacketXRVOIPMetricItem
|
||||
{
|
||||
// RFC 3611 4.7
|
||||
WebRtc_UWord32 SSRC;
|
||||
WebRtc_UWord8 lossRate;
|
||||
WebRtc_UWord8 discardRate;
|
||||
WebRtc_UWord8 burstDensity;
|
||||
WebRtc_UWord8 gapDensity;
|
||||
WebRtc_UWord16 burstDuration;
|
||||
WebRtc_UWord16 gapDuration;
|
||||
WebRtc_UWord16 roundTripDelay;
|
||||
WebRtc_UWord16 endSystemDelay;
|
||||
WebRtc_UWord8 signalLevel;
|
||||
WebRtc_UWord8 noiseLevel;
|
||||
WebRtc_UWord8 RERL;
|
||||
WebRtc_UWord8 Gmin;
|
||||
WebRtc_UWord8 Rfactor;
|
||||
WebRtc_UWord8 extRfactor;
|
||||
WebRtc_UWord8 MOSLQ;
|
||||
WebRtc_UWord8 MOSCQ;
|
||||
WebRtc_UWord8 RXconfig;
|
||||
WebRtc_UWord16 JBnominal;
|
||||
WebRtc_UWord16 JBmax;
|
||||
WebRtc_UWord16 JBabsMax;
|
||||
};
|
||||
|
||||
struct RTCPPacketRTPFBNACK
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC;
|
||||
};
|
||||
struct RTCPPacketRTPFBNACKItem
|
||||
{
|
||||
// RFC4585
|
||||
WebRtc_UWord16 PacketID;
|
||||
WebRtc_UWord16 BitMask;
|
||||
};
|
||||
|
||||
struct RTCPPacketRTPFBTMMBR
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC; // zero!
|
||||
};
|
||||
struct RTCPPacketRTPFBTMMBRItem
|
||||
{
|
||||
// RFC5104
|
||||
WebRtc_UWord32 SSRC;
|
||||
WebRtc_UWord32 MaxTotalMediaBitRate; // In Kbit/s
|
||||
WebRtc_UWord32 MeasuredOverhead;
|
||||
};
|
||||
|
||||
struct RTCPPacketRTPFBTMMBN
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC; // zero!
|
||||
};
|
||||
struct RTCPPacketRTPFBTMMBNItem
|
||||
{
|
||||
// RFC5104
|
||||
WebRtc_UWord32 SSRC; // "Owner"
|
||||
WebRtc_UWord32 MaxTotalMediaBitRate;
|
||||
WebRtc_UWord32 MeasuredOverhead;
|
||||
};
|
||||
|
||||
struct RTCPPacketPSFBFIR
|
||||
{
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC; // zero!
|
||||
};
|
||||
struct RTCPPacketPSFBFIRItem
|
||||
{
|
||||
// RFC5104
|
||||
WebRtc_UWord32 SSRC;
|
||||
WebRtc_UWord8 CommandSequenceNumber;
|
||||
};
|
||||
|
||||
struct RTCPPacketPSFBPLI
|
||||
{
|
||||
// RFC4585
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC;
|
||||
};
|
||||
|
||||
struct RTCPPacketPSFBSLI
|
||||
{
|
||||
// RFC4585
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC;
|
||||
};
|
||||
struct RTCPPacketPSFBSLIItem
|
||||
{
|
||||
// RFC4585
|
||||
WebRtc_UWord16 FirstMB;
|
||||
WebRtc_UWord16 NumberOfMB;
|
||||
WebRtc_UWord8 PictureId;
|
||||
};
|
||||
struct RTCPPacketPSFBRPSI
|
||||
{
|
||||
// RFC4585
|
||||
WebRtc_UWord32 SenderSSRC;
|
||||
WebRtc_UWord32 MediaSSRC;
|
||||
WebRtc_UWord8 PayloadType;
|
||||
WebRtc_UWord16 NumberOfValidBits;
|
||||
WebRtc_UWord8 NativeBitString[RTCP_RPSI_DATA_SIZE];
|
||||
};
|
||||
|
||||
// generic name APP
|
||||
struct RTCPPacketAPP
|
||||
{
|
||||
WebRtc_UWord8 SubType;
|
||||
WebRtc_UWord32 Name;
|
||||
WebRtc_UWord8 Data[kRtcpAppCode_DATA_SIZE];
|
||||
WebRtc_UWord16 Size;
|
||||
};
|
||||
|
||||
union RTCPPacket
|
||||
{
|
||||
RTCPPacketRR RR;
|
||||
RTCPPacketSR SR;
|
||||
RTCPPacketReportBlockItem ReportBlockItem;
|
||||
|
||||
RTCPPacketSDESCName CName;
|
||||
RTCPPacketBYE BYE;
|
||||
|
||||
RTCPPacketRTPFBNACK NACK;
|
||||
RTCPPacketRTPFBNACKItem NACKItem;
|
||||
|
||||
RTCPPacketPSFBPLI PLI;
|
||||
RTCPPacketPSFBSLI SLI;
|
||||
RTCPPacketPSFBSLIItem SLIItem;
|
||||
RTCPPacketPSFBRPSI RPSI;
|
||||
|
||||
RTCPPacketRTPFBTMMBR TMMBR;
|
||||
RTCPPacketRTPFBTMMBRItem TMMBRItem;
|
||||
RTCPPacketRTPFBTMMBN TMMBN;
|
||||
RTCPPacketRTPFBTMMBNItem TMMBNItem;
|
||||
RTCPPacketPSFBFIR FIR;
|
||||
RTCPPacketPSFBFIRItem FIRItem;
|
||||
|
||||
RTCPPacketXR XR;
|
||||
RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
|
||||
|
||||
RTCPPacketAPP APP;
|
||||
};
|
||||
|
||||
enum RTCPPacketTypes
|
||||
{
|
||||
kRtcpNotValidCode,
|
||||
|
||||
// RFC3550
|
||||
kRtcpRrCode,
|
||||
kRtcpSrCode,
|
||||
kRtcpReportBlockItemCode,
|
||||
|
||||
kRtcpSdesCode,
|
||||
kRtcpSdesChunkCode,
|
||||
kRtcpByeCode,
|
||||
|
||||
// RFC4585
|
||||
kRtcpRtpfbNackCode,
|
||||
kRtcpRtpfbNackItemCode,
|
||||
|
||||
kRtcpPsfbPliCode,
|
||||
kRtcpPsfbRpsiCode,
|
||||
kRtcpPsfbSliCode,
|
||||
kRtcpPsfbSliItemCode,
|
||||
|
||||
// RFC5104
|
||||
kRtcpRtpfbTmmbrCode,
|
||||
kRtcpRtpfbTmmbrItemCode,
|
||||
kRtcpRtpfbTmmbnCode,
|
||||
kRtcpRtpfbTmmbnItemCode,
|
||||
kRtcpPsfbFirCode,
|
||||
kRtcpPsfbFirItemCode,
|
||||
|
||||
// draft-perkins-avt-rapid-rtp-sync
|
||||
kRtcpRtpfbSrReqCode,
|
||||
|
||||
// RFC 3611
|
||||
kRtcpXrVoipMetricCode,
|
||||
|
||||
kRtcpAppCode,
|
||||
kRtcpAppItemCode,
|
||||
};
|
||||
|
||||
struct RTCPRawPacket
|
||||
{
|
||||
const WebRtc_UWord8* _ptrPacketBegin;
|
||||
const WebRtc_UWord8* _ptrPacketEnd;
|
||||
};
|
||||
|
||||
struct RTCPModRawPacket
|
||||
{
|
||||
WebRtc_UWord8* _ptrPacketBegin;
|
||||
WebRtc_UWord8* _ptrPacketEnd;
|
||||
};
|
||||
|
||||
struct RTCPCommonHeader
|
||||
{
|
||||
WebRtc_UWord8 V; // Version
|
||||
bool P; // Padding
|
||||
WebRtc_UWord8 IC; // Item count/subtype
|
||||
WebRtc_UWord8 PT; // Packet Type
|
||||
WebRtc_UWord16 LengthInOctets;
|
||||
};
|
||||
|
||||
enum RTCPPT
|
||||
{
|
||||
PT_SR = 200,
|
||||
PT_RR = 201,
|
||||
PT_SDES = 202,
|
||||
PT_BYE = 203,
|
||||
PT_APP = 204,
|
||||
PT_RTPFB = 205,
|
||||
PT_PSFB = 206,
|
||||
PT_XR = 207
|
||||
};
|
||||
|
||||
bool RTCPParseCommonHeader( const WebRtc_UWord8* ptrDataBegin,
|
||||
const WebRtc_UWord8* ptrDataEnd,
|
||||
RTCPCommonHeader& parsedHeader);
|
||||
|
||||
class RTCPParserV2
|
||||
{
|
||||
public:
|
||||
RTCPParserV2(const WebRtc_UWord8* rtcpData,
|
||||
size_t rtcpDataLength,
|
||||
bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
|
||||
~RTCPParserV2();
|
||||
|
||||
RTCPPacketTypes PacketType() const;
|
||||
const RTCPPacket& Packet() const;
|
||||
const RTCPRawPacket& RawPacket() const;
|
||||
ptrdiff_t LengthLeft() const;
|
||||
|
||||
bool IsValid() const;
|
||||
|
||||
RTCPPacketTypes Begin();
|
||||
RTCPPacketTypes Iterate();
|
||||
|
||||
private:
|
||||
enum ParseState
|
||||
{
|
||||
State_TopLevel, // Top level packet
|
||||
State_ReportBlockItem, // SR/RR report block
|
||||
State_SDESChunk, // SDES chunk
|
||||
State_BYEItem, // BYE item
|
||||
State_RTPFB_NACKItem, // NACK FCI item
|
||||
State_RTPFB_TMMBRItem, // TMMBR FCI item
|
||||
State_RTPFB_TMMBNItem, // TMMBN FCI item
|
||||
State_PSFB_SLIItem, // SLI FCI item
|
||||
State_PSFB_RPSIItem, // RPSI FCI item
|
||||
State_PSFB_FIRItem, // FIR FCI item
|
||||
State_XRItem,
|
||||
State_AppItem
|
||||
};
|
||||
|
||||
private:
|
||||
void IterateTopLevel();
|
||||
void IterateReportBlockItem();
|
||||
void IterateSDESChunk();
|
||||
void IterateBYEItem();
|
||||
void IterateNACKItem();
|
||||
void IterateTMMBRItem();
|
||||
void IterateTMMBNItem();
|
||||
void IterateSLIItem();
|
||||
void IterateRPSIItem();
|
||||
void IterateFIRItem();
|
||||
void IterateAppItem();
|
||||
|
||||
void Validate();
|
||||
void EndCurrentBlock();
|
||||
|
||||
bool ParseRR();
|
||||
bool ParseSR();
|
||||
bool ParseReportBlockItem();
|
||||
|
||||
bool ParseSDES();
|
||||
bool ParseSDESChunk();
|
||||
bool ParseSDESItem();
|
||||
|
||||
bool ParseBYE();
|
||||
bool ParseBYEItem();
|
||||
|
||||
bool ParseXR();
|
||||
bool ParseXRItem();
|
||||
bool ParseXRVOIPMetricItem();
|
||||
|
||||
bool ParseFBCommon(const RTCPCommonHeader& header);
|
||||
bool ParseNACKItem();
|
||||
bool ParseTMMBRItem();
|
||||
bool ParseTMMBNItem();
|
||||
bool ParseSLIItem();
|
||||
bool ParseRPSIItem();
|
||||
bool ParseFIRItem();
|
||||
|
||||
bool ParseAPP(const RTCPCommonHeader& header);
|
||||
bool ParseAPPItem();
|
||||
|
||||
private:
|
||||
const WebRtc_UWord8* const _ptrRTCPDataBegin;
|
||||
const bool _RTCPReducedSizeEnable;
|
||||
const WebRtc_UWord8* const _ptrRTCPDataEnd;
|
||||
|
||||
bool _validPacket;
|
||||
const WebRtc_UWord8* _ptrRTCPData;
|
||||
const WebRtc_UWord8* _ptrRTCPBlockEnd;
|
||||
|
||||
ParseState _state;
|
||||
WebRtc_UWord8 _numberOfBlocks;
|
||||
|
||||
RTCPPacketTypes _packetType;
|
||||
RTCPPacket _packet;
|
||||
};
|
||||
|
||||
class RTCPPacketIterator
|
||||
{
|
||||
public:
|
||||
RTCPPacketIterator(WebRtc_UWord8* rtcpData,
|
||||
size_t rtcpDataLength);
|
||||
~RTCPPacketIterator();
|
||||
|
||||
const RTCPCommonHeader* Begin();
|
||||
const RTCPCommonHeader* Iterate();
|
||||
const RTCPCommonHeader* Current();
|
||||
|
||||
private:
|
||||
WebRtc_UWord8* const _ptrBegin;
|
||||
WebRtc_UWord8* const _ptrEnd;
|
||||
|
||||
WebRtc_UWord8* _ptrBlock;
|
||||
|
||||
RTCPCommonHeader _header;
|
||||
};
|
||||
} // RTCPUtility
|
||||
} // namespace webrtc
|
||||
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
|
||||
Reference in New Issue
Block a user