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" | |
11 #include "webrtc/test/rtcp_packet_parser.h" | 12 #include "webrtc/test/rtcp_packet_parser.h" |
12 | 13 |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace webrtc { | 14 namespace webrtc { |
16 namespace test { | 15 namespace test { |
17 | 16 |
18 using namespace RTCPUtility; | 17 RtcpPacketParser::RtcpPacketParser() = default; |
18 RtcpPacketParser::~RtcpPacketParser() = default; | |
19 | 19 |
20 RtcpPacketParser::RtcpPacketParser() {} | 20 bool RtcpPacketParser::Parse(const void* data, size_t length) { |
21 | 21 const uint8_t* const buffer = static_cast<const uint8_t*>(data); |
22 RtcpPacketParser::~RtcpPacketParser() {} | 22 const uint8_t* const buffer_end = buffer + length; |
23 | 23 rtcp::CommonHeader header; |
24 void RtcpPacketParser::Parse(const void *data, size_t len) { | 24 for (const uint8_t *next_packet = buffer; |
25 const uint8_t* packet = static_cast<const uint8_t*>(data); | 25 RTC_DCHECK(next_packet <= buffer_end), next_packet != buffer_end; |
26 RTCPUtility::RTCPParserV2 parser(packet, len, true); | 26 next_packet = header.NextPacket()) { |
sprang_webrtc
2016/09/02 07:43:21
The dcheck inside the test statement of the for-lo
danilchap
2016/09/02 08:15:53
Done.
Failed to find reasons I had for putting DCH
| |
27 EXPECT_TRUE(parser.IsValid()); | 27 if (!header.Parse(next_packet, buffer_end - next_packet)) { |
28 for (RTCPUtility::RTCPPacketTypes type = parser.Begin(); | 28 // Invalid rtcp header or unaligned rtcp packet. |
29 type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) { | 29 return false; |
30 switch (type) { | 30 } |
31 case RTCPPacketTypes::kSr: | 31 switch (header.type()) { |
sprang_webrtc
2016/09/02 07:43:21
Header type is just an uin8_t, right? Can we add a
danilchap
2016/09/02 08:15:53
Done.
ADD_FAILURE would crash fuzzers fast, so add
| |
32 sender_report_.Set(parser.Packet().SR); | 32 case rtcp::App::kPacketType: |
33 app_.Parse(header); | |
33 break; | 34 break; |
34 case RTCPPacketTypes::kRr: | 35 case rtcp::Bye::kPacketType: |
35 receiver_report_.Set(parser.Packet().RR); | 36 bye_.Parse(header); |
36 break; | 37 break; |
37 case RTCPPacketTypes::kReportBlockItem: | 38 case rtcp::ExtendedReports::kPacketType: |
38 report_block_.Set(parser.Packet().ReportBlockItem); | 39 xr_.Parse(header); |
39 ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC]; | |
40 break; | 40 break; |
41 case RTCPPacketTypes::kSdes: | 41 case rtcp::ExtendedJitterReport::kPacketType: |
42 sdes_.Set(); | 42 ij_.Parse(header); |
43 break; | 43 break; |
44 case RTCPPacketTypes::kSdesChunk: | 44 case rtcp::Psfb::kPacketType: |
45 sdes_chunk_.Set(parser.Packet().CName); | 45 switch (header.fmt()) { |
46 case rtcp::Fir::kFeedbackMessageType: | |
47 fir_.Parse(header); | |
48 break; | |
49 case rtcp::Pli::kFeedbackMessageType: | |
50 pli_.Parse(header); | |
51 break; | |
52 case rtcp::Remb::kFeedbackMessageType: | |
53 remb_.Parse(header); | |
54 break; | |
55 case rtcp::Rpsi::kFeedbackMessageType: | |
56 rpsi_.Parse(header); | |
57 break; | |
58 case rtcp::Sli::kFeedbackMessageType: | |
59 sli_.Parse(header); | |
60 break; | |
61 } | |
46 break; | 62 break; |
47 case RTCPPacketTypes::kBye: | 63 case rtcp::ReceiverReport::kPacketType: |
48 bye_.Set(parser.Packet().BYE); | 64 receiver_report_.Parse(header); |
49 break; | 65 break; |
50 case RTCPPacketTypes::kApp: | 66 case rtcp::Rtpfb::kPacketType: |
51 app_.Set(parser.Packet().APP); | 67 switch (header.fmt()) { |
68 case rtcp::Nack::kFeedbackMessageType: | |
69 nack_.Parse(header); | |
70 break; | |
71 case rtcp::RapidResyncRequest::kFeedbackMessageType: | |
72 rrr_.Parse(header); | |
73 break; | |
74 case rtcp::Tmmbn::kFeedbackMessageType: | |
75 tmmbn_.Parse(header); | |
76 break; | |
77 case rtcp::Tmmbr::kFeedbackMessageType: | |
78 tmmbr_.Parse(header); | |
79 break; | |
80 case rtcp::TransportFeedback::kFeedbackMessageType: | |
81 transport_feedback_.Parse(header); | |
82 break; | |
83 } | |
52 break; | 84 break; |
53 case RTCPPacketTypes::kAppItem: | 85 case rtcp::Sdes::kPacketType: |
54 app_item_.Set(parser.Packet().APP); | 86 sdes_.Parse(header); |
55 break; | 87 break; |
56 case RTCPPacketTypes::kExtendedIj: | 88 case rtcp::SenderReport::kPacketType: |
57 ij_.Set(); | 89 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; | |
122 default: | |
123 break; | 90 break; |
124 } | 91 } |
125 } | 92 } |
126 } | 93 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 } | 94 } |
140 | 95 |
141 } // namespace test | 96 } // namespace test |
142 } // namespace webrtc | 97 } // namespace webrtc |
OLD | NEW |