2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
14 #include <stddef.h> // size_t, ptrdiff_t
16 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
18 #include "webrtc/typedefs.h"
21 namespace RTCPUtility {
22 uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
25 struct RTCPCnameInformation
27 char name[RTCP_CNAME_SIZE];
32 uint8_t NumberOfReportBlocks;
37 uint8_t NumberOfReportBlocks;
40 uint32_t NTPMostSignificant;
41 uint32_t NTPLeastSignificant;
42 uint32_t RTPTimestamp;
43 uint32_t SenderPacketCount;
44 uint32_t SenderOctetCount;
46 struct RTCPPacketReportBlockItem
51 uint32_t CumulativeNumOfPacketsLost;
52 uint32_t ExtendedHighestSequenceNumber;
57 struct RTCPPacketSDESCName
61 char CName[RTCP_CNAME_SIZE];
64 struct RTCPPacketExtendedJitterReportItem
77 uint32_t OriginatorSSRC;
79 struct RTCPPacketXRReceiverReferenceTimeItem
82 uint32_t NTPMostSignificant;
83 uint32_t NTPLeastSignificant;
85 struct RTCPPacketXRDLRRReportBlockItem
92 struct RTCPPacketXRVOIPMetricItem
100 uint16_t burstDuration;
101 uint16_t gapDuration;
102 uint16_t roundTripDelay;
103 uint16_t endSystemDelay;
118 struct RTCPPacketRTPFBNACK
123 struct RTCPPacketRTPFBNACKItem
130 struct RTCPPacketRTPFBTMMBR
133 uint32_t MediaSSRC; // zero!
135 struct RTCPPacketRTPFBTMMBRItem
139 uint32_t MaxTotalMediaBitRate; // In Kbit/s
140 uint32_t MeasuredOverhead;
143 struct RTCPPacketRTPFBTMMBN
146 uint32_t MediaSSRC; // zero!
148 struct RTCPPacketRTPFBTMMBNItem
151 uint32_t SSRC; // "Owner"
152 uint32_t MaxTotalMediaBitRate;
153 uint32_t MeasuredOverhead;
156 struct RTCPPacketPSFBFIR
159 uint32_t MediaSSRC; // zero!
161 struct RTCPPacketPSFBFIRItem
165 uint8_t CommandSequenceNumber;
168 struct RTCPPacketPSFBPLI
175 struct RTCPPacketPSFBSLI
181 struct RTCPPacketPSFBSLIItem
188 struct RTCPPacketPSFBRPSI
194 uint16_t NumberOfValidBits;
195 uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
197 struct RTCPPacketPSFBAPP
202 struct RTCPPacketPSFBREMBItem
205 uint8_t NumberOfSSRCs;
206 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
213 uint8_t Data[kRtcpAppCode_DATA_SIZE];
221 RTCPPacketReportBlockItem ReportBlockItem;
223 RTCPPacketSDESCName CName;
226 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
228 RTCPPacketRTPFBNACK NACK;
229 RTCPPacketRTPFBNACKItem NACKItem;
231 RTCPPacketPSFBPLI PLI;
232 RTCPPacketPSFBSLI SLI;
233 RTCPPacketPSFBSLIItem SLIItem;
234 RTCPPacketPSFBRPSI RPSI;
235 RTCPPacketPSFBAPP PSFBAPP;
236 RTCPPacketPSFBREMBItem REMBItem;
238 RTCPPacketRTPFBTMMBR TMMBR;
239 RTCPPacketRTPFBTMMBRItem TMMBRItem;
240 RTCPPacketRTPFBTMMBN TMMBN;
241 RTCPPacketRTPFBTMMBNItem TMMBNItem;
242 RTCPPacketPSFBFIR FIR;
243 RTCPPacketPSFBFIRItem FIRItem;
246 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
247 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
248 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
260 kRtcpReportBlockItemCode,
268 kRtcpExtendedIjItemCode,
272 kRtcpRtpfbNackItemCode,
277 kRtcpPsfbSliItemCode,
280 kRtcpPsfbRembItemCode,
284 kRtcpRtpfbTmmbrItemCode,
286 kRtcpRtpfbTmmbnItemCode,
288 kRtcpPsfbFirItemCode,
290 // draft-perkins-avt-rapid-rtp-sync
295 kRtcpXrReceiverReferenceTimeCode,
296 kRtcpXrDlrrReportBlockCode,
297 kRtcpXrDlrrReportBlockItemCode,
298 kRtcpXrVoipMetricCode,
306 const uint8_t* _ptrPacketBegin;
307 const uint8_t* _ptrPacketEnd;
310 struct RTCPModRawPacket
312 uint8_t* _ptrPacketBegin;
313 uint8_t* _ptrPacketEnd;
316 struct RTCPCommonHeader
318 uint8_t V; // Version
320 uint8_t IC; // Item count/subtype
321 uint8_t PT; // Packet Type
322 uint16_t LengthInOctets;
338 // Extended report blocks, RFC 3611.
339 enum RtcpXrBlockType {
340 kBtReceiverReferenceTime = 4,
345 bool RTCPParseCommonHeader( const uint8_t* ptrDataBegin,
346 const uint8_t* ptrDataEnd,
347 RTCPCommonHeader& parsedHeader);
352 RTCPParserV2(const uint8_t* rtcpData,
353 size_t rtcpDataLength,
354 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
357 RTCPPacketTypes PacketType() const;
358 const RTCPPacket& Packet() const;
359 const RTCPRawPacket& RawPacket() const;
360 ptrdiff_t LengthLeft() const;
362 bool IsValid() const;
364 RTCPPacketTypes Begin();
365 RTCPPacketTypes Iterate();
370 State_TopLevel, // Top level packet
371 State_ReportBlockItem, // SR/RR report block
372 State_SDESChunk, // SDES chunk
373 State_BYEItem, // BYE item
374 State_ExtendedJitterItem, // Extended jitter report item
375 State_RTPFB_NACKItem, // NACK FCI item
376 State_RTPFB_TMMBRItem, // TMMBR FCI item
377 State_RTPFB_TMMBNItem, // TMMBN FCI item
378 State_PSFB_SLIItem, // SLI FCI item
379 State_PSFB_RPSIItem, // RPSI FCI item
380 State_PSFB_FIRItem, // FIR FCI item
381 State_PSFB_AppItem, // Application specific FCI item
382 State_PSFB_REMBItem, // Application specific REMB item
389 void IterateTopLevel();
390 void IterateReportBlockItem();
391 void IterateSDESChunk();
392 void IterateBYEItem();
393 void IterateExtendedJitterItem();
394 void IterateNACKItem();
395 void IterateTMMBRItem();
396 void IterateTMMBNItem();
397 void IterateSLIItem();
398 void IterateRPSIItem();
399 void IterateFIRItem();
400 void IteratePsfbAppItem();
401 void IteratePsfbREMBItem();
402 void IterateAppItem();
403 void IterateXrItem();
404 void IterateXrDlrrItem();
407 void EndCurrentBlock();
411 bool ParseReportBlockItem();
414 bool ParseSDESChunk();
415 bool ParseSDESItem();
425 bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
426 bool ParseXrDlrr(int block_length_4bytes);
427 bool ParseXrDlrrItem();
428 bool ParseXrVoipMetricItem(int block_length_4bytes);
429 bool ParseXrUnsupportedBlockType(int block_length_4bytes);
431 bool ParseFBCommon(const RTCPCommonHeader& header);
432 bool ParseNACKItem();
433 bool ParseTMMBRItem();
434 bool ParseTMMBNItem();
436 bool ParseRPSIItem();
438 bool ParsePsfbAppItem();
439 bool ParsePsfbREMBItem();
441 bool ParseAPP(const RTCPCommonHeader& header);
445 const uint8_t* const _ptrRTCPDataBegin;
446 const bool _RTCPReducedSizeEnable;
447 const uint8_t* const _ptrRTCPDataEnd;
450 const uint8_t* _ptrRTCPData;
451 const uint8_t* _ptrRTCPBlockEnd;
454 uint8_t _numberOfBlocks;
456 RTCPPacketTypes _packetType;
460 class RTCPPacketIterator
463 RTCPPacketIterator(uint8_t* rtcpData,
464 size_t rtcpDataLength);
465 ~RTCPPacketIterator();
467 const RTCPCommonHeader* Begin();
468 const RTCPCommonHeader* Iterate();
469 const RTCPCommonHeader* Current();
472 uint8_t* const _ptrBegin;
473 uint8_t* const _ptrEnd;
477 RTCPCommonHeader _header;
480 } // namespace webrtc
481 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_