Index: webrtc/test/rtcp_packet_parser.cc |
diff --git a/webrtc/test/rtcp_packet_parser.cc b/webrtc/test/rtcp_packet_parser.cc |
index 65f450d2e3dfdfa91fcf4d9d5a9f34b4cc450bc1..d8cac5b0b07c2e06177b8d46e0abacc9705eacf5 100644 |
--- a/webrtc/test/rtcp_packet_parser.cc |
+++ b/webrtc/test/rtcp_packet_parser.cc |
@@ -8,134 +8,89 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
+#include "webrtc/base/checks.h" |
#include "webrtc/test/rtcp_packet_parser.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
namespace webrtc { |
namespace test { |
-using namespace RTCPUtility; |
- |
-RtcpPacketParser::RtcpPacketParser() {} |
- |
-RtcpPacketParser::~RtcpPacketParser() {} |
+RtcpPacketParser::RtcpPacketParser() = default; |
+RtcpPacketParser::~RtcpPacketParser() = default; |
-void RtcpPacketParser::Parse(const void *data, size_t len) { |
- const uint8_t* packet = static_cast<const uint8_t*>(data); |
- RTCPUtility::RTCPParserV2 parser(packet, len, true); |
- EXPECT_TRUE(parser.IsValid()); |
- for (RTCPUtility::RTCPPacketTypes type = parser.Begin(); |
- type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) { |
- switch (type) { |
- case RTCPPacketTypes::kSr: |
- sender_report_.Set(parser.Packet().SR); |
- break; |
- case RTCPPacketTypes::kRr: |
- receiver_report_.Set(parser.Packet().RR); |
- break; |
- case RTCPPacketTypes::kReportBlockItem: |
- report_block_.Set(parser.Packet().ReportBlockItem); |
- ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC]; |
- break; |
- case RTCPPacketTypes::kSdes: |
- sdes_.Set(); |
- break; |
- case RTCPPacketTypes::kSdesChunk: |
- sdes_chunk_.Set(parser.Packet().CName); |
- break; |
- case RTCPPacketTypes::kBye: |
- bye_.Set(parser.Packet().BYE); |
- break; |
- case RTCPPacketTypes::kApp: |
- app_.Set(parser.Packet().APP); |
- break; |
- case RTCPPacketTypes::kAppItem: |
- app_item_.Set(parser.Packet().APP); |
- break; |
- case RTCPPacketTypes::kExtendedIj: |
- ij_.Set(); |
- break; |
- case RTCPPacketTypes::kExtendedIjItem: |
- ij_item_.Set(parser.Packet().ExtendedJitterReportItem); |
- break; |
- case RTCPPacketTypes::kPsfbPli: |
- pli_.Set(parser.Packet().PLI); |
- break; |
- case RTCPPacketTypes::kPsfbSli: |
- sli_.Set(parser.Packet().SLI); |
- break; |
- case RTCPPacketTypes::kPsfbSliItem: |
- sli_item_.Set(parser.Packet().SLIItem); |
- break; |
- case RTCPPacketTypes::kPsfbRpsiItem: |
- rpsi_.Set(parser.Packet().RPSI); |
- break; |
- case RTCPPacketTypes::kPsfbFir: |
- fir_.Set(parser.Packet().FIR); |
- break; |
- case RTCPPacketTypes::kPsfbFirItem: |
- fir_item_.Set(parser.Packet().FIRItem); |
- break; |
- case RTCPPacketTypes::kRtpfbNack: |
- nack_.Set(parser.Packet().NACK); |
- nack_item_.Clear(); |
- break; |
- case RTCPPacketTypes::kRtpfbNackItem: |
- nack_item_.Set(parser.Packet().NACKItem); |
- break; |
- case RTCPPacketTypes::kPsfbApp: |
- psfb_app_.Set(parser.Packet().PSFBAPP); |
- break; |
- case RTCPPacketTypes::kPsfbRembItem: |
- remb_item_.Set(parser.Packet().REMBItem); |
- break; |
- case RTCPPacketTypes::kRtpfbTmmbr: |
- tmmbr_.Set(parser.Packet().TMMBR); |
- break; |
- case RTCPPacketTypes::kRtpfbTmmbrItem: |
- tmmbr_item_.Set(parser.Packet().TMMBRItem); |
- break; |
- case RTCPPacketTypes::kRtpfbTmmbn: |
- tmmbn_.Set(parser.Packet().TMMBN); |
- tmmbn_items_.Clear(); |
- break; |
- case RTCPPacketTypes::kRtpfbTmmbnItem: |
- tmmbn_items_.Set(parser.Packet().TMMBNItem); |
- break; |
- case RTCPPacketTypes::kXrHeader: |
- xr_header_.Set(parser.Packet().XR); |
- dlrr_items_.Clear(); |
- break; |
- case RTCPPacketTypes::kXrReceiverReferenceTime: |
- rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem); |
- break; |
- case RTCPPacketTypes::kXrDlrrReportBlock: |
- dlrr_.Set(); |
- break; |
- case RTCPPacketTypes::kXrDlrrReportBlockItem: |
- dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem); |
- break; |
- case RTCPPacketTypes::kXrVoipMetric: |
- voip_metric_.Set(parser.Packet().XRVOIPMetricItem); |
- break; |
- default: |
+bool RtcpPacketParser::Parse(const void* data, size_t length) { |
+ const uint8_t* const buffer = static_cast<const uint8_t*>(data); |
+ const uint8_t* const buffer_end = buffer + length; |
+ rtcp::CommonHeader header; |
+ for (const uint8_t *next_packet = buffer; |
+ RTC_DCHECK(next_packet <= buffer_end), next_packet != buffer_end; |
+ 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
|
+ if (!header.Parse(next_packet, buffer_end - next_packet)) { |
+ // Invalid rtcp header or unaligned rtcp packet. |
+ return false; |
+ } |
+ 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
|
+ case rtcp::App::kPacketType: |
+ app_.Parse(header); |
+ break; |
+ case rtcp::Bye::kPacketType: |
+ bye_.Parse(header); |
+ break; |
+ case rtcp::ExtendedReports::kPacketType: |
+ xr_.Parse(header); |
+ break; |
+ case rtcp::ExtendedJitterReport::kPacketType: |
+ ij_.Parse(header); |
+ break; |
+ case rtcp::Psfb::kPacketType: |
+ switch (header.fmt()) { |
+ case rtcp::Fir::kFeedbackMessageType: |
+ fir_.Parse(header); |
+ break; |
+ case rtcp::Pli::kFeedbackMessageType: |
+ pli_.Parse(header); |
+ break; |
+ case rtcp::Remb::kFeedbackMessageType: |
+ remb_.Parse(header); |
+ break; |
+ case rtcp::Rpsi::kFeedbackMessageType: |
+ rpsi_.Parse(header); |
+ break; |
+ case rtcp::Sli::kFeedbackMessageType: |
+ sli_.Parse(header); |
+ break; |
+ } |
+ break; |
+ case rtcp::ReceiverReport::kPacketType: |
+ receiver_report_.Parse(header); |
+ break; |
+ case rtcp::Rtpfb::kPacketType: |
+ switch (header.fmt()) { |
+ case rtcp::Nack::kFeedbackMessageType: |
+ nack_.Parse(header); |
+ break; |
+ case rtcp::RapidResyncRequest::kFeedbackMessageType: |
+ rrr_.Parse(header); |
+ break; |
+ case rtcp::Tmmbn::kFeedbackMessageType: |
+ tmmbn_.Parse(header); |
+ break; |
+ case rtcp::Tmmbr::kFeedbackMessageType: |
+ tmmbr_.Parse(header); |
+ break; |
+ case rtcp::TransportFeedback::kFeedbackMessageType: |
+ transport_feedback_.Parse(header); |
+ break; |
+ } |
+ break; |
+ case rtcp::Sdes::kPacketType: |
+ sdes_.Parse(header); |
+ break; |
+ case rtcp::SenderReport::kPacketType: |
+ sender_report_.Parse(header); |
break; |
} |
} |
-} |
- |
-uint64_t Rpsi::PictureId() const { |
- assert(num_packets_ > 0); |
- uint16_t num_bytes = rpsi_.NumberOfValidBits / 8; |
- assert(num_bytes > 0); |
- uint64_t picture_id = 0; |
- for (uint16_t i = 0; i < num_bytes - 1; ++i) { |
- picture_id += (rpsi_.NativeBitString[i] & 0x7f); |
- picture_id <<= 7; |
- } |
- picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f); |
- return picture_id; |
+ return true; |
} |
} // namespace test |