From 39ce11f7f65d773c09e540774900e206b5be06fc Mon Sep 17 00:00:00 2001 From: gyzhou Date: Mon, 12 Dec 2016 17:06:49 -0800 Subject: [PATCH] Revert of Support external audio mixer. (patchset #5 id:140001 of https://codereview.webrtc.org/2539213003/ ) Reason for revert: A interface change broke some downstream code in google3. Original issue's description: > Support external audio mixer in webrtc. > > An external audio mixer will be passed from PeerConnectionFactory to > AudioTransportProxy. > > BUG=webrtc:6457 > > Committed: https://crrev.com/f6bcac59e88c3be5ffd73bbb1098f2d82ee316a1 > Cr-Commit-Position: refs/heads/master@{#15556} TBR=solenberg@webrtc.org,aleloi@webrtc.org,deadbeef@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:6457 Review-Url: https://codereview.webrtc.org/2562333003 Cr-Commit-Position: refs/heads/master@{#15557} --- webrtc/api/peerconnectionfactory.cc | 63 ++++++++----------- webrtc/api/peerconnectionfactory.h | 6 +- webrtc/api/peerconnectioninterface.h | 15 ----- webrtc/audio/audio_receive_stream.cc | 2 +- webrtc/media/base/fakemediaengine.h | 9 ++- webrtc/media/base/mediaengine.h | 11 ++-- .../engine/nullwebrtcvideoengine_unittest.cc | 4 +- webrtc/media/engine/webrtcmediaengine.cc | 31 ++++----- webrtc/media/engine/webrtcmediaengine.h | 4 +- .../engine/webrtcmediaengine_unittest.cc | 3 +- webrtc/media/engine/webrtcvoiceengine.cc | 19 ++---- webrtc/media/engine/webrtcvoiceengine.h | 5 +- .../engine/webrtcvoiceengine_unittest.cc | 14 ++--- 13 files changed, 65 insertions(+), 121 deletions(-) diff --git a/webrtc/api/peerconnectionfactory.cc b/webrtc/api/peerconnectionfactory.cc index 9da6e57f94..e76701e486 100644 --- a/webrtc/api/peerconnectionfactory.cc +++ b/webrtc/api/peerconnectionfactory.cc @@ -57,9 +57,27 @@ rtc::scoped_refptr CreatePeerConnectionFactory( AudioDeviceModule* default_adm, cricket::WebRtcVideoEncoderFactory* encoder_factory, cricket::WebRtcVideoDecoderFactory* decoder_factory) { - return CreatePeerConnectionFactoryWithAudioMixer( - network_thread, worker_thread, signaling_thread, default_adm, - encoder_factory, decoder_factory, nullptr); + rtc::scoped_refptr pc_factory( + new rtc::RefCountedObject( + network_thread, + worker_thread, + signaling_thread, + default_adm, + CreateBuiltinAudioDecoderFactory(), + encoder_factory, + decoder_factory)); + + // Call Initialize synchronously but make sure its executed on + // |signaling_thread|. + MethodCall0 call( + pc_factory.get(), + &PeerConnectionFactory::Initialize); + bool result = call.Marshal(RTC_FROM_HERE, signaling_thread); + + if (!result) { + return nullptr; + } + return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory); } PeerConnectionFactory::PeerConnectionFactory() @@ -77,33 +95,6 @@ PeerConnectionFactory::PeerConnectionFactory() worker_thread_->Start(); } -rtc::scoped_refptr -CreatePeerConnectionFactoryWithAudioMixer( - rtc::Thread* network_thread, - rtc::Thread* worker_thread, - rtc::Thread* signaling_thread, - AudioDeviceModule* default_adm, - cricket::WebRtcVideoEncoderFactory* encoder_factory, - cricket::WebRtcVideoDecoderFactory* decoder_factory, - rtc::scoped_refptr audio_mixer) { - rtc::scoped_refptr pc_factory( - new rtc::RefCountedObject( - network_thread, worker_thread, signaling_thread, default_adm, - CreateBuiltinAudioDecoderFactory(), encoder_factory, decoder_factory, - audio_mixer)); - - // Call Initialize synchronously but make sure it is executed on - // |signaling_thread|. - MethodCall0 call( - pc_factory.get(), &PeerConnectionFactory::Initialize); - bool result = call.Marshal(RTC_FROM_HERE, signaling_thread); - - if (!result) { - return nullptr; - } - return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory); -} - PeerConnectionFactory::PeerConnectionFactory( rtc::Thread* network_thread, rtc::Thread* worker_thread, @@ -112,8 +103,7 @@ PeerConnectionFactory::PeerConnectionFactory( const rtc::scoped_refptr& audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer) + cricket::WebRtcVideoDecoderFactory* video_decoder_factory) : owns_ptrs_(false), wraps_current_thread_(false), network_thread_(network_thread), @@ -122,8 +112,7 @@ PeerConnectionFactory::PeerConnectionFactory( default_adm_(default_adm), audio_decoder_factory_(audio_decoder_factory), video_encoder_factory_(video_encoder_factory), - video_decoder_factory_(video_decoder_factory), - external_audio_mixer_(audio_mixer) { + video_decoder_factory_(video_decoder_factory) { RTC_DCHECK(network_thread); RTC_DCHECK(worker_thread); RTC_DCHECK(signaling_thread); @@ -347,8 +336,10 @@ rtc::Thread* PeerConnectionFactory::network_thread() { cricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() { ASSERT(worker_thread_ == rtc::Thread::Current()); return cricket::WebRtcMediaEngineFactory::Create( - default_adm_.get(), audio_decoder_factory_, video_encoder_factory_.get(), - video_decoder_factory_.get(), external_audio_mixer_); + default_adm_.get(), + audio_decoder_factory_, + video_encoder_factory_.get(), + video_decoder_factory_.get()); } } // namespace webrtc diff --git a/webrtc/api/peerconnectionfactory.h b/webrtc/api/peerconnectionfactory.h index 4b412bacb9..7a30ab4569 100644 --- a/webrtc/api/peerconnectionfactory.h +++ b/webrtc/api/peerconnectionfactory.h @@ -111,8 +111,7 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface { const rtc::scoped_refptr& audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer); + cricket::WebRtcVideoDecoderFactory* video_decoder_factory); virtual ~PeerConnectionFactory(); private: @@ -136,9 +135,6 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface { std::unique_ptr video_decoder_factory_; std::unique_ptr default_network_manager_; std::unique_ptr default_socket_factory_; - // External audio mixer. This can be NULL. In that case, internal audio mixer - // will be created and used. - rtc::scoped_refptr external_audio_mixer_; }; } // namespace webrtc diff --git a/webrtc/api/peerconnectioninterface.h b/webrtc/api/peerconnectioninterface.h index d4daf2435e..29badbd8bb 100644 --- a/webrtc/api/peerconnectioninterface.h +++ b/webrtc/api/peerconnectioninterface.h @@ -87,7 +87,6 @@ class WebRtcVideoEncoderFactory; namespace webrtc { class AudioDeviceModule; -class AudioMixer; class MediaConstraintsInterface; // MediaStream container interface. @@ -804,20 +803,6 @@ rtc::scoped_refptr CreatePeerConnectionFactory( cricket::WebRtcVideoEncoderFactory* encoder_factory, cricket::WebRtcVideoDecoderFactory* decoder_factory); -// Create a new instance of PeerConnectionFactoryInterface with external audio -// mixer. -// -// If |audio_mixer| is null, an internal audio mixer will be created and used. -rtc::scoped_refptr -CreatePeerConnectionFactoryWithAudioMixer( - rtc::Thread* network_thread, - rtc::Thread* worker_thread, - rtc::Thread* signaling_thread, - AudioDeviceModule* default_adm, - cricket::WebRtcVideoEncoderFactory* encoder_factory, - cricket::WebRtcVideoDecoderFactory* decoder_factory, - rtc::scoped_refptr audio_mixer); - // Create a new instance of PeerConnectionFactoryInterface. // Same thread is used as worker and network thread. inline rtc::scoped_refptr diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc index f46337afd1..8da0616f1d 100644 --- a/webrtc/audio/audio_receive_stream.cc +++ b/webrtc/audio/audio_receive_stream.cc @@ -293,7 +293,7 @@ int AudioReceiveStream::PreferredSampleRate() const { } int AudioReceiveStream::Ssrc() const { - return config_.rtp.remote_ssrc; + return config_.rtp.local_ssrc; } internal::AudioState* AudioReceiveStream::audio_state() const { diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h index 932427b9b4..dc547f8f10 100644 --- a/webrtc/media/base/fakemediaengine.h +++ b/webrtc/media/base/fakemediaengine.h @@ -753,10 +753,10 @@ class FakeBaseEngine { class FakeVoiceEngine : public FakeBaseEngine { public: - FakeVoiceEngine(webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_decoder_factory, - rtc::scoped_refptr audio_mixer) { + FakeVoiceEngine( + webrtc::AudioDeviceModule* adm, + const rtc::scoped_refptr& + audio_decoder_factory) { // Add a fake audio codec. Note that the name must not be "" as there are // sanity checks against that. codecs_.push_back(AudioCodec(101, "fake_audio_codec", 0, 0, 1)); @@ -864,7 +864,6 @@ class FakeMediaEngine : public: FakeMediaEngine() : CompositeMediaEngine(nullptr, - nullptr, nullptr) {} virtual ~FakeMediaEngine() {} diff --git a/webrtc/media/base/mediaengine.h b/webrtc/media/base/mediaengine.h index debc171360..5b7443b6f3 100644 --- a/webrtc/media/base/mediaengine.h +++ b/webrtc/media/base/mediaengine.h @@ -33,7 +33,6 @@ namespace webrtc { class AudioDeviceModule; -class AudioMixer; class Call; } @@ -111,11 +110,11 @@ class MediaEngineFactory { template class CompositeMediaEngine : public MediaEngineInterface { public: - CompositeMediaEngine(webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_decoder_factory, - rtc::scoped_refptr audio_mixer) - : voice_(adm, audio_decoder_factory, audio_mixer) {} + CompositeMediaEngine( + webrtc::AudioDeviceModule* adm, + const rtc::scoped_refptr& + audio_decoder_factory) + : voice_(adm, audio_decoder_factory) {} virtual ~CompositeMediaEngine() {} virtual bool Init() { video_.Init(); diff --git a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc index a8f2421610..c63dbfb010 100644 --- a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc +++ b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc @@ -25,9 +25,7 @@ class WebRtcMediaEngineNullVideo WebRtcVideoEncoderFactory* video_encoder_factory, WebRtcVideoDecoderFactory* video_decoder_factory) : CompositeMediaEngine( - adm, - audio_decoder_factory, - nullptr) { + adm, audio_decoder_factory) { video_.SetExternalDecoderFactory(video_decoder_factory); video_.SetExternalEncoderFactory(video_encoder_factory); } diff --git a/webrtc/media/engine/webrtcmediaengine.cc b/webrtc/media/engine/webrtcmediaengine.cc index c76840cf0d..1531be36b5 100644 --- a/webrtc/media/engine/webrtcmediaengine.cc +++ b/webrtc/media/engine/webrtcmediaengine.cc @@ -33,18 +33,13 @@ class WebRtcMediaEngine2 const rtc::scoped_refptr& audio_decoder_factory, WebRtcVideoEncoderFactory* video_encoder_factory, - WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer) + WebRtcVideoDecoderFactory* video_decoder_factory) #ifdef HAVE_WEBRTC_VIDEO : CompositeMediaEngine( - adm, - audio_decoder_factory, - audio_mixer){ + adm, audio_decoder_factory){ #else : CompositeMediaEngine( - adm, - audio_decoder_factory, - audio_mixer) { + adm, audio_decoder_factory) { #endif video_.SetExternalDecoderFactory(video_decoder_factory); video_.SetExternalEncoderFactory(video_encoder_factory); @@ -58,11 +53,9 @@ cricket::MediaEngineInterface* CreateWebRtcMediaEngine( const rtc::scoped_refptr& audio_decoder_factory, cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer) { - return new cricket::WebRtcMediaEngine2(adm, audio_decoder_factory, - video_encoder_factory, - video_decoder_factory, audio_mixer); + cricket::WebRtcVideoDecoderFactory* video_decoder_factory) { + return new cricket::WebRtcMediaEngine2( + adm, audio_decoder_factory, video_encoder_factory, video_decoder_factory); } void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine) { @@ -78,9 +71,9 @@ MediaEngineInterface* WebRtcMediaEngineFactory::Create( webrtc::AudioDeviceModule* adm, WebRtcVideoEncoderFactory* video_encoder_factory, WebRtcVideoDecoderFactory* video_decoder_factory) { - return CreateWebRtcMediaEngine( - adm, webrtc::CreateBuiltinAudioDecoderFactory(), video_encoder_factory, - video_decoder_factory, nullptr); + return CreateWebRtcMediaEngine(adm, + webrtc::CreateBuiltinAudioDecoderFactory(), + video_encoder_factory, video_decoder_factory); } // Used by PeerConnectionFactory to create a media engine passed into @@ -90,11 +83,9 @@ MediaEngineInterface* WebRtcMediaEngineFactory::Create( const rtc::scoped_refptr& audio_decoder_factory, WebRtcVideoEncoderFactory* video_encoder_factory, - WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer) { + WebRtcVideoDecoderFactory* video_decoder_factory) { return CreateWebRtcMediaEngine(adm, audio_decoder_factory, - video_encoder_factory, video_decoder_factory, - audio_mixer); + video_encoder_factory, video_decoder_factory); } namespace { diff --git a/webrtc/media/engine/webrtcmediaengine.h b/webrtc/media/engine/webrtcmediaengine.h index 3cca48f39c..49b050c593 100644 --- a/webrtc/media/engine/webrtcmediaengine.h +++ b/webrtc/media/engine/webrtcmediaengine.h @@ -21,7 +21,6 @@ namespace webrtc { class AudioDecoderFactory; class AudioDeviceModule; -class AudioMixer; } namespace cricket { class WebRtcVideoDecoderFactory; @@ -45,8 +44,7 @@ class WebRtcMediaEngineFactory { const rtc::scoped_refptr& audio_decoder_factory, WebRtcVideoEncoderFactory* video_encoder_factory, - WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer); + WebRtcVideoDecoderFactory* video_decoder_factory); }; // Verify that extension IDs are within 1-byte extension range and are not diff --git a/webrtc/media/engine/webrtcmediaengine_unittest.cc b/webrtc/media/engine/webrtcmediaengine_unittest.cc index 77fbc87beb..03e50a18c9 100644 --- a/webrtc/media/engine/webrtcmediaengine_unittest.cc +++ b/webrtc/media/engine/webrtcmediaengine_unittest.cc @@ -188,8 +188,7 @@ TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) { TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) { std::unique_ptr engine(WebRtcMediaEngineFactory::Create( - nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr, - nullptr)); + nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr)); EXPECT_TRUE(engine); } diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index a36f328705..2a0583c909 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -277,16 +277,10 @@ void GetOpusConfig(const AudioCodec& codec, voe_codec->rate = GetOpusBitrate(codec, *max_playback_rate); } -webrtc::AudioState::Config MakeAudioStateConfig( - VoEWrapper* voe_wrapper, - rtc::scoped_refptr audio_mixer) { +webrtc::AudioState::Config MakeAudioStateConfig(VoEWrapper* voe_wrapper) { webrtc::AudioState::Config config; config.voice_engine = voe_wrapper->engine(); - if (audio_mixer) { - config.audio_mixer = audio_mixer; - } else { - config.audio_mixer = webrtc::AudioMixerImpl::Create(); - } + config.audio_mixer = webrtc::AudioMixerImpl::Create(); return config; } @@ -546,17 +540,14 @@ bool WebRtcVoiceEngine::ToCodecInst(const AudioCodec& in, WebRtcVoiceEngine::WebRtcVoiceEngine( webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& decoder_factory, - rtc::scoped_refptr audio_mixer) - : WebRtcVoiceEngine(adm, decoder_factory, audio_mixer, new VoEWrapper()) { - audio_state_ = - webrtc::AudioState::Create(MakeAudioStateConfig(voe(), audio_mixer)); + const rtc::scoped_refptr& decoder_factory) + : WebRtcVoiceEngine(adm, decoder_factory, new VoEWrapper()) { + audio_state_ = webrtc::AudioState::Create(MakeAudioStateConfig(voe())); } WebRtcVoiceEngine::WebRtcVoiceEngine( webrtc::AudioDeviceModule* adm, const rtc::scoped_refptr& decoder_factory, - rtc::scoped_refptr audio_mixer, VoEWrapper* voe_wrapper) : adm_(adm), decoder_factory_(decoder_factory), voe_wrapper_(voe_wrapper) { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); diff --git a/webrtc/media/engine/webrtcvoiceengine.h b/webrtc/media/engine/webrtcvoiceengine.h index 224fcb20b6..633e7d3e95 100644 --- a/webrtc/media/engine/webrtcvoiceengine.h +++ b/webrtc/media/engine/webrtcvoiceengine.h @@ -34,7 +34,6 @@ namespace cricket { class AudioDeviceModule; -class AudioMixer; class AudioSource; class VoEWrapper; class WebRtcVoiceMediaChannel; @@ -49,13 +48,11 @@ class WebRtcVoiceEngine final : public webrtc::TraceCallback { WebRtcVoiceEngine( webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& decoder_factory, - rtc::scoped_refptr audio_mixer); + const rtc::scoped_refptr& decoder_factory); // Dependency injection for testing. WebRtcVoiceEngine( webrtc::AudioDeviceModule* adm, const rtc::scoped_refptr& decoder_factory, - rtc::scoped_refptr audio_mixer, VoEWrapper* voe_wrapper); ~WebRtcVoiceEngine() override; diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index 3ca7ec8b05..bddefdd145 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -84,7 +84,7 @@ TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { EXPECT_FALSE(voe.IsInited()); { cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, + &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), new FakeVoEWrapper(&voe)); EXPECT_TRUE(voe.IsInited()); } @@ -116,7 +116,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test { EXPECT_CALL(apm_, ApplyConfig(testing::_)); EXPECT_CALL(apm_, SetExtraOptions(testing::_)); EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0)); - engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory, nullptr, + engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory, new FakeVoEWrapper(&voe_))); send_parameters_.codecs.push_back(kPcmuCodec); recv_parameters_.codecs.push_back(kPcmuCodec); @@ -3466,7 +3466,7 @@ TEST(WebRtcVoiceEngineTest, StartupShutdown) { // If the VoiceEngine wants to gather available codecs early, that's fine but // we never want it to create a decoder at this stage. cricket::WebRtcVoiceEngine engine( - nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); + nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); webrtc::RtcEventLogNullImpl event_log; std::unique_ptr call( webrtc::Call::Create(webrtc::Call::Config(&event_log))); @@ -3483,7 +3483,7 @@ TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); { cricket::WebRtcVoiceEngine engine( - &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); + &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); webrtc::RtcEventLogNullImpl event_log; std::unique_ptr call( webrtc::Call::Create(webrtc::Call::Config(&event_log))); @@ -3551,7 +3551,7 @@ TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { // TODO(ossu): Why are the payload types of codecs with non-static payload // type assignments checked here? It shouldn't really matter. cricket::WebRtcVoiceEngine engine( - nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); + nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); for (const cricket::AudioCodec& codec : engine.send_codecs()) { if (codec.name == "CN" && codec.clockrate == 16000) { EXPECT_EQ(105, codec.id); @@ -3587,7 +3587,7 @@ TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { // Tests that VoE supports at least 32 channels TEST(WebRtcVoiceEngineTest, Has32Channels) { cricket::WebRtcVoiceEngine engine( - nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); + nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); webrtc::RtcEventLogNullImpl event_log; std::unique_ptr call( webrtc::Call::Create(webrtc::Call::Config(&event_log))); @@ -3620,7 +3620,7 @@ TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { // SetRecvParameters returns true. // I think it will become clear once audio decoder injection is completed. cricket::WebRtcVoiceEngine engine( - nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr); + nullptr, webrtc::CreateBuiltinAudioDecoderFactory()); webrtc::RtcEventLogNullImpl event_log; std::unique_ptr call( webrtc::Call::Create(webrtc::Call::Config(&event_log)));