Removes templating from CompositeMediaEngine.

Usage of templates makes it harder for tooling to help the user. This
can be experienced when trying to investigate compile failures and using
editor tools to browse the code.

This CL replaces usage of templates with injection of unique pointers to
interfaces that implements the behavior that previously was assumed by
the templated implementation.

Bug: webrtc:9883
Change-Id: Ica17af9646f68a9b063988f9e85d6acc8ca37c10
Reviewed-on: https://webrtc-review.googlesource.com/c/106703
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25668}
diff --git a/media/base/fakemediaengine.cc b/media/base/fakemediaengine.cc
index 55e38c6..b48206f 100644
--- a/media/base/fakemediaengine.cc
+++ b/media/base/fakemediaengine.cc
@@ -12,6 +12,7 @@
 
 #include <utility>
 
+#include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "rtc_base/checks.h"
 
@@ -552,10 +553,10 @@
 }
 
 FakeMediaEngine::FakeMediaEngine()
-    : CompositeMediaEngine<FakeVoiceEngine, FakeVideoEngine>(std::tuple<>(),
-                                                             std::tuple<>()),
-      voice_(&voice()),
-      video_(&video()) {}
+    : CompositeMediaEngine(absl::make_unique<FakeVoiceEngine>(),
+                           absl::make_unique<FakeVideoEngine>()),
+      voice_(static_cast<FakeVoiceEngine*>(&voice())),
+      video_(static_cast<FakeVideoEngine*>(&video())) {}
 FakeMediaEngine::~FakeMediaEngine() {}
 void FakeMediaEngine::SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
   voice_->SetCodecs(codecs);
diff --git a/media/base/fakemediaengine.h b/media/base/fakemediaengine.h
index 4821ad4..d7b44c5 100644
--- a/media/base/fakemediaengine.h
+++ b/media/base/fakemediaengine.h
@@ -554,8 +554,7 @@
   friend class FakeMediaEngine;
 };
 
-class FakeMediaEngine
-    : public CompositeMediaEngine<FakeVoiceEngine, FakeVideoEngine> {
+class FakeMediaEngine : public CompositeMediaEngine {
  public:
   FakeMediaEngine();
 
diff --git a/media/base/mediaengine.cc b/media/base/mediaengine.cc
index 76cac4b..94ebcad 100644
--- a/media/base/mediaengine.cc
+++ b/media/base/mediaengine.cc
@@ -10,6 +10,8 @@
 
 #include "media/base/mediaengine.h"
 
+#include <utility>
+
 #include "api/video/video_bitrate_allocation.h"
 #include "rtc_base/stringencode.h"
 
@@ -104,4 +106,83 @@
   return webrtc::RTCError::OK();
 }
 
+CompositeMediaEngine::CompositeMediaEngine(
+    std::unique_ptr<VoiceEngineInterface> voice_engine,
+    std::unique_ptr<VideoEngineInterface> video_engine)
+    : voice_engine_(std::move(voice_engine)),
+      video_engine_(std::move(video_engine)) {}
+
+CompositeMediaEngine::~CompositeMediaEngine() = default;
+
+bool CompositeMediaEngine::Init() {
+  voice().Init();
+  return true;
+}
+
+rtc::scoped_refptr<webrtc::AudioState> CompositeMediaEngine::GetAudioState()
+    const {
+  return voice().GetAudioState();
+}
+
+VoiceMediaChannel* CompositeMediaEngine::CreateChannel(
+    webrtc::Call* call,
+    const MediaConfig& config,
+    const AudioOptions& options,
+    const webrtc::CryptoOptions& crypto_options) {
+  return voice().CreateMediaChannel(call, config, options, crypto_options);
+}
+
+VideoMediaChannel* CompositeMediaEngine::CreateVideoChannel(
+    webrtc::Call* call,
+    const MediaConfig& config,
+    const VideoOptions& options,
+    const webrtc::CryptoOptions& crypto_options) {
+  return video().CreateMediaChannel(call, config, options, crypto_options);
+}
+
+const std::vector<AudioCodec>& CompositeMediaEngine::audio_send_codecs() {
+  return voice().send_codecs();
+}
+
+const std::vector<AudioCodec>& CompositeMediaEngine::audio_recv_codecs() {
+  return voice().recv_codecs();
+}
+
+RtpCapabilities CompositeMediaEngine::GetAudioCapabilities() {
+  return voice().GetCapabilities();
+}
+
+std::vector<VideoCodec> CompositeMediaEngine::video_codecs() {
+  return video().codecs();
+}
+
+RtpCapabilities CompositeMediaEngine::GetVideoCapabilities() {
+  return video().GetCapabilities();
+}
+
+bool CompositeMediaEngine::StartAecDump(rtc::PlatformFile file,
+                                        int64_t max_size_bytes) {
+  return voice().StartAecDump(file, max_size_bytes);
+}
+
+void CompositeMediaEngine::StopAecDump() {
+  voice().StopAecDump();
+}
+
+VoiceEngineInterface& CompositeMediaEngine::voice() {
+  return *voice_engine_.get();
+}
+
+VideoEngineInterface& CompositeMediaEngine::video() {
+  return *video_engine_.get();
+}
+
+const VoiceEngineInterface& CompositeMediaEngine::voice() const {
+  return *voice_engine_.get();
+}
+
+const VideoEngineInterface& CompositeMediaEngine::video() const {
+  return *video_engine_.get();
+}
+
 };  // namespace cricket
