OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
| 11 #include "webrtc/base/checks.h" |
| 12 #include "webrtc/base/logging.h" |
11 #include "webrtc/test/rtcp_packet_parser.h" | 13 #include "webrtc/test/rtcp_packet_parser.h" |
12 | 14 |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace webrtc { | 15 namespace webrtc { |
16 namespace test { | 16 namespace test { |
17 | 17 |
18 using namespace RTCPUtility; | 18 RtcpPacketParser::RtcpPacketParser() = default; |
| 19 RtcpPacketParser::~RtcpPacketParser() = default; |
19 | 20 |
20 RtcpPacketParser::RtcpPacketParser() {} | 21 bool RtcpPacketParser::Parse(const void* data, size_t length) { |
21 | 22 const uint8_t* const buffer = static_cast<const uint8_t*>(data); |
22 RtcpPacketParser::~RtcpPacketParser() {} | 23 const uint8_t* const buffer_end = buffer + length; |
23 | 24 rtcp::CommonHeader header; |
24 void RtcpPacketParser::Parse(const void *data, size_t len) { | 25 for (const uint8_t* next_packet = buffer; next_packet != buffer_end; |
25 const uint8_t* packet = static_cast<const uint8_t*>(data); | 26 next_packet = header.NextPacket()) { |
26 RTCPUtility::RTCPParserV2 parser(packet, len, true); | 27 RTC_DCHECK_GT(buffer_end - next_packet, 0); |
27 EXPECT_TRUE(parser.IsValid()); | 28 if (!header.Parse(next_packet, buffer_end - next_packet)) { |
28 for (RTCPUtility::RTCPPacketTypes type = parser.Begin(); | 29 LOG(LS_WARNING) |
29 type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) { | 30 << "Invalid rtcp header or unaligned rtcp packet at position " |
30 switch (type) { | 31 << (next_packet - buffer); |
31 case RTCPPacketTypes::kSr: | 32 return false; |
32 sender_report_.Set(parser.Packet().SR); | 33 } |
| 34 switch (header.type()) { |
| 35 case rtcp::App::kPacketType: |
| 36 app_.Parse(header); |
33 break; | 37 break; |
34 case RTCPPacketTypes::kRr: | 38 case rtcp::Bye::kPacketType: |
35 receiver_report_.Set(parser.Packet().RR); | 39 bye_.Parse(header); |
36 break; | 40 break; |
37 case RTCPPacketTypes::kReportBlockItem: | 41 case rtcp::ExtendedReports::kPacketType: |
38 report_block_.Set(parser.Packet().ReportBlockItem); | 42 xr_.Parse(header); |
39 ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC]; | |
40 break; | 43 break; |
41 case RTCPPacketTypes::kSdes: | 44 case rtcp::ExtendedJitterReport::kPacketType: |
42 sdes_.Set(); | 45 ij_.Parse(header); |
43 break; | 46 break; |
44 case RTCPPacketTypes::kSdesChunk: | 47 case rtcp::Psfb::kPacketType: |
45 sdes_chunk_.Set(parser.Packet().CName); | 48 switch (header.fmt()) { |
| 49 case rtcp::Fir::kFeedbackMessageType: |
| 50 fir_.Parse(header); |
| 51 break; |
| 52 case rtcp::Pli::kFeedbackMessageType: |
| 53 pli_.Parse(header); |
| 54 break; |
| 55 case rtcp::Remb::kFeedbackMessageType: |
| 56 remb_.Parse(header); |
| 57 break; |
| 58 case rtcp::Rpsi::kFeedbackMessageType: |
| 59 rpsi_.Parse(header); |
| 60 break; |
| 61 case rtcp::Sli::kFeedbackMessageType: |
| 62 sli_.Parse(header); |
| 63 break; |
| 64 default: |
| 65 LOG(LS_WARNING) << "Unknown rtcp payload specific feedback type " |
| 66 << header.fmt(); |
| 67 break; |
| 68 } |
46 break; | 69 break; |
47 case RTCPPacketTypes::kBye: | 70 case rtcp::ReceiverReport::kPacketType: |
48 bye_.Set(parser.Packet().BYE); | 71 receiver_report_.Parse(header); |
49 break; | 72 break; |
50 case RTCPPacketTypes::kApp: | 73 case rtcp::Rtpfb::kPacketType: |
51 app_.Set(parser.Packet().APP); | 74 switch (header.fmt()) { |
| 75 case rtcp::Nack::kFeedbackMessageType: |
| 76 nack_.Parse(header); |
| 77 break; |
| 78 case rtcp::RapidResyncRequest::kFeedbackMessageType: |
| 79 rrr_.Parse(header); |
| 80 break; |
| 81 case rtcp::Tmmbn::kFeedbackMessageType: |
| 82 tmmbn_.Parse(header); |
| 83 break; |
| 84 case rtcp::Tmmbr::kFeedbackMessageType: |
| 85 tmmbr_.Parse(header); |
| 86 break; |
| 87 case rtcp::TransportFeedback::kFeedbackMessageType: |
| 88 transport_feedback_.Parse(header); |
| 89 break; |
| 90 default: |
| 91 LOG(LS_WARNING) << "Unknown rtcp transport feedback type " |
| 92 << header.fmt(); |
| 93 break; |
| 94 } |
52 break; | 95 break; |
53 case RTCPPacketTypes::kAppItem: | 96 case rtcp::Sdes::kPacketType: |
54 app_item_.Set(parser.Packet().APP); | 97 sdes_.Parse(header); |
55 break; | 98 break; |
56 case RTCPPacketTypes::kExtendedIj: | 99 case rtcp::SenderReport::kPacketType: |
57 ij_.Set(); | 100 sender_report_.Parse(header); |
58 break; | |
59 case RTCPPacketTypes::kExtendedIjItem: | |
60 ij_item_.Set(parser.Packet().ExtendedJitterReportItem); | |
61 break; | |
62 case RTCPPacketTypes::kPsfbPli: | |
63 pli_.Set(parser.Packet().PLI); | |
64 break; | |
65 case RTCPPacketTypes::kPsfbSli: | |
66 sli_.Set(parser.Packet().SLI); | |
67 break; | |
68 case RTCPPacketTypes::kPsfbSliItem: | |
69 sli_item_.Set(parser.Packet().SLIItem); | |
70 break; | |
71 case RTCPPacketTypes::kPsfbRpsiItem: | |
72 rpsi_.Set(parser.Packet().RPSI); | |
73 break; | |
74 case RTCPPacketTypes::kPsfbFir: | |
75 fir_.Set(parser.Packet().FIR); | |
76 break; | |
77 case RTCPPacketTypes::kPsfbFirItem: | |
78 fir_item_.Set(parser.Packet().FIRItem); | |
79 break; | |
80 case RTCPPacketTypes::kRtpfbNack: | |
81 nack_.Set(parser.Packet().NACK); | |
82 nack_item_.Clear(); | |
83 break; | |
84 case RTCPPacketTypes::kRtpfbNackItem: | |
85 nack_item_.Set(parser.Packet().NACKItem); | |
86 break; | |
87 case RTCPPacketTypes::kPsfbApp: | |
88 psfb_app_.Set(parser.Packet().PSFBAPP); | |
89 break; | |
90 case RTCPPacketTypes::kPsfbRembItem: | |
91 remb_item_.Set(parser.Packet().REMBItem); | |
92 break; | |
93 case RTCPPacketTypes::kRtpfbTmmbr: | |
94 tmmbr_.Set(parser.Packet().TMMBR); | |
95 break; | |
96 case RTCPPacketTypes::kRtpfbTmmbrItem: | |
97 tmmbr_item_.Set(parser.Packet().TMMBRItem); | |
98 break; | |
99 case RTCPPacketTypes::kRtpfbTmmbn: | |
100 tmmbn_.Set(parser.Packet().TMMBN); | |
101 tmmbn_items_.Clear(); | |
102 break; | |
103 case RTCPPacketTypes::kRtpfbTmmbnItem: | |
104 tmmbn_items_.Set(parser.Packet().TMMBNItem); | |
105 break; | |
106 case RTCPPacketTypes::kXrHeader: | |
107 xr_header_.Set(parser.Packet().XR); | |
108 dlrr_items_.Clear(); | |
109 break; | |
110 case RTCPPacketTypes::kXrReceiverReferenceTime: | |
111 rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem); | |
112 break; | |
113 case RTCPPacketTypes::kXrDlrrReportBlock: | |
114 dlrr_.Set(); | |
115 break; | |
116 case RTCPPacketTypes::kXrDlrrReportBlockItem: | |
117 dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem); | |
118 break; | |
119 case RTCPPacketTypes::kXrVoipMetric: | |
120 voip_metric_.Set(parser.Packet().XRVOIPMetricItem); | |
121 break; | 101 break; |
122 default: | 102 default: |
| 103 LOG(LS_WARNING) << "Unknown rtcp packet type " << header.type(); |
123 break; | 104 break; |
124 } | 105 } |
125 } | 106 } |
126 } | 107 return true; |
127 | |
128 uint64_t Rpsi::PictureId() const { | |
129 assert(num_packets_ > 0); | |
130 uint16_t num_bytes = rpsi_.NumberOfValidBits / 8; | |
131 assert(num_bytes > 0); | |
132 uint64_t picture_id = 0; | |
133 for (uint16_t i = 0; i < num_bytes - 1; ++i) { | |
134 picture_id += (rpsi_.NativeBitString[i] & 0x7f); | |
135 picture_id <<= 7; | |
136 } | |
137 picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f); | |
138 return picture_id; | |
139 } | 108 } |
140 | 109 |
141 } // namespace test | 110 } // namespace test |
142 } // namespace webrtc | 111 } // namespace webrtc |
OLD | NEW |