rtcp_utility.h revision 14b43beb7ce4440b30dcea31196de5b4a529cb6b
1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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. 9 */ 10 11#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ 12#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ 13 14#include <cstddef> // size_t, ptrdiff_t 15 16#include "typedefs.h" 17#include "rtp_rtcp_config.h" 18#include "rtp_rtcp_defines.h" 19 20namespace webrtc { 21namespace RTCPUtility { 22 // CNAME 23 struct RTCPCnameInformation 24 { 25 char name[RTCP_CNAME_SIZE]; 26 }; 27 struct RTCPPacketRR 28 { 29 WebRtc_UWord32 SenderSSRC; 30 WebRtc_UWord8 NumberOfReportBlocks; 31 }; 32 struct RTCPPacketSR 33 { 34 WebRtc_UWord32 SenderSSRC; 35 WebRtc_UWord8 NumberOfReportBlocks; 36 37 // sender info 38 WebRtc_UWord32 NTPMostSignificant; 39 WebRtc_UWord32 NTPLeastSignificant; 40 WebRtc_UWord32 RTPTimestamp; 41 WebRtc_UWord32 SenderPacketCount; 42 WebRtc_UWord32 SenderOctetCount; 43 }; 44 struct RTCPPacketReportBlockItem 45 { 46 // report block 47 WebRtc_UWord32 SSRC; 48 WebRtc_UWord8 FractionLost; 49 WebRtc_UWord32 CumulativeNumOfPacketsLost; 50 WebRtc_UWord32 ExtendedHighestSequenceNumber; 51 WebRtc_UWord32 Jitter; 52 WebRtc_UWord32 LastSR; 53 WebRtc_UWord32 DelayLastSR; 54 }; 55 struct RTCPPacketSDESCName 56 { 57 // RFC3550 58 WebRtc_UWord32 SenderSSRC; 59 char CName[RTCP_CNAME_SIZE]; 60 }; 61 62 struct RTCPPacketExtendedJitterReportItem 63 { 64 // RFC 5450 65 WebRtc_UWord32 Jitter; 66 }; 67 68 struct RTCPPacketBYE 69 { 70 WebRtc_UWord32 SenderSSRC; 71 }; 72 struct RTCPPacketXR 73 { 74 // RFC 3611 75 WebRtc_UWord32 OriginatorSSRC; 76 }; 77 struct RTCPPacketXRVOIPMetricItem 78 { 79 // RFC 3611 4.7 80 WebRtc_UWord32 SSRC; 81 WebRtc_UWord8 lossRate; 82 WebRtc_UWord8 discardRate; 83 WebRtc_UWord8 burstDensity; 84 WebRtc_UWord8 gapDensity; 85 WebRtc_UWord16 burstDuration; 86 WebRtc_UWord16 gapDuration; 87 WebRtc_UWord16 roundTripDelay; 88 WebRtc_UWord16 endSystemDelay; 89 WebRtc_UWord8 signalLevel; 90 WebRtc_UWord8 noiseLevel; 91 WebRtc_UWord8 RERL; 92 WebRtc_UWord8 Gmin; 93 WebRtc_UWord8 Rfactor; 94 WebRtc_UWord8 extRfactor; 95 WebRtc_UWord8 MOSLQ; 96 WebRtc_UWord8 MOSCQ; 97 WebRtc_UWord8 RXconfig; 98 WebRtc_UWord16 JBnominal; 99 WebRtc_UWord16 JBmax; 100 WebRtc_UWord16 JBabsMax; 101 }; 102 103 struct RTCPPacketRTPFBNACK 104 { 105 WebRtc_UWord32 SenderSSRC; 106 WebRtc_UWord32 MediaSSRC; 107 }; 108 struct RTCPPacketRTPFBNACKItem 109 { 110 // RFC4585 111 WebRtc_UWord16 PacketID; 112 WebRtc_UWord16 BitMask; 113 }; 114 115 struct RTCPPacketRTPFBTMMBR 116 { 117 WebRtc_UWord32 SenderSSRC; 118 WebRtc_UWord32 MediaSSRC; // zero! 119 }; 120 struct RTCPPacketRTPFBTMMBRItem 121 { 122 // RFC5104 123 WebRtc_UWord32 SSRC; 124 WebRtc_UWord32 MaxTotalMediaBitRate; // In Kbit/s 125 WebRtc_UWord32 MeasuredOverhead; 126 }; 127 128 struct RTCPPacketRTPFBTMMBN 129 { 130 WebRtc_UWord32 SenderSSRC; 131 WebRtc_UWord32 MediaSSRC; // zero! 132 }; 133 struct RTCPPacketRTPFBTMMBNItem 134 { 135 // RFC5104 136 WebRtc_UWord32 SSRC; // "Owner" 137 WebRtc_UWord32 MaxTotalMediaBitRate; 138 WebRtc_UWord32 MeasuredOverhead; 139 }; 140 141 struct RTCPPacketPSFBFIR 142 { 143 WebRtc_UWord32 SenderSSRC; 144 WebRtc_UWord32 MediaSSRC; // zero! 145 }; 146 struct RTCPPacketPSFBFIRItem 147 { 148 // RFC5104 149 WebRtc_UWord32 SSRC; 150 WebRtc_UWord8 CommandSequenceNumber; 151 }; 152 153 struct RTCPPacketPSFBPLI 154 { 155 // RFC4585 156 WebRtc_UWord32 SenderSSRC; 157 WebRtc_UWord32 MediaSSRC; 158 }; 159 160 struct RTCPPacketPSFBSLI 161 { 162 // RFC4585 163 WebRtc_UWord32 SenderSSRC; 164 WebRtc_UWord32 MediaSSRC; 165 }; 166 struct RTCPPacketPSFBSLIItem 167 { 168 // RFC4585 169 WebRtc_UWord16 FirstMB; 170 WebRtc_UWord16 NumberOfMB; 171 WebRtc_UWord8 PictureId; 172 }; 173 struct RTCPPacketPSFBRPSI 174 { 175 // RFC4585 176 WebRtc_UWord32 SenderSSRC; 177 WebRtc_UWord32 MediaSSRC; 178 WebRtc_UWord8 PayloadType; 179 WebRtc_UWord16 NumberOfValidBits; 180 WebRtc_UWord8 NativeBitString[RTCP_RPSI_DATA_SIZE]; 181 }; 182 struct RTCPPacketPSFBAPP 183 { 184 WebRtc_UWord32 SenderSSRC; 185 WebRtc_UWord32 MediaSSRC; 186 }; 187 struct RTCPPacketPSFBREMBItem 188 { 189 WebRtc_UWord32 BitRate; 190 WebRtc_UWord8 NumberOfSSRCs; 191 WebRtc_UWord32 SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS]; 192 }; 193 // generic name APP 194 struct RTCPPacketAPP 195 { 196 WebRtc_UWord8 SubType; 197 WebRtc_UWord32 Name; 198 WebRtc_UWord8 Data[kRtcpAppCode_DATA_SIZE]; 199 WebRtc_UWord16 Size; 200 }; 201 202 union RTCPPacket 203 { 204 RTCPPacketRR RR; 205 RTCPPacketSR SR; 206 RTCPPacketReportBlockItem ReportBlockItem; 207 208 RTCPPacketSDESCName CName; 209 RTCPPacketBYE BYE; 210 211 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem; 212 213 RTCPPacketRTPFBNACK NACK; 214 RTCPPacketRTPFBNACKItem NACKItem; 215 216 RTCPPacketPSFBPLI PLI; 217 RTCPPacketPSFBSLI SLI; 218 RTCPPacketPSFBSLIItem SLIItem; 219 RTCPPacketPSFBRPSI RPSI; 220 RTCPPacketPSFBAPP PSFBAPP; 221 RTCPPacketPSFBREMBItem REMBItem; 222 223 RTCPPacketRTPFBTMMBR TMMBR; 224 RTCPPacketRTPFBTMMBRItem TMMBRItem; 225 RTCPPacketRTPFBTMMBN TMMBN; 226 RTCPPacketRTPFBTMMBNItem TMMBNItem; 227 RTCPPacketPSFBFIR FIR; 228 RTCPPacketPSFBFIRItem FIRItem; 229 230 RTCPPacketXR XR; 231 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem; 232 233 RTCPPacketAPP APP; 234 }; 235 236 enum RTCPPacketTypes 237 { 238 kRtcpNotValidCode, 239 240 // RFC3550 241 kRtcpRrCode, 242 kRtcpSrCode, 243 kRtcpReportBlockItemCode, 244 245 kRtcpSdesCode, 246 kRtcpSdesChunkCode, 247 kRtcpByeCode, 248 249 // RFC5450 250 kRtcpExtendedIjCode, 251 kRtcpExtendedIjItemCode, 252 253 // RFC4585 254 kRtcpRtpfbNackCode, 255 kRtcpRtpfbNackItemCode, 256 257 kRtcpPsfbPliCode, 258 kRtcpPsfbRpsiCode, 259 kRtcpPsfbSliCode, 260 kRtcpPsfbSliItemCode, 261 kRtcpPsfbAppCode, 262 kRtcpPsfbRembCode, 263 kRtcpPsfbRembItemCode, 264 265 // RFC5104 266 kRtcpRtpfbTmmbrCode, 267 kRtcpRtpfbTmmbrItemCode, 268 kRtcpRtpfbTmmbnCode, 269 kRtcpRtpfbTmmbnItemCode, 270 kRtcpPsfbFirCode, 271 kRtcpPsfbFirItemCode, 272 273 // draft-perkins-avt-rapid-rtp-sync 274 kRtcpRtpfbSrReqCode, 275 276 // RFC 3611 277 kRtcpXrVoipMetricCode, 278 279 kRtcpAppCode, 280 kRtcpAppItemCode, 281 }; 282 283 struct RTCPRawPacket 284 { 285 const WebRtc_UWord8* _ptrPacketBegin; 286 const WebRtc_UWord8* _ptrPacketEnd; 287 }; 288 289 struct RTCPModRawPacket 290 { 291 WebRtc_UWord8* _ptrPacketBegin; 292 WebRtc_UWord8* _ptrPacketEnd; 293 }; 294 295 struct RTCPCommonHeader 296 { 297 WebRtc_UWord8 V; // Version 298 bool P; // Padding 299 WebRtc_UWord8 IC; // Item count/subtype 300 WebRtc_UWord8 PT; // Packet Type 301 WebRtc_UWord16 LengthInOctets; 302 }; 303 304 enum RTCPPT 305 { 306 PT_IJ = 195, 307 PT_SR = 200, 308 PT_RR = 201, 309 PT_SDES = 202, 310 PT_BYE = 203, 311 PT_APP = 204, 312 PT_RTPFB = 205, 313 PT_PSFB = 206, 314 PT_XR = 207 315 }; 316 317 bool RTCPParseCommonHeader( const WebRtc_UWord8* ptrDataBegin, 318 const WebRtc_UWord8* ptrDataEnd, 319 RTCPCommonHeader& parsedHeader); 320 321 class RTCPParserV2 322 { 323 public: 324 RTCPParserV2(const WebRtc_UWord8* rtcpData, 325 size_t rtcpDataLength, 326 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP! 327 ~RTCPParserV2(); 328 329 RTCPPacketTypes PacketType() const; 330 const RTCPPacket& Packet() const; 331 const RTCPRawPacket& RawPacket() const; 332 ptrdiff_t LengthLeft() const; 333 334 bool IsValid() const; 335 336 RTCPPacketTypes Begin(); 337 RTCPPacketTypes Iterate(); 338 339 private: 340 enum ParseState 341 { 342 State_TopLevel, // Top level packet 343 State_ReportBlockItem, // SR/RR report block 344 State_SDESChunk, // SDES chunk 345 State_BYEItem, // BYE item 346 State_ExtendedJitterItem, // Extended jitter report item 347 State_RTPFB_NACKItem, // NACK FCI item 348 State_RTPFB_TMMBRItem, // TMMBR FCI item 349 State_RTPFB_TMMBNItem, // TMMBN FCI item 350 State_PSFB_SLIItem, // SLI FCI item 351 State_PSFB_RPSIItem, // RPSI FCI item 352 State_PSFB_FIRItem, // FIR FCI item 353 State_PSFB_AppItem, // Application specific FCI item 354 State_PSFB_REMBItem, // Application specific REMB item 355 State_XRItem, 356 State_AppItem 357 }; 358 359 private: 360 void IterateTopLevel(); 361 void IterateReportBlockItem(); 362 void IterateSDESChunk(); 363 void IterateBYEItem(); 364 void IterateExtendedJitterItem(); 365 void IterateNACKItem(); 366 void IterateTMMBRItem(); 367 void IterateTMMBNItem(); 368 void IterateSLIItem(); 369 void IterateRPSIItem(); 370 void IterateFIRItem(); 371 void IteratePsfbAppItem(); 372 void IteratePsfbREMBItem(); 373 void IterateAppItem(); 374 375 void Validate(); 376 void EndCurrentBlock(); 377 378 bool ParseRR(); 379 bool ParseSR(); 380 bool ParseReportBlockItem(); 381 382 bool ParseSDES(); 383 bool ParseSDESChunk(); 384 bool ParseSDESItem(); 385 386 bool ParseBYE(); 387 bool ParseBYEItem(); 388 389 bool ParseIJ(); 390 bool ParseIJItem(); 391 392 bool ParseXR(); 393 bool ParseXRItem(); 394 bool ParseXRVOIPMetricItem(); 395 396 bool ParseFBCommon(const RTCPCommonHeader& header); 397 bool ParseNACKItem(); 398 bool ParseTMMBRItem(); 399 bool ParseTMMBNItem(); 400 bool ParseSLIItem(); 401 bool ParseRPSIItem(); 402 bool ParseFIRItem(); 403 bool ParsePsfbAppItem(); 404 bool ParsePsfbREMBItem(); 405 406 bool ParseAPP(const RTCPCommonHeader& header); 407 bool ParseAPPItem(); 408 409 private: 410 const WebRtc_UWord8* const _ptrRTCPDataBegin; 411 const bool _RTCPReducedSizeEnable; 412 const WebRtc_UWord8* const _ptrRTCPDataEnd; 413 414 bool _validPacket; 415 const WebRtc_UWord8* _ptrRTCPData; 416 const WebRtc_UWord8* _ptrRTCPBlockEnd; 417 418 ParseState _state; 419 WebRtc_UWord8 _numberOfBlocks; 420 421 RTCPPacketTypes _packetType; 422 RTCPPacket _packet; 423 }; 424 425 class RTCPPacketIterator 426 { 427 public: 428 RTCPPacketIterator(WebRtc_UWord8* rtcpData, 429 size_t rtcpDataLength); 430 ~RTCPPacketIterator(); 431 432 const RTCPCommonHeader* Begin(); 433 const RTCPCommonHeader* Iterate(); 434 const RTCPCommonHeader* Current(); 435 436 private: 437 WebRtc_UWord8* const _ptrBegin; 438 WebRtc_UWord8* const _ptrEnd; 439 440 WebRtc_UWord8* _ptrBlock; 441 442 RTCPCommonHeader _header; 443 }; 444} // RTCPUtility 445} // namespace webrtc 446#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ 447