| OLD | NEW |
| (Empty) |
| 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 <stddef.h> // size_t, ptrdiff_t | |
| 15 | |
| 16 #include <memory> | |
| 17 | |
| 18 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | |
| 19 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" | |
| 20 #include "webrtc/typedefs.h" | |
| 21 | |
| 22 namespace webrtc { | |
| 23 namespace rtcp { | |
| 24 class RtcpPacket; | |
| 25 } | |
| 26 namespace RTCPUtility { | |
| 27 | |
| 28 class NackStats { | |
| 29 public: | |
| 30 NackStats(); | |
| 31 ~NackStats(); | |
| 32 | |
| 33 // Updates stats with requested sequence number. | |
| 34 // This function should be called for each NACK request to calculate the | |
| 35 // number of unique NACKed RTP packets. | |
| 36 void ReportRequest(uint16_t sequence_number); | |
| 37 | |
| 38 // Gets the number of NACKed RTP packets. | |
| 39 uint32_t requests() const { return requests_; } | |
| 40 | |
| 41 // Gets the number of unique NACKed RTP packets. | |
| 42 uint32_t unique_requests() const { return unique_requests_; } | |
| 43 | |
| 44 private: | |
| 45 uint16_t max_sequence_number_; | |
| 46 uint32_t requests_; | |
| 47 uint32_t unique_requests_; | |
| 48 }; | |
| 49 | |
| 50 uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac); | |
| 51 | |
| 52 struct RTCPPacketRR { | |
| 53 uint32_t SenderSSRC; | |
| 54 uint8_t NumberOfReportBlocks; | |
| 55 }; | |
| 56 struct RTCPPacketSR { | |
| 57 uint32_t SenderSSRC; | |
| 58 uint8_t NumberOfReportBlocks; | |
| 59 | |
| 60 // sender info | |
| 61 uint32_t NTPMostSignificant; | |
| 62 uint32_t NTPLeastSignificant; | |
| 63 uint32_t RTPTimestamp; | |
| 64 uint32_t SenderPacketCount; | |
| 65 uint32_t SenderOctetCount; | |
| 66 }; | |
| 67 struct RTCPPacketReportBlockItem { | |
| 68 // report block | |
| 69 uint32_t SSRC; | |
| 70 uint8_t FractionLost; | |
| 71 uint32_t CumulativeNumOfPacketsLost; | |
| 72 uint32_t ExtendedHighestSequenceNumber; | |
| 73 uint32_t Jitter; | |
| 74 uint32_t LastSR; | |
| 75 uint32_t DelayLastSR; | |
| 76 }; | |
| 77 struct RTCPPacketSDESCName { | |
| 78 // RFC3550 | |
| 79 uint32_t SenderSSRC; | |
| 80 char CName[RTCP_CNAME_SIZE]; | |
| 81 }; | |
| 82 | |
| 83 struct RTCPPacketExtendedJitterReportItem { | |
| 84 // RFC 5450 | |
| 85 uint32_t Jitter; | |
| 86 }; | |
| 87 | |
| 88 struct RTCPPacketBYE { | |
| 89 uint32_t SenderSSRC; | |
| 90 }; | |
| 91 struct RTCPPacketXR { | |
| 92 // RFC 3611 | |
| 93 uint32_t OriginatorSSRC; | |
| 94 }; | |
| 95 struct RTCPPacketXRReceiverReferenceTimeItem { | |
| 96 // RFC 3611 4.4 | |
| 97 uint32_t NTPMostSignificant; | |
| 98 uint32_t NTPLeastSignificant; | |
| 99 }; | |
| 100 struct RTCPPacketXRDLRRReportBlockItem { | |
| 101 // RFC 3611 4.5 | |
| 102 uint32_t SSRC; | |
| 103 uint32_t LastRR; | |
| 104 uint32_t DelayLastRR; | |
| 105 }; | |
| 106 struct RTCPPacketXRVOIPMetricItem { | |
| 107 // RFC 3611 4.7 | |
| 108 uint32_t SSRC; | |
| 109 uint8_t lossRate; | |
| 110 uint8_t discardRate; | |
| 111 uint8_t burstDensity; | |
| 112 uint8_t gapDensity; | |
| 113 uint16_t burstDuration; | |
| 114 uint16_t gapDuration; | |
| 115 uint16_t roundTripDelay; | |
| 116 uint16_t endSystemDelay; | |
| 117 uint8_t signalLevel; | |
| 118 uint8_t noiseLevel; | |
| 119 uint8_t RERL; | |
| 120 uint8_t Gmin; | |
| 121 uint8_t Rfactor; | |
| 122 uint8_t extRfactor; | |
| 123 uint8_t MOSLQ; | |
| 124 uint8_t MOSCQ; | |
| 125 uint8_t RXconfig; | |
| 126 uint16_t JBnominal; | |
| 127 uint16_t JBmax; | |
| 128 uint16_t JBabsMax; | |
| 129 }; | |
| 130 | |
| 131 struct RTCPPacketRTPFBNACK { | |
| 132 uint32_t SenderSSRC; | |
| 133 uint32_t MediaSSRC; | |
| 134 }; | |
| 135 struct RTCPPacketRTPFBNACKItem { | |
| 136 // RFC4585 | |
| 137 uint16_t PacketID; | |
| 138 uint16_t BitMask; | |
| 139 }; | |
| 140 | |
| 141 struct RTCPPacketRTPFBTMMBR { | |
| 142 uint32_t SenderSSRC; | |
| 143 uint32_t MediaSSRC; // zero! | |
| 144 }; | |
| 145 struct RTCPPacketRTPFBTMMBRItem { | |
| 146 // RFC5104 | |
| 147 uint32_t SSRC; | |
| 148 uint32_t MaxTotalMediaBitRate; // In Kbit/s | |
| 149 uint32_t MeasuredOverhead; | |
| 150 }; | |
| 151 | |
| 152 struct RTCPPacketRTPFBTMMBN { | |
| 153 uint32_t SenderSSRC; | |
| 154 uint32_t MediaSSRC; // zero! | |
| 155 }; | |
| 156 struct RTCPPacketRTPFBTMMBNItem { | |
| 157 // RFC5104 | |
| 158 uint32_t SSRC; // "Owner" | |
| 159 uint32_t MaxTotalMediaBitRate; | |
| 160 uint32_t MeasuredOverhead; | |
| 161 }; | |
| 162 | |
| 163 struct RTCPPacketPSFBFIR { | |
| 164 uint32_t SenderSSRC; | |
| 165 uint32_t MediaSSRC; // zero! | |
| 166 }; | |
| 167 struct RTCPPacketPSFBFIRItem { | |
| 168 // RFC5104 | |
| 169 uint32_t SSRC; | |
| 170 uint8_t CommandSequenceNumber; | |
| 171 }; | |
| 172 | |
| 173 struct RTCPPacketPSFBPLI { | |
| 174 // RFC4585 | |
| 175 uint32_t SenderSSRC; | |
| 176 uint32_t MediaSSRC; | |
| 177 }; | |
| 178 | |
| 179 struct RTCPPacketPSFBSLI { | |
| 180 // RFC4585 | |
| 181 uint32_t SenderSSRC; | |
| 182 uint32_t MediaSSRC; | |
| 183 }; | |
| 184 struct RTCPPacketPSFBSLIItem { | |
| 185 // RFC4585 | |
| 186 uint16_t FirstMB; | |
| 187 uint16_t NumberOfMB; | |
| 188 uint8_t PictureId; | |
| 189 }; | |
| 190 struct RTCPPacketPSFBRPSI { | |
| 191 // RFC4585 | |
| 192 uint32_t SenderSSRC; | |
| 193 uint32_t MediaSSRC; | |
| 194 uint8_t PayloadType; | |
| 195 uint16_t NumberOfValidBits; | |
| 196 uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE]; | |
| 197 }; | |
| 198 struct RTCPPacketPSFBAPP { | |
| 199 uint32_t SenderSSRC; | |
| 200 uint32_t MediaSSRC; | |
| 201 }; | |
| 202 struct RTCPPacketPSFBREMBItem { | |
| 203 uint32_t BitRate; | |
| 204 uint8_t NumberOfSSRCs; | |
| 205 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS]; | |
| 206 }; | |
| 207 // generic name APP | |
| 208 struct RTCPPacketAPP { | |
| 209 uint8_t SubType; | |
| 210 uint32_t Name; | |
| 211 uint8_t Data[kRtcpAppCode_DATA_SIZE]; | |
| 212 uint16_t Size; | |
| 213 }; | |
| 214 | |
| 215 union RTCPPacket { | |
| 216 RTCPPacketRR RR; | |
| 217 RTCPPacketSR SR; | |
| 218 RTCPPacketReportBlockItem ReportBlockItem; | |
| 219 | |
| 220 RTCPPacketSDESCName CName; | |
| 221 RTCPPacketBYE BYE; | |
| 222 | |
| 223 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem; | |
| 224 | |
| 225 RTCPPacketRTPFBNACK NACK; | |
| 226 RTCPPacketRTPFBNACKItem NACKItem; | |
| 227 | |
| 228 RTCPPacketPSFBPLI PLI; | |
| 229 RTCPPacketPSFBSLI SLI; | |
| 230 RTCPPacketPSFBSLIItem SLIItem; | |
| 231 RTCPPacketPSFBRPSI RPSI; | |
| 232 RTCPPacketPSFBAPP PSFBAPP; | |
| 233 RTCPPacketPSFBREMBItem REMBItem; | |
| 234 | |
| 235 RTCPPacketRTPFBTMMBR TMMBR; | |
| 236 RTCPPacketRTPFBTMMBRItem TMMBRItem; | |
| 237 RTCPPacketRTPFBTMMBN TMMBN; | |
| 238 RTCPPacketRTPFBTMMBNItem TMMBNItem; | |
| 239 RTCPPacketPSFBFIR FIR; | |
| 240 RTCPPacketPSFBFIRItem FIRItem; | |
| 241 | |
| 242 RTCPPacketXR XR; | |
| 243 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem; | |
| 244 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem; | |
| 245 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem; | |
| 246 | |
| 247 RTCPPacketAPP APP; | |
| 248 }; | |
| 249 | |
| 250 enum class RTCPPacketTypes { | |
| 251 kInvalid, | |
| 252 | |
| 253 // RFC3550 | |
| 254 kRr, | |
| 255 kSr, | |
| 256 kReportBlockItem, | |
| 257 | |
| 258 kSdes, | |
| 259 kSdesChunk, | |
| 260 kBye, | |
| 261 | |
| 262 // RFC5450 | |
| 263 kExtendedIj, | |
| 264 kExtendedIjItem, | |
| 265 | |
| 266 // RFC4585 | |
| 267 kRtpfbNack, | |
| 268 kRtpfbNackItem, | |
| 269 | |
| 270 kPsfbPli, | |
| 271 kPsfbRpsi, | |
| 272 kPsfbRpsiItem, | |
| 273 kPsfbSli, | |
| 274 kPsfbSliItem, | |
| 275 kPsfbApp, | |
| 276 kPsfbRemb, | |
| 277 kPsfbRembItem, | |
| 278 | |
| 279 // RFC5104 | |
| 280 kRtpfbTmmbr, | |
| 281 kRtpfbTmmbrItem, | |
| 282 kRtpfbTmmbn, | |
| 283 kRtpfbTmmbnItem, | |
| 284 kPsfbFir, | |
| 285 kPsfbFirItem, | |
| 286 | |
| 287 // draft-perkins-avt-rapid-rtp-sync | |
| 288 kRtpfbSrReq, | |
| 289 | |
| 290 // RFC 3611 | |
| 291 kXrHeader, | |
| 292 kXrReceiverReferenceTime, | |
| 293 kXrDlrrReportBlock, | |
| 294 kXrDlrrReportBlockItem, | |
| 295 kXrVoipMetric, | |
| 296 | |
| 297 kApp, | |
| 298 kAppItem, | |
| 299 | |
| 300 // draft-holmer-rmcat-transport-wide-cc-extensions | |
| 301 kTransportFeedback, | |
| 302 }; | |
| 303 | |
| 304 struct RTCPRawPacket { | |
| 305 const uint8_t* _ptrPacketBegin; | |
| 306 const uint8_t* _ptrPacketEnd; | |
| 307 }; | |
| 308 | |
| 309 struct RTCPModRawPacket { | |
| 310 uint8_t* _ptrPacketBegin; | |
| 311 uint8_t* _ptrPacketEnd; | |
| 312 }; | |
| 313 | |
| 314 struct RtcpCommonHeader { | |
| 315 static const uint8_t kHeaderSizeBytes = 4; | |
| 316 RtcpCommonHeader() | |
| 317 : version(2), | |
| 318 count_or_format(0), | |
| 319 packet_type(0), | |
| 320 payload_size_bytes(0), | |
| 321 padding_bytes(0) {} | |
| 322 | |
| 323 uint32_t BlockSize() const { | |
| 324 return kHeaderSizeBytes + payload_size_bytes + padding_bytes; | |
| 325 } | |
| 326 | |
| 327 uint8_t version; | |
| 328 uint8_t count_or_format; | |
| 329 uint8_t packet_type; | |
| 330 uint32_t payload_size_bytes; | |
| 331 uint8_t padding_bytes; | |
| 332 }; | |
| 333 | |
| 334 enum RTCPPT : uint8_t { | |
| 335 PT_IJ = 195, | |
| 336 PT_SR = 200, | |
| 337 PT_RR = 201, | |
| 338 PT_SDES = 202, | |
| 339 PT_BYE = 203, | |
| 340 PT_APP = 204, | |
| 341 PT_RTPFB = 205, | |
| 342 PT_PSFB = 206, | |
| 343 PT_XR = 207 | |
| 344 }; | |
| 345 | |
| 346 // Extended report blocks, RFC 3611. | |
| 347 enum RtcpXrBlockType : uint8_t { | |
| 348 kBtReceiverReferenceTime = 4, | |
| 349 kBtDlrr = 5, | |
| 350 kBtVoipMetric = 7 | |
| 351 }; | |
| 352 | |
| 353 bool RtcpParseCommonHeader(const uint8_t* buffer, | |
| 354 size_t size_bytes, | |
| 355 RtcpCommonHeader* parsed_header); | |
| 356 | |
| 357 class RTCPParserV2 { | |
| 358 public: | |
| 359 RTCPParserV2( | |
| 360 const uint8_t* rtcpData, | |
| 361 size_t rtcpDataLength, | |
| 362 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP! | |
| 363 ~RTCPParserV2(); | |
| 364 | |
| 365 RTCPPacketTypes PacketType() const; | |
| 366 const RTCPPacket& Packet() const; | |
| 367 rtcp::RtcpPacket* ReleaseRtcpPacket(); | |
| 368 const RTCPRawPacket& RawPacket() const; | |
| 369 ptrdiff_t LengthLeft() const; | |
| 370 | |
| 371 bool IsValid() const; | |
| 372 size_t NumSkippedBlocks() const; | |
| 373 | |
| 374 RTCPPacketTypes Begin(); | |
| 375 RTCPPacketTypes Iterate(); | |
| 376 | |
| 377 private: | |
| 378 enum class ParseState { | |
| 379 State_TopLevel, // Top level packet | |
| 380 State_ReportBlockItem, // SR/RR report block | |
| 381 State_SDESChunk, // SDES chunk | |
| 382 State_BYEItem, // BYE item | |
| 383 State_ExtendedJitterItem, // Extended jitter report item | |
| 384 State_RTPFB_NACKItem, // NACK FCI item | |
| 385 State_RTPFB_TMMBRItem, // TMMBR FCI item | |
| 386 State_RTPFB_TMMBNItem, // TMMBN FCI item | |
| 387 State_PSFB_SLIItem, // SLI FCI item | |
| 388 State_PSFB_RPSIItem, // RPSI FCI item | |
| 389 State_PSFB_FIRItem, // FIR FCI item | |
| 390 State_PSFB_AppItem, // Application specific FCI item | |
| 391 State_PSFB_REMBItem, // Application specific REMB item | |
| 392 State_XRItem, | |
| 393 State_XR_DLLRItem, | |
| 394 State_AppItem | |
| 395 }; | |
| 396 | |
| 397 private: | |
| 398 void IterateTopLevel(); | |
| 399 void IterateReportBlockItem(); | |
| 400 void IterateSDESChunk(); | |
| 401 void IterateBYEItem(); | |
| 402 void IterateExtendedJitterItem(); | |
| 403 void IterateNACKItem(); | |
| 404 void IterateTMMBRItem(); | |
| 405 void IterateTMMBNItem(); | |
| 406 void IterateSLIItem(); | |
| 407 void IterateRPSIItem(); | |
| 408 void IterateFIRItem(); | |
| 409 void IteratePsfbAppItem(); | |
| 410 void IteratePsfbREMBItem(); | |
| 411 void IterateAppItem(); | |
| 412 void IterateXrItem(); | |
| 413 void IterateXrDlrrItem(); | |
| 414 | |
| 415 void Validate(); | |
| 416 void EndCurrentBlock(); | |
| 417 | |
| 418 bool ParseRR(); | |
| 419 bool ParseSR(); | |
| 420 bool ParseReportBlockItem(); | |
| 421 | |
| 422 bool ParseSDES(); | |
| 423 bool ParseSDESChunk(); | |
| 424 bool ParseSDESItem(); | |
| 425 | |
| 426 bool ParseBYE(); | |
| 427 bool ParseBYEItem(); | |
| 428 | |
| 429 bool ParseIJ(); | |
| 430 bool ParseIJItem(); | |
| 431 | |
| 432 bool ParseXr(); | |
| 433 bool ParseXrItem(); | |
| 434 bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes); | |
| 435 bool ParseXrDlrr(int block_length_4bytes); | |
| 436 bool ParseXrDlrrItem(); | |
| 437 bool ParseXrVoipMetricItem(int block_length_4bytes); | |
| 438 bool ParseXrUnsupportedBlockType(int block_length_4bytes); | |
| 439 | |
| 440 bool ParseFBCommon(const RtcpCommonHeader& header); | |
| 441 bool ParseNACKItem(); | |
| 442 bool ParseTMMBRItem(); | |
| 443 bool ParseTMMBNItem(); | |
| 444 bool ParseSLIItem(); | |
| 445 bool ParseRPSIItem(); | |
| 446 bool ParseFIRItem(); | |
| 447 bool ParsePsfbAppItem(); | |
| 448 bool ParsePsfbREMBItem(); | |
| 449 | |
| 450 bool ParseAPP(const RtcpCommonHeader& header); | |
| 451 bool ParseAPPItem(); | |
| 452 | |
| 453 private: | |
| 454 const uint8_t* const _ptrRTCPDataBegin; | |
| 455 const bool _RTCPReducedSizeEnable; | |
| 456 const uint8_t* const _ptrRTCPDataEnd; | |
| 457 | |
| 458 bool _validPacket; | |
| 459 const uint8_t* _ptrRTCPData; | |
| 460 const uint8_t* _ptrRTCPBlockEnd; | |
| 461 | |
| 462 ParseState _state; | |
| 463 uint8_t _numberOfBlocks; | |
| 464 size_t num_skipped_blocks_; | |
| 465 | |
| 466 RTCPPacketTypes _packetType; | |
| 467 RTCPPacket _packet; | |
| 468 std::unique_ptr<webrtc::rtcp::RtcpPacket> rtcp_packet_; | |
| 469 }; | |
| 470 | |
| 471 class RTCPPacketIterator { | |
| 472 public: | |
| 473 RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength); | |
| 474 ~RTCPPacketIterator(); | |
| 475 | |
| 476 const RtcpCommonHeader* Begin(); | |
| 477 const RtcpCommonHeader* Iterate(); | |
| 478 const RtcpCommonHeader* Current(); | |
| 479 | |
| 480 private: | |
| 481 uint8_t* const _ptrBegin; | |
| 482 uint8_t* const _ptrEnd; | |
| 483 | |
| 484 uint8_t* _ptrBlock; | |
| 485 | |
| 486 RtcpCommonHeader _header; | |
| 487 }; | |
| 488 } // namespace RTCPUtility | |
| 489 } // namespace webrtc | |
| 490 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_ | |
| OLD | NEW |