In rtc event log visualizer use modern api of the ReceiveSideCongestionController

Bug: webrtc:14859
Change-Id: I121905a892aaafb54c1fff62f818bfd767b92da0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296823
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39755}
diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer.cc b/rtc_tools/rtc_event_log_visualizer/analyzer.cc
index a5b8b49..07a7dd4 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 @@
   }
 }
 
+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<TransmissionOffset>(1);
+  rtp_header_extensions.Register<AbsoluteSendTime>(2);
+  rtp_header_extensions.Register<TransportSequenceNumber>(3);
+  rtp_header_extensions.Register<FakeExtensionSmall>(4);
+  // Use id > 14 to force two byte header per rtp header when this one is used.
+  rtp_header_extensions.Register<FakeExtensionLarge>(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<TransmissionOffset>(
+        header.extension.transmissionTimeOffset);
+    ++num_bwe_extensions;
+  }
+  if (header.extension.hasAbsoluteSendTime) {
+    rtp_packet.SetExtension<AbsoluteSendTime>(
+        header.extension.absoluteSendTime);
+    ++num_bwe_extensions;
+  }
+  if (header.extension.hasTransportSequenceNumber) {
+    rtp_packet.SetExtension<TransportSequenceNumber>(
+        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 @@
   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<uint32_t> bitrate_bps = acked_bitrate.Rate(arrival_time_ms);
     if (bitrate_bps) {
       uint32_t y = *bitrate_bps / 1000;