diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc index 2bb104ac31..ac8f5f3640 100644 --- a/talk/media/webrtc/webrtcvideoengine2.cc +++ b/talk/media/webrtc/webrtcvideoengine2.cc @@ -207,11 +207,8 @@ static bool RtpExtensionsHaveChanged( return false; } -WebRtcVideoEncoderFactory2::~WebRtcVideoEncoderFactory2() { -} - std::vector -WebRtcVideoEncoderFactory2::CreateSimulcastVideoStreams( +WebRtcVideoChannel2::WebRtcVideoSendStream::CreateSimulcastVideoStreams( const VideoCodec& codec, const VideoOptions& options, size_t num_streams) { @@ -240,7 +237,8 @@ WebRtcVideoEncoderFactory2::CreateSimulcastVideoStreams( codec.framerate != 0 ? codec.framerate : kDefaultVideoMaxFramerate); } -std::vector WebRtcVideoEncoderFactory2::CreateVideoStreams( +std::vector +WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams( const VideoCodec& codec, const VideoOptions& options, size_t num_streams) { @@ -264,38 +262,22 @@ std::vector WebRtcVideoEncoderFactory2::CreateVideoStreams( return streams; } -void* WebRtcVideoEncoderFactory2::CreateVideoEncoderSettings( +void* WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings( const VideoCodec& codec, const VideoOptions& options) { if (CodecNameMatches(codec.name, kVp8CodecName)) { - webrtc::VideoCodecVP8* settings = new webrtc::VideoCodecVP8( - webrtc::VideoEncoder::GetDefaultVp8Settings()); - options.video_noise_reduction.Get(&settings->denoisingOn); - return settings; + encoder_settings_.vp8 = webrtc::VideoEncoder::GetDefaultVp8Settings(); + options.video_noise_reduction.Get(&encoder_settings_.vp8.denoisingOn); + return &encoder_settings_.vp8; } if (CodecNameMatches(codec.name, kVp9CodecName)) { - webrtc::VideoCodecVP9* settings = new webrtc::VideoCodecVP9( - webrtc::VideoEncoder::GetDefaultVp9Settings()); - options.video_noise_reduction.Get(&settings->denoisingOn); - return settings; + encoder_settings_.vp9 = webrtc::VideoEncoder::GetDefaultVp9Settings(); + options.video_noise_reduction.Get(&encoder_settings_.vp9.denoisingOn); + return &encoder_settings_.vp9; } return NULL; } -void WebRtcVideoEncoderFactory2::DestroyVideoEncoderSettings( - const VideoCodec& codec, - void* encoder_settings) { - if (encoder_settings == NULL) { - return; - } - if (CodecNameMatches(codec.name, kVp8CodecName)) { - delete reinterpret_cast(encoder_settings); - } - if (CodecNameMatches(codec.name, kVp9CodecName)) { - delete reinterpret_cast(encoder_settings); - } -} - DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler() : default_recv_ssrc_(0), default_renderer_(NULL) {} @@ -439,8 +421,7 @@ WebRtcVideoChannel2* WebRtcVideoEngine2::CreateChannel( voice_channel, options, external_encoder_factory_, - external_decoder_factory_, - GetVideoEncoderFactory()); + external_decoder_factory_); if (!channel->Init()) { delete channel; return NULL; @@ -579,10 +560,6 @@ bool WebRtcVideoEngine2::ShouldIgnoreTrace(const std::string& trace) { return false; } -WebRtcVideoEncoderFactory2* WebRtcVideoEngine2::GetVideoEncoderFactory() { - return &default_video_encoder_factory_; -} - std::vector WebRtcVideoEngine2::GetSupportedCodecs() const { std::vector supported_codecs = DefaultVideoCodecList(); @@ -618,13 +595,11 @@ WebRtcVideoChannel2::WebRtcVideoChannel2( VoiceMediaChannel* voice_channel, const VideoOptions& options, WebRtcVideoEncoderFactory* external_encoder_factory, - WebRtcVideoDecoderFactory* external_decoder_factory, - WebRtcVideoEncoderFactory2* encoder_factory) + WebRtcVideoDecoderFactory* external_decoder_factory) : unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), voice_channel_(voice_channel), external_encoder_factory_(external_encoder_factory), - external_decoder_factory_(external_decoder_factory), - encoder_factory_(encoder_factory) { + external_decoder_factory_(external_decoder_factory) { SetDefaultOptions(); options_.SetAll(options); webrtc::Call::Config config(this); @@ -862,7 +837,6 @@ bool WebRtcVideoChannel2::AddSendStream(const StreamParams& sp) { WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(call_.get(), external_encoder_factory_, - encoder_factory_, options_, send_codec_, sp, @@ -1353,14 +1327,12 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::VideoSendStreamParameters:: WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( webrtc::Call* call, WebRtcVideoEncoderFactory* external_encoder_factory, - WebRtcVideoEncoderFactory2* encoder_factory, const VideoOptions& options, const Settable& codec_settings, const StreamParams& sp, const std::vector& rtp_extensions) : call_(call), external_encoder_factory_(external_encoder_factory), - encoder_factory_(encoder_factory), stream_(NULL), parameters_(webrtc::VideoSendStream::Config(), options, codec_settings), allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false), @@ -1700,7 +1672,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( clamped_codec.width = width; clamped_codec.height = height; - encoder_config.streams = encoder_factory_->CreateVideoStreams( + encoder_config.streams = CreateVideoStreams( clamped_codec, parameters_.options, parameters_.config.rtp.ssrcs.size()); // Conference mode screencast uses 2 temporal layers split at 100kbit. @@ -1746,15 +1718,10 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetDimensions( CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); encoder_config.encoder_specific_settings = - encoder_factory_->CreateVideoEncoderSettings(codec_settings.codec, - parameters_.options); + ConfigureVideoEncoderSettings(codec_settings.codec, parameters_.options); bool stream_reconfigured = stream_->ReconfigureVideoEncoder(encoder_config); - encoder_factory_->DestroyVideoEncoderSettings( - codec_settings.codec, - encoder_config.encoder_specific_settings); - encoder_config.encoder_specific_settings = NULL; if (!stream_reconfigured) { @@ -1880,16 +1847,11 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { VideoCodecSettings codec_settings; parameters_.codec_settings.Get(&codec_settings); parameters_.encoder_config.encoder_specific_settings = - encoder_factory_->CreateVideoEncoderSettings(codec_settings.codec, - parameters_.options); + ConfigureVideoEncoderSettings(codec_settings.codec, parameters_.options); stream_ = call_->CreateVideoSendStream(parameters_.config, parameters_.encoder_config); - encoder_factory_->DestroyVideoEncoderSettings( - codec_settings.codec, - parameters_.encoder_config.encoder_specific_settings); - parameters_.encoder_config.encoder_specific_settings = NULL; if (sending_) { diff --git a/talk/media/webrtc/webrtcvideoengine2.h b/talk/media/webrtc/webrtcvideoengine2.h index f5a97a26a1..6ffff2b8a0 100644 --- a/talk/media/webrtc/webrtcvideoengine2.h +++ b/talk/media/webrtc/webrtcvideoengine2.h @@ -106,27 +106,6 @@ class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler { VideoRenderer* default_renderer_; }; -// TODO(pbos): Remove this class and just inline configuring code. -class WebRtcVideoEncoderFactory2 { - public: - virtual ~WebRtcVideoEncoderFactory2(); - virtual std::vector CreateVideoStreams( - const VideoCodec& codec, - const VideoOptions& options, - size_t num_streams); - - std::vector CreateSimulcastVideoStreams( - const VideoCodec& codec, - const VideoOptions& options, - size_t num_streams); - - virtual void* CreateVideoEncoderSettings(const VideoCodec& codec, - const VideoOptions& options); - - virtual void DestroyVideoEncoderSettings(const VideoCodec& codec, - void* encoder_settings); -}; - // CallFactory, overridden for testing to verify that webrtc::Call is configured // properly. class WebRtcCallFactory { @@ -187,8 +166,6 @@ class WebRtcVideoEngine2 : public sigslot::has_slots<> { rtc::CpuMonitor* cpu_monitor() { return cpu_monitor_.get(); } - virtual WebRtcVideoEncoderFactory2* GetVideoEncoderFactory(); - private: std::vector GetSupportedCodecs() const; @@ -201,7 +178,6 @@ class WebRtcVideoEngine2 : public sigslot::has_slots<> { bool initialized_; rtc::scoped_ptr cpu_monitor_; - WebRtcVideoEncoderFactory2 default_video_encoder_factory_; WebRtcCallFactory default_call_factory_; WebRtcCallFactory* call_factory_; @@ -221,8 +197,7 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, VoiceMediaChannel* voice_channel, const VideoOptions& options, WebRtcVideoEncoderFactory* external_encoder_factory, - WebRtcVideoDecoderFactory* external_decoder_factory, - WebRtcVideoEncoderFactory2* encoder_factory); + WebRtcVideoDecoderFactory* external_decoder_factory); ~WebRtcVideoChannel2(); bool Init(); @@ -301,7 +276,6 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, WebRtcVideoSendStream( webrtc::Call* call, WebRtcVideoEncoderFactory* external_encoder_factory, - WebRtcVideoEncoderFactory2* encoder_factory, const VideoOptions& options, const Settable& codec_settings, const StreamParams& sp, @@ -364,6 +338,24 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, bool is_screencast; }; + union VideoEncoderSettings { + webrtc::VideoCodecVP8 vp8; + webrtc::VideoCodecVP9 vp9; + }; + + static std::vector CreateVideoStreams( + const VideoCodec& codec, + const VideoOptions& options, + size_t num_streams); + static std::vector CreateSimulcastVideoStreams( + const VideoCodec& codec, + const VideoOptions& options, + size_t num_streams); + + void* ConfigureVideoEncoderSettings(const VideoCodec& codec, + const VideoOptions& options) + EXCLUSIVE_LOCKS_REQUIRED(lock_); + AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec) EXCLUSIVE_LOCKS_REQUIRED(lock_); void DestroyVideoEncoder(AllocatedEncoder* encoder) @@ -381,11 +373,11 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, webrtc::Call* const call_; WebRtcVideoEncoderFactory* const external_encoder_factory_ GUARDED_BY(lock_); - WebRtcVideoEncoderFactory2* const encoder_factory_ GUARDED_BY(lock_); rtc::CriticalSection lock_; webrtc::VideoSendStream* stream_ GUARDED_BY(lock_); VideoSendStreamParameters parameters_ GUARDED_BY(lock_); + VideoEncoderSettings encoder_settings_ GUARDED_BY(lock_); AllocatedEncoder allocated_encoder_ GUARDED_BY(lock_); Dimensions last_dimensions_ GUARDED_BY(lock_); @@ -496,7 +488,6 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, VoiceMediaChannel* const voice_channel_; WebRtcVideoEncoderFactory* const external_encoder_factory_; WebRtcVideoDecoderFactory* const external_decoder_factory_; - WebRtcVideoEncoderFactory2* const encoder_factory_; std::vector recv_codecs_; std::vector recv_rtp_extensions_; webrtc::Call::Config::BitrateConfig bitrate_config_;