Add unlimited retransmission experiment for screenshare

Bug: webrtc:9659
Change-Id: Idcdc647c112ed2c7c027a7a0056b145ce8f45788
Reviewed-on: https://webrtc-review.googlesource.com/95724
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24422}
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 8df5380..055d712 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -203,6 +203,7 @@
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/video:video_bitrate_allocation",
     "../../api/video:video_bitrate_allocator",
+    "../../api/video:video_frame",
     "../../api/video_codecs:video_codecs_api",
     "../../common_video",
     "../../logging:rtc_event_audio",
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index e0347f0..ba04b5c 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -160,7 +160,9 @@
       overhead_observer_(overhead_observer),
       populate_network2_timestamp_(populate_network2_timestamp),
       send_side_bwe_with_overhead_(
-          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
+          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
+      unlimited_retransmission_experiment_(
+          field_trial::IsEnabled("WebRTC-UnlimitedScreenshareRetransmission")) {
   // This random initialization is not intended to be cryptographic strong.
   timestamp_offset_ = random_.Rand<uint32_t>();
   // Random start, 16 bits. Can't be 0.
@@ -412,6 +414,11 @@
       *transport_frame_id_out = rtp_timestamp;
     if (!sending_media_)
       return true;
+
+    // Cache video content type.
+    if (!audio_configured_ && rtp_header) {
+      video_content_type_ = rtp_header->content_type;
+    }
   }
   VideoCodecType video_type = kVideoCodecGeneric;
   if (CheckPayloadType(payload_type, &video_type) != 0) {
@@ -643,10 +650,21 @@
 
   const int32_t packet_size = static_cast<int32_t>(stored_packet->payload_size);
 
+  // Skip retransmission rate check if sending screenshare and the experiment
+  // is on.
+  bool skip_retransmission_rate_limit;
+  {
+    rtc::CritScope lock(&send_critsect_);
+    skip_retransmission_rate_limit =
+        unlimited_retransmission_experiment_ && video_content_type_ &&
+        videocontenttypehelpers::IsScreenshare(*video_content_type_);
+  }
+
   RTC_DCHECK(retransmission_rate_limiter_);
   // Check if we're overusing retransmission bitrate.
   // TODO(sprang): Add histograms for nack success or failure reasons.
-  if (!retransmission_rate_limiter_->TryUseRate(packet_size)) {
+  if (!skip_retransmission_rate_limit &&
+      !retransmission_rate_limiter_->TryUseRate(packet_size)) {
     return -1;
   }
 
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index 5ff4a0f..7f66d24 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -20,6 +20,7 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/call/transport.h"
+#include "api/video/video_content_type.h"
 #include "common_types.h"  // NOLINT(build/include)
 #include "modules/rtp_rtcp/include/flexfec_sender.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
@@ -338,6 +339,11 @@
 
   const bool send_side_bwe_with_overhead_;
 
+  const bool unlimited_retransmission_experiment_;
+
+  absl::optional<VideoContentType> video_content_type_
+      RTC_GUARDED_BY(send_critsect_);
+
   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSender);
 };