Refactor RTCP sender

The main purpose of this CL is to clean up RTCPSender::PrepareRTCP, but
it has quite a few ramifications. Notable changes:

* Removed the rtcpPacketTypeFlags bit vector and don't assume
  RTCPPacketType values have a single unique bit set. This will allow
  making this an enum class once rtcp_receiver has been overhauled.

* Flags are now stored in a map that is a member of the class. This
  meant we could remove some bool flags (eg send_remb_) which was
  previously masked into rtcpPacketTypeFlags and then masked out again
  when testing if a remb packet should be sent.

* Make all build methods, eg. BuildREMB(), have the same signature.
  An RtcpContext struct was introduced for this purpose. This allowed
  the use of a map from RTCPPacketType to method pointer. Instead of
  18 consecutive if-statements, there is now a single loop.
  The context class also allowed some simplifications in the build
  methods themselves.

* A few minor simplifications and cleanups.

The next step is to gradually replace the builder methods with the
builders from the new RtcpPacket classes.

BUG=2450
R=asapersson@webrtc.org, pbos@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/48329004

Cr-Commit-Position: refs/heads/master@{#9166}
This commit is contained in:
Erik Språng
2015-05-11 10:17:43 +02:00
parent 1f629232d5
commit 242e22b055
15 changed files with 1508 additions and 1681 deletions

View File

@@ -11,6 +11,7 @@
#ifndef WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_H_ #ifndef WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_H_
#define WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_H_ #define WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_H_
#include <set>
#include <vector> #include <vector>
#include "webrtc/modules/interface/module.h" #include "webrtc/modules/interface/module.h"
@@ -390,12 +391,20 @@ class RtpRtcp : public Module {
/* /*
* Force a send of a RTCP packet * Force a send of a RTCP packet
* normal SR and RR are triggered via the process function * periodic SR and RR are triggered via the process function
* *
* return -1 on failure else 0 * return -1 on failure else 0
*/ */
virtual int32_t SendRTCP( virtual int32_t SendRTCP(RTCPPacketType rtcpPacketType) = 0;
uint32_t rtcpPacketType = kRtcpReport) = 0;
/*
* Force a send of a RTCP packet with more than one packet type.
* periodic SR and RR are triggered via the process function
*
* return -1 on failure else 0
*/
virtual int32_t SendCompoundRTCP(
const std::set<RTCPPacketType>& rtcpPacketTypes) = 0;
/* /*
* Good state of RTP receiver inform sender * Good state of RTP receiver inform sender

View File

@@ -88,20 +88,21 @@ enum RTCPAppSubTypes
kAppSubtypeBwe = 0x00 kAppSubtypeBwe = 0x00
}; };
enum RTCPPacketType // TODO(sprang): Make this an enum class once rtcp_receiver has been cleaned up.
{ enum RTCPPacketType : uint32_t {
kRtcpReport = 0x0001, kRtcpReport = 0x0001,
kRtcpSr = 0x0002, kRtcpSr = 0x0002,
kRtcpRr = 0x0004, kRtcpRr = 0x0004,
kRtcpBye = 0x0008, kRtcpSdes = 0x0008,
kRtcpPli = 0x0010, kRtcpBye = 0x0010,
kRtcpNack = 0x0020, kRtcpPli = 0x0020,
kRtcpFir = 0x0040, kRtcpNack = 0x0040,
kRtcpTmmbr = 0x0080, kRtcpFir = 0x0080,
kRtcpTmmbn = 0x0100, kRtcpTmmbr = 0x0100,
kRtcpSrReq = 0x0200, kRtcpTmmbn = 0x0200,
kRtcpXrVoipMetric = 0x0400, kRtcpSrReq = 0x0400,
kRtcpApp = 0x0800, kRtcpXrVoipMetric = 0x0800,
kRtcpApp = 0x1000,
kRtcpSli = 0x4000, kRtcpSli = 0x4000,
kRtcpRpsi = 0x8000, kRtcpRpsi = 0x8000,
kRtcpRemb = 0x10000, kRtcpRemb = 0x10000,
@@ -129,7 +130,7 @@ enum NACKMethod
kNackRtcp = 2 kNackRtcp = 2
}; };
enum RetransmissionMode { enum RetransmissionMode : uint8_t {
kRetransmitOff = 0x0, kRetransmitOff = 0x0,
kRetransmitFECPackets = 0x1, kRetransmitFECPackets = 0x1,
kRetransmitBaseLayer = 0x2, kRetransmitBaseLayer = 0x2,

View File

@@ -156,8 +156,9 @@ class MockRtpRtcp : public RtpRtcp {
int64_t* avgRTT, int64_t* avgRTT,
int64_t* minRTT, int64_t* minRTT,
int64_t* maxRTT)); int64_t* maxRTT));
MOCK_METHOD1(SendRTCP, MOCK_METHOD1(SendRTCP, int32_t(RTCPPacketType packetType));
int32_t(uint32_t rtcpPacketType)); MOCK_METHOD1(SendCompoundRTCP,
int32_t(const std::set<RTCPPacketType>& packetTypes));
MOCK_METHOD1(SendRTCPReferencePictureSelection, MOCK_METHOD1(SendRTCPReferencePictureSelection,
int32_t(const uint64_t pictureID)); int32_t(const uint64_t pictureID));
MOCK_METHOD1(SendRTCPSliceLossIndication, MOCK_METHOD1(SendRTCPSliceLossIndication,

View File

@@ -285,69 +285,68 @@ RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation,
} }
RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin();
while (pktType != RTCPUtility::kRtcpNotValidCode) while (pktType != RTCPPacketTypes::kInvalid) {
{
// Each "case" is responsible for iterate the parser to the // Each "case" is responsible for iterate the parser to the
// next top level packet. // next top level packet.
switch (pktType) switch (pktType)
{ {
case RTCPUtility::kRtcpSrCode: case RTCPPacketTypes::kSr:
case RTCPUtility::kRtcpRrCode: case RTCPPacketTypes::kRr:
HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation); HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpSdesCode: case RTCPPacketTypes::kSdes:
HandleSDES(*rtcpParser); HandleSDES(*rtcpParser);
break; break;
case RTCPUtility::kRtcpXrHeaderCode: case RTCPPacketTypes::kXrHeader:
HandleXrHeader(*rtcpParser, rtcpPacketInformation); HandleXrHeader(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpXrReceiverReferenceTimeCode: case RTCPPacketTypes::kXrReceiverReferenceTime:
HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation); HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpXrDlrrReportBlockCode: case RTCPPacketTypes::kXrDlrrReportBlock:
HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation); HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpXrVoipMetricCode: case RTCPPacketTypes::kXrVoipMetric:
HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation); HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpByeCode: case RTCPPacketTypes::kBye:
HandleBYE(*rtcpParser); HandleBYE(*rtcpParser);
break; break;
case RTCPUtility::kRtcpRtpfbNackCode: case RTCPPacketTypes::kRtpfbNack:
HandleNACK(*rtcpParser, rtcpPacketInformation); HandleNACK(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpRtpfbTmmbrCode: case RTCPPacketTypes::kRtpfbTmmbr:
HandleTMMBR(*rtcpParser, rtcpPacketInformation); HandleTMMBR(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpRtpfbTmmbnCode: case RTCPPacketTypes::kRtpfbTmmbn:
HandleTMMBN(*rtcpParser, rtcpPacketInformation); HandleTMMBN(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpRtpfbSrReqCode: case RTCPPacketTypes::kRtpfbSrReq:
HandleSR_REQ(*rtcpParser, rtcpPacketInformation); HandleSR_REQ(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpPsfbPliCode: case RTCPPacketTypes::kPsfbPli:
HandlePLI(*rtcpParser, rtcpPacketInformation); HandlePLI(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpPsfbSliCode: case RTCPPacketTypes::kPsfbSli:
HandleSLI(*rtcpParser, rtcpPacketInformation); HandleSLI(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpPsfbRpsiCode: case RTCPPacketTypes::kPsfbRpsi:
HandleRPSI(*rtcpParser, rtcpPacketInformation); HandleRPSI(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpExtendedIjCode: case RTCPPacketTypes::kExtendedIj:
HandleIJ(*rtcpParser, rtcpPacketInformation); HandleIJ(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpPsfbFirCode: case RTCPPacketTypes::kPsfbFir:
HandleFIR(*rtcpParser, rtcpPacketInformation); HandleFIR(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpPsfbAppCode: case RTCPPacketTypes::kPsfbApp:
HandlePsfbApp(*rtcpParser, rtcpPacketInformation); HandlePsfbApp(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpAppCode: case RTCPPacketTypes::kApp:
// generic application messages // generic application messages
HandleAPP(*rtcpParser, rtcpPacketInformation); HandleAPP(*rtcpParser, rtcpPacketInformation);
break; break;
case RTCPUtility::kRtcpAppItemCode: case RTCPPacketTypes::kAppItem:
// generic application messages // generic application messages
HandleAPPItem(*rtcpParser, rtcpPacketInformation); HandleAPPItem(*rtcpParser, rtcpPacketInformation);
break; break;
@@ -374,7 +373,8 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType();
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
assert((rtcpPacketType == RTCPUtility::kRtcpRrCode) || (rtcpPacketType == RTCPUtility::kRtcpSrCode)); assert((rtcpPacketType == RTCPPacketTypes::kRr) ||
(rtcpPacketType == RTCPPacketTypes::kSr));
// SR.SenderSSRC // SR.SenderSSRC
// The synchronization source identifier for the originator of this SR packet // The synchronization source identifier for the originator of this SR packet
@@ -382,7 +382,9 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
// rtcpPacket.RR.SenderSSRC // rtcpPacket.RR.SenderSSRC
// The source of the packet sender, same as of SR? or is this a CE? // The source of the packet sender, same as of SR? or is this a CE?
const uint32_t remoteSSRC = (rtcpPacketType == RTCPUtility::kRtcpRrCode) ? rtcpPacket.RR.SenderSSRC:rtcpPacket.SR.SenderSSRC; const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr)
? rtcpPacket.RR.SenderSSRC
: rtcpPacket.SR.SenderSSRC;
rtcpPacketInformation.remoteSSRC = remoteSSRC; rtcpPacketInformation.remoteSSRC = remoteSSRC;
@@ -393,8 +395,7 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
return; return;
} }
if (rtcpPacketType == RTCPUtility::kRtcpSrCode) if (rtcpPacketType == RTCPPacketTypes::kSr) {
{
TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR",
"remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
@@ -434,8 +435,7 @@ RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
rtcpPacketType = rtcpParser.Iterate(); rtcpPacketType = rtcpParser.Iterate();
while (rtcpPacketType == RTCPUtility::kRtcpReportBlockItemCode) while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) {
{
HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC); HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC);
rtcpPacketType = rtcpParser.Iterate(); rtcpPacketType = rtcpParser.Iterate();
} }
@@ -756,7 +756,7 @@ int32_t RTCPReceiver::BoundingSet(bool &tmmbrOwner, TMMBRSet* boundingSetRec) {
// no need for critsect we have _criticalSectionRTCPReceiver // no need for critsect we have _criticalSectionRTCPReceiver
void RTCPReceiver::HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser) { void RTCPReceiver::HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser) {
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpSdesChunkCode) { while (pktType == RTCPPacketTypes::kSdesChunk) {
HandleSDESChunk(rtcpParser); HandleSDESChunk(rtcpParser);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -792,7 +792,7 @@ void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser,
rtcpPacketInformation.ResetNACKPacketIdArray(); rtcpPacketInformation.ResetNACKPacketIdArray();
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpRtpfbNackItemCode) { while (pktType == RTCPPacketTypes::kRtpfbNackItem) {
HandleNACKItem(rtcpPacket, rtcpPacketInformation); HandleNACKItem(rtcpPacket, rtcpPacketInformation);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -896,7 +896,7 @@ void RTCPReceiver::HandleXrDlrrReportBlock(
// Iterate through sub-block(s), if any. // Iterate through sub-block(s), if any.
RTCPUtility::RTCPPacketTypes packet_type = parser.Iterate(); RTCPUtility::RTCPPacketTypes packet_type = parser.Iterate();
while (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) { while (packet_type == RTCPPacketTypes::kXrDlrrReportBlockItem) {
HandleXrDlrrReportBlockItem(packet, rtcpPacketInformation); HandleXrDlrrReportBlockItem(packet, rtcpPacketInformation);
packet_type = parser.Iterate(); packet_type = parser.Iterate();
} }
@@ -1029,7 +1029,7 @@ void RTCPReceiver::HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser,
ptrReceiveInfo->VerifyAndAllocateTMMBRSet((uint32_t)maxNumOfTMMBRBlocks); ptrReceiveInfo->VerifyAndAllocateTMMBRSet((uint32_t)maxNumOfTMMBRBlocks);
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpRtpfbTmmbrItemCode) { while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) {
HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSSRC); HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSSRC);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -1074,7 +1074,7 @@ void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser,
ptrReceiveInfo->VerifyAndAllocateBoundingSet((uint32_t)maxNumOfTMMBNBlocks); ptrReceiveInfo->VerifyAndAllocateBoundingSet((uint32_t)maxNumOfTMMBNBlocks);
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpRtpfbTmmbnItemCode) { while (pktType == RTCPPacketTypes::kRtpfbTmmbnItem) {
HandleTMMBNItem(*ptrReceiveInfo, rtcpPacket); HandleTMMBNItem(*ptrReceiveInfo, rtcpPacket);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -1101,7 +1101,7 @@ void RTCPReceiver::HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser,
RTCPPacketInformation& rtcpPacketInformation) { RTCPPacketInformation& rtcpPacketInformation) {
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpPsfbSliItemCode) { while (pktType == RTCPPacketTypes::kPsfbSliItem) {
HandleSLIItem(rtcpPacket, rtcpPacketInformation); HandleSLIItem(rtcpPacket, rtcpPacketInformation);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -1121,8 +1121,7 @@ RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser,
{ {
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
if(pktType == RTCPUtility::kRtcpPsfbRpsiCode) if (pktType == RTCPPacketTypes::kPsfbRpsi) {
{
rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi; // received signal that we have a confirmed reference picture rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi; // received signal that we have a confirmed reference picture
if(rtcpPacket.RPSI.NumberOfValidBits%8 != 0) if(rtcpPacket.RPSI.NumberOfValidBits%8 != 0)
{ {
@@ -1148,9 +1147,9 @@ RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser,
void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser,
RTCPPacketInformation& rtcpPacketInformation) { RTCPPacketInformation& rtcpPacketInformation) {
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
if (pktType == RTCPUtility::kRtcpPsfbRembCode) { if (pktType == RTCPPacketTypes::kPsfbRemb) {
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
if (pktType == RTCPUtility::kRtcpPsfbRembItemCode) { if (pktType == RTCPPacketTypes::kPsfbRembItem) {
HandleREMBItem(rtcpParser, rtcpPacketInformation); HandleREMBItem(rtcpParser, rtcpPacketInformation);
rtcpParser.Iterate(); rtcpParser.Iterate();
} }
@@ -1163,7 +1162,7 @@ void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser,
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpExtendedIjItemCode) { while (pktType == RTCPPacketTypes::kExtendedIjItem) {
HandleIJItem(rtcpPacket, rtcpPacketInformation); HandleIJItem(rtcpPacket, rtcpPacketInformation);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -1193,7 +1192,7 @@ void RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
GetReceiveInformation(rtcpPacket.FIR.SenderSSRC); GetReceiveInformation(rtcpPacket.FIR.SenderSSRC);
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpPsfbFirItemCode) { while (pktType == RTCPPacketTypes::kPsfbFirItem) {
HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation); HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation);
pktType = rtcpParser.Iterate(); pktType = rtcpParser.Iterate();
} }
@@ -1367,8 +1366,8 @@ void RTCPReceiver::TriggerCallbacksFromRTCPPacket(
_cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate( _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(
rtcpPacketInformation.receiverEstimatedMaxBitrate); rtcpPacketInformation.receiverEstimatedMaxBitrate);
} }
if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr || if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) ||
rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr) { (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) {
int64_t now = _clock->TimeInMilliseconds(); int64_t now = _clock->TimeInMilliseconds();
_cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport(
rtcpPacketInformation.report_blocks, rtcpPacketInformation.report_blocks,

File diff suppressed because it is too large Load Diff

View File

@@ -12,6 +12,7 @@
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_ #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
#include <map> #include <map>
#include <set>
#include <sstream> #include <sstream>
#include <string> #include <string>
@@ -40,10 +41,10 @@ class NACKStringBuilder {
std::string GetResult(); std::string GetResult();
private: private:
std::ostringstream _stream; std::ostringstream stream_;
int _count; int count_;
uint16_t _prevNack; uint16_t prevNack_;
bool _consecutive; bool consecutive_;
}; };
class RTCPSender { class RTCPSender {
@@ -107,7 +108,14 @@ public:
bool TimeToSendRTCPReport(bool sendKeyframeBeforeRTP = false) const; bool TimeToSendRTCPReport(bool sendKeyframeBeforeRTP = false) const;
int32_t SendRTCP(const FeedbackState& feedback_state, int32_t SendRTCP(const FeedbackState& feedback_state,
uint32_t rtcpPacketTypeFlags, RTCPPacketType packetType,
int32_t nackSize = 0,
const uint16_t* nackList = 0,
bool repeat = false,
uint64_t pictureID = 0);
int32_t SendCompoundRTCP(const FeedbackState& feedback_state,
const std::set<RTCPPacketType>& packetTypes,
int32_t nackSize = 0, int32_t nackSize = 0,
const uint16_t* nackList = 0, const uint16_t* nackList = 0,
bool repeat = false, bool repeat = false,
@@ -150,18 +158,36 @@ public:
void SetTargetBitrate(unsigned int target_bitrate); void SetTargetBitrate(unsigned int target_bitrate);
private: private:
struct RtcpContext;
// The BuildResult indicates the outcome of a call to a builder method,
// constructing a part of an RTCP packet:
//
// kError
// Building RTCP packet failed, propagate error out to caller.
// kAbort
// The (partial) block being build should not be included. Reset current
// buffer position to the state before the method call and proceed to the
// next packet type.
// kTruncated
// There is not enough room in the buffer to fit the data being constructed.
// (IP packet is full). Proceed to the next packet type, and call this
// method again when a new buffer has been allocated.
// TODO(sprang): Actually allocate multiple packets if needed.
// kSuccess
// Data has been successfully placed in the buffer.
enum class BuildResult { kError, kAborted, kTruncated, kSuccess };
int32_t SendToNetwork(const uint8_t* dataBuffer, size_t length); int32_t SendToNetwork(const uint8_t* dataBuffer, size_t length);
int32_t WriteAllReportBlocksToBuffer(uint8_t* rtcpbuffer, RTCPSender::BuildResult WriteAllReportBlocksToBuffer(
int pos, RtcpContext* context,
uint8_t* numberOfReportBlocks, uint8_t* numberOfReportBlocks)
uint32_t NTPsec, EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
uint32_t NTPfrac)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
int32_t WriteReportBlocksToBuffer( void WriteReportBlocksToBuffer(
uint8_t* rtcpbuffer, RtcpContext* context,
int32_t position,
const std::map<uint32_t, RTCPReportBlock*>& report_blocks); const std::map<uint32_t, RTCPReportBlock*>& report_blocks);
int32_t AddReportBlock(uint32_t SSRC, int32_t AddReportBlock(uint32_t SSRC,
@@ -174,21 +200,8 @@ private:
uint32_t* ntp_secs, uint32_t* ntp_secs,
uint32_t* ntp_frac); uint32_t* ntp_frac);
int32_t BuildSR(const FeedbackState& feedback_state,
uint8_t* rtcpbuffer,
int32_t pos,
uint32_t NTPsec,
uint32_t NTPfrac)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
int32_t BuildRR(uint8_t* rtcpbuffer,
int32_t pos,
uint32_t NTPsec,
uint32_t NTPfrac)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
int PrepareRTCP(const FeedbackState& feedback_state, int PrepareRTCP(const FeedbackState& feedback_state,
uint32_t packetTypeFlags, const std::set<RTCPPacketType>& packetTypes,
int32_t nackSize, int32_t nackSize,
const uint16_t* nackList, const uint16_t* nackList,
bool repeat, bool repeat,
@@ -196,135 +209,142 @@ private:
uint8_t* rtcp_buffer, uint8_t* rtcp_buffer,
int buffer_size); int buffer_size);
bool ShouldSendReportBlocks(uint32_t rtcp_packet_type) const; BuildResult BuildSR(RtcpContext* context)
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
int32_t BuildExtendedJitterReport(uint8_t* rtcpbuffer, BuildResult BuildRR(RtcpContext* context)
int32_t pos, EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
uint32_t jitterTransmissionTimeOffset) BuildResult BuildExtendedJitterReport(RtcpContext* context)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
BuildResult BuildSDEC(RtcpContext* context)
int32_t BuildSDEC(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildPLI(RtcpContext* context)
int32_t BuildPLI(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildREMB(RtcpContext* context)
int32_t BuildREMB(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildTMMBR(RtcpContext* context)
int32_t BuildTMMBR(ModuleRtpRtcpImpl* module, uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildTMMBN(RtcpContext* context)
int32_t BuildTMMBN(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildAPP(RtcpContext* context)
int32_t BuildAPP(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildVoIPMetric(RtcpContext* context)
int32_t BuildVoIPMetric(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildBYE(RtcpContext* context)
int32_t BuildBYE(uint8_t* rtcpbuffer, int32_t pos) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildFIR(RtcpContext* context)
int32_t BuildFIR(uint8_t* rtcpbuffer, int32_t pos, bool repeat) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildSLI(RtcpContext* context)
int32_t BuildSLI(uint8_t* rtcpbuffer, int32_t pos, uint8_t pictureID) EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); BuildResult BuildRPSI(RtcpContext* context)
int32_t BuildRPSI(uint8_t* rtcpbuffer, EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
int32_t pos, BuildResult BuildNACK(RtcpContext* context)
uint64_t pictureID, EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
uint8_t payloadType) BuildResult BuildReceiverReferenceTime(RtcpContext* context)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender); EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
BuildResult BuildDlrr(RtcpContext* context)
int32_t BuildNACK(uint8_t* rtcpbuffer, EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
int32_t pos,
int32_t nackSize,
const uint16_t* nackList,
std::string* nackString)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
int32_t BuildReceiverReferenceTime(uint8_t* buffer,
int32_t pos,
uint32_t ntp_sec,
uint32_t ntp_frac)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
int32_t BuildDlrr(uint8_t* buffer,
int32_t pos,
const RtcpReceiveTimeInfo& info)
EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPSender);
private: private:
const int32_t _id; const int32_t id_;
const bool _audio; const bool audio_;
Clock* const _clock; Clock* const clock_;
RTCPMethod _method GUARDED_BY(_criticalSectionRTCPSender); RTCPMethod method_ GUARDED_BY(critical_section_rtcp_sender_);
rtc::scoped_ptr<CriticalSectionWrapper> _criticalSectionTransport; rtc::scoped_ptr<CriticalSectionWrapper> critical_section_transport_;
Transport* _cbTransport GUARDED_BY(_criticalSectionTransport); Transport* cbTransport_ GUARDED_BY(critical_section_transport_);
rtc::scoped_ptr<CriticalSectionWrapper> _criticalSectionRTCPSender; rtc::scoped_ptr<CriticalSectionWrapper> critical_section_rtcp_sender_;
bool _usingNack GUARDED_BY(_criticalSectionRTCPSender); bool using_nack_ GUARDED_BY(critical_section_rtcp_sender_);
bool _sending GUARDED_BY(_criticalSectionRTCPSender); bool sending_ GUARDED_BY(critical_section_rtcp_sender_);
bool _sendTMMBN GUARDED_BY(_criticalSectionRTCPSender); bool remb_enabled_ GUARDED_BY(critical_section_rtcp_sender_);
bool _REMB GUARDED_BY(_criticalSectionRTCPSender); bool extended_jitter_report_enabled_ GUARDED_BY(critical_section_rtcp_sender_);
bool _sendREMB GUARDED_BY(_criticalSectionRTCPSender);
bool _TMMBR GUARDED_BY(_criticalSectionRTCPSender);
bool _IJ GUARDED_BY(_criticalSectionRTCPSender);
int64_t _nextTimeToSendRTCP GUARDED_BY(_criticalSectionRTCPSender); int64_t next_time_to_send_rtcp_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t start_timestamp_ GUARDED_BY(_criticalSectionRTCPSender); uint32_t start_timestamp_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t last_rtp_timestamp_ GUARDED_BY(_criticalSectionRTCPSender); uint32_t last_rtp_timestamp_ GUARDED_BY(critical_section_rtcp_sender_);
int64_t last_frame_capture_time_ms_ GUARDED_BY(_criticalSectionRTCPSender); int64_t last_frame_capture_time_ms_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t _SSRC GUARDED_BY(_criticalSectionRTCPSender); uint32_t ssrc_ GUARDED_BY(critical_section_rtcp_sender_);
// SSRC that we receive on our RTP channel // SSRC that we receive on our RTP channel
uint32_t _remoteSSRC GUARDED_BY(_criticalSectionRTCPSender); uint32_t remote_ssrc_ GUARDED_BY(critical_section_rtcp_sender_);
char _CNAME[RTCP_CNAME_SIZE] GUARDED_BY(_criticalSectionRTCPSender); char cname_[RTCP_CNAME_SIZE] GUARDED_BY(critical_section_rtcp_sender_);
ReceiveStatistics* receive_statistics_ GUARDED_BY(_criticalSectionRTCPSender); ReceiveStatistics* receive_statistics_
GUARDED_BY(critical_section_rtcp_sender_);
std::map<uint32_t, RTCPReportBlock*> internal_report_blocks_ std::map<uint32_t, RTCPReportBlock*> internal_report_blocks_
GUARDED_BY(_criticalSectionRTCPSender); GUARDED_BY(critical_section_rtcp_sender_);
std::map<uint32_t, RTCPReportBlock*> external_report_blocks_ std::map<uint32_t, RTCPReportBlock*> external_report_blocks_
GUARDED_BY(_criticalSectionRTCPSender); GUARDED_BY(critical_section_rtcp_sender_);
std::map<uint32_t, RTCPUtility::RTCPCnameInformation*> _csrcCNAMEs std::map<uint32_t, RTCPUtility::RTCPCnameInformation*> csrc_cnames_
GUARDED_BY(_criticalSectionRTCPSender); GUARDED_BY(critical_section_rtcp_sender_);
// Sent // Sent
uint32_t _lastSendReport[RTCP_NUMBER_OF_SR] GUARDED_BY( uint32_t last_send_report_[RTCP_NUMBER_OF_SR] GUARDED_BY(
_criticalSectionRTCPSender); // allow packet loss and RTT above 1 sec critical_section_rtcp_sender_); // allow packet loss and RTT above 1 sec
int64_t _lastRTCPTime[RTCP_NUMBER_OF_SR] GUARDED_BY( int64_t last_rtcp_time_[RTCP_NUMBER_OF_SR] GUARDED_BY(
_criticalSectionRTCPSender); critical_section_rtcp_sender_);
// Sent XR receiver reference time report. // Sent XR receiver reference time report.
// <mid ntp (mid 32 bits of the 64 bits NTP timestamp), send time in ms>. // <mid ntp (mid 32 bits of the 64 bits NTP timestamp), send time in ms>.
std::map<uint32_t, int64_t> last_xr_rr_ GUARDED_BY(_criticalSectionRTCPSender); std::map<uint32_t, int64_t> last_xr_rr_
GUARDED_BY(critical_section_rtcp_sender_);
// send CSRCs // send CSRCs
std::vector<uint32_t> csrcs_ GUARDED_BY(_criticalSectionRTCPSender); std::vector<uint32_t> csrcs_ GUARDED_BY(critical_section_rtcp_sender_);
// Full intra request // Full intra request
uint8_t _sequenceNumberFIR GUARDED_BY(_criticalSectionRTCPSender); uint8_t sequence_number_fir_ GUARDED_BY(critical_section_rtcp_sender_);
// REMB // REMB
uint32_t _rembBitrate GUARDED_BY(_criticalSectionRTCPSender); uint32_t remb_bitrate_ GUARDED_BY(critical_section_rtcp_sender_);
std::vector<uint32_t> remb_ssrcs_ GUARDED_BY(_criticalSectionRTCPSender); std::vector<uint32_t> remb_ssrcs_ GUARDED_BY(critical_section_rtcp_sender_);
TMMBRHelp _tmmbrHelp GUARDED_BY(_criticalSectionRTCPSender); TMMBRHelp tmmbr_help_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t _tmmbr_Send GUARDED_BY(_criticalSectionRTCPSender); uint32_t tmmbr_send_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t _packetOH_Send GUARDED_BY(_criticalSectionRTCPSender); uint32_t packet_oh_send_ GUARDED_BY(critical_section_rtcp_sender_);
// APP // APP
bool _appSend GUARDED_BY(_criticalSectionRTCPSender); uint8_t app_sub_type_ GUARDED_BY(critical_section_rtcp_sender_);
uint8_t _appSubType GUARDED_BY(_criticalSectionRTCPSender); uint32_t app_name_ GUARDED_BY(critical_section_rtcp_sender_);
uint32_t _appName GUARDED_BY(_criticalSectionRTCPSender); rtc::scoped_ptr<uint8_t[]> app_data_ GUARDED_BY(critical_section_rtcp_sender_);
rtc::scoped_ptr<uint8_t[]> _appData GUARDED_BY(_criticalSectionRTCPSender); uint16_t app_length_ GUARDED_BY(critical_section_rtcp_sender_);
uint16_t _appLength GUARDED_BY(_criticalSectionRTCPSender);
// True if sending of XR Receiver reference time report is enabled. // True if sending of XR Receiver reference time report is enabled.
bool xrSendReceiverReferenceTimeEnabled_ bool xr_send_receiver_reference_time_enabled_
GUARDED_BY(_criticalSectionRTCPSender); GUARDED_BY(critical_section_rtcp_sender_);
// XR VoIP metric // XR VoIP metric
bool _xrSendVoIPMetric GUARDED_BY(_criticalSectionRTCPSender); RTCPVoIPMetric xr_voip_metric_ GUARDED_BY(critical_section_rtcp_sender_);
RTCPVoIPMetric _xrVoIPMetric GUARDED_BY(_criticalSectionRTCPSender);
RtcpPacketTypeCounterObserver* const packet_type_counter_observer_; RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
RtcpPacketTypeCounter packet_type_counter_ RtcpPacketTypeCounter packet_type_counter_
GUARDED_BY(_criticalSectionRTCPSender); GUARDED_BY(critical_section_rtcp_sender_);
RTCPUtility::NackStats nack_stats_ GUARDED_BY(_criticalSectionRTCPSender); RTCPUtility::NackStats nack_stats_ GUARDED_BY(critical_section_rtcp_sender_);
void SetFlag(RTCPPacketType type, bool is_volatile)
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
void SetFlags(const std::set<RTCPPacketType>& types, bool is_volatile)
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
bool IsFlagPresent(RTCPPacketType type) const
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
bool ConsumeFlag(RTCPPacketType type, bool forced = false)
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
bool AllVolatileFlagsConsumed() const
EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
struct ReportFlag {
ReportFlag(RTCPPacketType type, bool is_volatile)
: type(type), is_volatile(is_volatile) {}
bool operator<(const ReportFlag& flag) const { return type < flag.type; }
bool operator==(const ReportFlag& flag) const { return type == flag.type; }
const RTCPPacketType type;
const bool is_volatile;
};
std::set<ReportFlag> report_flags_ GUARDED_BY(critical_section_rtcp_sender_);
typedef BuildResult (RTCPSender::*Builder)(RtcpContext*);
std::map<RTCPPacketType, Builder> builders_;
}; };
} // namespace webrtc } // namespace webrtc

View File

@@ -49,9 +49,9 @@ RTCPUtility::RTCPParserV2::RTCPParserV2(const uint8_t* rtcpData,
_validPacket(false), _validPacket(false),
_ptrRTCPData(rtcpData), _ptrRTCPData(rtcpData),
_ptrRTCPBlockEnd(NULL), _ptrRTCPBlockEnd(NULL),
_state(State_TopLevel), _state(ParseState::State_TopLevel),
_numberOfBlocks(0), _numberOfBlocks(0),
_packetType(kRtcpNotValidCode) { _packetType(RTCPPacketTypes::kInvalid) {
Validate(); Validate();
} }
@@ -88,58 +88,58 @@ RTCPUtility::RTCPPacketTypes
RTCPUtility::RTCPParserV2::Iterate() RTCPUtility::RTCPParserV2::Iterate()
{ {
// Reset packet type // Reset packet type
_packetType = kRtcpNotValidCode; _packetType = RTCPPacketTypes::kInvalid;
if (IsValid()) if (IsValid())
{ {
switch (_state) switch (_state)
{ {
case State_TopLevel: case ParseState::State_TopLevel:
IterateTopLevel(); IterateTopLevel();
break; break;
case State_ReportBlockItem: case ParseState::State_ReportBlockItem:
IterateReportBlockItem(); IterateReportBlockItem();
break; break;
case State_SDESChunk: case ParseState::State_SDESChunk:
IterateSDESChunk(); IterateSDESChunk();
break; break;
case State_BYEItem: case ParseState::State_BYEItem:
IterateBYEItem(); IterateBYEItem();
break; break;
case State_ExtendedJitterItem: case ParseState::State_ExtendedJitterItem:
IterateExtendedJitterItem(); IterateExtendedJitterItem();
break; break;
case State_RTPFB_NACKItem: case ParseState::State_RTPFB_NACKItem:
IterateNACKItem(); IterateNACKItem();
break; break;
case State_RTPFB_TMMBRItem: case ParseState::State_RTPFB_TMMBRItem:
IterateTMMBRItem(); IterateTMMBRItem();
break; break;
case State_RTPFB_TMMBNItem: case ParseState::State_RTPFB_TMMBNItem:
IterateTMMBNItem(); IterateTMMBNItem();
break; break;
case State_PSFB_SLIItem: case ParseState::State_PSFB_SLIItem:
IterateSLIItem(); IterateSLIItem();
break; break;
case State_PSFB_RPSIItem: case ParseState::State_PSFB_RPSIItem:
IterateRPSIItem(); IterateRPSIItem();
break; break;
case State_PSFB_FIRItem: case ParseState::State_PSFB_FIRItem:
IterateFIRItem(); IterateFIRItem();
break; break;
case State_PSFB_AppItem: case ParseState::State_PSFB_AppItem:
IteratePsfbAppItem(); IteratePsfbAppItem();
break; break;
case State_PSFB_REMBItem: case ParseState::State_PSFB_REMBItem:
IteratePsfbREMBItem(); IteratePsfbREMBItem();
break; break;
case State_XRItem: case ParseState::State_XRItem:
IterateXrItem(); IterateXrItem();
break; break;
case State_XR_DLLRItem: case ParseState::State_XR_DLLRItem:
IterateXrDlrrItem(); IterateXrDlrrItem();
break; break;
case State_AppItem: case ParseState::State_AppItem:
IterateAppItem(); IterateAppItem();
break; break;
default: default:
@@ -515,7 +515,7 @@ RTCPUtility::RTCPParserV2::ParseRR()
_ptrRTCPData += 4; // Skip header _ptrRTCPData += 4; // Skip header
_packetType = kRtcpRrCode; _packetType = RTCPPacketTypes::kRr;
_packet.RR.SenderSSRC = *_ptrRTCPData++ << 24; _packet.RR.SenderSSRC = *_ptrRTCPData++ << 24;
_packet.RR.SenderSSRC += *_ptrRTCPData++ << 16; _packet.RR.SenderSSRC += *_ptrRTCPData++ << 16;
@@ -525,7 +525,7 @@ RTCPUtility::RTCPParserV2::ParseRR()
_packet.RR.NumberOfReportBlocks = _numberOfBlocks; _packet.RR.NumberOfReportBlocks = _numberOfBlocks;
// State transition // State transition
_state = State_ReportBlockItem; _state = ParseState::State_ReportBlockItem;
return true; return true;
} }
@@ -543,7 +543,7 @@ RTCPUtility::RTCPParserV2::ParseSR()
_ptrRTCPData += 4; // Skip header _ptrRTCPData += 4; // Skip header
_packetType = kRtcpSrCode; _packetType = RTCPPacketTypes::kSr;
_packet.SR.SenderSSRC = *_ptrRTCPData++ << 24; _packet.SR.SenderSSRC = *_ptrRTCPData++ << 24;
_packet.SR.SenderSSRC += *_ptrRTCPData++ << 16; _packet.SR.SenderSSRC += *_ptrRTCPData++ << 16;
@@ -580,11 +580,11 @@ RTCPUtility::RTCPParserV2::ParseSR()
// State transition // State transition
if(_numberOfBlocks != 0) if(_numberOfBlocks != 0)
{ {
_state = State_ReportBlockItem; _state = ParseState::State_ReportBlockItem;
}else }else
{ {
// don't go to state report block item if 0 report blocks // don't go to state report block item if 0 report blocks
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
} }
return true; return true;
@@ -597,7 +597,7 @@ RTCPUtility::RTCPParserV2::ParseReportBlockItem()
if (length < 24 || _numberOfBlocks <= 0) if (length < 24 || _numberOfBlocks <= 0)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -634,7 +634,7 @@ RTCPUtility::RTCPParserV2::ParseReportBlockItem()
_packet.ReportBlockItem.DelayLastSR += *_ptrRTCPData++; _packet.ReportBlockItem.DelayLastSR += *_ptrRTCPData++;
_numberOfBlocks--; _numberOfBlocks--;
_packetType = kRtcpReportBlockItemCode; _packetType = RTCPPacketTypes::kReportBlockItem;
return true; return true;
} }
@@ -665,10 +665,10 @@ RTCPUtility::RTCPParserV2::ParseIJ()
_ptrRTCPData += 4; // Skip header _ptrRTCPData += 4; // Skip header
_packetType = kRtcpExtendedIjCode; _packetType = RTCPPacketTypes::kExtendedIj;
// State transition // State transition
_state = State_ExtendedJitterItem; _state = ParseState::State_ExtendedJitterItem;
return true; return true;
} }
@@ -679,7 +679,7 @@ RTCPUtility::RTCPParserV2::ParseIJItem()
if (length < 4 || _numberOfBlocks <= 0) if (length < 4 || _numberOfBlocks <= 0)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
@@ -690,7 +690,7 @@ RTCPUtility::RTCPParserV2::ParseIJItem()
_packet.ExtendedJitterReportItem.Jitter += *_ptrRTCPData++; _packet.ExtendedJitterReportItem.Jitter += *_ptrRTCPData++;
_numberOfBlocks--; _numberOfBlocks--;
_packetType = kRtcpExtendedIjItemCode; _packetType = RTCPPacketTypes::kExtendedIjItem;
return true; return true;
} }
@@ -701,15 +701,15 @@ RTCPUtility::RTCPParserV2::ParseSDES()
if (length < 8) if (length < 8)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_ptrRTCPData += 4; // Skip header _ptrRTCPData += 4; // Skip header
_state = State_SDESChunk; _state = ParseState::State_SDESChunk;
_packetType = kRtcpSdesCode; _packetType = RTCPPacketTypes::kSdes;
return true; return true;
} }
@@ -718,7 +718,7 @@ RTCPUtility::RTCPParserV2::ParseSDESChunk()
{ {
if(_numberOfBlocks <= 0) if(_numberOfBlocks <= 0)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -731,7 +731,7 @@ RTCPUtility::RTCPParserV2::ParseSDESChunk()
const ptrdiff_t dataLen = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t dataLen = _ptrRTCPBlockEnd - _ptrRTCPData;
if (dataLen < 4) if (dataLen < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -749,7 +749,7 @@ RTCPUtility::RTCPParserV2::ParseSDESChunk()
return true; return true;
} }
} }
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -790,7 +790,7 @@ RTCPUtility::RTCPParserV2::ParseSDESItem()
// Sanity // Sanity
if ((_ptrRTCPData + len) >= _ptrRTCPBlockEnd) if ((_ptrRTCPData + len) >= _ptrRTCPBlockEnd)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -802,7 +802,7 @@ RTCPUtility::RTCPParserV2::ParseSDESItem()
if ((c < ' ') || (c > '{') || (c == '%') || (c == '\\')) if ((c < ' ') || (c > '{') || (c == '%') || (c == '\\'))
{ {
// Illegal char // Illegal char
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -811,7 +811,7 @@ RTCPUtility::RTCPParserV2::ParseSDESItem()
} }
// Make sure we are null terminated. // Make sure we are null terminated.
_packet.CName.CName[i] = 0; _packet.CName.CName[i] = 0;
_packetType = kRtcpSdesChunkCode; _packetType = RTCPPacketTypes::kSdesChunk;
foundCName = true; foundCName = true;
} }
@@ -821,7 +821,7 @@ RTCPUtility::RTCPParserV2::ParseSDESItem()
} }
// No end tag found! // No end tag found!
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -832,7 +832,7 @@ RTCPUtility::RTCPParserV2::ParseBYE()
{ {
_ptrRTCPData += 4; // Skip header _ptrRTCPData += 4; // Skip header
_state = State_BYEItem; _state = ParseState::State_BYEItem;
return ParseBYEItem(); return ParseBYEItem();
} }
@@ -843,13 +843,13 @@ RTCPUtility::RTCPParserV2::ParseBYEItem()
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < 4 || _numberOfBlocks == 0) if (length < 4 || _numberOfBlocks == 0)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpByeCode; _packetType = RTCPPacketTypes::kBye;
_packet.BYE.SenderSSRC = *_ptrRTCPData++ << 24; _packet.BYE.SenderSSRC = *_ptrRTCPData++ << 24;
_packet.BYE.SenderSSRC += *_ptrRTCPData++ << 16; _packet.BYE.SenderSSRC += *_ptrRTCPData++ << 16;
@@ -894,8 +894,8 @@ bool RTCPUtility::RTCPParserV2::ParseXr()
_packet.XR.OriginatorSSRC += *_ptrRTCPData++ << 8; _packet.XR.OriginatorSSRC += *_ptrRTCPData++ << 8;
_packet.XR.OriginatorSSRC += *_ptrRTCPData++; _packet.XR.OriginatorSSRC += *_ptrRTCPData++;
_packetType = kRtcpXrHeaderCode; _packetType = RTCPPacketTypes::kXrHeader;
_state = State_XRItem; _state = ParseState::State_XRItem;
return true; return true;
} }
@@ -915,7 +915,7 @@ bool RTCPUtility::RTCPParserV2::ParseXrItem() {
const int kBlockHeaderLengthInBytes = 4; const int kBlockHeaderLengthInBytes = 4;
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < kBlockHeaderLengthInBytes) { if (length < kBlockHeaderLengthInBytes) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
@@ -956,7 +956,7 @@ bool RTCPUtility::RTCPParserV2::ParseXrReceiverReferenceTimeItem(
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (block_length_4bytes != kBlockLengthIn4Bytes || if (block_length_4bytes != kBlockLengthIn4Bytes ||
length < kBlockLengthInBytes) { length < kBlockLengthInBytes) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
@@ -971,8 +971,8 @@ bool RTCPUtility::RTCPParserV2::ParseXrReceiverReferenceTimeItem(
_packet.XRReceiverReferenceTimeItem.NTPLeastSignificant+= *_ptrRTCPData++<<8; _packet.XRReceiverReferenceTimeItem.NTPLeastSignificant+= *_ptrRTCPData++<<8;
_packet.XRReceiverReferenceTimeItem.NTPLeastSignificant+= *_ptrRTCPData++; _packet.XRReceiverReferenceTimeItem.NTPLeastSignificant+= *_ptrRTCPData++;
_packetType = kRtcpXrReceiverReferenceTimeCode; _packetType = RTCPPacketTypes::kXrReceiverReferenceTime;
_state = State_XRItem; _state = ParseState::State_XRItem;
return true; return true;
} }
@@ -997,25 +997,25 @@ bool RTCPUtility::RTCPParserV2::ParseXrDlrr(int block_length_4bytes) {
const int kSubBlockLengthIn4Bytes = 3; const int kSubBlockLengthIn4Bytes = 3;
if (block_length_4bytes < 0 || if (block_length_4bytes < 0 ||
(block_length_4bytes % kSubBlockLengthIn4Bytes) != 0) { (block_length_4bytes % kSubBlockLengthIn4Bytes) != 0) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpXrDlrrReportBlockCode; _packetType = RTCPPacketTypes::kXrDlrrReportBlock;
_state = State_XR_DLLRItem; _state = ParseState::State_XR_DLLRItem;
_numberOfBlocks = block_length_4bytes / kSubBlockLengthIn4Bytes; _numberOfBlocks = block_length_4bytes / kSubBlockLengthIn4Bytes;
return true; return true;
} }
bool RTCPUtility::RTCPParserV2::ParseXrDlrrItem() { bool RTCPUtility::RTCPParserV2::ParseXrDlrrItem() {
if (_numberOfBlocks == 0) { if (_numberOfBlocks == 0) {
_state = State_XRItem; _state = ParseState::State_XRItem;
return false; return false;
} }
const int kSubBlockLengthInBytes = 12; const int kSubBlockLengthInBytes = 12;
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < kSubBlockLengthInBytes) { if (length < kSubBlockLengthInBytes) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
@@ -1035,9 +1035,9 @@ bool RTCPUtility::RTCPParserV2::ParseXrDlrrItem() {
_packet.XRDLRRReportBlockItem.DelayLastRR += *_ptrRTCPData++ << 8; _packet.XRDLRRReportBlockItem.DelayLastRR += *_ptrRTCPData++ << 8;
_packet.XRDLRRReportBlockItem.DelayLastRR += *_ptrRTCPData++; _packet.XRDLRRReportBlockItem.DelayLastRR += *_ptrRTCPData++;
_packetType = kRtcpXrDlrrReportBlockItemCode; _packetType = RTCPPacketTypes::kXrDlrrReportBlockItem;
--_numberOfBlocks; --_numberOfBlocks;
_state = State_XR_DLLRItem; _state = ParseState::State_XR_DLLRItem;
return true; return true;
} }
/* VoIP Metrics Report Block. /* VoIP Metrics Report Block.
@@ -1070,7 +1070,7 @@ bool RTCPUtility::RTCPParserV2::ParseXrVoipMetricItem(int block_length_4bytes) {
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (block_length_4bytes != kBlockLengthIn4Bytes || if (block_length_4bytes != kBlockLengthIn4Bytes ||
length < kBlockLengthInBytes) { length < kBlockLengthInBytes) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
@@ -1117,8 +1117,8 @@ bool RTCPUtility::RTCPParserV2::ParseXrVoipMetricItem(int block_length_4bytes) {
_packet.XRVOIPMetricItem.JBabsMax = *_ptrRTCPData++ << 8; _packet.XRVOIPMetricItem.JBabsMax = *_ptrRTCPData++ << 8;
_packet.XRVOIPMetricItem.JBabsMax += *_ptrRTCPData++; _packet.XRVOIPMetricItem.JBabsMax += *_ptrRTCPData++;
_packetType = kRtcpXrVoipMetricCode; _packetType = RTCPPacketTypes::kXrVoipMetric;
_state = State_XRItem; _state = ParseState::State_XRItem;
return true; return true;
} }
@@ -1127,13 +1127,13 @@ bool RTCPUtility::RTCPParserV2::ParseXrUnsupportedBlockType(
const int32_t kBlockLengthInBytes = block_length_4bytes * 4; const int32_t kBlockLengthInBytes = block_length_4bytes * 4;
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < kBlockLengthInBytes) { if (length < kBlockLengthInBytes) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
// Skip block. // Skip block.
_ptrRTCPData += kBlockLengthInBytes; _ptrRTCPData += kBlockLengthInBytes;
_state = State_XRItem; _state = ParseState::State_XRItem;
return false; return false;
} }
@@ -1171,11 +1171,11 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header)
case 1: case 1:
{ {
// NACK // NACK
_packetType = kRtcpRtpfbNackCode; _packetType = RTCPPacketTypes::kRtpfbNack;
_packet.NACK.SenderSSRC = senderSSRC; _packet.NACK.SenderSSRC = senderSSRC;
_packet.NACK.MediaSSRC = mediaSSRC; _packet.NACK.MediaSSRC = mediaSSRC;
_state = State_RTPFB_NACKItem; _state = ParseState::State_RTPFB_NACKItem;
return true; return true;
} }
@@ -1188,22 +1188,22 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header)
case 3: case 3:
{ {
// TMMBR // TMMBR
_packetType = kRtcpRtpfbTmmbrCode; _packetType = RTCPPacketTypes::kRtpfbTmmbr;
_packet.TMMBR.SenderSSRC = senderSSRC; _packet.TMMBR.SenderSSRC = senderSSRC;
_packet.TMMBR.MediaSSRC = mediaSSRC; _packet.TMMBR.MediaSSRC = mediaSSRC;
_state = State_RTPFB_TMMBRItem; _state = ParseState::State_RTPFB_TMMBRItem;
return true; return true;
} }
case 4: case 4:
{ {
// TMMBN // TMMBN
_packetType = kRtcpRtpfbTmmbnCode; _packetType = RTCPPacketTypes::kRtpfbTmmbn;
_packet.TMMBN.SenderSSRC = senderSSRC; _packet.TMMBN.SenderSSRC = senderSSRC;
_packet.TMMBN.MediaSSRC = mediaSSRC; _packet.TMMBN.MediaSSRC = mediaSSRC;
_state = State_RTPFB_TMMBNItem; _state = ParseState::State_RTPFB_TMMBNItem;
return true; return true;
} }
@@ -1212,7 +1212,7 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header)
// RTCP-SR-REQ Rapid Synchronisation of RTP Flows // RTCP-SR-REQ Rapid Synchronisation of RTP Flows
// draft-perkins-avt-rapid-rtp-sync-03.txt // draft-perkins-avt-rapid-rtp-sync-03.txt
// trigger a new RTCP SR // trigger a new RTCP SR
_packetType = kRtcpRtpfbSrReqCode; _packetType = RTCPPacketTypes::kRtpfbSrReq;
// Note: No state transition, SR REQ is empty! // Note: No state transition, SR REQ is empty!
return true; return true;
@@ -1230,7 +1230,7 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header)
{ {
case 1: case 1:
// PLI // PLI
_packetType = kRtcpPsfbPliCode; _packetType = RTCPPacketTypes::kPsfbPli;
_packet.PLI.SenderSSRC = senderSSRC; _packet.PLI.SenderSSRC = senderSSRC;
_packet.PLI.MediaSSRC = mediaSSRC; _packet.PLI.MediaSSRC = mediaSSRC;
@@ -1238,34 +1238,34 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header)
return true; return true;
case 2: case 2:
// SLI // SLI
_packetType = kRtcpPsfbSliCode; _packetType = RTCPPacketTypes::kPsfbSli;
_packet.SLI.SenderSSRC = senderSSRC; _packet.SLI.SenderSSRC = senderSSRC;
_packet.SLI.MediaSSRC = mediaSSRC; _packet.SLI.MediaSSRC = mediaSSRC;
_state = State_PSFB_SLIItem; _state = ParseState::State_PSFB_SLIItem;
return true; return true;
case 3: case 3:
_packetType = kRtcpPsfbRpsiCode; _packetType = RTCPPacketTypes::kPsfbRpsi;
_packet.RPSI.SenderSSRC = senderSSRC; _packet.RPSI.SenderSSRC = senderSSRC;
_packet.RPSI.MediaSSRC = mediaSSRC; _packet.RPSI.MediaSSRC = mediaSSRC;
_state = State_PSFB_RPSIItem; _state = ParseState::State_PSFB_RPSIItem;
return true; return true;
case 4: case 4:
// FIR // FIR
_packetType = kRtcpPsfbFirCode; _packetType = RTCPPacketTypes::kPsfbFir;
_packet.FIR.SenderSSRC = senderSSRC; _packet.FIR.SenderSSRC = senderSSRC;
_packet.FIR.MediaSSRC = mediaSSRC; _packet.FIR.MediaSSRC = mediaSSRC;
_state = State_PSFB_FIRItem; _state = ParseState::State_PSFB_FIRItem;
return true; return true;
case 15: case 15:
_packetType = kRtcpPsfbAppCode; _packetType = RTCPPacketTypes::kPsfbApp;
_packet.PSFBAPP.SenderSSRC = senderSSRC; _packet.PSFBAPP.SenderSSRC = senderSSRC;
_packet.PSFBAPP.MediaSSRC = mediaSSRC; _packet.PSFBAPP.MediaSSRC = mediaSSRC;
_state = State_PSFB_AppItem; _state = ParseState::State_PSFB_AppItem;
return true; return true;
default: default:
break; break;
@@ -1298,19 +1298,19 @@ bool RTCPUtility::RTCPParserV2::ParseRPSIItem() {
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < 4) { if (length < 4) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
if (length > 2 + RTCP_RPSI_DATA_SIZE) { if (length > 2 + RTCP_RPSI_DATA_SIZE) {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpPsfbRpsiCode; _packetType = RTCPPacketTypes::kPsfbRpsi;
uint8_t padding_bits = *_ptrRTCPData++; uint8_t padding_bits = *_ptrRTCPData++;
_packet.RPSI.PayloadType = *_ptrRTCPData++; _packet.RPSI.PayloadType = *_ptrRTCPData++;
@@ -1332,13 +1332,13 @@ RTCPUtility::RTCPParserV2::ParseNACKItem()
if (length < 4) if (length < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpRtpfbNackItemCode; _packetType = RTCPPacketTypes::kRtpfbNackItem;
_packet.NACKItem.PacketID = *_ptrRTCPData++ << 8; _packet.NACKItem.PacketID = *_ptrRTCPData++ << 8;
_packet.NACKItem.PacketID += *_ptrRTCPData++; _packet.NACKItem.PacketID += *_ptrRTCPData++;
@@ -1356,41 +1356,41 @@ RTCPUtility::RTCPParserV2::ParsePsfbAppItem()
if (length < 4) if (length < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
if(*_ptrRTCPData++ != 'R') if(*_ptrRTCPData++ != 'R')
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
if(*_ptrRTCPData++ != 'E') if(*_ptrRTCPData++ != 'E')
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
if(*_ptrRTCPData++ != 'M') if(*_ptrRTCPData++ != 'M')
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
if(*_ptrRTCPData++ != 'B') if(*_ptrRTCPData++ != 'B')
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpPsfbRembCode; _packetType = RTCPPacketTypes::kPsfbRemb;
_state = State_PSFB_REMBItem; _state = ParseState::State_PSFB_REMBItem;
return true; return true;
} }
@@ -1401,7 +1401,7 @@ RTCPUtility::RTCPParserV2::ParsePsfbREMBItem()
if (length < 4) if (length < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
@@ -1420,13 +1420,13 @@ RTCPUtility::RTCPParserV2::ParsePsfbREMBItem()
const ptrdiff_t length_ssrcs = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length_ssrcs = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length_ssrcs < 4 * _packet.REMBItem.NumberOfSSRCs) if (length_ssrcs < 4 * _packet.REMBItem.NumberOfSSRCs)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpPsfbRembItemCode; _packetType = RTCPPacketTypes::kPsfbRembItem;
for (int i = 0; i < _packet.REMBItem.NumberOfSSRCs; i++) for (int i = 0; i < _packet.REMBItem.NumberOfSSRCs; i++)
{ {
@@ -1447,13 +1447,13 @@ RTCPUtility::RTCPParserV2::ParseTMMBRItem()
if (length < 8) if (length < 8)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpRtpfbTmmbrItemCode; _packetType = RTCPPacketTypes::kRtpfbTmmbrItem;
_packet.TMMBRItem.SSRC = *_ptrRTCPData++ << 24; _packet.TMMBRItem.SSRC = *_ptrRTCPData++ << 24;
_packet.TMMBRItem.SSRC += *_ptrRTCPData++ << 16; _packet.TMMBRItem.SSRC += *_ptrRTCPData++ << 16;
@@ -1486,13 +1486,13 @@ RTCPUtility::RTCPParserV2::ParseTMMBNItem()
if (length < 8) if (length < 8)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpRtpfbTmmbnItemCode; _packetType = RTCPPacketTypes::kRtpfbTmmbnItem;
_packet.TMMBNItem.SSRC = *_ptrRTCPData++ << 24; _packet.TMMBNItem.SSRC = *_ptrRTCPData++ << 24;
_packet.TMMBNItem.SSRC += *_ptrRTCPData++ << 16; _packet.TMMBNItem.SSRC += *_ptrRTCPData++ << 16;
@@ -1532,12 +1532,12 @@ RTCPUtility::RTCPParserV2::ParseSLIItem()
if (length < 4) if (length < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpPsfbSliItemCode; _packetType = RTCPPacketTypes::kPsfbSliItem;
uint32_t buffer; uint32_t buffer;
buffer = *_ptrRTCPData++ << 24; buffer = *_ptrRTCPData++ << 24;
@@ -1561,13 +1561,13 @@ RTCPUtility::RTCPParserV2::ParseFIRItem()
if (length < 8) if (length < 8)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpPsfbFirItemCode; _packetType = RTCPPacketTypes::kPsfbFirItem;
_packet.FIRItem.SSRC = *_ptrRTCPData++ << 24; _packet.FIRItem.SSRC = *_ptrRTCPData++ << 24;
_packet.FIRItem.SSRC += *_ptrRTCPData++ << 16; _packet.FIRItem.SSRC += *_ptrRTCPData++ << 16;
@@ -1604,12 +1604,12 @@ RTCPUtility::RTCPParserV2::ParseAPP( const RTCPCommonHeader& header)
length = _ptrRTCPBlockEnd - _ptrRTCPData; length = _ptrRTCPBlockEnd - _ptrRTCPData;
_packetType = kRtcpAppCode; _packetType = RTCPPacketTypes::kApp;
_packet.APP.SubType = header.IC; _packet.APP.SubType = header.IC;
_packet.APP.Name = name; _packet.APP.Name = name;
_state = State_AppItem; _state = ParseState::State_AppItem;
return true; return true;
} }
@@ -1619,12 +1619,12 @@ RTCPUtility::RTCPParserV2::ParseAPPItem()
const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData; const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;
if (length < 4) if (length < 4)
{ {
_state = State_TopLevel; _state = ParseState::State_TopLevel;
EndCurrentBlock(); EndCurrentBlock();
return false; return false;
} }
_packetType = kRtcpAppItemCode; _packetType = RTCPPacketTypes::kAppItem;
if(length > kRtcpAppCode_DATA_SIZE) if(length > kRtcpAppCode_DATA_SIZE)
{ {

View File

@@ -1,12 +1,12 @@
/* /*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
* *
* Use of this source code is governed by a BSD-style license * 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 * that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found * tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may * in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
@@ -42,20 +42,17 @@ class NackStats {
uint32_t unique_requests_; uint32_t unique_requests_;
}; };
uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac); uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
// CNAME // CNAME
struct RTCPCnameInformation struct RTCPCnameInformation {
{
char name[RTCP_CNAME_SIZE]; char name[RTCP_CNAME_SIZE];
}; };
struct RTCPPacketRR struct RTCPPacketRR {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint8_t NumberOfReportBlocks; uint8_t NumberOfReportBlocks;
}; };
struct RTCPPacketSR struct RTCPPacketSR {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint8_t NumberOfReportBlocks; uint8_t NumberOfReportBlocks;
@@ -65,9 +62,8 @@ class NackStats {
uint32_t RTPTimestamp; uint32_t RTPTimestamp;
uint32_t SenderPacketCount; uint32_t SenderPacketCount;
uint32_t SenderOctetCount; uint32_t SenderOctetCount;
}; };
struct RTCPPacketReportBlockItem struct RTCPPacketReportBlockItem {
{
// report block // report block
uint32_t SSRC; uint32_t SSRC;
uint8_t FractionLost; uint8_t FractionLost;
@@ -76,44 +72,37 @@ class NackStats {
uint32_t Jitter; uint32_t Jitter;
uint32_t LastSR; uint32_t LastSR;
uint32_t DelayLastSR; uint32_t DelayLastSR;
}; };
struct RTCPPacketSDESCName struct RTCPPacketSDESCName {
{
// RFC3550 // RFC3550
uint32_t SenderSSRC; uint32_t SenderSSRC;
char CName[RTCP_CNAME_SIZE]; char CName[RTCP_CNAME_SIZE];
}; };
struct RTCPPacketExtendedJitterReportItem struct RTCPPacketExtendedJitterReportItem {
{
// RFC 5450 // RFC 5450
uint32_t Jitter; uint32_t Jitter;
}; };
struct RTCPPacketBYE struct RTCPPacketBYE {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
}; };
struct RTCPPacketXR struct RTCPPacketXR {
{
// RFC 3611 // RFC 3611
uint32_t OriginatorSSRC; uint32_t OriginatorSSRC;
}; };
struct RTCPPacketXRReceiverReferenceTimeItem struct RTCPPacketXRReceiverReferenceTimeItem {
{
// RFC 3611 4.4 // RFC 3611 4.4
uint32_t NTPMostSignificant; uint32_t NTPMostSignificant;
uint32_t NTPLeastSignificant; uint32_t NTPLeastSignificant;
}; };
struct RTCPPacketXRDLRRReportBlockItem struct RTCPPacketXRDLRRReportBlockItem {
{
// RFC 3611 4.5 // RFC 3611 4.5
uint32_t SSRC; uint32_t SSRC;
uint32_t LastRR; uint32_t LastRR;
uint32_t DelayLastRR; uint32_t DelayLastRR;
}; };
struct RTCPPacketXRVOIPMetricItem struct RTCPPacketXRVOIPMetricItem {
{
// RFC 3611 4.7 // RFC 3611 4.7
uint32_t SSRC; uint32_t SSRC;
uint8_t lossRate; uint8_t lossRate;
@@ -136,109 +125,93 @@ class NackStats {
uint16_t JBnominal; uint16_t JBnominal;
uint16_t JBmax; uint16_t JBmax;
uint16_t JBabsMax; uint16_t JBabsMax;
}; };
struct RTCPPacketRTPFBNACK struct RTCPPacketRTPFBNACK {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; uint32_t MediaSSRC;
}; };
struct RTCPPacketRTPFBNACKItem struct RTCPPacketRTPFBNACKItem {
{
// RFC4585 // RFC4585
uint16_t PacketID; uint16_t PacketID;
uint16_t BitMask; uint16_t BitMask;
}; };
struct RTCPPacketRTPFBTMMBR struct RTCPPacketRTPFBTMMBR {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; // zero! uint32_t MediaSSRC; // zero!
}; };
struct RTCPPacketRTPFBTMMBRItem struct RTCPPacketRTPFBTMMBRItem {
{
// RFC5104 // RFC5104
uint32_t SSRC; uint32_t SSRC;
uint32_t MaxTotalMediaBitRate; // In Kbit/s uint32_t MaxTotalMediaBitRate; // In Kbit/s
uint32_t MeasuredOverhead; uint32_t MeasuredOverhead;
}; };
struct RTCPPacketRTPFBTMMBN struct RTCPPacketRTPFBTMMBN {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; // zero! uint32_t MediaSSRC; // zero!
}; };
struct RTCPPacketRTPFBTMMBNItem struct RTCPPacketRTPFBTMMBNItem {
{
// RFC5104 // RFC5104
uint32_t SSRC; // "Owner" uint32_t SSRC; // "Owner"
uint32_t MaxTotalMediaBitRate; uint32_t MaxTotalMediaBitRate;
uint32_t MeasuredOverhead; uint32_t MeasuredOverhead;
}; };
struct RTCPPacketPSFBFIR struct RTCPPacketPSFBFIR {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; // zero! uint32_t MediaSSRC; // zero!
}; };
struct RTCPPacketPSFBFIRItem struct RTCPPacketPSFBFIRItem {
{
// RFC5104 // RFC5104
uint32_t SSRC; uint32_t SSRC;
uint8_t CommandSequenceNumber; uint8_t CommandSequenceNumber;
}; };
struct RTCPPacketPSFBPLI struct RTCPPacketPSFBPLI {
{
// RFC4585 // RFC4585
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; uint32_t MediaSSRC;
}; };
struct RTCPPacketPSFBSLI struct RTCPPacketPSFBSLI {
{
// RFC4585 // RFC4585
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; uint32_t MediaSSRC;
}; };
struct RTCPPacketPSFBSLIItem struct RTCPPacketPSFBSLIItem {
{
// RFC4585 // RFC4585
uint16_t FirstMB; uint16_t FirstMB;
uint16_t NumberOfMB; uint16_t NumberOfMB;
uint8_t PictureId; uint8_t PictureId;
}; };
struct RTCPPacketPSFBRPSI struct RTCPPacketPSFBRPSI {
{
// RFC4585 // RFC4585
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; uint32_t MediaSSRC;
uint8_t PayloadType; uint8_t PayloadType;
uint16_t NumberOfValidBits; uint16_t NumberOfValidBits;
uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE]; uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
}; };
struct RTCPPacketPSFBAPP struct RTCPPacketPSFBAPP {
{
uint32_t SenderSSRC; uint32_t SenderSSRC;
uint32_t MediaSSRC; uint32_t MediaSSRC;
}; };
struct RTCPPacketPSFBREMBItem struct RTCPPacketPSFBREMBItem {
{
uint32_t BitRate; uint32_t BitRate;
uint8_t NumberOfSSRCs; uint8_t NumberOfSSRCs;
uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS]; uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
}; };
// generic name APP // generic name APP
struct RTCPPacketAPP struct RTCPPacketAPP {
{
uint8_t SubType; uint8_t SubType;
uint32_t Name; uint32_t Name;
uint8_t Data[kRtcpAppCode_DATA_SIZE]; uint8_t Data[kRtcpAppCode_DATA_SIZE];
uint16_t Size; uint16_t Size;
}; };
union RTCPPacket union RTCPPacket {
{
RTCPPacketRR RR; RTCPPacketRR RR;
RTCPPacketSR SR; RTCPPacketSR SR;
RTCPPacketReportBlockItem ReportBlockItem; RTCPPacketReportBlockItem ReportBlockItem;
@@ -271,82 +244,77 @@ class NackStats {
RTCPPacketXRVOIPMetricItem XRVOIPMetricItem; RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
RTCPPacketAPP APP; RTCPPacketAPP APP;
}; };
enum RTCPPacketTypes enum class RTCPPacketTypes {
{ kInvalid,
kRtcpNotValidCode,
// RFC3550 // RFC3550
kRtcpRrCode, kRr,
kRtcpSrCode, kSr,
kRtcpReportBlockItemCode, kReportBlockItem,
kRtcpSdesCode, kSdes,
kRtcpSdesChunkCode, kSdesChunk,
kRtcpByeCode, kBye,
// RFC5450 // RFC5450
kRtcpExtendedIjCode, kExtendedIj,
kRtcpExtendedIjItemCode, kExtendedIjItem,
// RFC4585 // RFC4585
kRtcpRtpfbNackCode, kRtpfbNack,
kRtcpRtpfbNackItemCode, kRtpfbNackItem,
kRtcpPsfbPliCode, kPsfbPli,
kRtcpPsfbRpsiCode, kPsfbRpsi,
kRtcpPsfbSliCode, kPsfbSli,
kRtcpPsfbSliItemCode, kPsfbSliItem,
kRtcpPsfbAppCode, kPsfbApp,
kRtcpPsfbRembCode, kPsfbRemb,
kRtcpPsfbRembItemCode, kPsfbRembItem,
// RFC5104 // RFC5104
kRtcpRtpfbTmmbrCode, kRtpfbTmmbr,
kRtcpRtpfbTmmbrItemCode, kRtpfbTmmbrItem,
kRtcpRtpfbTmmbnCode, kRtpfbTmmbn,
kRtcpRtpfbTmmbnItemCode, kRtpfbTmmbnItem,
kRtcpPsfbFirCode, kPsfbFir,
kRtcpPsfbFirItemCode, kPsfbFirItem,
// draft-perkins-avt-rapid-rtp-sync // draft-perkins-avt-rapid-rtp-sync
kRtcpRtpfbSrReqCode, kRtpfbSrReq,
// RFC 3611 // RFC 3611
kRtcpXrHeaderCode, kXrHeader,
kRtcpXrReceiverReferenceTimeCode, kXrReceiverReferenceTime,
kRtcpXrDlrrReportBlockCode, kXrDlrrReportBlock,
kRtcpXrDlrrReportBlockItemCode, kXrDlrrReportBlockItem,
kRtcpXrVoipMetricCode, kXrVoipMetric,
kRtcpAppCode, kApp,
kRtcpAppItemCode, kAppItem,
}; };
struct RTCPRawPacket struct RTCPRawPacket {
{
const uint8_t* _ptrPacketBegin; const uint8_t* _ptrPacketBegin;
const uint8_t* _ptrPacketEnd; const uint8_t* _ptrPacketEnd;
}; };
struct RTCPModRawPacket struct RTCPModRawPacket {
{
uint8_t* _ptrPacketBegin; uint8_t* _ptrPacketBegin;
uint8_t* _ptrPacketEnd; uint8_t* _ptrPacketEnd;
}; };
struct RTCPCommonHeader struct RTCPCommonHeader {
{
uint8_t V; // Version uint8_t V; // Version
bool P; // Padding bool P; // Padding
uint8_t IC; // Item count/subtype uint8_t IC; // Item count/subtype
uint8_t PT; // Packet Type uint8_t PT; // Packet Type
uint16_t LengthInOctets; uint16_t LengthInOctets;
}; };
enum RTCPPT enum RTCPPT : uint8_t {
{
PT_IJ = 195, PT_IJ = 195,
PT_SR = 200, PT_SR = 200,
PT_RR = 201, PT_RR = 201,
@@ -356,23 +324,23 @@ class NackStats {
PT_RTPFB = 205, PT_RTPFB = 205,
PT_PSFB = 206, PT_PSFB = 206,
PT_XR = 207 PT_XR = 207
}; };
// Extended report blocks, RFC 3611. // Extended report blocks, RFC 3611.
enum RtcpXrBlockType { enum RtcpXrBlockType : uint8_t {
kBtReceiverReferenceTime = 4, kBtReceiverReferenceTime = 4,
kBtDlrr = 5, kBtDlrr = 5,
kBtVoipMetric = 7 kBtVoipMetric = 7
}; };
bool RTCPParseCommonHeader( const uint8_t* ptrDataBegin, bool RTCPParseCommonHeader(const uint8_t* ptrDataBegin,
const uint8_t* ptrDataEnd, const uint8_t* ptrDataEnd,
RTCPCommonHeader& parsedHeader); RTCPCommonHeader& parsedHeader);
class RTCPParserV2 class RTCPParserV2 {
{
public: public:
RTCPParserV2(const uint8_t* rtcpData, RTCPParserV2(
const uint8_t* rtcpData,
size_t rtcpDataLength, size_t rtcpDataLength,
bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP! bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
~RTCPParserV2(); ~RTCPParserV2();
@@ -388,8 +356,7 @@ class NackStats {
RTCPPacketTypes Iterate(); RTCPPacketTypes Iterate();
private: private:
enum ParseState enum class ParseState {
{
State_TopLevel, // Top level packet State_TopLevel, // Top level packet
State_ReportBlockItem, // SR/RR report block State_ReportBlockItem, // SR/RR report block
State_SDESChunk, // SDES chunk State_SDESChunk, // SDES chunk
@@ -478,13 +445,11 @@ class NackStats {
RTCPPacketTypes _packetType; RTCPPacketTypes _packetType;
RTCPPacket _packet; RTCPPacket _packet;
}; };
class RTCPPacketIterator class RTCPPacketIterator {
{
public: public:
RTCPPacketIterator(uint8_t* rtcpData, RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength);
size_t rtcpDataLength);
~RTCPPacketIterator(); ~RTCPPacketIterator();
const RTCPCommonHeader* Begin(); const RTCPCommonHeader* Begin();
@@ -498,7 +463,7 @@ class NackStats {
uint8_t* _ptrBlock; uint8_t* _ptrBlock;
RTCPCommonHeader _header; RTCPCommonHeader _header;
}; };
} // RTCPUtility } // RTCPUtility
} // namespace webrtc } // namespace webrtc
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_

View File

@@ -556,8 +556,15 @@ int32_t ModuleRtpRtcpImpl::ResetSendDataCountersRTP() {
// Force a send of an RTCP packet. // Force a send of an RTCP packet.
// Normal SR and RR are triggered via the process function. // Normal SR and RR are triggered via the process function.
int32_t ModuleRtpRtcpImpl::SendRTCP(uint32_t rtcp_packet_type) { int32_t ModuleRtpRtcpImpl::SendRTCP(RTCPPacketType packet_type) {
return rtcp_sender_.SendRTCP(GetFeedbackState(), rtcp_packet_type); return rtcp_sender_.SendRTCP(GetFeedbackState(), packet_type);
}
// Force a send of an RTCP packet.
// Normal SR and RR are triggered via the process function.
int32_t ModuleRtpRtcpImpl::SendCompoundRTCP(
const std::set<RTCPPacketType>& packet_types) {
return rtcp_sender_.SendCompoundRTCP(GetFeedbackState(), packet_types);
} }
int32_t ModuleRtpRtcpImpl::SetRTCPApplicationSpecificData( int32_t ModuleRtpRtcpImpl::SetRTCPApplicationSpecificData(

View File

@@ -161,7 +161,10 @@ class ModuleRtpRtcpImpl : public RtpRtcp {
// Force a send of an RTCP packet. // Force a send of an RTCP packet.
// Normal SR and RR are triggered via the process function. // Normal SR and RR are triggered via the process function.
int32_t SendRTCP(uint32_t rtcp_packet_type = kRtcpReport) override; int32_t SendRTCP(RTCPPacketType rtcpPacketType) override;
int32_t SendCompoundRTCP(
const std::set<RTCPPacketType>& rtcpPacketTypes) override;
int32_t ResetSendDataCountersRTP() override; int32_t ResetSendDataCountersRTP() override;

View File

@@ -373,7 +373,10 @@ TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_FirAndPli) {
EXPECT_EQ(1U, sender_.RtcpReceived().fir_packets); EXPECT_EQ(1U, sender_.RtcpReceived().fir_packets);
// Receive module sends a FIR and PLI. // Receive module sends a FIR and PLI.
EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpFir | kRtcpPli)); std::set<RTCPPacketType> packet_types;
packet_types.insert(kRtcpFir);
packet_types.insert(kRtcpPli);
EXPECT_EQ(0, receiver_.impl_->SendCompoundRTCP(packet_types));
EXPECT_EQ(2U, receiver_.RtcpSent().fir_packets); EXPECT_EQ(2U, receiver_.RtcpSent().fir_packets);
EXPECT_EQ(1U, receiver_.RtcpSent().pli_packets); EXPECT_EQ(1U, receiver_.RtcpSent().pli_packets);
// Send module receives the FIR and PLI. // Send module receives the FIR and PLI.

View File

@@ -15,6 +15,8 @@
namespace webrtc { namespace webrtc {
namespace test { namespace test {
using namespace RTCPUtility;
RtcpPacketParser::RtcpPacketParser() {} RtcpPacketParser::RtcpPacketParser() {}
RtcpPacketParser::~RtcpPacketParser() {} RtcpPacketParser::~RtcpPacketParser() {}
@@ -24,98 +26,97 @@ void RtcpPacketParser::Parse(const void *data, size_t len) {
RTCPUtility::RTCPParserV2 parser(packet, len, true); RTCPUtility::RTCPParserV2 parser(packet, len, true);
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
for (RTCPUtility::RTCPPacketTypes type = parser.Begin(); for (RTCPUtility::RTCPPacketTypes type = parser.Begin();
type != RTCPUtility::kRtcpNotValidCode; type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) {
type = parser.Iterate()) {
switch (type) { switch (type) {
case RTCPUtility::kRtcpSrCode: case RTCPPacketTypes::kSr:
sender_report_.Set(parser.Packet().SR); sender_report_.Set(parser.Packet().SR);
break; break;
case RTCPUtility::kRtcpRrCode: case RTCPPacketTypes::kRr:
receiver_report_.Set(parser.Packet().RR); receiver_report_.Set(parser.Packet().RR);
break; break;
case RTCPUtility::kRtcpReportBlockItemCode: case RTCPPacketTypes::kReportBlockItem:
report_block_.Set(parser.Packet().ReportBlockItem); report_block_.Set(parser.Packet().ReportBlockItem);
++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC]; ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC];
break; break;
case RTCPUtility::kRtcpSdesCode: case RTCPPacketTypes::kSdes:
sdes_.Set(); sdes_.Set();
break; break;
case RTCPUtility::kRtcpSdesChunkCode: case RTCPPacketTypes::kSdesChunk:
sdes_chunk_.Set(parser.Packet().CName); sdes_chunk_.Set(parser.Packet().CName);
break; break;
case RTCPUtility::kRtcpByeCode: case RTCPPacketTypes::kBye:
bye_.Set(parser.Packet().BYE); bye_.Set(parser.Packet().BYE);
break; break;
case RTCPUtility::kRtcpAppCode: case RTCPPacketTypes::kApp:
app_.Set(parser.Packet().APP); app_.Set(parser.Packet().APP);
break; break;
case RTCPUtility::kRtcpAppItemCode: case RTCPPacketTypes::kAppItem:
app_item_.Set(parser.Packet().APP); app_item_.Set(parser.Packet().APP);
break; break;
case RTCPUtility::kRtcpExtendedIjCode: case RTCPPacketTypes::kExtendedIj:
ij_.Set(); ij_.Set();
break; break;
case RTCPUtility::kRtcpExtendedIjItemCode: case RTCPPacketTypes::kExtendedIjItem:
ij_item_.Set(parser.Packet().ExtendedJitterReportItem); ij_item_.Set(parser.Packet().ExtendedJitterReportItem);
break; break;
case RTCPUtility::kRtcpPsfbPliCode: case RTCPPacketTypes::kPsfbPli:
pli_.Set(parser.Packet().PLI); pli_.Set(parser.Packet().PLI);
break; break;
case RTCPUtility::kRtcpPsfbSliCode: case RTCPPacketTypes::kPsfbSli:
sli_.Set(parser.Packet().SLI); sli_.Set(parser.Packet().SLI);
break; break;
case RTCPUtility::kRtcpPsfbSliItemCode: case RTCPPacketTypes::kPsfbSliItem:
sli_item_.Set(parser.Packet().SLIItem); sli_item_.Set(parser.Packet().SLIItem);
break; break;
case RTCPUtility::kRtcpPsfbRpsiCode: case RTCPPacketTypes::kPsfbRpsi:
rpsi_.Set(parser.Packet().RPSI); rpsi_.Set(parser.Packet().RPSI);
break; break;
case RTCPUtility::kRtcpPsfbFirCode: case RTCPPacketTypes::kPsfbFir:
fir_.Set(parser.Packet().FIR); fir_.Set(parser.Packet().FIR);
break; break;
case RTCPUtility::kRtcpPsfbFirItemCode: case RTCPPacketTypes::kPsfbFirItem:
fir_item_.Set(parser.Packet().FIRItem); fir_item_.Set(parser.Packet().FIRItem);
break; break;
case RTCPUtility::kRtcpRtpfbNackCode: case RTCPPacketTypes::kRtpfbNack:
nack_.Set(parser.Packet().NACK); nack_.Set(parser.Packet().NACK);
nack_item_.Clear(); nack_item_.Clear();
break; break;
case RTCPUtility::kRtcpRtpfbNackItemCode: case RTCPPacketTypes::kRtpfbNackItem:
nack_item_.Set(parser.Packet().NACKItem); nack_item_.Set(parser.Packet().NACKItem);
break; break;
case RTCPUtility::kRtcpPsfbAppCode: case RTCPPacketTypes::kPsfbApp:
psfb_app_.Set(parser.Packet().PSFBAPP); psfb_app_.Set(parser.Packet().PSFBAPP);
break; break;
case RTCPUtility::kRtcpPsfbRembItemCode: case RTCPPacketTypes::kPsfbRembItem:
remb_item_.Set(parser.Packet().REMBItem); remb_item_.Set(parser.Packet().REMBItem);
break; break;
case RTCPUtility::kRtcpRtpfbTmmbrCode: case RTCPPacketTypes::kRtpfbTmmbr:
tmmbr_.Set(parser.Packet().TMMBR); tmmbr_.Set(parser.Packet().TMMBR);
break; break;
case RTCPUtility::kRtcpRtpfbTmmbrItemCode: case RTCPPacketTypes::kRtpfbTmmbrItem:
tmmbr_item_.Set(parser.Packet().TMMBRItem); tmmbr_item_.Set(parser.Packet().TMMBRItem);
break; break;
case RTCPUtility::kRtcpRtpfbTmmbnCode: case RTCPPacketTypes::kRtpfbTmmbn:
tmmbn_.Set(parser.Packet().TMMBN); tmmbn_.Set(parser.Packet().TMMBN);
tmmbn_items_.Clear(); tmmbn_items_.Clear();
break; break;
case RTCPUtility::kRtcpRtpfbTmmbnItemCode: case RTCPPacketTypes::kRtpfbTmmbnItem:
tmmbn_items_.Set(parser.Packet().TMMBNItem); tmmbn_items_.Set(parser.Packet().TMMBNItem);
break; break;
case RTCPUtility::kRtcpXrHeaderCode: case RTCPPacketTypes::kXrHeader:
xr_header_.Set(parser.Packet().XR); xr_header_.Set(parser.Packet().XR);
dlrr_items_.Clear(); dlrr_items_.Clear();
break; break;
case RTCPUtility::kRtcpXrReceiverReferenceTimeCode: case RTCPPacketTypes::kXrReceiverReferenceTime:
rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem); rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem);
break; break;
case RTCPUtility::kRtcpXrDlrrReportBlockCode: case RTCPPacketTypes::kXrDlrrReportBlock:
dlrr_.Set(); dlrr_.Set();
break; break;
case RTCPUtility::kRtcpXrDlrrReportBlockItemCode: case RTCPPacketTypes::kXrDlrrReportBlockItem:
dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem); dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem);
break; break;
case RTCPUtility::kRtcpXrVoipMetricCode: case RTCPPacketTypes::kXrVoipMetric:
voip_metric_.Set(parser.Packet().XRVOIPMetricItem); voip_metric_.Set(parser.Packet().XRVOIPMetricItem);
break; break;
default: default:

View File

@@ -66,9 +66,9 @@ class SyncRtcpObserver : public test::RtpRtcpObserver {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
packet_type != RTCPUtility::kRtcpNotValidCode; packet_type != RTCPUtility::RTCPPacketTypes::kInvalid;
packet_type = parser.Iterate()) { packet_type = parser.Iterate()) {
if (packet_type == RTCPUtility::kRtcpSrCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) {
const RTCPUtility::RTCPPacket& packet = parser.Packet(); const RTCPUtility::RTCPPacket& packet = parser.Packet();
RtcpMeasurement ntp_rtp_pair( RtcpMeasurement ntp_rtp_pair(
packet.SR.NTPMostSignificant, packet.SR.NTPMostSignificant,

View File

@@ -418,8 +418,8 @@ TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpRtpfbNackCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kRtpfbNack) {
--nacks_left_; --nacks_left_;
break; break;
} }
@@ -929,12 +929,12 @@ void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
packet_type != RTCPUtility::kRtcpNotValidCode; packet_type != RTCPUtility::RTCPPacketTypes::kInvalid;
packet_type = parser.Iterate()) { packet_type = parser.Iterate()) {
if (!nack_enabled_) if (!nack_enabled_)
EXPECT_NE(packet_type, RTCPUtility::kRtcpRtpfbNackCode); EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kRtpfbNack);
if (packet_type == RTCPUtility::kRtcpPsfbPliCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbPli) {
received_pli_ = true; received_pli_ = true;
break; break;
} }
@@ -1070,9 +1070,9 @@ void EndToEndTest::RespectsRtcpMode(newapi::RtcpMode rtcp_mode) {
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
bool has_report_block = false; bool has_report_block = false;
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
EXPECT_NE(RTCPUtility::kRtcpSrCode, packet_type); EXPECT_NE(RTCPUtility::RTCPPacketTypes::kSr, packet_type);
if (packet_type == RTCPUtility::kRtcpRrCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kRr) {
has_report_block = true; has_report_block = true;
break; break;
} }
@@ -1336,12 +1336,12 @@ TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
bool received_psfb = false; bool received_psfb = false;
bool received_remb = false; bool received_remb = false;
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpPsfbRembCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRemb) {
const RTCPUtility::RTCPPacket& packet = parser.Packet(); const RTCPUtility::RTCPPacket& packet = parser.Packet();
EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc); EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc);
received_psfb = true; received_psfb = true;
} else if (packet_type == RTCPUtility::kRtcpPsfbRembItemCode) { } else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) {
const RTCPUtility::RTCPPacket& packet = parser.Packet(); const RTCPUtility::RTCPPacket& packet = parser.Packet();
EXPECT_GT(packet.REMBItem.BitRate, 0u); EXPECT_GT(packet.REMBItem.BitRate, 0u);
EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u);
@@ -1700,15 +1700,16 @@ void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpRrCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kRr) {
++sent_rtcp_rr_; ++sent_rtcp_rr_;
} else if (packet_type == } else if (packet_type ==
RTCPUtility::kRtcpXrReceiverReferenceTimeCode) { RTCPUtility::RTCPPacketTypes::kXrReceiverReferenceTime) {
++sent_rtcp_rrtr_; ++sent_rtcp_rrtr_;
} }
EXPECT_NE(packet_type, RTCPUtility::kRtcpSrCode); EXPECT_NE(packet_type, RTCPUtility::RTCPPacketTypes::kSr);
EXPECT_NE(packet_type, RTCPUtility::kRtcpXrDlrrReportBlockItemCode); EXPECT_NE(packet_type,
RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem);
packet_type = parser.Iterate(); packet_type = parser.Iterate();
} }
return SEND_PACKET; return SEND_PACKET;
@@ -1719,13 +1720,15 @@ void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpSrCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) {
++sent_rtcp_sr_; ++sent_rtcp_sr_;
} else if (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) { } else if (packet_type ==
RTCPUtility::RTCPPacketTypes::kXrDlrrReportBlockItem) {
++sent_rtcp_dlrr_; ++sent_rtcp_dlrr_;
} }
EXPECT_NE(packet_type, RTCPUtility::kRtcpXrReceiverReferenceTimeCode); EXPECT_NE(packet_type,
RTCPUtility::RTCPPacketTypes::kXrReceiverReferenceTime);
packet_type = parser.Iterate(); packet_type = parser.Iterate();
} }
if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve &&

View File

@@ -104,8 +104,8 @@ TEST_F(VideoSendStreamTest, SupportsCName) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpSdesChunkCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kSdesChunk) {
EXPECT_EQ(parser.Packet().CName.CName, kCName); EXPECT_EQ(parser.Packet().CName.CName, kCName);
observation_complete_->Set(); observation_complete_->Set();
} }
@@ -1514,8 +1514,8 @@ TEST_F(VideoSendStreamTest, RtcpSenderReportContainsMediaBytesSent) {
EXPECT_TRUE(parser.IsValid()); EXPECT_TRUE(parser.IsValid());
RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
while (packet_type != RTCPUtility::kRtcpNotValidCode) { while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
if (packet_type == RTCPUtility::kRtcpSrCode) { if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) {
// Only compare sent media bytes if SenderPacketCount matches the // Only compare sent media bytes if SenderPacketCount matches the
// number of sent rtp packets (a new rtp packet could be sent before // number of sent rtp packets (a new rtp packet could be sent before
// the rtcp packet). // the rtcp packet).