Improve RTC event log parser.

(Support parsing TWCC which nack sequnce numbers greater than the last
one received. Don't silently drop unrecognized/malformed RTCP packets.)

Bug: webrtc:14078
Change-Id: I34a0deabfdb5f36b988919cfcc9159197435756c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/262800
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36921}
This commit is contained in:
Björn Terelius
2022-05-17 16:47:31 +02:00
committed by WebRTC LUCI CQ
parent 2f3168ff38
commit 94c09169a2

View File

@ -690,46 +690,40 @@ ParsedRtcEventLog::ParseStatus StoreRtcpBlocks(
header.fmt() == rtcp::TransportFeedback::kFeedbackMessageType) {
LoggedRtcpPacketTransportFeedback parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.transport_feedback.Parse(header))
transport_feedback_list->push_back(std::move(parsed_block));
RTC_PARSE_CHECK_OR_RETURN(parsed_block.transport_feedback.Parse(header));
transport_feedback_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::SenderReport::kPacketType) {
LoggedRtcpPacketSenderReport parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.sr.Parse(header)) {
sr_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.sr.Parse(header));
sr_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::ReceiverReport::kPacketType) {
LoggedRtcpPacketReceiverReport parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.rr.Parse(header)) {
rr_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.rr.Parse(header));
rr_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::ExtendedReports::kPacketType) {
LoggedRtcpPacketExtendedReports parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.xr.Parse(header)) {
xr_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.xr.Parse(header));
xr_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::Fir::kPacketType &&
header.fmt() == rtcp::Fir::kFeedbackMessageType) {
LoggedRtcpPacketFir parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.fir.Parse(header)) {
fir_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.fir.Parse(header));
fir_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::Pli::kPacketType &&
header.fmt() == rtcp::Pli::kFeedbackMessageType) {
LoggedRtcpPacketPli parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.pli.Parse(header)) {
pli_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.pli.Parse(header));
pli_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::Bye::kPacketType) {
LoggedRtcpPacketBye parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.bye.Parse(header)) {
bye_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.bye.Parse(header));
bye_list->push_back(std::move(parsed_block));
} else if (header.type() == rtcp::Psfb::kPacketType &&
header.fmt() == rtcp::Psfb::kAfbMessageType) {
bool type_found = false;
@ -749,13 +743,13 @@ ParsedRtcEventLog::ParseStatus StoreRtcpBlocks(
type_found = true;
}
}
// We ignore other application-layer feedback types.
} else if (header.type() == rtcp::Nack::kPacketType &&
header.fmt() == rtcp::Nack::kFeedbackMessageType) {
LoggedRtcpPacketNack parsed_block;
parsed_block.timestamp = timestamp;
if (parsed_block.nack.Parse(header)) {
nack_list->push_back(std::move(parsed_block));
}
RTC_PARSE_CHECK_OR_RETURN(parsed_block.nack.Parse(header));
nack_list->push_back(std::move(parsed_block));
}
}
return ParsedRtcEventLog::ParseStatus::Success();
@ -2393,8 +2387,11 @@ std::vector<LoggedPacketInfo> ParsedRtcEventLog::GetPacketInfos(
last->last_in_feedback = true;
for (LoggedPacketInfo* fb : packet_feedbacks) {
if (direction == PacketDirection::kOutgoingPacket) {
fb->feedback_hold_duration =
last->reported_recv_time - fb->reported_recv_time;
if (last->reported_recv_time.IsFinite() &&
fb->reported_recv_time.IsFinite()) {
fb->feedback_hold_duration =
last->reported_recv_time - fb->reported_recv_time;
}
} else {
fb->feedback_hold_duration =
log_feedback_time - fb->log_packet_time;