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:

committed by
WebRTC LUCI CQ

parent
2f3168ff38
commit
94c09169a2
@ -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;
|
||||||
|
Reference in New Issue
Block a user