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