1 /* 2 * Copyright (c) 2014 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 12 #ifndef WEBRTC_TEST_RTCP_PACKET_PARSER_H_ 13 #define WEBRTC_TEST_RTCP_PACKET_PARSER_H_ 14 15 #include <map> 16 #include <string> 17 #include <vector> 18 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 20 #include "webrtc/typedefs.h" 21 22 namespace webrtc { 23 namespace test { 24 25 class RtcpPacketParser; 26 27 class PacketType { 28 public: 29 virtual ~PacketType() {} 30 31 int num_packets() const { return num_packets_; } 32 33 protected: 34 PacketType() : num_packets_(0) {} 35 36 int num_packets_; 37 }; 38 39 class SenderReport : public PacketType { 40 public: 41 SenderReport() {} 42 virtual ~SenderReport() {} 43 44 uint32_t Ssrc() const { return sr_.SenderSSRC; } 45 uint32_t NtpSec() const { return sr_.NTPMostSignificant; } 46 uint32_t NtpFrac() const { return sr_.NTPLeastSignificant; } 47 uint32_t RtpTimestamp() const { return sr_.RTPTimestamp; } 48 uint32_t PacketCount() const { return sr_.SenderPacketCount; } 49 uint32_t OctetCount() const { return sr_.SenderOctetCount; } 50 51 private: 52 friend class RtcpPacketParser; 53 54 void Set(const RTCPUtility::RTCPPacketSR& sr) { 55 sr_ = sr; 56 ++num_packets_; 57 } 58 59 RTCPUtility::RTCPPacketSR sr_; 60 }; 61 62 class ReceiverReport : public PacketType { 63 public: 64 ReceiverReport() {} 65 virtual ~ReceiverReport() {} 66 67 uint32_t Ssrc() const { return rr_.SenderSSRC; } 68 69 private: 70 friend class RtcpPacketParser; 71 72 void Set(const RTCPUtility::RTCPPacketRR& rr) { 73 rr_ = rr; 74 ++num_packets_; 75 } 76 77 RTCPUtility::RTCPPacketRR rr_; 78 }; 79 80 class ReportBlock : public PacketType { 81 public: 82 ReportBlock() {} 83 virtual ~ReportBlock() {} 84 85 uint32_t Ssrc() const { return rb_.SSRC; } 86 uint8_t FractionLost() const { return rb_.FractionLost; } 87 uint32_t CumPacketLost() const { return rb_.CumulativeNumOfPacketsLost; } 88 uint32_t ExtHighestSeqNum() const { return rb_.ExtendedHighestSequenceNumber;} 89 uint32_t Jitter() const { return rb_.Jitter; } 90 uint32_t LastSr() const { return rb_.LastSR; } 91 uint32_t DelayLastSr()const { return rb_.DelayLastSR; } 92 93 private: 94 friend class RtcpPacketParser; 95 96 void Set(const RTCPUtility::RTCPPacketReportBlockItem& rb) { 97 rb_ = rb; 98 ++num_packets_; 99 } 100 101 RTCPUtility::RTCPPacketReportBlockItem rb_; 102 }; 103 104 class Ij : public PacketType { 105 public: 106 Ij() {} 107 virtual ~Ij() {} 108 109 private: 110 friend class RtcpPacketParser; 111 112 void Set() { ++num_packets_; } 113 }; 114 115 class IjItem : public PacketType { 116 public: 117 IjItem() {} 118 virtual ~IjItem() {} 119 120 uint32_t Jitter() const { return ij_item_.Jitter; } 121 122 private: 123 friend class RtcpPacketParser; 124 125 void Set(const RTCPUtility::RTCPPacketExtendedJitterReportItem& ij_item) { 126 ij_item_ = ij_item; 127 ++num_packets_; 128 } 129 130 RTCPUtility::RTCPPacketExtendedJitterReportItem ij_item_; 131 }; 132 133 class Sdes : public PacketType { 134 public: 135 Sdes() {} 136 virtual ~Sdes() {} 137 138 private: 139 friend class RtcpPacketParser; 140 141 void Set() { ++num_packets_; } 142 }; 143 144 class SdesChunk : public PacketType { 145 public: 146 SdesChunk() {} 147 virtual ~SdesChunk() {} 148 149 uint32_t Ssrc() const { return cname_.SenderSSRC; } 150 std::string Cname() const { return cname_.CName; } 151 152 private: 153 friend class RtcpPacketParser; 154 155 void Set(const RTCPUtility::RTCPPacketSDESCName& cname) { 156 cname_ = cname; 157 ++num_packets_; 158 } 159 160 RTCPUtility::RTCPPacketSDESCName cname_; 161 }; 162 163 class Bye : public PacketType { 164 public: 165 Bye() {} 166 virtual ~Bye() {} 167 168 uint32_t Ssrc() const { return bye_.SenderSSRC; } 169 170 private: 171 friend class RtcpPacketParser; 172 173 void Set(const RTCPUtility::RTCPPacketBYE& bye) { 174 bye_ = bye; 175 ++num_packets_; 176 } 177 178 RTCPUtility::RTCPPacketBYE bye_; 179 }; 180 181 class Rpsi : public PacketType { 182 public: 183 Rpsi() {} 184 virtual ~Rpsi() {} 185 186 uint32_t Ssrc() const { return rpsi_.SenderSSRC; } 187 uint32_t MediaSsrc() const { return rpsi_.MediaSSRC; } 188 uint8_t PayloadType() const { return rpsi_.PayloadType; } 189 uint16_t NumberOfValidBits() const { return rpsi_.NumberOfValidBits; } 190 uint64_t PictureId() const; 191 192 private: 193 friend class RtcpPacketParser; 194 195 void Set(const RTCPUtility::RTCPPacketPSFBRPSI& rpsi) { 196 rpsi_ = rpsi; 197 ++num_packets_; 198 } 199 200 RTCPUtility::RTCPPacketPSFBRPSI rpsi_; 201 }; 202 203 class App : public PacketType { 204 public: 205 App() {} 206 virtual ~App() {} 207 208 uint8_t SubType() const { return app_.SubType; } 209 uint32_t Name() const { return app_.Name; } 210 211 private: 212 friend class RtcpPacketParser; 213 214 void Set(const RTCPUtility::RTCPPacketAPP& app) { 215 app_ = app; 216 ++num_packets_; 217 } 218 219 RTCPUtility::RTCPPacketAPP app_; 220 }; 221 222 class AppItem : public PacketType { 223 public: 224 AppItem() {} 225 virtual ~AppItem() {} 226 227 uint8_t* Data() { return app_item_.Data; } 228 uint16_t DataLength() const { return app_item_.Size; } 229 230 private: 231 friend class RtcpPacketParser; 232 233 void Set(const RTCPUtility::RTCPPacketAPP& app) { 234 app_item_ = app; 235 ++num_packets_; 236 } 237 238 RTCPUtility::RTCPPacketAPP app_item_; 239 }; 240 241 class Pli : public PacketType { 242 public: 243 Pli() {} 244 virtual ~Pli() {} 245 246 uint32_t Ssrc() const { return pli_.SenderSSRC; } 247 uint32_t MediaSsrc() const { return pli_.MediaSSRC; } 248 249 private: 250 friend class RtcpPacketParser; 251 252 void Set(const RTCPUtility::RTCPPacketPSFBPLI& pli) { 253 pli_ = pli; 254 ++num_packets_; 255 } 256 257 RTCPUtility::RTCPPacketPSFBPLI pli_; 258 }; 259 260 class Sli : public PacketType { 261 public: 262 Sli() {} 263 virtual ~Sli() {} 264 265 uint32_t Ssrc() const { return sli_.SenderSSRC; } 266 uint32_t MediaSsrc() const { return sli_.MediaSSRC; } 267 268 private: 269 friend class RtcpPacketParser; 270 271 void Set(const RTCPUtility::RTCPPacketPSFBSLI& sli) { 272 sli_ = sli; 273 ++num_packets_; 274 } 275 276 RTCPUtility::RTCPPacketPSFBSLI sli_; 277 }; 278 279 class SliItem : public PacketType { 280 public: 281 SliItem() {} 282 virtual ~SliItem() {} 283 284 uint16_t FirstMb() const { return sli_item_.FirstMB; } 285 uint16_t NumberOfMb() const { return sli_item_.NumberOfMB; } 286 uint8_t PictureId() const { return sli_item_.PictureId; } 287 288 private: 289 friend class RtcpPacketParser; 290 291 void Set(const RTCPUtility::RTCPPacketPSFBSLIItem& sli_item) { 292 sli_item_ = sli_item; 293 ++num_packets_; 294 } 295 296 RTCPUtility::RTCPPacketPSFBSLIItem sli_item_; 297 }; 298 299 class Fir : public PacketType { 300 public: 301 Fir() {} 302 virtual ~Fir() {} 303 304 uint32_t Ssrc() const { return fir_.SenderSSRC; } 305 306 private: 307 friend class RtcpPacketParser; 308 309 void Set(const RTCPUtility::RTCPPacketPSFBFIR& fir) { 310 fir_ = fir; 311 ++num_packets_; 312 } 313 314 RTCPUtility::RTCPPacketPSFBFIR fir_; 315 }; 316 317 class FirItem : public PacketType { 318 public: 319 FirItem() {} 320 virtual ~FirItem() {} 321 322 uint32_t Ssrc() const { return fir_item_.SSRC; } 323 uint8_t SeqNum() const { return fir_item_.CommandSequenceNumber; } 324 325 private: 326 friend class RtcpPacketParser; 327 328 void Set(const RTCPUtility::RTCPPacketPSFBFIRItem& fir_item) { 329 fir_item_ = fir_item; 330 ++num_packets_; 331 } 332 333 RTCPUtility::RTCPPacketPSFBFIRItem fir_item_; 334 }; 335 336 class Nack : public PacketType { 337 public: 338 Nack() {} 339 virtual ~Nack() {} 340 341 uint32_t Ssrc() const { return nack_.SenderSSRC; } 342 uint32_t MediaSsrc() const { return nack_.MediaSSRC; } 343 344 private: 345 friend class RtcpPacketParser; 346 347 void Set(const RTCPUtility::RTCPPacketRTPFBNACK& nack) { 348 nack_ = nack; 349 ++num_packets_; 350 } 351 352 RTCPUtility::RTCPPacketRTPFBNACK nack_; 353 }; 354 355 class NackItem : public PacketType { 356 public: 357 NackItem() {} 358 virtual ~NackItem() {} 359 360 std::vector<uint16_t> last_nack_list() const { 361 return last_nack_list_; 362 } 363 364 private: 365 friend class RtcpPacketParser; 366 367 void Set(const RTCPUtility::RTCPPacketRTPFBNACKItem& nack_item) { 368 last_nack_list_.push_back(nack_item.PacketID); 369 for (int i = 0; i < 16; ++i) { 370 if (nack_item.BitMask & (1 << i)) { 371 last_nack_list_.push_back(nack_item.PacketID + i + 1); 372 } 373 } 374 ++num_packets_; 375 } 376 void Clear() { last_nack_list_.clear(); } 377 378 std::vector<uint16_t> last_nack_list_; 379 }; 380 381 class PsfbApp : public PacketType { 382 public: 383 PsfbApp() {} 384 virtual ~PsfbApp() {} 385 386 uint32_t Ssrc() const { return psfb_app_.SenderSSRC; } 387 388 private: 389 friend class RtcpPacketParser; 390 391 void Set(const RTCPUtility::RTCPPacketPSFBAPP& psfb_app) { 392 psfb_app_ = psfb_app; 393 ++num_packets_; 394 } 395 396 RTCPUtility::RTCPPacketPSFBAPP psfb_app_; 397 }; 398 399 class RembItem : public PacketType { 400 public: 401 RembItem() : last_bitrate_bps_(0) {} 402 virtual ~RembItem() {} 403 404 int last_bitrate_bps() const { return last_bitrate_bps_; } 405 std::vector<uint32_t> last_ssrc_list() { 406 return last_ssrc_list_; 407 } 408 409 private: 410 friend class RtcpPacketParser; 411 412 void Set(const RTCPUtility::RTCPPacketPSFBREMBItem& remb_item) { 413 last_bitrate_bps_ = remb_item.BitRate; 414 last_ssrc_list_.clear(); 415 last_ssrc_list_.insert( 416 last_ssrc_list_.end(), 417 remb_item.SSRCs, 418 remb_item.SSRCs + remb_item.NumberOfSSRCs); 419 ++num_packets_; 420 } 421 422 uint32_t last_bitrate_bps_; 423 std::vector<uint32_t> last_ssrc_list_; 424 }; 425 426 class Tmmbr : public PacketType { 427 public: 428 Tmmbr() {} 429 virtual ~Tmmbr() {} 430 431 uint32_t Ssrc() const { return tmmbr_.SenderSSRC; } 432 433 private: 434 friend class RtcpPacketParser; 435 436 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBR& tmmbr) { 437 tmmbr_ = tmmbr; 438 ++num_packets_; 439 } 440 441 RTCPUtility::RTCPPacketRTPFBTMMBR tmmbr_; 442 }; 443 444 class TmmbrItem : public PacketType { 445 public: 446 TmmbrItem() {} 447 virtual ~TmmbrItem() {} 448 449 uint32_t Ssrc() const { return tmmbr_item_.SSRC; } 450 uint32_t BitrateKbps() const { return tmmbr_item_.MaxTotalMediaBitRate; } 451 uint32_t Overhead() const { return tmmbr_item_.MeasuredOverhead; } 452 453 private: 454 friend class RtcpPacketParser; 455 456 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBRItem& tmmbr_item) { 457 tmmbr_item_ = tmmbr_item; 458 ++num_packets_; 459 } 460 461 RTCPUtility::RTCPPacketRTPFBTMMBRItem tmmbr_item_; 462 }; 463 464 465 class Tmmbn : public PacketType { 466 public: 467 Tmmbn() {} 468 virtual ~Tmmbn() {} 469 470 uint32_t Ssrc() const { return tmmbn_.SenderSSRC; } 471 472 private: 473 friend class RtcpPacketParser; 474 475 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBN& tmmbn) { 476 tmmbn_ = tmmbn; 477 ++num_packets_; 478 } 479 480 RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_; 481 }; 482 483 class TmmbnItems : public PacketType { 484 public: 485 TmmbnItems() {} 486 virtual ~TmmbnItems() {} 487 488 uint32_t Ssrc(uint8_t num) const { 489 assert(num < tmmbns_.size()); 490 return tmmbns_[num].SSRC; 491 } 492 uint32_t BitrateKbps(uint8_t num) const { 493 assert(num < tmmbns_.size()); 494 return tmmbns_[num].MaxTotalMediaBitRate; 495 } 496 uint32_t Overhead(uint8_t num) const { 497 assert(num < tmmbns_.size()); 498 return tmmbns_[num].MeasuredOverhead; 499 } 500 501 private: 502 friend class RtcpPacketParser; 503 504 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBNItem& tmmbn_item) { 505 tmmbns_.push_back(tmmbn_item); 506 ++num_packets_; 507 } 508 void Clear() { tmmbns_.clear(); } 509 510 std::vector<RTCPUtility::RTCPPacketRTPFBTMMBNItem> tmmbns_; 511 }; 512 513 class XrHeader : public PacketType { 514 public: 515 XrHeader() {} 516 virtual ~XrHeader() {} 517 518 uint32_t Ssrc() const { return xr_header_.OriginatorSSRC; } 519 520 private: 521 friend class RtcpPacketParser; 522 523 void Set(const RTCPUtility::RTCPPacketXR& xr_header) { 524 xr_header_ = xr_header; 525 ++num_packets_; 526 } 527 528 RTCPUtility::RTCPPacketXR xr_header_; 529 }; 530 531 class Rrtr : public PacketType { 532 public: 533 Rrtr() {} 534 virtual ~Rrtr() {} 535 536 uint32_t NtpSec() const { return rrtr_.NTPMostSignificant; } 537 uint32_t NtpFrac() const { return rrtr_.NTPLeastSignificant; } 538 539 private: 540 friend class RtcpPacketParser; 541 542 void Set(const RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem& rrtr) { 543 rrtr_ = rrtr; 544 ++num_packets_; 545 } 546 547 RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem rrtr_; 548 }; 549 550 class Dlrr : public PacketType { 551 public: 552 Dlrr() {} 553 virtual ~Dlrr() {} 554 555 private: 556 friend class RtcpPacketParser; 557 558 void Set() { ++num_packets_; } 559 }; 560 561 class DlrrItems : public PacketType { 562 public: 563 DlrrItems() {} 564 virtual ~DlrrItems() {} 565 566 uint32_t Ssrc(uint8_t num) const { 567 assert(num < dlrrs_.size()); 568 return dlrrs_[num].SSRC; 569 } 570 uint32_t LastRr(uint8_t num) const { 571 assert(num < dlrrs_.size()); 572 return dlrrs_[num].LastRR; 573 } 574 uint32_t DelayLastRr(uint8_t num) const { 575 assert(num < dlrrs_.size()); 576 return dlrrs_[num].DelayLastRR; 577 } 578 579 private: 580 friend class RtcpPacketParser; 581 582 void Set(const RTCPUtility::RTCPPacketXRDLRRReportBlockItem& dlrr) { 583 dlrrs_.push_back(dlrr); 584 ++num_packets_; 585 } 586 void Clear() { dlrrs_.clear(); } 587 588 std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrrs_; 589 }; 590 591 class VoipMetric : public PacketType { 592 public: 593 VoipMetric() {} 594 virtual ~VoipMetric() {} 595 596 uint32_t Ssrc() const { return voip_metric_.SSRC; } 597 uint8_t LossRate() { return voip_metric_.lossRate; } 598 uint8_t DiscardRate() { return voip_metric_.discardRate; } 599 uint8_t BurstDensity() { return voip_metric_.burstDensity; } 600 uint8_t GapDensity() { return voip_metric_.gapDensity; } 601 uint16_t BurstDuration() { return voip_metric_.burstDuration; } 602 uint16_t GapDuration() { return voip_metric_.gapDuration; } 603 uint16_t RoundTripDelay() { return voip_metric_.roundTripDelay; } 604 uint16_t EndSystemDelay() { return voip_metric_.endSystemDelay; } 605 uint8_t SignalLevel() { return voip_metric_.signalLevel; } 606 uint8_t NoiseLevel() { return voip_metric_.noiseLevel; } 607 uint8_t Rerl() { return voip_metric_.RERL; } 608 uint8_t Gmin() { return voip_metric_.Gmin; } 609 uint8_t Rfactor() { return voip_metric_.Rfactor; } 610 uint8_t ExtRfactor() { return voip_metric_.extRfactor; } 611 uint8_t MosLq() { return voip_metric_.MOSLQ; } 612 uint8_t MosCq() { return voip_metric_.MOSCQ; } 613 uint8_t RxConfig() { return voip_metric_.RXconfig; } 614 uint16_t JbNominal() { return voip_metric_.JBnominal; } 615 uint16_t JbMax() { return voip_metric_.JBmax; } 616 uint16_t JbAbsMax() { return voip_metric_.JBabsMax; } 617 618 private: 619 friend class RtcpPacketParser; 620 621 void Set(const RTCPUtility::RTCPPacketXRVOIPMetricItem& voip_metric) { 622 voip_metric_ = voip_metric; 623 ++num_packets_; 624 } 625 626 RTCPUtility::RTCPPacketXRVOIPMetricItem voip_metric_; 627 }; 628 629 class RtcpPacketParser { 630 public: 631 RtcpPacketParser(); 632 ~RtcpPacketParser(); 633 634 void Parse(const void *packet, int packet_len); 635 636 SenderReport* sender_report() { return &sender_report_; } 637 ReceiverReport* receiver_report() { return &receiver_report_; } 638 ReportBlock* report_block() { return &report_block_; } 639 Sdes* sdes() { return &sdes_; } 640 SdesChunk* sdes_chunk() { return &sdes_chunk_; } 641 Bye* bye() { return &bye_; } 642 App* app() { return &app_; } 643 AppItem* app_item() { return &app_item_; } 644 Ij* ij() { return &ij_; } 645 IjItem* ij_item() { return &ij_item_; } 646 Pli* pli() { return &pli_; } 647 Sli* sli() { return &sli_; } 648 SliItem* sli_item() { return &sli_item_; } 649 Rpsi* rpsi() { return &rpsi_; } 650 Fir* fir() { return &fir_; } 651 FirItem* fir_item() { return &fir_item_; } 652 Nack* nack() { return &nack_; } 653 NackItem* nack_item() { return &nack_item_; } 654 PsfbApp* psfb_app() { return &psfb_app_; } 655 RembItem* remb_item() { return &remb_item_; } 656 Tmmbr* tmmbr() { return &tmmbr_; } 657 TmmbrItem* tmmbr_item() { return &tmmbr_item_; } 658 Tmmbn* tmmbn() { return &tmmbn_; } 659 TmmbnItems* tmmbn_items() { return &tmmbn_items_; } 660 XrHeader* xr_header() { return &xr_header_; } 661 Rrtr* rrtr() { return &rrtr_; } 662 Dlrr* dlrr() { return &dlrr_; } 663 DlrrItems* dlrr_items() { return &dlrr_items_; } 664 VoipMetric* voip_metric() { return &voip_metric_; } 665 666 int report_blocks_per_ssrc(uint32_t ssrc) { 667 return report_blocks_per_ssrc_[ssrc]; 668 } 669 670 private: 671 SenderReport sender_report_; 672 ReceiverReport receiver_report_; 673 ReportBlock report_block_; 674 Sdes sdes_; 675 SdesChunk sdes_chunk_; 676 Bye bye_; 677 App app_; 678 AppItem app_item_; 679 Ij ij_; 680 IjItem ij_item_; 681 Pli pli_; 682 Sli sli_; 683 SliItem sli_item_; 684 Rpsi rpsi_; 685 Fir fir_; 686 FirItem fir_item_; 687 Nack nack_; 688 NackItem nack_item_; 689 PsfbApp psfb_app_; 690 RembItem remb_item_; 691 Tmmbr tmmbr_; 692 TmmbrItem tmmbr_item_; 693 Tmmbn tmmbn_; 694 TmmbnItems tmmbn_items_; 695 XrHeader xr_header_; 696 Rrtr rrtr_; 697 Dlrr dlrr_; 698 DlrrItems dlrr_items_; 699 VoipMetric voip_metric_; 700 701 std::map<uint32_t, int> report_blocks_per_ssrc_; 702 }; 703 } // namespace test 704 } // namespace webrtc 705 #endif // WEBRTC_TEST_RTCP_PACKET_PARSER_H_ 706