diff --git a/media/base/mediaengine.h b/media/base/mediaengine.h
index eede3af..1ddb36c 100644
--- a/media/base/mediaengine.h
+++ b/media/base/mediaengine.h
@@ -15,9 +15,8 @@
 #include <CoreAudio/CoreAudio.h>
 #endif
 
+#include <memory>
 #include <string>
-#include <tuple>
-#include <utility>
 #include <vector>
 
 #include "api/audio_codecs/audio_decoder_factory.h"
@@ -147,68 +146,45 @@
 
 // CompositeMediaEngine constructs a MediaEngine from separate
 // voice and video engine classes.
-template <class VOICE, class VIDEO>
 class CompositeMediaEngine : public MediaEngineInterface {
  public:
-  template <class... Args1, class... Args2>
-  CompositeMediaEngine(std::tuple<Args1...> first_args,
-                       std::tuple<Args2...> second_args)
-      : engines_(std::piecewise_construct,
-                 std::move(first_args),
-                 std::move(second_args)) {}
+  CompositeMediaEngine(std::unique_ptr<VoiceEngineInterface> audio_engine,
+                       std::unique_ptr<VideoEngineInterface> video_engine);
+  ~CompositeMediaEngine() override;
+  bool Init() override;
 
-  virtual ~CompositeMediaEngine() {}
-  virtual bool Init() {
-    voice().Init();
-    return true;
-  }
-
-  virtual rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const {
-    return voice().GetAudioState();
-  }
-  virtual VoiceMediaChannel* CreateChannel(
+  rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const override;
+  VoiceMediaChannel* CreateChannel(
       webrtc::Call* call,
       const MediaConfig& config,
       const AudioOptions& options,
-      const webrtc::CryptoOptions& crypto_options) {
-    return voice().CreateMediaChannel(call, config, options, crypto_options);
-  }
-  virtual VideoMediaChannel* CreateVideoChannel(
+      const webrtc::CryptoOptions& crypto_options) override;
+
+  VideoMediaChannel* CreateVideoChannel(
       webrtc::Call* call,
       const MediaConfig& config,
       const VideoOptions& options,
-      const webrtc::CryptoOptions& crypto_options) {
-    return video().CreateMediaChannel(call, config, options, crypto_options);
-  }
+      const webrtc::CryptoOptions& crypto_options) override;
 
-  virtual const std::vector<AudioCodec>& audio_send_codecs() {
-    return voice().send_codecs();
-  }
-  virtual const std::vector<AudioCodec>& audio_recv_codecs() {
-    return voice().recv_codecs();
-  }
-  virtual RtpCapabilities GetAudioCapabilities() {
-    return voice().GetCapabilities();
-  }
-  virtual std::vector<VideoCodec> video_codecs() { return video().codecs(); }
-  virtual RtpCapabilities GetVideoCapabilities() {
-    return video().GetCapabilities();
-  }
+  const std::vector<AudioCodec>& audio_send_codecs() override;
+  const std::vector<AudioCodec>& audio_recv_codecs() override;
+  RtpCapabilities GetAudioCapabilities() override;
 
-  virtual bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) {
-    return voice().StartAecDump(file, max_size_bytes);
-  }
+  std::vector<VideoCodec> video_codecs() override;
+  RtpCapabilities GetVideoCapabilities() override;
 
-  virtual void StopAecDump() { voice().StopAecDump(); }
+  bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) override;
+  void StopAecDump() override;
 
  protected:
-  VOICE& voice() { return engines_.first; }
-  VIDEO& video() { return engines_.second; }
-  const VOICE& voice() const { return engines_.first; }
-  const VIDEO& video() const { return engines_.second; }
+  VoiceEngineInterface& voice();
+  VideoEngineInterface& video();
+  const VoiceEngineInterface& voice() const;
+  const VideoEngineInterface& video() const;
 
  private:
-  std::pair<VOICE, VIDEO> engines_;
+  std::unique_ptr<VoiceEngineInterface> voice_engine_;
+  std::unique_ptr<VideoEngineInterface> video_engine_;
 };
 
 enum DataChannelType {