diff --git a/webrtc/media/base/mediaengine.h b/webrtc/media/base/mediaengine.h index edf0cb0f30..d1d162370d 100644 --- a/webrtc/media/base/mediaengine.h +++ b/webrtc/media/base/mediaengine.h @@ -74,7 +74,7 @@ class MediaEngineInterface { virtual const std::vector& audio_send_codecs() = 0; virtual const std::vector& audio_recv_codecs() = 0; virtual RtpCapabilities GetAudioCapabilities() = 0; - virtual const std::vector video_codecs() = 0; + virtual const std::vector& video_codecs() = 0; virtual RtpCapabilities GetVideoCapabilities() = 0; // Starts AEC dump using existing file, a maximum file size in bytes can be @@ -147,7 +147,7 @@ class CompositeMediaEngine : public MediaEngineInterface { virtual RtpCapabilities GetAudioCapabilities() { return voice_.GetCapabilities(); } - virtual const std::vector video_codecs() { + virtual const std::vector& video_codecs() { return video_.codecs(); } virtual RtpCapabilities GetVideoCapabilities() { diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index dfdae5ea99..3cacc7da82 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -543,6 +543,7 @@ WebRtcVideoEngine2::WebRtcVideoEngine2() external_decoder_factory_(NULL), external_encoder_factory_(NULL) { LOG(LS_INFO) << "WebRtcVideoEngine2::WebRtcVideoEngine2()"; + video_codecs_ = GetSupportedCodecs(external_encoder_factory_); } WebRtcVideoEngine2::~WebRtcVideoEngine2() { @@ -565,8 +566,8 @@ WebRtcVideoChannel2* WebRtcVideoEngine2::CreateChannel( external_decoder_factory_); } -const std::vector WebRtcVideoEngine2::codecs() const { - return GetSupportedCodecs(external_encoder_factory_); +const std::vector& WebRtcVideoEngine2::codecs() const { + return video_codecs_; } RtpCapabilities WebRtcVideoEngine2::GetCapabilities() const { @@ -613,6 +614,8 @@ void WebRtcVideoEngine2::SetExternalEncoderFactory( encoder_factory = simulcast_encoder_factory_.get(); } external_encoder_factory_ = encoder_factory; + + video_codecs_ = GetSupportedCodecs(encoder_factory); } static std::vector GetSupportedCodecs( diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index 1032e9c7e0..ef893d2e98 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h @@ -105,7 +105,7 @@ class WebRtcVideoEngine2 { const MediaConfig& config, const VideoOptions& options); - const std::vector codecs() const; + const std::vector& codecs() const; RtpCapabilities GetCapabilities() const; // Set a WebRtcVideoDecoderFactory for external decoding. Video engine does @@ -119,6 +119,8 @@ class WebRtcVideoEngine2 { WebRtcVideoEncoderFactory* encoder_factory); private: + std::vector video_codecs_; + bool initialized_; WebRtcVideoDecoderFactory* external_decoder_factory_; diff --git a/webrtc/pc/channelmanager.cc b/webrtc/pc/channelmanager.cc index fb6f44f846..06475e9eaa 100644 --- a/webrtc/pc/channelmanager.cc +++ b/webrtc/pc/channelmanager.cc @@ -29,9 +29,6 @@ namespace cricket { -static bool IsRtxCodec(const VideoCodec& codec) { - return _stricmp(kRtxCodecName, codec.name.c_str()) == 0; -} using rtc::Bind; @@ -140,13 +137,18 @@ void ChannelManager::GetSupportedAudioRtpHeaderExtensions( *ext = media_engine_->GetAudioCapabilities().header_extensions; } -std::vector ChannelManager::GetSupportedVideoCodecs() const { - std::vector codecs = media_engine_->video_codecs(); - if (!enable_rtx_) { - codecs.erase(std::remove_if(codecs.begin(), codecs.end(), &IsRtxCodec), - codecs.end()); +void ChannelManager::GetSupportedVideoCodecs( + std::vector* codecs) const { + codecs->clear(); + + std::vector::const_iterator it; + for (it = media_engine_->video_codecs().begin(); + it != media_engine_->video_codecs().end(); ++it) { + if (!enable_rtx_ && _stricmp(kRtxCodecName, it->name.c_str()) == 0) { + continue; + } + codecs->push_back(*it); } - return codecs; } void ChannelManager::GetSupportedVideoRtpHeaderExtensions( diff --git a/webrtc/pc/channelmanager.h b/webrtc/pc/channelmanager.h index 68b1ab2feb..15a3752c44 100644 --- a/webrtc/pc/channelmanager.h +++ b/webrtc/pc/channelmanager.h @@ -75,7 +75,7 @@ class ChannelManager { void GetSupportedAudioSendCodecs(std::vector* codecs) const; void GetSupportedAudioReceiveCodecs(std::vector* codecs) const; void GetSupportedAudioRtpHeaderExtensions(RtpHeaderExtensions* ext) const; - std::vector GetSupportedVideoCodecs() const; + void GetSupportedVideoCodecs(std::vector* codecs) const; void GetSupportedVideoRtpHeaderExtensions(RtpHeaderExtensions* ext) const; void GetSupportedDataCodecs(std::vector* codecs) const; diff --git a/webrtc/pc/channelmanager_unittest.cc b/webrtc/pc/channelmanager_unittest.cc index 34b347b3ff..174d064b05 100644 --- a/webrtc/pc/channelmanager_unittest.cc +++ b/webrtc/pc/channelmanager_unittest.cc @@ -173,17 +173,17 @@ TEST_F(ChannelManagerTest, SetVideoRtxEnabled) { const VideoCodec rtx_codec(96, "rtx"); // By default RTX is disabled. - codecs = cm_->GetSupportedVideoCodecs(); + cm_->GetSupportedVideoCodecs(&codecs); EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec)); // Enable and check. EXPECT_TRUE(cm_->SetVideoRtxEnabled(true)); - codecs = cm_->GetSupportedVideoCodecs(); + cm_->GetSupportedVideoCodecs(&codecs); EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec)); // Disable and check. EXPECT_TRUE(cm_->SetVideoRtxEnabled(false)); - codecs = cm_->GetSupportedVideoCodecs(); + cm_->GetSupportedVideoCodecs(&codecs); EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec)); // Cannot toggle rtx after initialization. @@ -194,7 +194,7 @@ TEST_F(ChannelManagerTest, SetVideoRtxEnabled) { // Can set again after terminate. cm_->Terminate(); EXPECT_TRUE(cm_->SetVideoRtxEnabled(true)); - codecs = cm_->GetSupportedVideoCodecs(); + cm_->GetSupportedVideoCodecs(&codecs); EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec)); } diff --git a/webrtc/pc/mediasession.cc b/webrtc/pc/mediasession.cc index 0ebc766039..ebba9acbcb 100644 --- a/webrtc/pc/mediasession.cc +++ b/webrtc/pc/mediasession.cc @@ -1274,7 +1274,7 @@ MediaSessionDescriptionFactory::MediaSessionDescriptionFactory( channel_manager->GetSupportedAudioReceiveCodecs(&audio_recv_codecs_); channel_manager->GetSupportedAudioSendCodecs(&audio_send_codecs_); channel_manager->GetSupportedAudioRtpHeaderExtensions(&audio_rtp_extensions_); - video_codecs_ = channel_manager->GetSupportedVideoCodecs(); + channel_manager->GetSupportedVideoCodecs(&video_codecs_); channel_manager->GetSupportedVideoRtpHeaderExtensions(&video_rtp_extensions_); channel_manager->GetSupportedDataCodecs(&data_codecs_); NegotiateCodecs(audio_recv_codecs_, audio_send_codecs_,