Wiring down config from video engine until video coding and remote bitrate estimator modules instantiation.

R=mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/1450008

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4007 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/video_engine/encoder_state_feedback_unittest.cc b/video_engine/encoder_state_feedback_unittest.cc
index 736ebcd..4009d83 100644
--- a/video_engine/encoder_state_feedback_unittest.cc
+++ b/video_engine/encoder_state_feedback_unittest.cc
@@ -10,15 +10,16 @@
 
 
 // This file includes unit tests for EncoderStateFeedback.
-#include "video_engine/encoder_state_feedback.h"
+#include "webrtc/video_engine/encoder_state_feedback.h"
 
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
-#include "modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
-#include "modules/utility/interface/process_thread.h"
-#include "system_wrappers/interface/scoped_ptr.h"
-#include "video_engine/vie_encoder.h"
+#include "webrtc/common.h"
+#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
+#include "webrtc/modules/utility/interface/process_thread.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/video_engine/vie_encoder.h"
 
 namespace webrtc {
 
@@ -36,7 +37,7 @@
 class MockVieEncoder : public ViEEncoder {
  public:
   explicit MockVieEncoder(TestProcessThread* process_thread)
-      : ViEEncoder(1, 1, 1, *process_thread, NULL) {}
+      : ViEEncoder(1, 1, 1, config_, *process_thread, NULL) {}
   ~MockVieEncoder() {}
 
   MOCK_METHOD1(OnReceivedIntraFrameRequest,
@@ -47,6 +48,8 @@
                void(uint32_t ssrc, uint64_t picture_id));
   MOCK_METHOD2(OnLocalSsrcChanged,
                void(uint32_t old_ssrc, uint32_t new_ssrc));
+
+  const Config config_;
 };
 
 class VieKeyRequestTest : public ::testing::Test {
diff --git a/video_engine/include/vie_base.h b/video_engine/include/vie_base.h
index 8bbf1d5..ea0ab74 100644
--- a/video_engine/include/vie_base.h
+++ b/video_engine/include/vie_base.h
@@ -23,12 +23,14 @@
 
 namespace webrtc {
 
+class Config;
 class VoiceEngine;
 
 class WEBRTC_DLLEXPORT VideoEngine {
  public:
   // Creates a VideoEngine object, which can then be used to acquire sub‐APIs.
   static VideoEngine* Create();
+  static VideoEngine* Create(const Config& config);
 
   // Deletes a VideoEngine instance.
   static bool Delete(VideoEngine*& video_engine);
diff --git a/video_engine/vie_base_impl.cc b/video_engine/vie_base_impl.cc
index 617ab40..7beb919 100644
--- a/video_engine/vie_base_impl.cc
+++ b/video_engine/vie_base_impl.cc
@@ -59,7 +59,8 @@
   return ref_count;
 }
 
-ViEBaseImpl::ViEBaseImpl() {
+ViEBaseImpl::ViEBaseImpl(const Config& config)
+    : shared_data_(config) {
   WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_.instance_id(),
                "ViEBaseImpl::ViEBaseImpl() Ctor");
 }
diff --git a/video_engine/vie_base_impl.h b/video_engine/vie_base_impl.h
index a9eec44..4c57699 100644
--- a/video_engine/vie_base_impl.h
+++ b/video_engine/vie_base_impl.h
@@ -18,6 +18,7 @@
 
 namespace webrtc {
 
+class Config;
 class Module;
 class VoiceEngine;
 
@@ -47,7 +48,7 @@
   virtual int LastError();
 
  protected:
-  ViEBaseImpl();
+  ViEBaseImpl(const Config& config);
   virtual ~ViEBaseImpl();
 
   ViESharedData* shared_data() { return &shared_data_; }
diff --git a/video_engine/vie_capturer.cc b/video_engine/vie_capturer.cc
index 1a283d7..e72d5d8 100644
--- a/video_engine/vie_capturer.cc
+++ b/video_engine/vie_capturer.cc
@@ -32,6 +32,7 @@
 
 ViECapturer::ViECapturer(int capture_id,
                          int engine_id,
+                         const Config& config,
                          ProcessThread& module_process_thread)
     : ViEFrameProviderBase(capture_id, engine_id),
       capture_cs_(CriticalSectionWrapper::CreateCriticalSection()),
@@ -128,9 +129,10 @@
 ViECapturer* ViECapturer::CreateViECapture(
     int capture_id,
     int engine_id,
+    const Config& config,
     VideoCaptureModule* capture_module,
     ProcessThread& module_process_thread) {
-  ViECapturer* capture = new ViECapturer(capture_id, engine_id,
+  ViECapturer* capture = new ViECapturer(capture_id, engine_id, config,
                                          module_process_thread);
   if (!capture || capture->Init(capture_module) != 0) {
     delete capture;
@@ -154,10 +156,11 @@
 ViECapturer* ViECapturer::CreateViECapture(
     int capture_id,
     int engine_id,
+    const Config& config,
     const char* device_unique_idUTF8,
     const uint32_t device_unique_idUTF8Length,
     ProcessThread& module_process_thread) {
-  ViECapturer* capture = new ViECapturer(capture_id, engine_id,
+  ViECapturer* capture = new ViECapturer(capture_id, engine_id, config,
                                          module_process_thread);
   if (!capture ||
       capture->Init(device_unique_idUTF8, device_unique_idUTF8Length) != 0) {
diff --git a/video_engine/vie_capturer.h b/video_engine/vie_capturer.h
index df0e126..01a6709 100644
--- a/video_engine/vie_capturer.h
+++ b/video_engine/vie_capturer.h
@@ -27,6 +27,7 @@
 
 namespace webrtc {
 
+class Config;
 class CriticalSectionWrapper;
 class EventWrapper;
 class ProcessThread;
@@ -45,12 +46,14 @@
  public:
   static ViECapturer* CreateViECapture(int capture_id,
                                        int engine_id,
+                                       const Config& config,
                                        VideoCaptureModule* capture_module,
                                        ProcessThread& module_process_thread);
 
   static ViECapturer* CreateViECapture(
       int capture_id,
       int engine_id,
+      const Config& config,
       const char* device_unique_idUTF8,
       uint32_t device_unique_idUTF8Length,
       ProcessThread& module_process_thread);
@@ -108,6 +111,7 @@
  protected:
   ViECapturer(int capture_id,
               int engine_id,
+              const Config& config,
               ProcessThread& module_process_thread);
 
   int32_t Init(VideoCaptureModule* capture_module);
diff --git a/video_engine/vie_channel.cc b/video_engine/vie_channel.cc
index 6796070..d4f1957 100644
--- a/video_engine/vie_channel.cc
+++ b/video_engine/vie_channel.cc
@@ -55,6 +55,7 @@
 ViEChannel::ViEChannel(int32_t channel_id,
                        int32_t engine_id,
                        uint32_t number_of_cores,
+                       const Config& config,
                        ProcessThread& module_process_thread,
                        RtcpIntraFrameObserver* intra_frame_observer,
                        RtcpBandwidthObserver* bandwidth_observer,
diff --git a/video_engine/vie_channel.h b/video_engine/vie_channel.h
index 620d64e..540385f 100644
--- a/video_engine/vie_channel.h
+++ b/video_engine/vie_channel.h
@@ -32,21 +32,22 @@
 
 class CallStatsObserver;
 class ChannelStatsObserver;
+class Config;
 class CriticalSectionWrapper;
 class Encryption;
 class PacedSender;
 class ProcessThread;
-class RtpRtcp;
 class RtcpRttObserver;
+class RtpRtcp;
 class ThreadWrapper;
-class VideoCodingModule;
-class VideoDecoder;
-class VideoRenderCallback;
 class ViEDecoderObserver;
 class ViEEffectFilter;
 class ViENetworkObserver;
 class ViERTCPObserver;
 class ViERTPObserver;
+class VideoCodingModule;
+class VideoDecoder;
+class VideoRenderCallback;
 class VoEVideoSync;
 
 class ViEChannel
@@ -64,6 +65,7 @@
   ViEChannel(int32_t channel_id,
              int32_t engine_id,
              uint32_t number_of_cores,
+             const Config& config,
              ProcessThread& module_process_thread,
              RtcpIntraFrameObserver* intra_frame_observer,
              RtcpBandwidthObserver* bandwidth_observer,
diff --git a/video_engine/vie_channel_group.cc b/video_engine/vie_channel_group.cc
index c7169b6..1a78659 100644
--- a/video_engine/vie_channel_group.cc
+++ b/video_engine/vie_channel_group.cc
@@ -24,7 +24,8 @@
 
 ChannelGroup::ChannelGroup(ProcessThread* process_thread,
                            const OverUseDetectorOptions& options,
-                           RemoteBitrateEstimator::EstimationMode mode)
+                           RemoteBitrateEstimator::EstimationMode mode,
+                           const Config& config)
     : remb_(new VieRemb()),
       bitrate_controller_(BitrateController::CreateBitrateController()),
       call_stats_(new CallStats()),
diff --git a/video_engine/vie_channel_group.h b/video_engine/vie_channel_group.h
index 418cda4..6a31368 100644
--- a/video_engine/vie_channel_group.h
+++ b/video_engine/vie_channel_group.h
@@ -20,6 +20,7 @@
 
 class BitrateController;
 class CallStats;
+class Config;
 class EncoderStateFeedback;
 struct OverUseDetectorOptions;
 class ProcessThread;
@@ -33,7 +34,8 @@
  public:
   ChannelGroup(ProcessThread* process_thread,
                const OverUseDetectorOptions& options,
-               RemoteBitrateEstimator::EstimationMode mode);
+               RemoteBitrateEstimator::EstimationMode mode,
+               const Config& config);
   ~ChannelGroup();
 
   void AddChannel(int channel_id);
diff --git a/video_engine/vie_channel_manager.cc b/video_engine/vie_channel_manager.cc
index 73bc87e..874b16f 100644
--- a/video_engine/vie_channel_manager.cc
+++ b/video_engine/vie_channel_manager.cc
@@ -29,7 +29,8 @@
 ViEChannelManager::ViEChannelManager(
     int engine_id,
     int number_of_cores,
-    const OverUseDetectorOptions& options)
+    const OverUseDetectorOptions& options,
+    const Config& config)
     : channel_id_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
       engine_id_(engine_id),
       number_of_cores_(number_of_cores),
@@ -39,7 +40,8 @@
       voice_engine_(NULL),
       module_process_thread_(NULL),
       over_use_detector_options_(options),
-      bwe_mode_(RemoteBitrateEstimator::kSingleStreamEstimation) {
+      bwe_mode_(RemoteBitrateEstimator::kSingleStreamEstimation),
+      config_(config) {
   WEBRTC_TRACE(kTraceMemory, kTraceVideo, ViEId(engine_id),
                "ViEChannelManager::ViEChannelManager(engine_id: %d)",
                engine_id);
@@ -93,10 +95,12 @@
   // Create a new channel group and add this channel.
   ChannelGroup* group = new ChannelGroup(module_process_thread_,
                                          over_use_detector_options_,
-                                         bwe_mode_);
+                                         bwe_mode_,
+                                         config_);
   BitrateController* bitrate_controller = group->GetBitrateController();
   ViEEncoder* vie_encoder = new ViEEncoder(engine_id_, new_channel_id,
                                            number_of_cores_,
+                                           config_,
                                            *module_process_thread_,
                                            bitrate_controller);
 
@@ -165,6 +169,7 @@
   if (sender) {
     // We need to create a new ViEEncoder.
     vie_encoder = new ViEEncoder(engine_id_, new_channel_id, number_of_cores_,
+                                 config_,
                                  *module_process_thread_,
                                  bitrate_controller);
     if (!(vie_encoder->Init() &&
@@ -423,6 +428,7 @@
 
   ViEChannel* vie_channel = new ViEChannel(channel_id, engine_id_,
                                            number_of_cores_,
+                                           config_,
                                            *module_process_thread_,
                                            intra_frame_observer,
                                            bandwidth_observer,
diff --git a/video_engine/vie_channel_manager.h b/video_engine/vie_channel_manager.h
index 326f681..a093b85 100644
--- a/video_engine/vie_channel_manager.h
+++ b/video_engine/vie_channel_manager.h
@@ -25,6 +25,7 @@
 
 namespace webrtc {
 
+class Config;
 class CriticalSectionWrapper;
 class MapWrapper;
 class ProcessThread;
@@ -44,7 +45,8 @@
  public:
   ViEChannelManager(int engine_id,
                     int number_of_cores,
-                    const OverUseDetectorOptions& options);
+                    const OverUseDetectorOptions& options,
+                    const Config& config);
   ~ViEChannelManager();
 
   void SetModuleProcessThread(ProcessThread* module_process_thread);
@@ -137,6 +139,7 @@
   ProcessThread* module_process_thread_;
   const OverUseDetectorOptions& over_use_detector_options_;
   RemoteBitrateEstimator::EstimationMode bwe_mode_;
+  const Config& config_;
 };
 
 class ViEChannelManagerScoped: private ViEManagerScopedBase {
diff --git a/video_engine/vie_encoder.cc b/video_engine/vie_encoder.cc
index f75ca12..e0be252 100644
--- a/video_engine/vie_encoder.cc
+++ b/video_engine/vie_encoder.cc
@@ -101,6 +101,7 @@
 ViEEncoder::ViEEncoder(int32_t engine_id,
                        int32_t channel_id,
                        uint32_t number_of_cores,
+                       const Config& config,
                        ProcessThread& module_process_thread,
                        BitrateController* bitrate_controller)
   : engine_id_(engine_id),
diff --git a/video_engine/vie_encoder.h b/video_engine/vie_encoder.h
index f9dd0bd..43a38f6 100644
--- a/video_engine/vie_encoder.h
+++ b/video_engine/vie_encoder.h
@@ -28,6 +28,7 @@
 namespace webrtc {
 
 class CriticalSectionWrapper;
+class Config;
 class PacedSender;
 class ProcessThread;
 class QMVideoSettingsCallback;
@@ -51,6 +52,7 @@
   ViEEncoder(int32_t engine_id,
              int32_t channel_id,
              uint32_t number_of_cores,
+             const Config& config,
              ProcessThread& module_process_thread,
              BitrateController* bitrate_controller);
   ~ViEEncoder();
diff --git a/video_engine/vie_impl.cc b/video_engine/vie_impl.cc
index 8a4067c..349a996 100644
--- a/video_engine/vie_impl.cc
+++ b/video_engine/vie_impl.cc
@@ -8,8 +8,10 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "video_engine/vie_impl.h"
-#include "system_wrappers/interface/trace.h"
+#include "webrtc/video_engine/vie_impl.h"
+
+#include "webrtc/common.h"
+#include "webrtc/system_wrappers/interface/trace.h"
 
 #ifdef WEBRTC_ANDROID
 #include "webrtc/modules/video_capture/include/video_capture_factory.h"
@@ -21,7 +23,11 @@
 enum { kModuleId = 0 };
 
 VideoEngine* VideoEngine::Create() {
-  return new VideoEngineImpl();
+  return new VideoEngineImpl(new Config(), true /* owns_config */);
+}
+
+VideoEngine* VideoEngine::Create(const Config& config) {
+  return new VideoEngineImpl(&config, false /* owns_config */);
 }
 
 bool VideoEngine::Delete(VideoEngine*& video_engine) {
diff --git a/video_engine/vie_impl.h b/video_engine/vie_impl.h
index ad6e306..2888912 100644
--- a/video_engine/vie_impl.h
+++ b/video_engine/vie_impl.h
@@ -11,35 +11,37 @@
 #ifndef WEBRTC_VIDEO_ENGINE_VIE_IMPL_H_
 #define WEBRTC_VIDEO_ENGINE_VIE_IMPL_H_
 
-#include "engine_configurations.h"  // NOLINT
-#include "video_engine/vie_defines.h"
+#include "webrtc/common.h"
+#include "webrtc/engine_configurations.h"
+#include "webrtc/video_engine/vie_defines.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
 
-#include "video_engine/vie_base_impl.h"
+#include "webrtc/video_engine/vie_base_impl.h"
 
 #ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
-#include "video_engine/vie_capture_impl.h"
+#include "webrtc/video_engine/vie_capture_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_CODEC_API
-#include "video_engine/vie_codec_impl.h"
+#include "webrtc/video_engine/vie_codec_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_ENCRYPTION_API
-#include "video_engine/vie_encryption_impl.h"
+#include "webrtc/video_engine/vie_encryption_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_FILE_API
-#include "video_engine/vie_file_impl.h"
+#include "webrtc/video_engine/vie_file_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_IMAGE_PROCESS_API
-#include "video_engine/vie_image_process_impl.h"
+#include "webrtc/video_engine/vie_image_process_impl.h"
 #endif
-#include "video_engine/vie_network_impl.h"
+#include "webrtc/video_engine/vie_network_impl.h"
 #ifdef WEBRTC_VIDEO_ENGINE_RENDER_API
-#include "video_engine/vie_render_impl.h"
+#include "webrtc/video_engine/vie_render_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_RTP_RTCP_API
-#include "video_engine/vie_rtp_rtcp_impl.h"
+#include "webrtc/video_engine/vie_rtp_rtcp_impl.h"
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
-#include "video_engine/vie_external_codec_impl.h"
+#include "webrtc/video_engine/vie_external_codec_impl.h"
 #endif
 
 namespace webrtc {
@@ -74,35 +76,40 @@
       public VideoEngine
 {  // NOLINT
  public:
-  VideoEngineImpl()
-      :
+  VideoEngineImpl(const Config* config, bool owns_config)
+      : ViEBaseImpl(*config),
 #ifdef WEBRTC_VIDEO_ENGINE_CODEC_API
-        ViECodecImpl(ViEBaseImpl::shared_data())
+        ViECodecImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_CAPTURE_API
-        , ViECaptureImpl(ViEBaseImpl::shared_data())
+        ViECaptureImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_ENCRYPTION_API
-        , ViEEncryptionImpl(ViEBaseImpl::shared_data())
+        ViEEncryptionImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_FILE_API
-        , ViEFileImpl(ViEBaseImpl::shared_data())
+        ViEFileImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_IMAGE_PROCESS_API
-        , ViEImageProcessImpl(ViEBaseImpl::shared_data())
+        ViEImageProcessImpl(ViEBaseImpl::shared_data()),
 #endif
-        , ViENetworkImpl(ViEBaseImpl::shared_data())
+        ViENetworkImpl(ViEBaseImpl::shared_data()),
 #ifdef WEBRTC_VIDEO_ENGINE_RENDER_API
-        , ViERenderImpl(ViEBaseImpl::shared_data())
+        ViERenderImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_RTP_RTCP_API
-        , ViERTP_RTCPImpl(ViEBaseImpl::shared_data())
+        ViERTP_RTCPImpl(ViEBaseImpl::shared_data()),
 #endif
 #ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
-        , ViEExternalCodecImpl(ViEBaseImpl::shared_data())
+        ViEExternalCodecImpl(ViEBaseImpl::shared_data()),
 #endif
+        own_config_(owns_config ? config : NULL)
   {}
   virtual ~VideoEngineImpl() {}
+
+ private:
+  // Placeholder for the case where this owns the config.
+  scoped_ptr<const Config> own_config_;
 };
 
 }  // namespace webrtc
diff --git a/video_engine/vie_input_manager.cc b/video_engine/vie_input_manager.cc
index f775557..964c4df 100644
--- a/video_engine/vie_input_manager.cc
+++ b/video_engine/vie_input_manager.cc
@@ -26,8 +26,9 @@
 
 namespace webrtc {
 
-ViEInputManager::ViEInputManager(const int engine_id)
-    : engine_id_(engine_id),
+ViEInputManager::ViEInputManager(const int engine_id, const Config& config)
+    : config_(config),
+      engine_id_(engine_id),
       map_cs_(CriticalSectionWrapper::CreateCriticalSection()),
       device_info_cs_(CriticalSectionWrapper::CreateCriticalSection()),
       vie_frame_provider_map_(),
@@ -260,7 +261,7 @@
     return kViECaptureDeviceMaxNoDevicesAllocated;
   }
   ViECapturer* vie_capture = ViECapturer::CreateViECapture(
-      newcapture_id, engine_id_, device_unique_idUTF8,
+      newcapture_id, engine_id_, config_, device_unique_idUTF8,
       device_unique_idUTF8Length, *module_process_thread_);
   if (!vie_capture) {
   ReturnCaptureId(newcapture_id);
@@ -299,7 +300,8 @@
   }
 
   ViECapturer* vie_capture = ViECapturer::CreateViECapture(
-      newcapture_id, engine_id_, capture_module, *module_process_thread_);
+      newcapture_id, engine_id_, config_,
+      capture_module, *module_process_thread_);
   if (!vie_capture) {
   ReturnCaptureId(newcapture_id);
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideo, ViEId(engine_id_),
@@ -369,7 +371,7 @@
   }
 
   ViECapturer* vie_capture = ViECapturer::CreateViECapture(
-      newcapture_id, engine_id_, NULL, 0, *module_process_thread_);
+      newcapture_id, engine_id_, config_, NULL, 0, *module_process_thread_);
   if (!vie_capture) {
     ReturnCaptureId(newcapture_id);
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideo, ViEId(engine_id_),
diff --git a/video_engine/vie_input_manager.h b/video_engine/vie_input_manager.h
index d892131..e76c646 100644
--- a/video_engine/vie_input_manager.h
+++ b/video_engine/vie_input_manager.h
@@ -22,6 +22,7 @@
 
 namespace webrtc {
 
+class Config;
 class CriticalSectionWrapper;
 class ProcessThread;
 class RWLockWrapper;
@@ -33,7 +34,7 @@
 class ViEInputManager : private ViEManagerBase {
   friend class ViEInputManagerScoped;
  public:
-  explicit ViEInputManager(int engine_id);
+  ViEInputManager(int engine_id, const Config& config);
   ~ViEInputManager();
 
   void SetModuleProcessThread(ProcessThread* module_process_thread);
@@ -109,6 +110,7 @@
   // Gets the ViEFilePlayer for this file_id.
   ViEFilePlayer* ViEFilePlayerPtr(int file_id) const;
 
+  const Config& config_;
   int engine_id_;
   scoped_ptr<CriticalSectionWrapper> map_cs_;
   scoped_ptr<CriticalSectionWrapper> device_info_cs_;
diff --git a/video_engine/vie_shared_data.cc b/video_engine/vie_shared_data.cc
index 574aa9a..4e6ebcc 100644
--- a/video_engine/vie_shared_data.cc
+++ b/video_engine/vie_shared_data.cc
@@ -22,14 +22,15 @@
 // Active instance counter
 int ViESharedData::instance_counter_ = 0;
 
-ViESharedData::ViESharedData()
+ViESharedData::ViESharedData(const Config& config)
     : instance_id_(++instance_counter_),
       initialized_(false),
       number_cores_(CpuInfo::DetectNumberOfCores()),
       over_use_detector_options_(),
       channel_manager_(*new ViEChannelManager(instance_id_, number_cores_,
-                                              over_use_detector_options_)),
-      input_manager_(*new ViEInputManager(instance_id_)),
+                                              over_use_detector_options_,
+                                              config)),
+      input_manager_(*new ViEInputManager(instance_id_, config)),
       render_manager_(*new ViERenderManager(instance_id_)),
       module_process_thread_(ProcessThread::CreateProcessThread()),
       last_error_(0) {
diff --git a/video_engine/vie_shared_data.h b/video_engine/vie_shared_data.h
index 886cf67..4b28886 100644
--- a/video_engine/vie_shared_data.h
+++ b/video_engine/vie_shared_data.h
@@ -18,6 +18,7 @@
 
 namespace webrtc {
 
+class Config;
 class ProcessThread;
 class ViEChannelManager;
 class ViEInputManager;
@@ -25,7 +26,7 @@
 
 class ViESharedData {
  public:
-  ViESharedData();
+  ViESharedData(const Config& config);
   ~ViESharedData();
 
   bool Initialized() const;