Make fec controller plug-able.

Bug: webrtc:8656
Change-Id: I3d42ffc92a7c95266e5d53bab03f388bd0de2592
Reviewed-on: https://webrtc-review.googlesource.com/39760
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Ying Wang <yinwa@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21710}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 90b44cf..636fe0b 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -28,6 +28,7 @@
     "..:webrtc_common",
     "../:typedefs",
     "../api:audio_mixer_api",
+    "../api:fec_controller_api",
     "../api:libjingle_peerconnection_api",
     "../api:optional",
     "../api:transport_api",
@@ -149,6 +150,7 @@
     "../modules/rtp_rtcp",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../modules/utility",
+    "../modules/video_coding:video_coding",
     "../rtc_base:checks",
     "../rtc_base:rtc_base_approved",
     "../rtc_base:rtc_task_queue",
diff --git a/call/DEPS b/call/DEPS
index 307a26e..f823a7b 100644
--- a/call/DEPS
+++ b/call/DEPS
@@ -7,6 +7,7 @@
   "+modules/audio_processing",
   "+modules/bitrate_controller",
   "+modules/congestion_controller",
+  "+modules/video_coding",
   "+modules/pacing",
   "+modules/rtp_rtcp",
   "+modules/utility",
diff --git a/call/call.cc b/call/call.cc
index fceea13..fc8333c 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -42,6 +42,7 @@
 #include "modules/rtp_rtcp/source/byte_io.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "modules/utility/include/process_thread.h"
+#include "modules/video_coding/fec_controller_default.h"
 #include "rtc_base/basictypes.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/constructormagic.h"
@@ -184,6 +185,10 @@
   webrtc::VideoSendStream* CreateVideoSendStream(
       webrtc::VideoSendStream::Config config,
       VideoEncoderConfig encoder_config) override;
+  webrtc::VideoSendStream* CreateVideoSendStream(
+      webrtc::VideoSendStream::Config config,
+      VideoEncoderConfig encoder_config,
+      std::unique_ptr<FecController> fec_controller) override;
   void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override;
 
   webrtc::VideoReceiveStream* CreateVideoReceiveStream(
@@ -402,6 +407,13 @@
   return new internal::Call(config, std::move(transport_send));
 }
 
+VideoSendStream* Call::CreateVideoSendStream(
+    VideoSendStream::Config config,
+    VideoEncoderConfig encoder_config,
+    std::unique_ptr<FecController> fec_controller) {
+  return nullptr;
+}
+
 namespace internal {
 
 Call::Call(const Call::Config& config,
@@ -714,6 +726,15 @@
 webrtc::VideoSendStream* Call::CreateVideoSendStream(
     webrtc::VideoSendStream::Config config,
     VideoEncoderConfig encoder_config) {
+  return CreateVideoSendStream(
+      std::move(config), std::move(encoder_config),
+      rtc::MakeUnique<FecControllerDefault>(Clock::GetRealTimeClock()));
+}
+
+webrtc::VideoSendStream* Call::CreateVideoSendStream(
+    webrtc::VideoSendStream::Config config,
+    VideoEncoderConfig encoder_config,
+    std::unique_ptr<FecController> fec_controller) {
   TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream");
   RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
 
@@ -733,7 +754,7 @@
       call_stats_.get(), transport_send_.get(), bitrate_allocator_.get(),
       video_send_delay_stats_.get(), event_log_, std::move(config),
       std::move(encoder_config), suspended_video_send_ssrcs_,
-      suspended_video_payload_states_);
+      suspended_video_payload_states_, std::move(fec_controller));
 
   {
     WriteLockScoped write_lock(*send_crit_);
diff --git a/call/call.h b/call/call.h
index b6e0aea..eb23e8b 100644
--- a/call/call.h
+++ b/call/call.h
@@ -15,6 +15,7 @@
 #include <string>
 #include <vector>
 
+#include "api/fec_controller.h"
 #include "api/rtcerror.h"
 #include "call/audio_receive_stream.h"
 #include "call/audio_send_stream.h"
@@ -144,6 +145,10 @@
   virtual VideoSendStream* CreateVideoSendStream(
       VideoSendStream::Config config,
       VideoEncoderConfig encoder_config) = 0;
+  virtual VideoSendStream* CreateVideoSendStream(
+      VideoSendStream::Config config,
+      VideoEncoderConfig encoder_config,
+      std::unique_ptr<FecController> fec_controller);
   virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0;
 
   virtual VideoReceiveStream* CreateVideoReceiveStream(