Add PacketOptions to SendRtcp

which will allow sending RTCP with ECN flags.

BUG=webrtc:42225697

Change-Id: Ie32a0e4fc0ce34aaa0f960f85258c1365ba706bc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/387120
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@meta.com>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44478}
diff --git a/api/call/transport.h b/api/call/transport.h
index b2bc18e..a445ffe 100644
--- a/api/call/transport.h
+++ b/api/call/transport.h
@@ -28,7 +28,8 @@
   // as packet_id not being set.
   int64_t packet_id = -1;
   // Whether this is an audio or video packet, excluding retransmissions.
-  bool is_media = true;
+  // Defaults to `false` which is the more common case.
+  bool is_media = false;
   bool included_in_feedback = false;
   bool included_in_allocation = false;
   bool send_as_ect1 = false;
@@ -42,7 +43,19 @@
  public:
   virtual bool SendRtp(ArrayView<const uint8_t> packet,
                        const PacketOptions& options) = 0;
-  virtual bool SendRtcp(ArrayView<const uint8_t> packet) = 0;
+  // TODO: bugs.webrtc.org/42225697 - Make virtual when downstream is updated.
+  virtual bool SendRtcp(ArrayView<const uint8_t> packet,
+                        const PacketOptions& /*options*/) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+    return SendRtcp(packet);
+#pragma clang diagnostic pop
+  }
+  [[deprecated("Pass PacketOptions")]]
+  // TODO: bugs.webrtc.org/42225697 - Remove when downstream is updated.
+  virtual bool SendRtcp(ArrayView<const uint8_t> packet) {
+    return SendRtcp(packet, /*packet_options=*/{});
+  }
 
  protected:
   virtual ~Transport() {}
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index 702a8d8..0492dd2 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -260,19 +260,31 @@
     sources = [ "channel_receive_unittest.cc" ]
     deps = [
       ":audio",
+      "../api:array_view",
+      "../api:make_ref_counted",
       "../api:mock_frame_transformer",
+      "../api:scoped_refptr",
+      "../api:transport_api",
       "../api/audio:audio_device",
+      "../api/audio:audio_frame_api",
+      "../api/audio_codecs:audio_codecs_api",
       "../api/audio_codecs:builtin_audio_decoder_factory",
       "../api/crypto:frame_decryptor_interface",
+      "../api/crypto:options",
       "../api/environment:environment_factory",
       "../api/task_queue:default_task_queue_factory",
+      "../api/units:time_delta",
+      "../api/units:timestamp",
       "../logging:mocks",
       "../modules/audio_device:mock_audio_device",
       "../modules/rtp_rtcp",
       "../modules/rtp_rtcp:ntp_time_util",
       "../modules/rtp_rtcp:rtp_rtcp_format",
       "../rtc_base:logging",
+      "../rtc_base:stringutils",
       "../rtc_base:threading",
+      "../rtc_base:timeutils",
+      "../system_wrappers",
       "../test:audio_codec_mocks",
       "../test:mock_transport",
       "../test:test_support",
diff --git a/audio/channel_receive.h b/audio/channel_receive.h
index ee72187..6179c4f 100644
--- a/audio/channel_receive.h
+++ b/audio/channel_receive.h
@@ -27,6 +27,7 @@
 #include "api/call/audio_sink.h"
 #include "api/call/transport.h"
 #include "api/crypto/crypto_options.h"
+#include "api/crypto/frame_decryptor_interface.h"
 #include "api/environment/environment.h"
 #include "api/frame_transformer_interface.h"
 #include "api/neteq/neteq_factory.h"
@@ -42,7 +43,6 @@
 namespace webrtc {
 
 class AudioDeviceModule;
-class FrameDecryptorInterface;
 class PacketRouter;
 class RateLimiter;
 class ReceiveStatistics;
diff --git a/audio/channel_receive_unittest.cc b/audio/channel_receive_unittest.cc
index 7cedba6..e228b42 100644
--- a/audio/channel_receive_unittest.cc
+++ b/audio/channel_receive_unittest.cc
@@ -10,25 +10,38 @@
 
 #include "audio/channel_receive.h"
 
-#include "absl/strings/escaping.h"
-#include "api/audio/audio_device.h"
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+#include <memory>
+#include <optional>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "api/audio/audio_frame.h"
+#include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "api/crypto/frame_decryptor_interface.h"
+#include "api/call/transport.h"
+#include "api/crypto/crypto_options.h"
 #include "api/environment/environment_factory.h"
+#include "api/make_ref_counted.h"
+#include "api/scoped_refptr.h"
 #include "api/test/mock_frame_transformer.h"
+#include "api/units/time_delta.h"
+#include "api/units/timestamp.h"
 #include "modules/audio_device/include/mock_audio_device.h"
-#include "modules/rtp_rtcp/source/byte_io.h"
 #include "modules/rtp_rtcp/source/ntp_time_util.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
-#include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "rtc_base/logging.h"
-#include "rtc_base/thread.h"
+#include "rtc_base/string_encode.h"
+#include "rtc_base/time_utils.h"
+#include "system_wrappers/include/ntp_time.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/mock_audio_decoder_factory.h"
 #include "test/mock_transport.h"
 #include "test/time_controller/simulated_time_controller.h"
 
@@ -171,7 +184,8 @@
 
   bool receiver_report_sent = false;
   EXPECT_CALL(transport_, SendRtcp)
-      .WillRepeatedly([&](ArrayView<const uint8_t> packet) {
+      .WillRepeatedly([&](ArrayView<const uint8_t> packet,
+                          const PacketOptions& options) {
         if (packet.size() >= 2 &&
             packet[1] == rtcp::ReceiverReport::kPacketType) {
           receiver_report_sent = true;
@@ -189,10 +203,11 @@
   auto channel = CreateTestChannelReceive();
 
   EXPECT_CALL(transport_, SendRtcp)
-      .WillRepeatedly([&](ArrayView<const uint8_t> packet) {
-        HandleGeneratedRtcp(*channel, packet);
-        return true;
-      });
+      .WillRepeatedly(
+          [&](ArrayView<const uint8_t> packet, const PacketOptions& options) {
+            HandleGeneratedRtcp(*channel, packet);
+            return true;
+          });
   // Before any packets are sent, CaptureStartTime is invalid.
   EXPECT_EQ(ProbeCaptureStartNtpTime(*channel), -1);
 
diff --git a/audio/voip/test/BUILD.gn b/audio/voip/test/BUILD.gn
index 7f12006..2b80dc6 100644
--- a/audio/voip/test/BUILD.gn
+++ b/audio/voip/test/BUILD.gn
@@ -46,17 +46,25 @@
     deps = [
       ":mock_task_queue",
       "..:audio_channel",
+      "../../../api:array_view",
+      "../../../api:make_ref_counted",
+      "../../../api:scoped_refptr",
       "../../../api:transport_api",
+      "../../../api/audio:audio_frame_api",
+      "../../../api/audio:audio_mixer_api",
+      "../../../api/audio_codecs:audio_codecs_api",
       "../../../api/audio_codecs:builtin_audio_decoder_factory",
       "../../../api/audio_codecs:builtin_audio_encoder_factory",
       "../../../api/environment",
       "../../../api/environment:environment_factory",
       "../../../api/task_queue:task_queue",
+      "../../../api/voip:voip_api",
       "../../../modules/audio_mixer:audio_mixer_impl",
       "../../../modules/audio_mixer:audio_mixer_test_utils",
       "../../../modules/rtp_rtcp:rtp_rtcp",
       "../../../modules/rtp_rtcp:rtp_rtcp_format",
       "../../../rtc_base:logging",
+      "../../../system_wrappers",
       "../../../test:mock_transport",
       "../../../test:test_support",
       "//third_party/abseil-cpp/absl/functional:any_invocable",
diff --git a/audio/voip/test/audio_channel_unittest.cc b/audio/voip/test/audio_channel_unittest.cc
index 9a47e03..ad71c67 100644
--- a/audio/voip/test/audio_channel_unittest.cc
+++ b/audio/voip/test/audio_channel_unittest.cc
@@ -10,19 +10,32 @@
 
 #include "audio/voip/audio_channel.h"
 
+#include <cstdint>
+#include <cstring>
+#include <memory>
+#include <optional>
+#include <utility>
+
 #include "absl/functional/any_invocable.h"
+#include "api/array_view.h"
+#include "api/audio/audio_frame.h"
+#include "api/audio/audio_mixer.h"
+#include "api/audio_codecs/audio_decoder_factory.h"
+#include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "api/call/transport.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
-#include "api/task_queue/task_queue_base.h"
-#include "api/task_queue/task_queue_factory.h"
+#include "api/make_ref_counted.h"
+#include "api/scoped_refptr.h"
+#include "api/voip/voip_statistics.h"
 #include "audio/voip/test/mock_task_queue.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
 #include "modules/audio_mixer/sine_wave_generator.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "rtc_base/logging.h"
+#include "system_wrappers/include/clock.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mock_transport.h"
@@ -229,7 +242,7 @@
     audio_channel_->ReceivedRTPPacket(packet);
     return true;
   };
-  auto loop_rtcp = [&](ArrayView<const uint8_t> packet) {
+  auto loop_rtcp = [&](ArrayView<const uint8_t> packet, Unused) {
     audio_channel_->ReceivedRTCPPacket(packet);
     return true;
   };
@@ -316,7 +329,7 @@
   auto send_recv_rtcp = [&](scoped_refptr<AudioChannel> rtcp_sender,
                             scoped_refptr<AudioChannel> rtcp_receiver) {
     // Setup routing logic via transport_.
-    auto route_rtcp = [&](ArrayView<const uint8_t> packet) {
+    auto route_rtcp = [&](ArrayView<const uint8_t> packet, Unused) {
       rtcp_receiver->ReceivedRTCPPacket(packet);
       return true;
     };
diff --git a/call/fake_network_pipe.cc b/call/fake_network_pipe.cc
index a1150b3..f63bf11 100644
--- a/call/fake_network_pipe.cc
+++ b/call/fake_network_pipe.cc
@@ -323,7 +323,8 @@
       return;
     }
     if (packet->is_rtcp()) {
-      transport->SendRtcp(MakeArrayView(packet->data(), packet->data_length()));
+      transport->SendRtcp(MakeArrayView(packet->data(), packet->data_length()),
+                          packet->packet_options());
     } else {
       transport->SendRtp(MakeArrayView(packet->data(), packet->data_length()),
                          packet->packet_options());
diff --git a/examples/androidvoip/jni/android_voip_client.cc b/examples/androidvoip/jni/android_voip_client.cc
index f15355d..cea3d48 100644
--- a/examples/androidvoip/jni/android_voip_client.cc
+++ b/examples/androidvoip/jni/android_voip_client.cc
@@ -479,7 +479,8 @@
   }
 }
 
-bool AndroidVoipClient::SendRtcp(webrtc::ArrayView<const uint8_t> packet) {
+bool AndroidVoipClient::SendRtcp(webrtc::ArrayView<const uint8_t> packet,
+                                 const webrtc::PacketOptions& options) {
   std::vector<uint8_t> packet_copy(packet.begin(), packet.end());
   voip_thread_->PostTask([this, packet_copy = std::move(packet_copy)] {
     SendRtcpPacket(packet_copy);
diff --git a/examples/androidvoip/jni/android_voip_client.h b/examples/androidvoip/jni/android_voip_client.h
index 29a0fc8..cb8b927 100644
--- a/examples/androidvoip/jni/android_voip_client.h
+++ b/examples/androidvoip/jni/android_voip_client.h
@@ -120,7 +120,8 @@
   // Implementation for Transport.
   bool SendRtp(webrtc::ArrayView<const uint8_t> packet,
                const webrtc::PacketOptions& options) override;
-  bool SendRtcp(webrtc::ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(webrtc::ArrayView<const uint8_t> packet,
+                const webrtc::PacketOptions& options) override;
 
   void OnSignalReadRTPPacket(webrtc::AsyncPacketSocket* socket,
                              const webrtc::ReceivedIpPacket& packet);
diff --git a/media/base/media_channel_impl.cc b/media/base/media_channel_impl.cc
index 40da627..b880077 100644
--- a/media/base/media_channel_impl.cc
+++ b/media/base/media_channel_impl.cc
@@ -19,9 +19,6 @@
 #include "api/array_view.h"
 #include "api/audio_options.h"
 #include "api/call/transport.h"
-#include "api/crypto/frame_decryptor_interface.h"
-#include "api/crypto/frame_encryptor_interface.h"
-#include "api/frame_transformer_interface.h"
 #include "api/media_stream_interface.h"
 #include "api/rtc_error.h"
 #include "api/rtp_sender_interface.h"
@@ -173,15 +170,32 @@
   RTC_DCHECK(!network_interface_);
 }
 
+AsyncSocketPacketOptions
+MediaChannelUtil::TransportForMediaChannels::TranslatePacketOptions(
+    const PacketOptions& options) {
+  AsyncSocketPacketOptions rtc_options;
+  rtc_options.packet_id = options.packet_id;
+  if (DscpEnabled()) {
+    rtc_options.dscp = PreferredDscp();
+  }
+  rtc_options.info_signaled_after_sent.included_in_feedback =
+      options.included_in_feedback;
+  rtc_options.info_signaled_after_sent.included_in_allocation =
+      options.included_in_allocation;
+  rtc_options.info_signaled_after_sent.is_media = options.is_media;
+  rtc_options.ecn_1 = options.send_as_ect1;
+  rtc_options.batchable = options.batchable;
+  rtc_options.last_packet_in_batch = options.last_packet_in_batch;
+  return rtc_options;
+}
+
 bool MediaChannelUtil::TransportForMediaChannels::SendRtcp(
-    ArrayView<const uint8_t> packet) {
-  auto send = [this, packet = CopyOnWriteBuffer(
-                         packet, webrtc::kMaxRtpPacketLen)]() mutable {
-    AsyncSocketPacketOptions rtc_options;
-    if (DscpEnabled()) {
-      rtc_options.dscp = PreferredDscp();
-    }
-    DoSendPacket(&packet, true, rtc_options);
+    ArrayView<const uint8_t> packet,
+    const PacketOptions& options) {
+  auto send = [this,
+               packet = CopyOnWriteBuffer(packet, webrtc::kMaxRtpPacketLen),
+               options]() mutable {
+    DoSendPacket(&packet, true, TranslatePacketOptions(options));
   };
 
   if (network_thread_->IsCurrent()) {
@@ -195,28 +209,10 @@
 bool MediaChannelUtil::TransportForMediaChannels::SendRtp(
     ArrayView<const uint8_t> packet,
     const webrtc::PacketOptions& options) {
-  auto send = [this, packet_id = options.packet_id,
-               included_in_feedback = options.included_in_feedback,
-               included_in_allocation = options.included_in_allocation,
-               batchable = options.batchable,
-               last_packet_in_batch = options.last_packet_in_batch,
-               is_media = options.is_media, ect_1 = options.send_as_ect1,
-               packet = CopyOnWriteBuffer(packet,
-                                          webrtc::kMaxRtpPacketLen)]() mutable {
-    AsyncSocketPacketOptions rtc_options;
-    rtc_options.packet_id = packet_id;
-    if (DscpEnabled()) {
-      rtc_options.dscp = PreferredDscp();
-    }
-    rtc_options.info_signaled_after_sent.included_in_feedback =
-        included_in_feedback;
-    rtc_options.info_signaled_after_sent.included_in_allocation =
-        included_in_allocation;
-    rtc_options.info_signaled_after_sent.is_media = is_media;
-    rtc_options.ecn_1 = ect_1;
-    rtc_options.batchable = batchable;
-    rtc_options.last_packet_in_batch = last_packet_in_batch;
-    DoSendPacket(&packet, false, rtc_options);
+  auto send = [this,
+               packet = CopyOnWriteBuffer(packet, webrtc::kMaxRtpPacketLen),
+               options]() mutable {
+    DoSendPacket(&packet, false, TranslatePacketOptions(options));
   };
 
   // TODO(bugs.webrtc.org/11993): ModuleRtpRtcpImpl2 and related classes (e.g.
diff --git a/media/base/media_channel_impl.h b/media/base/media_channel_impl.h
index 3c30e6b..8c222b2 100644
--- a/media/base/media_channel_impl.h
+++ b/media/base/media_channel_impl.h
@@ -91,7 +91,8 @@
     // Implementation of webrtc::Transport
     bool SendRtp(ArrayView<const uint8_t> packet,
                  const PacketOptions& options) override;
-    bool SendRtcp(ArrayView<const uint8_t> packet) override;
+    bool SendRtcp(ArrayView<const uint8_t> packet,
+                  const PacketOptions& options) override;
 
     // Not implementation of webrtc::Transport
     void SetInterface(MediaChannelNetworkInterface* iface);
@@ -99,6 +100,8 @@
     int SetOption(MediaChannelNetworkInterface::SocketType type,
                   Socket::Option opt,
                   int option);
+    AsyncSocketPacketOptions TranslatePacketOptions(
+        const PacketOptions& options);
 
     bool DoSendPacket(CopyOnWriteBuffer* packet,
                       bool rtcp,
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 8e1029a..0d2803b 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -5788,7 +5788,8 @@
 
   // Packets should also self-identify their dscp in PacketOptions.
   const uint8_t kData[10] = {0};
-  EXPECT_TRUE(ChannelImplAsTransport(send_channel.get())->SendRtcp(kData));
+  EXPECT_TRUE(ChannelImplAsTransport(send_channel.get())
+                  ->SendRtcp(kData, /*packet_options=*/{}));
   EXPECT_EQ(DSCP_CS1, network_interface->options().dscp);
   send_channel->SetInterface(nullptr);
 
diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc
index 4223f88..c4d1a1d 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -30,6 +30,7 @@
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/audio_options.h"
 #include "api/call/audio_sink.h"
+#include "api/call/transport.h"
 #include "api/crypto/crypto_options.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
@@ -3427,7 +3428,9 @@
 
   // Packets should also self-identify their dscp in PacketOptions.
   const uint8_t kData[10] = {0};
-  EXPECT_TRUE(SendImplFromPointer(channel.get())->transport()->SendRtcp(kData));
+  EXPECT_TRUE(SendImplFromPointer(channel.get())
+                  ->transport()
+                  ->SendRtcp(kData, /*packet_options=*/{}));
   EXPECT_EQ(webrtc::DSCP_CS1, network_interface.options().dscp);
   channel->SetInterface(nullptr);
 
diff --git a/modules/rtp_rtcp/source/nack_rtx_unittest.cc b/modules/rtp_rtcp/source/nack_rtx_unittest.cc
index 28b75a7..ea0a21a 100644
--- a/modules/rtp_rtcp/source/nack_rtx_unittest.cc
+++ b/modules/rtp_rtcp/source/nack_rtx_unittest.cc
@@ -115,7 +115,8 @@
     return true;
   }
 
-  bool SendRtcp(ArrayView<const uint8_t> data) override {
+  bool SendRtcp(ArrayView<const uint8_t> data,
+                const PacketOptions& /* options */) override {
     module_->IncomingRtcpPacket(data);
     return true;
   }
diff --git a/modules/rtp_rtcp/source/rtcp_sender.cc b/modules/rtp_rtcp/source/rtcp_sender.cc
index c08fd08..e1cbe26 100644
--- a/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -22,6 +22,7 @@
 
 #include "absl/strings/string_view.h"
 #include "api/array_view.h"
+#include "api/call/transport.h"
 #include "api/environment/environment.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/rtp_headers.h"
@@ -238,7 +239,7 @@
                                          bool buffering_allowed) {
   int32_t error_code = -1;
   auto callback = [&](ArrayView<const uint8_t> packet) {
-    transport_->SendRtcp(packet);
+    transport_->SendRtcp(packet, /*packet_options=*/{});
     error_code = 0;
     env_.event_log().Log(std::make_unique<RtcEventRtcpPacketOutgoing>(packet));
   };
@@ -596,7 +597,7 @@
                              const uint16_t* nack_list) {
   int32_t error_code = -1;
   auto callback = [&](ArrayView<const uint8_t> packet) {
-    if (transport_->SendRtcp(packet)) {
+    if (transport_->SendRtcp(packet, /*packet_options=*/{})) {
       error_code = 0;
       env_.event_log().Log(
           std::make_unique<RtcEventRtcpPacketOutgoing>(packet));
@@ -894,7 +895,7 @@
   }
   RTC_DCHECK_LE(max_packet_size, IP_PACKET_SIZE);
   auto callback = [&](ArrayView<const uint8_t> packet) {
-    if (transport_->SendRtcp(packet)) {
+    if (transport_->SendRtcp(packet, /*packet_options=*/{})) {
       env_.event_log().Log(
           std::make_unique<RtcEventRtcpPacketOutgoing>(packet));
     }
diff --git a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
index ffba6d7..e93b38e 100644
--- a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
@@ -81,7 +81,9 @@
                const PacketOptions& /* options */) override {
     return false;
   }
-  bool SendRtcp(ArrayView<const uint8_t> data) override {
+  bool SendRtcp(ArrayView<const uint8_t> data,
+                const PacketOptions& options) override {
+    EXPECT_FALSE(options.is_media);
     parser_.Parse(data);
     return true;
   }
@@ -680,8 +682,8 @@
 // of a RTCP compound packet.
 TEST_F(RtcpSenderTest, ByeMustBeLast) {
   MockTransport mock_transport;
-  EXPECT_CALL(mock_transport, SendRtcp(_))
-      .WillOnce(Invoke([](ArrayView<const uint8_t> data) {
+  EXPECT_CALL(mock_transport, SendRtcp(_, _))
+      .WillOnce(Invoke([](ArrayView<const uint8_t> data, ::testing::Unused) {
         const uint8_t* next_packet = data.data();
         const uint8_t* const packet_end = data.data() + data.size();
         rtcp::CommonHeader packet;
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
index 40bfcd3..8fa6580 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
@@ -131,7 +131,8 @@
     ++rtp_packets_sent_;
     return true;
   }
-  bool SendRtcp(ArrayView<const uint8_t> data) override {
+  bool SendRtcp(ArrayView<const uint8_t> data,
+                const PacketOptions& /* options */) override {
     test::RtcpPacketParser parser;
     parser.Parse(data);
     last_nack_list_ = parser.nack()->packet_ids();
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
index 0fae24d..153bc6c 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
@@ -103,7 +103,8 @@
     last_rtp_sequence_number_ = packet.SequenceNumber();
     return true;
   }
-  bool SendRtcp(ArrayView<const uint8_t> data) override {
+  bool SendRtcp(ArrayView<const uint8_t> data,
+                const PacketOptions& /* options */) override {
     test::RtcpPacketParser parser;
     parser.Parse(data);
     last_nack_list_ = parser.nack()->packet_ids();
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc
index 6ce33ae..83e5a1f 100644
--- a/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc
@@ -59,7 +59,10 @@
     EXPECT_TRUE(sent_packets_.back().Parse(data));
     return true;
   }
-  bool SendRtcp(ArrayView<const uint8_t> /* data */) override { return false; }
+  bool SendRtcp(ArrayView<const uint8_t> /* data */,
+                const PacketOptions& /* options */) override {
+    return false;
+  }
   const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
   int packets_sent() { return sent_packets_.size(); }
 
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
index 833a93b..e86296f 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
@@ -115,7 +115,10 @@
     return true;
   }
 
-  bool SendRtcp(ArrayView<const uint8_t>) override { RTC_CHECK_NOTREACHED(); }
+  bool SendRtcp(ArrayView<const uint8_t> /* packet */,
+                const PacketOptions& /* options */) override {
+    RTC_CHECK_NOTREACHED();
+  }
 
   std::optional<TransmittedPacket> last_packet() { return last_packet_; }
 
diff --git a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
index b5045ae..a67ebfd 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
@@ -147,7 +147,10 @@
     EXPECT_TRUE(sent_packets_.back().Parse(data));
     return true;
   }
-  bool SendRtcp(ArrayView<const uint8_t> /* data */) override { return false; }
+  bool SendRtcp(ArrayView<const uint8_t> /* data */,
+                const PacketOptions& /* options */) override {
+    return false;
+  }
   const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
   int packets_sent() { return sent_packets_.size(); }
   const std::vector<RtpPacketReceived>& sent_packets() const {
diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn
index bac6167..052ffd9 100644
--- a/rtc_tools/BUILD.gn
+++ b/rtc_tools/BUILD.gn
@@ -183,12 +183,16 @@
       "..//api/video_codecs:video_encoder_factory_template_libvpx_vp9_adapter",
       "..//api/video_codecs:video_encoder_factory_template_open_h264_adapter",
       "..//test/network:simulated_network",
+      "../api:array_view",
       "../api:create_frame_generator",
+      "../api:make_ref_counted",
+      "../api:rtp_headers",
       "../api:rtp_parameters",
       "../api:transport_api",
       "../api/environment",
       "../api/environment:environment_factory",
       "../api/video:builtin_video_bitrate_allocator_factory",
+      "../api/video:video_bitrate_allocator_factory",
       "../api/video_codecs:video_codecs_api",
       "../call",
       "../call:call_interfaces",
@@ -199,9 +203,11 @@
       "../call:video_send_stream_api",
       "../media:media_constants",
       "../media:rtc_audio_video",
+      "../rtc_base:logging",
       "../rtc_base:rtc_json",
       "../rtc_base:threading",
       "../rtc_base/system:file_wrapper",
+      "../system_wrappers",
       "../test:fileutils",
       "../test:frame_generator_capturer",
       "../test:rtp_test_utils",
diff --git a/rtc_tools/rtp_generator/rtp_generator.cc b/rtc_tools/rtp_generator/rtp_generator.cc
index cb4a14c..51228a4 100644
--- a/rtc_tools/rtp_generator/rtp_generator.cc
+++ b/rtc_tools/rtp_generator/rtp_generator.cc
@@ -11,27 +11,47 @@
 #include "rtc_tools/rtp_generator/rtp_generator.h"
 
 #include <algorithm>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
 #include <memory>
+#include <optional>
+#include <string>
 #include <utility>
+#include <vector>
 
+#include "api/array_view.h"
+#include "api/call/transport.h"
 #include "api/environment/environment_factory.h"
+#include "api/make_ref_counted.h"
+#include "api/media_types.h"
+#include "api/rtp_headers.h"
+#include "api/rtp_parameters.h"
 #include "api/test/create_frame_generator.h"
+#include "api/video/builtin_video_bitrate_allocator_factory.h"
+#include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_decoder_factory_template.h"
 #include "api/video_codecs/video_decoder_factory_template_dav1d_adapter.h"
 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp8_adapter.h"
 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/video_codecs/video_encoder_factory.h"
 #include "api/video_codecs/video_encoder_factory_template.h"
 #include "api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
+#include "call/call.h"
+#include "call/call_config.h"
+#include "call/video_send_stream.h"
 #include "media/base/media_constants.h"
+#include "rtc_base/logging.h"
 #include "rtc_base/strings/json.h"
 #include "rtc_base/system/file_wrapper.h"
 #include "rtc_base/thread.h"
+#include "system_wrappers/include/clock.h"
+#include "test/frame_generator_capturer.h"
+#include "test/rtp_file_reader.h"
+#include "test/rtp_file_writer.h"
 #include "test/testsupport/file_utils.h"
-#include "video/config/encoder_stream_factory.h"
 #include "video/config/video_encoder_config.h"
 
 namespace webrtc {
@@ -281,13 +301,14 @@
 }
 
 bool RtpGenerator::SendRtp(ArrayView<const uint8_t> packet,
-                           const webrtc::PacketOptions& options) {
+                           const PacketOptions& /* options */) {
   test::RtpPacket rtp_packet = DataToRtpPacket(packet.data(), packet.size());
   rtp_dump_writer_->WritePacket(&rtp_packet);
   return true;
 }
 
-bool RtpGenerator::SendRtcp(ArrayView<const uint8_t> packet) {
+bool RtpGenerator::SendRtcp(ArrayView<const uint8_t> packet,
+                            const PacketOptions& /* options */) {
   test::RtpPacket rtcp_packet = DataToRtpPacket(packet.data(), packet.size());
   rtp_dump_writer_->WritePacket(&rtcp_packet);
   return true;
diff --git a/rtc_tools/rtp_generator/rtp_generator.h b/rtc_tools/rtp_generator/rtp_generator.h
index bb5f141..cd7ad29 100644
--- a/rtc_tools/rtp_generator/rtp_generator.h
+++ b/rtc_tools/rtp_generator/rtp_generator.h
@@ -11,14 +11,17 @@
 #ifndef RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_
 #define RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_
 
+#include <cstddef>
+#include <cstdint>
 #include <memory>
+#include <optional>
 #include <string>
 #include <vector>
 
+#include "api/array_view.h"
 #include "api/call/transport.h"
 #include "api/environment/environment.h"
-#include "api/media_types.h"
-#include "api/video/builtin_video_bitrate_allocator_factory.h"
+#include "api/video/video_bitrate_allocator_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "call/call.h"
@@ -28,7 +31,6 @@
 #include "test/frame_generator_capturer.h"
 #include "test/rtp_file_reader.h"
 #include "test/rtp_file_writer.h"
-#include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 
@@ -92,9 +94,10 @@
   // Captured RTP packets are written to the RTPDump file instead of over the
   // network.
   bool SendRtp(ArrayView<const uint8_t> packet,
-               const webrtc::PacketOptions& options) override;
+               const PacketOptions& options) override;
   // RTCP packets are ignored for now.
-  bool SendRtcp(ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override;
   // Returns the maximum duration
   int GetMaxDuration() const;
   // Waits until all video streams have finished.
diff --git a/test/BUILD.gn b/test/BUILD.gn
index a17bbcd..292a4c6 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -1031,7 +1031,10 @@
     "null_transport.cc",
     "null_transport.h",
   ]
-  deps = [ "../api:transport_api" ]
+  deps = [
+    "../api:array_view",
+    "../api:transport_api",
+  ]
 }
 
 rtc_library("encoder_settings") {
@@ -1086,6 +1089,7 @@
   ]
   deps = [
     ":test_support",
+    "../api:array_view",
     "../api:transport_api",
   ]
 }
diff --git a/test/direct_transport.cc b/test/direct_transport.cc
index fe68dd7..7d96b81 100644
--- a/test/direct_transport.cc
+++ b/test/direct_transport.cc
@@ -120,7 +120,8 @@
   return true;
 }
 
-bool DirectTransport::SendRtcp(ArrayView<const uint8_t> data) {
+bool DirectTransport::SendRtcp(ArrayView<const uint8_t> data,
+                               const PacketOptions& /* options */) {
   fake_network_->DeliverRtcpPacket(CopyOnWriteBuffer(data));
   MutexLock lock(&process_lock_);
   if (!next_process_task_.Running())
diff --git a/test/direct_transport.h b/test/direct_transport.h
index 4cf3f26..3b79957 100644
--- a/test/direct_transport.h
+++ b/test/direct_transport.h
@@ -10,14 +10,19 @@
 #ifndef TEST_DIRECT_TRANSPORT_H_
 #define TEST_DIRECT_TRANSPORT_H_
 
+#include <cstddef>
+#include <cstdint>
+#include <map>
 #include <memory>
 
+#include "api/array_view.h"
 #include "api/call/transport.h"
-#include "api/sequence_checker.h"
+#include "api/media_types.h"
+#include "api/rtp_parameters.h"
 #include "api/task_queue/task_queue_base.h"
-#include "api/test/simulated_network.h"
 #include "call/call.h"
 #include "call/simulated_packet_receiver.h"
+#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/task_utils/repeating_task.h"
 #include "rtc_base/thread_annotations.h"
@@ -63,7 +68,8 @@
 
   bool SendRtp(ArrayView<const uint8_t> data,
                const PacketOptions& options) override;
-  bool SendRtcp(ArrayView<const uint8_t> data) override;
+  bool SendRtcp(ArrayView<const uint8_t> data,
+                const PacketOptions& options) override;
 
   int GetAverageDelayMs();
 
diff --git a/test/mock_transport.h b/test/mock_transport.h
index 87b60b3..9cd6113 100644
--- a/test/mock_transport.h
+++ b/test/mock_transport.h
@@ -11,6 +11,9 @@
 #ifndef TEST_MOCK_TRANSPORT_H_
 #define TEST_MOCK_TRANSPORT_H_
 
+#include <cstdint>
+
+#include "api/array_view.h"
 #include "api/call/transport.h"
 #include "test/gmock.h"
 
@@ -25,7 +28,10 @@
               SendRtp,
               (webrtc::ArrayView<const uint8_t>, const PacketOptions&),
               (override));
-  MOCK_METHOD(bool, SendRtcp, (webrtc::ArrayView<const uint8_t>), (override));
+  MOCK_METHOD(bool,
+              SendRtcp,
+              (webrtc::ArrayView<const uint8_t>, const PacketOptions&),
+              (override));
 };
 
 }  // namespace webrtc
diff --git a/test/null_transport.cc b/test/null_transport.cc
index 884f294..ae6e19b 100644
--- a/test/null_transport.cc
+++ b/test/null_transport.cc
@@ -9,6 +9,11 @@
  */
 #include "test/null_transport.h"
 
+#include <cstdint>
+
+#include "api/array_view.h"
+#include "api/call/transport.h"
+
 namespace webrtc {
 namespace test {
 
@@ -17,7 +22,8 @@
   return true;
 }
 
-bool NullTransport::SendRtcp(ArrayView<const uint8_t> packet) {
+bool NullTransport::SendRtcp(ArrayView<const uint8_t> packet,
+                             const PacketOptions& options) {
   return true;
 }
 
diff --git a/test/null_transport.h b/test/null_transport.h
index 1649622..a65c6d7 100644
--- a/test/null_transport.h
+++ b/test/null_transport.h
@@ -10,6 +10,9 @@
 #ifndef TEST_NULL_TRANSPORT_H_
 #define TEST_NULL_TRANSPORT_H_
 
+#include <cstdint>
+
+#include "api/array_view.h"
 #include "api/call/transport.h"
 
 namespace webrtc {
@@ -21,7 +24,8 @@
  public:
   bool SendRtp(ArrayView<const uint8_t> packet,
                const PacketOptions& options) override;
-  bool SendRtcp(ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override;
 };
 }  // namespace test
 }  // namespace webrtc
diff --git a/test/rtp_rtcp_observer.h b/test/rtp_rtcp_observer.h
index d4b8ec4..f392674 100644
--- a/test/rtp_rtcp_observer.h
+++ b/test/rtp_rtcp_observer.h
@@ -10,20 +10,23 @@
 #ifndef TEST_RTP_RTCP_OBSERVER_H_
 #define TEST_RTP_RTCP_OBSERVER_H_
 
+#include <cstdint>
 #include <map>
 #include <memory>
 #include <utility>
-#include <vector>
 
 #include "absl/flags/flag.h"
 #include "api/array_view.h"
-#include "api/test/simulated_network.h"
+#include "api/call/transport.h"
+#include "api/media_types.h"
+#include "api/rtp_parameters.h"
+#include "api/task_queue/task_queue_base.h"
 #include "api/units/time_delta.h"
+#include "call/call.h"
 #include "call/simulated_packet_receiver.h"
-#include "call/video_send_stream.h"
 #include "modules/rtp_rtcp/source/rtp_util.h"
+#include "rtc_base/checks.h"
 #include "rtc_base/event.h"
-#include "system_wrappers/include/field_trial.h"
 #include "test/direct_transport.h"
 #include "test/gtest.h"
 #include "test/test_flags.h"
@@ -116,10 +119,12 @@
       case RtpRtcpObserver::SEND_PACKET:
         return test::DirectTransport::SendRtp(packet, options);
     }
-    return true;  // Will never happen, makes compiler happy.
+    RTC_DCHECK_NOTREACHED();
+    return true;
   }
 
-  bool SendRtcp(ArrayView<const uint8_t> packet) override {
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override {
     EXPECT_TRUE(IsRtcpPacket(packet));
     RtpRtcpObserver::Action action = RtpRtcpObserver::SEND_PACKET;
     if (observer_) {
@@ -134,9 +139,10 @@
         // Drop packet silently.
         return true;
       case RtpRtcpObserver::SEND_PACKET:
-        return test::DirectTransport::SendRtcp(packet);
+        return test::DirectTransport::SendRtcp(packet, options);
     }
-    return true;  // Will never happen, makes compiler happy.
+    RTC_DCHECK_NOTREACHED();
+    return true;
   }
 
   RtpRtcpObserver* const observer_;
diff --git a/test/scenario/network_node.cc b/test/scenario/network_node.cc
index e64cf62..364f2e6 100644
--- a/test/scenario/network_node.cc
+++ b/test/scenario/network_node.cc
@@ -122,7 +122,8 @@
   return true;
 }
 
-bool NetworkNodeTransport::SendRtcp(ArrayView<const uint8_t> packet) {
+bool NetworkNodeTransport::SendRtcp(ArrayView<const uint8_t> packet,
+                                    const PacketOptions& options) {
   CopyOnWriteBuffer buffer(packet);
   MutexLock lock(&mutex_);
   if (!endpoint_)
diff --git a/test/scenario/network_node.h b/test/scenario/network_node.h
index e2f6f59..e0086fa 100644
--- a/test/scenario/network_node.h
+++ b/test/scenario/network_node.h
@@ -62,7 +62,8 @@
 
   bool SendRtp(ArrayView<const uint8_t> packet,
                const PacketOptions& options) override;
-  bool SendRtcp(ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override;
 
   void Connect(EmulatedEndpoint* endpoint,
                const SocketAddress& receiver_address,
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 3e7af5a..68bc3cf 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -555,6 +555,7 @@
         "../api/test/metrics:global_metrics_logger_and_exporter",
         "../api/test/metrics:metric",
         "../api/units:time_delta",
+        "../api/units:timestamp",
         "../api/video:builtin_video_bitrate_allocator_factory",
         "../api/video:encoded_image",
         "../api/video:video_bitrate_allocation",
@@ -887,6 +888,7 @@
       "../api:sequence_checker",
       "../api:simulated_network_api",
       "../api:time_controller",
+      "../api:transport_api",
       "../api:video_track_source_constraints",
       "../api/adaptation:resource_adaptation_api",
       "../api/crypto:options",
@@ -974,6 +976,7 @@
       "../modules/video_coding/svc:scalability_structures",
       "../modules/video_coding/svc:scalable_video_controller",
       "../modules/video_coding/timing:timing_module",
+      "../rtc_base:buffer",
       "../rtc_base:byte_buffer",
       "../rtc_base:checks",
       "../rtc_base:copy_on_write_buffer",
@@ -999,6 +1002,7 @@
       "../rtc_base/experiments:rate_control_settings",
       "../rtc_base/synchronization:mutex",
       "../system_wrappers",
+      "../system_wrappers:field_trial",
       "../system_wrappers:metrics",
       "../test:direct_transport",
       "../test:encoder_settings",
diff --git a/video/end_to_end_tests/bandwidth_tests.cc b/video/end_to_end_tests/bandwidth_tests.cc
index 82643ef..d327a76 100644
--- a/video/end_to_end_tests/bandwidth_tests.cc
+++ b/video/end_to_end_tests/bandwidth_tests.cc
@@ -8,30 +8,45 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <cstdint>
 #include <memory>
+#include <string>
+#include <vector>
 
+#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
+#include "api/rtp_headers.h"
+#include "api/rtp_parameters.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/test/simulated_network.h"
+#include "api/transport/bitrate_settings.h"
 #include "api/units/time_delta.h"
 #include "api/video/builtin_video_bitrate_allocator_factory.h"
 #include "api/video/video_bitrate_allocation.h"
-#include "call/fake_network_pipe.h"
+#include "api/video/video_bitrate_allocator_factory.h"
+#include "call/call.h"
+#include "call/video_receive_stream.h"
+#include "call/video_send_stream.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
+#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
+#include "rtc_base/checks.h"
 #include "rtc_base/rate_limiter.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/thread_annotations.h"
+#include "system_wrappers/include/field_trial.h"
 #include "system_wrappers/include/sleep.h"
 #include "test/call_test.h"
 #include "test/fake_encoder.h"
 #include "test/field_trial.h"
 #include "test/gtest.h"
-#include "test/network/simulated_network.h"
 #include "test/rtcp_packet_parser.h"
 #include "test/rtp_rtcp_observer.h"
 #include "test/video_encoder_proxy_factory.h"
 #include "test/video_test_constants.h"
+#include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
diff --git a/video/end_to_end_tests/network_state_tests.cc b/video/end_to_end_tests/network_state_tests.cc
index 4def709..1f9b336 100644
--- a/video/end_to_end_tests/network_state_tests.cc
+++ b/video/end_to_end_tests/network_state_tests.cc
@@ -8,24 +8,40 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <cstdint>
 #include <memory>
+#include <vector>
 
+#include "api/array_view.h"
+#include "api/call/transport.h"
+#include "api/environment/environment.h"
 #include "api/media_types.h"
-#include "api/task_queue/default_task_queue_factory.h"
+#include "api/rtp_headers.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/test/simulated_network.h"
+#include "api/units/time_delta.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
+#include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_encoder.h"
+#include "call/call.h"
 #include "call/fake_network_pipe.h"
+#include "call/video_receive_stream.h"
+#include "call/video_send_stream.h"
 #include "modules/rtp_rtcp/source/rtp_packet.h"
+#include "rtc_base/event.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/thread_annotations.h"
 #include "system_wrappers/include/sleep.h"
 #include "test/call_test.h"
 #include "test/fake_encoder.h"
 #include "test/gtest.h"
-#include "test/network/simulated_network.h"
+#include "test/rtp_rtcp_observer.h"
 #include "test/video_encoder_proxy_factory.h"
+#include "test/video_test_constants.h"
+#include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
@@ -42,7 +58,8 @@
       return false;
     }
 
-    bool SendRtcp(ArrayView<const uint8_t> packet) override {
+    bool SendRtcp(ArrayView<const uint8_t> packet,
+                  const PacketOptions& /* options */) override {
       ADD_FAILURE() << "Unexpected RTCP sent.";
       return false;
     }
@@ -68,7 +85,8 @@
       return true;
     }
 
-    bool SendRtcp(ArrayView<const uint8_t> packet) override {
+    bool SendRtcp(ArrayView<const uint8_t> packet,
+                  const PacketOptions& /* options */) override {
       MutexLock lock(&mutex_);
       need_rtcp_ = false;
       return true;
diff --git a/video/end_to_end_tests/retransmission_tests.cc b/video/end_to_end_tests/retransmission_tests.cc
index 7c50a7c..836a4a4 100644
--- a/video/end_to_end_tests/retransmission_tests.cc
+++ b/video/end_to_end_tests/retransmission_tests.cc
@@ -8,25 +8,45 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include <memory>
+#include <cstddef>
+#include <cstdint>
+#include <optional>
+#include <set>
+#include <string>
+#include <vector>
 
-#include "absl/algorithm/container.h"
+#include "api/array_view.h"
+#include "api/call/transport.h"
+#include "api/environment/environment.h"
+#include "api/rtp_parameters.h"
 #include "api/task_queue/task_queue_base.h"
-#include "api/test/simulated_network.h"
 #include "api/test/video/function_video_encoder_factory.h"
 #include "api/units/time_delta.h"
+#include "api/video/video_codec_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_rotation.h"
+#include "api/video/video_sink_interface.h"
+#include "api/video_codecs/sdp_video_format.h"
+#include "call/audio_receive_stream.h"
+#include "call/audio_send_stream.h"
 #include "call/fake_network_pipe.h"
+#include "call/video_receive_stream.h"
+#include "call/video_send_stream.h"
+#include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
 #include "modules/rtp_rtcp/source/rtp_packet.h"
 #include "modules/video_coding/codecs/vp8/include/vp8.h"
+#include "rtc_base/buffer.h"
+#include "rtc_base/checks.h"
 #include "rtc_base/event.h"
 #include "rtc_base/synchronization/mutex.h"
-#include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/thread_annotations.h"
 #include "test/call_test.h"
-#include "test/field_trial.h"
+#include "test/frame_generator_capturer.h"
 #include "test/gtest.h"
-#include "test/network/simulated_network.h"
 #include "test/rtcp_packet_parser.h"
+#include "test/rtp_rtcp_observer.h"
 #include "test/video_test_constants.h"
+#include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
@@ -166,7 +186,8 @@
         nack.SetPacketIds(nack_list, 1);
         Buffer buffer = nack.Build();
 
-        EXPECT_TRUE(receive_transport_->SendRtcp(buffer));
+        EXPECT_TRUE(
+            receive_transport_->SendRtcp(buffer, /*packet_options=*/{}));
       }
 
       return SEND_PACKET;
diff --git a/video/end_to_end_tests/rtp_rtcp_tests.cc b/video/end_to_end_tests/rtp_rtcp_tests.cc
index e372a94..712d4a8 100644
--- a/video/end_to_end_tests/rtp_rtcp_tests.cc
+++ b/video/end_to_end_tests/rtp_rtcp_tests.cc
@@ -8,21 +8,47 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <list>
+#include <map>
 #include <memory>
+#include <optional>
+#include <vector>
 
+#include "api/array_view.h"
+#include "api/call/transport.h"
+#include "api/environment/environment.h"
+#include "api/field_trials_view.h"
+#include "api/make_ref_counted.h"
+#include "api/rtp_headers.h"
 #include "api/test/simulated_network.h"
+#include "api/test/video/function_video_encoder_factory.h"
+#include "api/video/video_codec_type.h"
+#include "api/video_codecs/sdp_video_format.h"
 #include "call/fake_network_pipe.h"
+#include "call/flexfec_receive_stream.h"
+#include "call/video_receive_stream.h"
+#include "call/video_send_stream.h"
 #include "modules/include/module_common_types_public.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
 #include "modules/rtp_rtcp/source/rtp_packet.h"
 #include "modules/video_coding/codecs/vp8/include/vp8.h"
+#include "rtc_base/buffer.h"
+#include "rtc_base/checks.h"
 #include "rtc_base/numerics/sequence_number_unwrapper.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/thread_annotations.h"
 #include "test/call_test.h"
+#include "test/encoder_settings.h"
 #include "test/gtest.h"
-#include "test/network/simulated_network.h"
 #include "test/rtcp_packet_parser.h"
+#include "test/rtp_rtcp_observer.h"
 #include "test/video_test_constants.h"
+#include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
@@ -337,7 +363,7 @@
         rtcp::RapidResyncRequest force_send_sr_back_request;
         Buffer packet = force_send_sr_back_request.Build();
         static_cast<webrtc::Transport*>(receive_transport_.get())
-            ->SendRtcp(packet);
+            ->SendRtcp(packet, /*packet_options=*/{});
       }
       CreateFrameGeneratorCapturer(30, 1280, 720);
       StartVideoSources();
diff --git a/video/rtp_video_stream_receiver2_unittest.cc b/video/rtp_video_stream_receiver2_unittest.cc
index 068f476..6a8f963 100644
--- a/video/rtp_video_stream_receiver2_unittest.cc
+++ b/video/rtp_video_stream_receiver2_unittest.cc
@@ -207,7 +207,9 @@
                                                 /*raw_payload=*/false);
     ON_CALL(mock_transport_, SendRtcp)
         .WillByDefault(
-            Invoke(&rtcp_packet_parser_, &test::RtcpPacketParser::Parse));
+            Invoke([this](ArrayView<const uint8_t> packet, ::testing::Unused) {
+              return rtcp_packet_parser_.Parse(packet);
+            }));
   }
 
   RTPVideoHeader GetDefaultH264VideoHeader() {
diff --git a/video/transport_adapter.cc b/video/transport_adapter.cc
index b3116ea..95e430f 100644
--- a/video/transport_adapter.cc
+++ b/video/transport_adapter.cc
@@ -10,6 +10,10 @@
 
 #include "video/transport_adapter.h"
 
+#include <cstdint>
+
+#include "api/array_view.h"
+#include "api/call/transport.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
@@ -30,11 +34,12 @@
   return transport_->SendRtp(packet, options);
 }
 
-bool TransportAdapter::SendRtcp(ArrayView<const uint8_t> packet) {
+bool TransportAdapter::SendRtcp(ArrayView<const uint8_t> packet,
+                                const PacketOptions& options) {
   if (!enabled_.load())
     return false;
 
-  return transport_->SendRtcp(packet);
+  return transport_->SendRtcp(packet, options);
 }
 
 void TransportAdapter::Enable() {
diff --git a/video/transport_adapter.h b/video/transport_adapter.h
index 28c113e..1752851 100644
--- a/video/transport_adapter.h
+++ b/video/transport_adapter.h
@@ -15,6 +15,7 @@
 
 #include <atomic>
 
+#include "api/array_view.h"
 #include "api/call/transport.h"
 
 namespace webrtc {
@@ -27,7 +28,8 @@
 
   bool SendRtp(ArrayView<const uint8_t> packet,
                const PacketOptions& options) override;
-  bool SendRtcp(ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override;
 
   void Enable();
   void Disable();
diff --git a/video/video_analyzer.cc b/video/video_analyzer.cc
index 0cd9bab..94f06ee 100644
--- a/video/video_analyzer.cc
+++ b/video/video_analyzer.cc
@@ -337,8 +337,9 @@
   return result;
 }
 
-bool VideoAnalyzer::SendRtcp(ArrayView<const uint8_t> packet) {
-  return transport_->SendRtcp(packet);
+bool VideoAnalyzer::SendRtcp(ArrayView<const uint8_t> packet,
+                             const PacketOptions& options) {
+  return transport_->SendRtcp(packet, options);
 }
 
 void VideoAnalyzer::OnFrame(const VideoFrame& video_frame) {
diff --git a/video/video_analyzer.h b/video/video_analyzer.h
index 6d68a5d..8ccd353 100644
--- a/video/video_analyzer.h
+++ b/video/video_analyzer.h
@@ -10,24 +10,43 @@
 #ifndef VIDEO_VIDEO_ANALYZER_H_
 #define VIDEO_VIDEO_ANALYZER_H_
 
+#include <cstddef>
+#include <cstdint>
+#include <cstdio>
 #include <deque>
 #include <map>
 #include <memory>
+#include <optional>
 #include <string>
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "api/call/transport.h"
+#include "api/media_types.h"
 #include "api/numerics/samples_stats_counter.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/test/metrics/metric.h"
+#include "api/units/time_delta.h"
+#include "api/units/timestamp.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_sink_interface.h"
 #include "api/video/video_source_interface.h"
+#include "call/audio_receive_stream.h"
+#include "call/call.h"
+#include "call/packet_receiver.h"
+#include "call/video_receive_stream.h"
+#include "call/video_send_stream.h"
 #include "modules/rtp_rtcp/source/rtp_packet.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "modules/rtp_rtcp/source/video_rtp_depacketizer.h"
+#include "rtc_base/copy_on_write_buffer.h"
 #include "rtc_base/event.h"
-#include "rtc_base/numerics/running_statistics.h"
 #include "rtc_base/numerics/sequence_number_unwrapper.h"
 #include "rtc_base/platform_thread.h"
 #include "rtc_base/synchronization/mutex.h"
+#include "rtc_base/thread_annotations.h"
+#include "system_wrappers/include/clock.h"
 #include "test/layer_filtering_transport.h"
 #include "test/rtp_file_writer.h"
 
@@ -79,7 +98,8 @@
   bool SendRtp(ArrayView<const uint8_t> packet,
                const PacketOptions& options) override;
 
-  bool SendRtcp(ArrayView<const uint8_t> packet) override;
+  bool SendRtcp(ArrayView<const uint8_t> packet,
+                const PacketOptions& options) override;
   void OnFrame(const VideoFrame& video_frame) override;
   void Wait();
 
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc
index 2feb51b..61e1872 100644
--- a/video/video_receive_stream2_unittest.cc
+++ b/video/video_receive_stream2_unittest.cc
@@ -22,6 +22,7 @@
 #include <vector>
 
 #include "absl/memory/memory.h"
+#include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
 #include "api/metronome/test/fake_metronome.h"
@@ -214,7 +215,9 @@
         .WillByDefault(Invoke(&fake_decoder_, &test::FakeDecoder::Release));
     ON_CALL(mock_transport_, SendRtcp)
         .WillByDefault(
-            Invoke(&rtcp_packet_parser_, &test::RtcpPacketParser::Parse));
+            Invoke([this](ArrayView<const uint8_t> packet, ::testing::Unused) {
+              return rtcp_packet_parser_.Parse(packet);
+            }));
   }
 
   ~VideoReceiveStream2Test() override {