From 4b61f3a0c62cb92f243477f0e8fa13425e4cf92a Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 30 Mar 2023 14:17:19 +0200 Subject: [PATCH] In rtc event log visualizer use modern api of the ReceiveSideCongestionController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:14859 Change-Id: I121905a892aaafb54c1fff62f818bfd767b92da0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296823 Reviewed-by: Björn Terelius Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/main@{#39755} --- .../rtc_event_log_visualizer/analyzer.cc | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer.cc b/rtc_tools/rtc_event_log_visualizer/analyzer.cc index a5b8b49302..07a7dd4104 100644 --- a/rtc_tools/rtc_event_log_visualizer/analyzer.cc +++ b/rtc_tools/rtc_event_log_visualizer/analyzer.cc @@ -46,6 +46,7 @@ #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" +#include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" @@ -339,6 +340,72 @@ std::string GetDirectionAsShortString(PacketDirection direction) { } } +struct FakeExtensionSmall { + static constexpr RTPExtensionType kId = kRtpExtensionMid; + static constexpr absl::string_view Uri() { return "fake-extension-small"; } +}; +struct FakeExtensionLarge { + static constexpr RTPExtensionType kId = kRtpExtensionRtpStreamId; + static constexpr absl::string_view Uri() { return "fake-extension-large"; } +}; + +RtpPacketReceived RtpPacketForBWEFromHeader(const RTPHeader& header) { + RtpHeaderExtensionMap rtp_header_extensions(/*extmap_allow_mixed=*/true); + // ReceiveSideCongestionController doesn't need to know extensions ids as + // long as it able to get extensions by type. So any ids would work here. + rtp_header_extensions.Register(1); + rtp_header_extensions.Register(2); + rtp_header_extensions.Register(3); + rtp_header_extensions.Register(4); + // Use id > 14 to force two byte header per rtp header when this one is used. + rtp_header_extensions.Register(16); + + RtpPacketReceived rtp_packet(&rtp_header_extensions); + // Set only fields that might be relevant for the bandwidth estimatior. + rtp_packet.SetSsrc(header.ssrc); + rtp_packet.SetTimestamp(header.timestamp); + size_t num_bwe_extensions = 0; + if (header.extension.hasTransmissionTimeOffset) { + rtp_packet.SetExtension( + header.extension.transmissionTimeOffset); + ++num_bwe_extensions; + } + if (header.extension.hasAbsoluteSendTime) { + rtp_packet.SetExtension( + header.extension.absoluteSendTime); + ++num_bwe_extensions; + } + if (header.extension.hasTransportSequenceNumber) { + rtp_packet.SetExtension( + header.extension.transportSequenceNumber); + ++num_bwe_extensions; + } + + // All parts of the RTP header are 32bit aligned. + RTC_CHECK_EQ(header.headerLength % 4, 0); + + // Original packet could have more extensions, there could be csrcs that are + // not propagated by the rtc event log, i.e. logged header size might be + // larger that rtp_packet.header_size(). Increase it by setting an extra fake + // extension. + RTC_CHECK_GE(header.headerLength, rtp_packet.headers_size()); + size_t bytes_to_add = header.headerLength - rtp_packet.headers_size(); + if (bytes_to_add > 0) { + if (bytes_to_add <= 16) { + // one-byte header rtp header extension allows to add up to 16 bytes. + rtp_packet.AllocateExtension(FakeExtensionSmall::kId, bytes_to_add - 1); + } else { + // two-byte header rtp header extension would also add one byte per + // already set extension. + rtp_packet.AllocateExtension(FakeExtensionLarge::kId, + bytes_to_add - 2 - num_bwe_extensions); + } + } + RTC_CHECK_EQ(rtp_packet.headers_size(), header.headerLength); + + return rtp_packet; +} + } // namespace EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log, @@ -1468,12 +1535,16 @@ void EventLogAnalyzer::CreateReceiveSideBweSimulationGraph(Plot* plot) { int64_t last_update_us = 0; for (const auto& kv : incoming_rtp) { const RtpPacketType& packet = *kv.second; - int64_t arrival_time_ms = packet.rtp.log_time_us() / 1000; - size_t payload = packet.rtp.total_length; /*Should subtract header?*/ - clock.AdvanceTimeMicroseconds(packet.rtp.log_time_us() - - clock.TimeInMicroseconds()); - rscc.OnReceivedPacket(arrival_time_ms, payload, packet.rtp.header); - acked_bitrate.Update(payload, arrival_time_ms); + + RtpPacketReceived rtp_packet = RtpPacketForBWEFromHeader(packet.rtp.header); + rtp_packet.set_arrival_time(packet.rtp.log_time()); + rtp_packet.SetPayloadSize(packet.rtp.total_length - + rtp_packet.headers_size()); + + clock.AdvanceTime(rtp_packet.arrival_time() - clock.CurrentTime()); + rscc.OnReceivedPacket(rtp_packet, MediaType::VIDEO); + int64_t arrival_time_ms = packet.rtp.log_time().ms(); + acked_bitrate.Update(packet.rtp.total_length, arrival_time_ms); absl::optional bitrate_bps = acked_bitrate.Rate(arrival_time_ms); if (bitrate_bps) { uint32_t y = *bitrate_bps / 1000;