Implement RtpVideoSender::SetFecAllowed()

Bug: webrtc:10769
Change-Id: I7214b2eaad828c59fd9836e85a3ecd8e737fe5f7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143966
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28420}
diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc
index bf9e94e..529e0ad 100644
--- a/call/rtp_video_sender.cc
+++ b/call/rtp_video_sender.cc
@@ -225,6 +225,7 @@
       flexfec_sender_(
           MaybeCreateFlexfecSender(clock, rtp_config, suspended_ssrcs_)),
       fec_controller_(std::move(fec_controller)),
+      fec_allowed_(true),
       rtp_streams_(
           CreateRtpStreamSenders(clock,
                                  rtp_config,
@@ -705,6 +706,12 @@
   // protection overhead.
   encoder_target_rate_bps_ = fec_controller_->UpdateFecRates(
       payload_bitrate_bps, framerate, fraction_loss, loss_mask_vector_, rtt);
+  if (!fec_allowed_) {
+    encoder_target_rate_bps_ = payload_bitrate_bps;
+    // fec_controller_->UpdateFecRates() was still called so as to allow
+    // |fec_controller_| to update whatever internal state it might have,
+    // since |fec_allowed_| may be toggled back on at any moment.
+  }
 
   uint32_t packetization_rate_bps = 0;
   if (account_for_packetization_overhead_) {
@@ -783,7 +790,8 @@
 }
 
 void RtpVideoSender::SetFecAllowed(bool fec_allowed) {
-  // TODO(bugs.webrtc.og/10769): Handle this message.
+  rtc::CritScope cs(&crit_);
+  fec_allowed_ = fec_allowed;
 }
 
 void RtpVideoSender::OnPacketFeedbackVector(
diff --git a/call/rtp_video_sender.h b/call/rtp_video_sender.h
index 333bfea..2f13752 100644
--- a/call/rtp_video_sender.h
+++ b/call/rtp_video_sender.h
@@ -178,7 +178,10 @@
   std::map<uint32_t, RtpState> suspended_ssrcs_;
 
   std::unique_ptr<FlexfecSender> flexfec_sender_;
+
   const std::unique_ptr<FecController> fec_controller_;
+  bool fec_allowed_ RTC_GUARDED_BY(crit_);
+
   // Rtp modules are assumed to be sorted in simulcast index order.
   const std::vector<webrtc_internal_rtp_video_sender::RtpStreamSender>
       rtp_streams_;