diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/base/mediachannel.h | 7 | ||||
-rw-r--r-- | media/base/mediaengine.cc | 78 | ||||
-rw-r--r-- | media/webrtc/webrtcmediaengine.cc | 193 | ||||
-rw-r--r-- | media/webrtc/webrtcmediaengine.h | 37 | ||||
-rw-r--r-- | media/webrtc/webrtcvoiceengine.cc | 21 | ||||
-rw-r--r-- | media/webrtc/webrtcvoiceengine_unittest.cc | 25 |
6 files changed, 207 insertions, 154 deletions
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h index 3759acc..782973f 100644 --- a/media/base/mediachannel.h +++ b/media/base/mediachannel.h @@ -182,7 +182,6 @@ struct AudioOptions { recording_sample_rate.SetFrom(change.recording_sample_rate); playout_sample_rate.SetFrom(change.playout_sample_rate); dscp.SetFrom(change.dscp); - opus_fec.SetFrom(change.opus_fec); } bool operator==(const AudioOptions& o) const { @@ -208,8 +207,7 @@ struct AudioOptions { rx_agc_limiter == o.rx_agc_limiter && recording_sample_rate == o.recording_sample_rate && playout_sample_rate == o.playout_sample_rate && - dscp == o.dscp && - opus_fec == o.opus_fec; + dscp == o.dscp; } std::string ToString() const { @@ -240,7 +238,6 @@ struct AudioOptions { ost << ToStringIfSet("recording_sample_rate", recording_sample_rate); ost << ToStringIfSet("playout_sample_rate", playout_sample_rate); ost << ToStringIfSet("dscp", dscp); - ost << ToStringIfSet("opus_fec", opus_fec); ost << "}"; return ost.str(); } @@ -278,8 +275,6 @@ struct AudioOptions { Settable<uint32> playout_sample_rate; // Set DSCP value for packet sent from audio channel. Settable<bool> dscp; - // Set Opus FEC - Settable<bool> opus_fec; }; // Options that can be applied to a VideoMediaChannel or a VideoMediaEngine. diff --git a/media/base/mediaengine.cc b/media/base/mediaengine.cc index 289f229..d38a312 100644 --- a/media/base/mediaengine.cc +++ b/media/base/mediaengine.cc @@ -27,90 +27,40 @@ #include "talk/media/base/mediaengine.h" -namespace cricket { -const int MediaEngineInterface::kDefaultAudioDelayOffset = 0; -} - #if !defined(DISABLE_MEDIA_ENGINE_FACTORY) -#if defined(HAVE_LINPHONE) -#include "talk/media/other/linphonemediaengine.h" -#endif // HAVE_LINPHONE -#if defined(HAVE_WEBRTC_VOICE) -#include "talk/media/webrtc/webrtcvoiceengine.h" -#endif // HAVE_WEBRTC_VOICE -#if defined(HAVE_WEBRTC_VIDEO) -#include "talk/media/webrtc/webrtcvideoengine.h" -#endif // HAVE_WEBRTC_VIDEO -#if defined(HAVE_LMI) -#include "talk/media/base/hybridvideoengine.h" -#include "talk/media/lmi/lmimediaengine.h" -#endif // HAVE_LMI +#if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO) +#include "talk/media/webrtc/webrtcmediaengine.h" +#endif // HAVE_WEBRTC_VOICE && HAVE_WEBRTC_VIDEO + #ifdef HAVE_CONFIG_H #include "config.h" #endif // HAVE_CONFIG namespace cricket { -#if defined(HAVE_WEBRTC_VOICE) -#define AUDIO_ENG_NAME WebRtcVoiceEngine -#else -#define AUDIO_ENG_NAME NullVoiceEngine -#endif - -#if defined(HAVE_WEBRTC_VIDEO) -#if !defined(HAVE_LMI) -template<> -CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine>:: - CompositeMediaEngine() { - video_.SetVoiceEngine(&voice_); -} -#define VIDEO_ENG_NAME WebRtcVideoEngine -#else -// If we have both WebRtcVideoEngine and LmiVideoEngine, enable dual-stack. -// This small class here allows us to hook the WebRtcVideoChannel up to -// the capturer owned by the LMI engine, without infecting the rest of the -// HybridVideoEngine classes with this abstraction violation. -class WebRtcLmiHybridVideoEngine - : public HybridVideoEngine<WebRtcVideoEngine, LmiVideoEngine> { - public: - void SetVoiceEngine(WebRtcVoiceEngine* engine) { - video1_.SetVoiceEngine(engine); - } -}; -template<> -CompositeMediaEngine<WebRtcVoiceEngine, WebRtcLmiHybridVideoEngine>:: - CompositeMediaEngine() { - video_.SetVoiceEngine(&voice_); -} -#define VIDEO_ENG_NAME WebRtcLmiHybridVideoEngine -#endif -#elif defined(HAVE_LMI) -#define VIDEO_ENG_NAME LmiVideoEngine -#else -#define VIDEO_ENG_NAME NullVideoEngine -#endif MediaEngineFactory::MediaEngineCreateFunction MediaEngineFactory::create_function_ = NULL; + MediaEngineFactory::MediaEngineCreateFunction MediaEngineFactory::SetCreateFunction(MediaEngineCreateFunction function) { MediaEngineCreateFunction old_function = create_function_; create_function_ = function; return old_function; -}; +} +// TODO(pthatcher): Remove this method and require all the users of +// media engines to choose one explictly, or at least remove the +// default behavior and require calling SetCreateFunction explictly. MediaEngineInterface* MediaEngineFactory::Create() { if (create_function_) { return create_function_(); - } else { -#if defined(HAVE_LINPHONE) - return new LinphoneMediaEngine("", ""); -#elif defined(AUDIO_ENG_NAME) && defined(VIDEO_ENG_NAME) - return new CompositeMediaEngine<AUDIO_ENG_NAME, VIDEO_ENG_NAME>(); -#else - return new NullMediaEngine(); -#endif } +#if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO) + return WebRtcMediaEngineFactory::Create(); +#else + return new NullMediaEngine(); +#endif // HAVE_WEBRTC_VIDEO && HAVE_WEBRTC_VOICE } }; // namespace cricket diff --git a/media/webrtc/webrtcmediaengine.cc b/media/webrtc/webrtcmediaengine.cc index 445564c..2dae423 100644 --- a/media/webrtc/webrtcmediaengine.cc +++ b/media/webrtc/webrtcmediaengine.cc @@ -26,7 +26,49 @@ */ #include "talk/media/webrtc/webrtcmediaengine.h" +#include "talk/media/webrtc/webrtcvideoengine.h" +#ifdef WEBRTC_CHROMIUM_BUILD +#include "talk/media/webrtc/webrtcvideoengine2.h" +#endif +#include "talk/media/webrtc/webrtcvoiceengine.h" +#ifdef WEBRTC_CHROMIUM_BUILD #include "webrtc/system_wrappers/interface/field_trial.h" +#endif + +namespace cricket { + +class WebRtcMediaEngine : + public CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine> { + public: + WebRtcMediaEngine() {} + WebRtcMediaEngine(webrtc::AudioDeviceModule* adm, + webrtc::AudioDeviceModule* adm_sc, + WebRtcVideoEncoderFactory* encoder_factory, + WebRtcVideoDecoderFactory* decoder_factory) { + voice_.SetAudioDeviceModule(adm, adm_sc); + video_.SetVoiceEngine(&voice_); + video_.EnableTimedRender(); + video_.SetExternalEncoderFactory(encoder_factory); + video_.SetExternalDecoderFactory(decoder_factory); + } +}; + +#ifdef WEBRTC_CHROMIUM_BUILD +class WebRtcMediaEngine2 : + public CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine2> { + public: + WebRtcMediaEngine2(webrtc::AudioDeviceModule* adm, + webrtc::AudioDeviceModule* adm_sc, + WebRtcVideoEncoderFactory* encoder_factory, + WebRtcVideoDecoderFactory* decoder_factory) { + voice_.SetAudioDeviceModule(adm, adm_sc); + video_.SetVoiceEngine(&voice_); + video_.EnableTimedRender(); + } +}; +#endif // WEBRTC_CHROMIUM_BUILD + +} // namespace cricket WRME_EXPORT cricket::MediaEngineInterface* CreateWebRtcMediaEngine( @@ -40,19 +82,154 @@ cricket::MediaEngineInterface* CreateWebRtcMediaEngine( adm, adm_sc, encoder_factory, decoder_factory); } #endif // WEBRTC_CHROMIUM_BUILD + // This is just to get a diff to run pulse. return new cricket::WebRtcMediaEngine( adm, adm_sc, encoder_factory, decoder_factory); } WRME_EXPORT void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine) { -#ifdef WEBRTC_CHROMIUM_BUILD - if (webrtc::field_trial::FindFullName("WebRTC-NewVideoAPI") == "Enabled") { - delete static_cast<cricket::WebRtcMediaEngine2*>(media_engine); - } else { -#endif // WEBRTC_CHROMIUM_BUILD - delete static_cast<cricket::WebRtcMediaEngine*>(media_engine); -#ifdef WEBRTC_CHROMIUM_BUILD + delete media_engine; +} + +namespace cricket { + +class DelegatingWebRtcMediaEngine : public cricket::MediaEngineInterface { + public: + DelegatingWebRtcMediaEngine( + webrtc::AudioDeviceModule* adm, + webrtc::AudioDeviceModule* adm_sc, + WebRtcVideoEncoderFactory* encoder_factory, + WebRtcVideoDecoderFactory* decoder_factory) + : delegate_(CreateWebRtcMediaEngine( + adm, adm_sc, encoder_factory, decoder_factory)) { } -#endif // WEBRTC_CHROMIUM_BUILD + virtual ~DelegatingWebRtcMediaEngine() { + DestroyWebRtcMediaEngine(delegate_); + } + virtual bool Init(rtc::Thread* worker_thread) OVERRIDE { + return delegate_->Init(worker_thread); + } + virtual void Terminate() OVERRIDE { + delegate_->Terminate(); + } + virtual int GetCapabilities() OVERRIDE { + return delegate_->GetCapabilities(); + } + virtual VoiceMediaChannel* CreateChannel() OVERRIDE { + return delegate_->CreateChannel(); + } + virtual VideoMediaChannel* CreateVideoChannel( + VoiceMediaChannel* voice_media_channel) OVERRIDE { + return delegate_->CreateVideoChannel(voice_media_channel); + } + virtual SoundclipMedia* CreateSoundclip() OVERRIDE { + return delegate_->CreateSoundclip(); + } + virtual AudioOptions GetAudioOptions() const OVERRIDE { + return delegate_->GetAudioOptions(); + } + virtual bool SetAudioOptions(const AudioOptions& options) OVERRIDE { + return delegate_->SetAudioOptions(options); + } + virtual bool SetVideoOptions(const VideoOptions& options) OVERRIDE { + return delegate_->SetVideoOptions(options); + } + virtual bool SetAudioDelayOffset(int offset) OVERRIDE { + return delegate_->SetAudioDelayOffset(offset); + } + virtual bool SetDefaultVideoEncoderConfig( + const VideoEncoderConfig& config) OVERRIDE { + return delegate_->SetDefaultVideoEncoderConfig(config); + } + virtual VideoEncoderConfig GetDefaultVideoEncoderConfig() const OVERRIDE { + return delegate_->GetDefaultVideoEncoderConfig(); + } + virtual bool SetSoundDevices( + const Device* in_device, const Device* out_device) OVERRIDE { + return delegate_->SetSoundDevices(in_device, out_device); + } + virtual bool GetOutputVolume(int* level) OVERRIDE { + return delegate_->GetOutputVolume(level); + } + virtual bool SetOutputVolume(int level) OVERRIDE { + return delegate_->SetOutputVolume(level); + } + virtual int GetInputLevel() OVERRIDE { + return delegate_->GetInputLevel(); + } + virtual bool SetLocalMonitor(bool enable) OVERRIDE { + return delegate_->SetLocalMonitor(enable); + } + virtual bool SetLocalRenderer(VideoRenderer* renderer) OVERRIDE { + return delegate_->SetLocalRenderer(renderer); + } + virtual const std::vector<AudioCodec>& audio_codecs() OVERRIDE { + return delegate_->audio_codecs(); + } + virtual const std::vector<RtpHeaderExtension>& + audio_rtp_header_extensions() OVERRIDE { + return delegate_->audio_rtp_header_extensions(); + } + virtual const std::vector<VideoCodec>& video_codecs() OVERRIDE { + return delegate_->video_codecs(); + } + virtual const std::vector<RtpHeaderExtension>& + video_rtp_header_extensions() OVERRIDE { + return delegate_->video_rtp_header_extensions(); + } + virtual void SetVoiceLogging(int min_sev, const char* filter) OVERRIDE { + delegate_->SetVoiceLogging(min_sev, filter); + } + virtual void SetVideoLogging(int min_sev, const char* filter) OVERRIDE { + delegate_->SetVideoLogging(min_sev, filter); + } + virtual bool StartAecDump(rtc::PlatformFile file) OVERRIDE { + return delegate_->StartAecDump(file); + } + virtual bool RegisterVoiceProcessor( + uint32 ssrc, VoiceProcessor* video_processor, + MediaProcessorDirection direction) OVERRIDE { + return delegate_->RegisterVoiceProcessor(ssrc, video_processor, direction); + } + virtual bool UnregisterVoiceProcessor( + uint32 ssrc, VoiceProcessor* video_processor, + MediaProcessorDirection direction) OVERRIDE { + return delegate_->UnregisterVoiceProcessor(ssrc, video_processor, + direction); + } + virtual VideoFormat GetStartCaptureFormat() const OVERRIDE { + return delegate_->GetStartCaptureFormat(); + } + virtual sigslot::repeater2<VideoCapturer*, CaptureState>& + SignalVideoCaptureStateChange() { + return delegate_->SignalVideoCaptureStateChange(); + } + + private: + cricket::MediaEngineInterface* delegate_; +}; + +// Used by ChannelManager when no media engine is passed in to it +// explicitly (acts as a default). +MediaEngineInterface* WebRtcMediaEngineFactory::Create() { + return new cricket::WebRtcMediaEngine(); +} + +// Used by PeerConnectionFactory and to create a media engine passed +// into ChannelManager. +MediaEngineInterface* WebRtcMediaEngineFactory::Create( + webrtc::AudioDeviceModule* adm, + webrtc::AudioDeviceModule* adm_sc, + WebRtcVideoEncoderFactory* encoder_factory, + WebRtcVideoDecoderFactory* decoder_factory) { +#if !defined(LIBPEERCONNECTION_LIB) && \ + !defined(LIBPEERCONNECTION_IMPLEMENTATION) + return new cricket::DelegatingWebRtcMediaEngine(); +#else + return CreateWebRtcMediaEngine(adm, adm_sc, encoder_factory, decoder_factory); +#endif // !defined(LIBPEERCONNECTION_LIB) && + // !defined(LIBPEERCONNECTION_IMPLEMENTATION) } + +} // namespace cricket diff --git a/media/webrtc/webrtcmediaengine.h b/media/webrtc/webrtcmediaengine.h index 701417c..efca26c 100644 --- a/media/webrtc/webrtcmediaengine.h +++ b/media/webrtc/webrtcmediaengine.h @@ -40,7 +40,6 @@ class WebRtcVideoDecoderFactory; class WebRtcVideoEncoderFactory; } - #if !defined(LIBPEERCONNECTION_LIB) && \ !defined(LIBPEERCONNECTION_IMPLEMENTATION) @@ -53,11 +52,15 @@ cricket::MediaEngineInterface* CreateWebRtcMediaEngine( WRME_EXPORT void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine); +#endif // !defined(LIBPEERCONNECTION_LIB) && + // !defined(LIBPEERCONNECTION_IMPLEMENTATION) + namespace cricket { -class WebRtcMediaEngine : public cricket::MediaEngineInterface { +class WebRtcMediaEngineFactory { public: - WebRtcMediaEngine( + static MediaEngineInterface* Create(); + static MediaEngineInterface* Create( webrtc::AudioDeviceModule* adm, webrtc::AudioDeviceModule* adm_sc, cricket::WebRtcVideoEncoderFactory* encoder_factory, @@ -189,35 +192,9 @@ class WebRtcMediaEngine : public WebRtcCompositeMediaEngine { WebRtcMediaEngine(webrtc::AudioDeviceModule* adm, webrtc::AudioDeviceModule* adm_sc, WebRtcVideoEncoderFactory* encoder_factory, - WebRtcVideoDecoderFactory* decoder_factory) { - voice_.SetAudioDeviceModule(adm, adm_sc); - video_.SetVoiceEngine(&voice_); - video_.EnableTimedRender(); - video_.SetExternalEncoderFactory(encoder_factory); - video_.SetExternalDecoderFactory(decoder_factory); - } + WebRtcVideoDecoderFactory* decoder_factory); }; -#ifdef WEBRTC_CHROMIUM_BUILD -typedef CompositeMediaEngine<WebRtcVoiceEngine, WebRtcVideoEngine2> - WebRtcCompositeMediaEngine2; - -class WebRtcMediaEngine2 : public WebRtcCompositeMediaEngine2 { - public: - WebRtcMediaEngine2(webrtc::AudioDeviceModule* adm, - webrtc::AudioDeviceModule* adm_sc, - WebRtcVideoEncoderFactory* encoder_factory, - WebRtcVideoDecoderFactory* decoder_factory) { - voice_.SetAudioDeviceModule(adm, adm_sc); - video_.SetVoiceEngine(&voice_); - video_.EnableTimedRender(); - } -}; -#endif - } // namespace cricket -#endif // !defined(LIBPEERCONNECTION_LIB) && - // !defined(LIBPEERCONNECTION_IMPLEMENTATION) - #endif // TALK_MEDIA_WEBRTCMEDIAENGINE_H_ diff --git a/media/webrtc/webrtcvoiceengine.cc b/media/webrtc/webrtcvoiceengine.cc index 81a6cdc..5cf53e4 100644 --- a/media/webrtc/webrtcvoiceengine.cc +++ b/media/webrtc/webrtcvoiceengine.cc @@ -237,7 +237,6 @@ static AudioOptions GetDefaultEngineOptions() { options.experimental_aec.Set(false); options.experimental_ns.Set(false); options.aec_dump.Set(false); - options.opus_fec.Set(false); return options; } @@ -430,15 +429,6 @@ static bool IsOpusFecEnabled(const AudioCodec& codec) { return codec.GetParam(kCodecParamUseInbandFec, &value) && value == 1; } -// Set params[kCodecParamUseInbandFec]. Caller should make sure codec is Opus. -static void SetOpusFec(AudioCodec* codec, bool opus_fec) { - if (opus_fec) { - codec->SetParam(kCodecParamUseInbandFec, 1); - } else { - codec->RemoveParam(kCodecParamUseInbandFec); - } -} - void WebRtcVoiceEngine::ConstructCodecs() { LOG(LS_INFO) << "WebRtc VoiceEngine codecs:"; int ncodecs = voe_wrapper_->codec()->NumOfCodecs(); @@ -483,7 +473,6 @@ void WebRtcVoiceEngine::ConstructCodecs() { } // TODO(hellner): Add ptime, sprop-stereo, stereo and useinbandfec // when they can be set to values other than the default. - SetOpusFec(&codec, false); } codecs_.push_back(codec); } else { @@ -916,16 +905,6 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { } } - bool opus_fec; - if (options.opus_fec.Get(&opus_fec)) { - LOG(LS_INFO) << "Opus FEC is enabled? " << opus_fec; - for (std::vector<AudioCodec>::iterator it = codecs_.begin(); - it != codecs_.end(); ++it) { - if (IsOpus(*it)) - SetOpusFec(&(*it), opus_fec); - } - } - return true; } diff --git a/media/webrtc/webrtcvoiceengine_unittest.cc b/media/webrtc/webrtcvoiceengine_unittest.cc index 1798d1d..89d4c4d 100644 --- a/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/media/webrtc/webrtcvoiceengine_unittest.cc @@ -1230,31 +1230,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) { } #endif // USE_WEBRTC_DEV_BRANCH -// Test AudioOptions controls whether opus FEC is supported in codec list. -TEST_F(WebRtcVoiceEngineTestFake, OpusFecViaOptions) { - EXPECT_TRUE(SetupEngine()); - std::vector<cricket::AudioCodec> codecs = engine_.codecs(); - int value; - for (std::vector<cricket::AudioCodec>::const_iterator it = codecs.begin(); - it != codecs.end(); ++it) { - if (_stricmp(it->name.c_str(), cricket::kOpusCodecName) == 0) { - EXPECT_FALSE(it->GetParam(cricket::kCodecParamUseInbandFec, &value)); - } - } - - cricket::AudioOptions options; - options.opus_fec.Set(true); - EXPECT_TRUE(engine_.SetOptions(options)); - codecs = engine_.codecs(); - for (std::vector<cricket::AudioCodec>::const_iterator it = codecs.begin(); - it != codecs.end(); ++it) { - if (_stricmp(it->name.c_str(), cricket::kOpusCodecName) == 0) { - EXPECT_TRUE(it->GetParam(cricket::kCodecParamUseInbandFec, &value)); - EXPECT_EQ(1, value); - } - } -} - // Test that we can apply CELT with stereo mode but fail with mono mode. TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCelt) { EXPECT_TRUE(SetupEngine()); |