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 #include "webrtc/test/rtcp_packet_parser.h" 12 13 namespace webrtc { 14 namespace test { 15 16 RtcpPacketParser::RtcpPacketParser() {} 17 18 RtcpPacketParser::~RtcpPacketParser() {} 19 20 void RtcpPacketParser::Parse(const void *data, int len) { 21 const uint8_t* packet = static_cast<const uint8_t*>(data); 22 RTCPUtility::RTCPParserV2 parser(packet, len, true); 23 for (RTCPUtility::RTCPPacketTypes type = parser.Begin(); 24 type != RTCPUtility::kRtcpNotValidCode; 25 type = parser.Iterate()) { 26 switch (type) { 27 case RTCPUtility::kRtcpSrCode: 28 sender_report_.Set(parser.Packet().SR); 29 break; 30 case RTCPUtility::kRtcpRrCode: 31 receiver_report_.Set(parser.Packet().RR); 32 break; 33 case RTCPUtility::kRtcpReportBlockItemCode: 34 report_block_.Set(parser.Packet().ReportBlockItem); 35 ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC]; 36 break; 37 case RTCPUtility::kRtcpSdesCode: 38 sdes_.Set(); 39 break; 40 case RTCPUtility::kRtcpSdesChunkCode: 41 sdes_chunk_.Set(parser.Packet().CName); 42 break; 43 case RTCPUtility::kRtcpByeCode: 44 bye_.Set(parser.Packet().BYE); 45 break; 46 case RTCPUtility::kRtcpAppCode: 47 app_.Set(parser.Packet().APP); 48 break; 49 case RTCPUtility::kRtcpAppItemCode: 50 app_item_.Set(parser.Packet().APP); 51 break; 52 case RTCPUtility::kRtcpExtendedIjCode: 53 ij_.Set(); 54 break; 55 case RTCPUtility::kRtcpExtendedIjItemCode: 56 ij_item_.Set(parser.Packet().ExtendedJitterReportItem); 57 break; 58 case RTCPUtility::kRtcpPsfbPliCode: 59 pli_.Set(parser.Packet().PLI); 60 break; 61 case RTCPUtility::kRtcpPsfbSliCode: 62 sli_.Set(parser.Packet().SLI); 63 break; 64 case RTCPUtility::kRtcpPsfbSliItemCode: 65 sli_item_.Set(parser.Packet().SLIItem); 66 break; 67 case RTCPUtility::kRtcpPsfbRpsiCode: 68 rpsi_.Set(parser.Packet().RPSI); 69 break; 70 case RTCPUtility::kRtcpPsfbFirCode: 71 fir_.Set(parser.Packet().FIR); 72 break; 73 case RTCPUtility::kRtcpPsfbFirItemCode: 74 fir_item_.Set(parser.Packet().FIRItem); 75 break; 76 case RTCPUtility::kRtcpRtpfbNackCode: 77 nack_.Set(parser.Packet().NACK); 78 nack_item_.Clear(); 79 break; 80 case RTCPUtility::kRtcpRtpfbNackItemCode: 81 nack_item_.Set(parser.Packet().NACKItem); 82 break; 83 case RTCPUtility::kRtcpPsfbAppCode: 84 psfb_app_.Set(parser.Packet().PSFBAPP); 85 break; 86 case RTCPUtility::kRtcpPsfbRembItemCode: 87 remb_item_.Set(parser.Packet().REMBItem); 88 break; 89 case RTCPUtility::kRtcpRtpfbTmmbrCode: 90 tmmbr_.Set(parser.Packet().TMMBR); 91 break; 92 case RTCPUtility::kRtcpRtpfbTmmbrItemCode: 93 tmmbr_item_.Set(parser.Packet().TMMBRItem); 94 break; 95 case RTCPUtility::kRtcpRtpfbTmmbnCode: 96 tmmbn_.Set(parser.Packet().TMMBN); 97 tmmbn_items_.Clear(); 98 break; 99 case RTCPUtility::kRtcpRtpfbTmmbnItemCode: 100 tmmbn_items_.Set(parser.Packet().TMMBNItem); 101 break; 102 case RTCPUtility::kRtcpXrHeaderCode: 103 xr_header_.Set(parser.Packet().XR); 104 dlrr_items_.Clear(); 105 break; 106 case RTCPUtility::kRtcpXrReceiverReferenceTimeCode: 107 rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem); 108 break; 109 case RTCPUtility::kRtcpXrDlrrReportBlockCode: 110 dlrr_.Set(); 111 break; 112 case RTCPUtility::kRtcpXrDlrrReportBlockItemCode: 113 dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem); 114 break; 115 case RTCPUtility::kRtcpXrVoipMetricCode: 116 voip_metric_.Set(parser.Packet().XRVOIPMetricItem); 117 break; 118 default: 119 break; 120 } 121 } 122 } 123 124 uint64_t Rpsi::PictureId() const { 125 assert(num_packets_ > 0); 126 uint16_t num_bytes = rpsi_.NumberOfValidBits / 8; 127 assert(num_bytes > 0); 128 uint64_t picture_id = 0; 129 for (uint16_t i = 0; i < num_bytes - 1; ++i) { 130 picture_id += (rpsi_.NativeBitString[i] & 0x7f); 131 picture_id <<= 7; 132 } 133 picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f); 134 return picture_id; 135 } 136 137 } // namespace test 138 } // namespace webrtc 139