diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index 0fe39cb63f..21c844e95a 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -1843,6 +1843,10 @@ bool WebRtcVideoMediaChannel::AddSendStream(const StreamParams& sp) { send_channel->set_stream_params(sp); + if (IsSimulcastStream(sp)) { + DisableAllExternalEncoders(send_channel, channel_id); + } + // Reset send codec after stream parameters changed. if (send_codec_) { if (!SetSendCodec(send_channel, *send_codec_, send_min_bitrate_, @@ -3908,6 +3912,24 @@ void WebRtcVideoMediaChannel::MaybeDisconnectCapturer(VideoCapturer* capturer) { } } +void WebRtcVideoMediaChannel::DisableAllExternalEncoders( + WebRtcVideoChannelSendInfo* send_channel, + int channel_id) { + const WebRtcVideoChannelSendInfo::EncoderMap& encoder_map = + send_channel->registered_encoders(); + for (WebRtcVideoChannelSendInfo::EncoderMap::const_iterator it = + encoder_map.begin(); it != encoder_map.end(); ++it) { + if (engine()->vie()->ext_codec()->DeRegisterExternalSendCodec( + channel_id, it->first) != 0) { + LOG_RTCERR1(DeregisterEncoderObserver, channel_id); + } + engine()->DestroyExternalEncoder(it->second); + } + send_channel->ClearRegisteredEncoders(); + + engine()->SetExternalEncoderFactory(NULL); +} + } // namespace cricket #endif // HAVE_WEBRTC_VIDEO diff --git a/talk/media/webrtc/webrtcvideoengine.h b/talk/media/webrtc/webrtcvideoengine.h index b818b0d143..ecacf1fd26 100644 --- a/talk/media/webrtc/webrtcvideoengine.h +++ b/talk/media/webrtc/webrtcvideoengine.h @@ -414,6 +414,11 @@ class WebRtcVideoMediaChannel : public talk_base::MessageHandler, // to one send channel, i.e. the last send channel. void MaybeDisconnectCapturer(VideoCapturer* capturer); + // Deregister and free all the external encoders previously register to + // |send_channel|. Also disable the external encoder factory. + void DisableAllExternalEncoders(WebRtcVideoChannelSendInfo* send_channel, + int channel_id); + // Global state. WebRtcVideoEngine* engine_; VoiceMediaChannel* voice_channel_; diff --git a/talk/media/webrtc/webrtcvideoengine_unittest.cc b/talk/media/webrtc/webrtcvideoengine_unittest.cc index 9860a8403e..371fb741da 100644 --- a/talk/media/webrtc/webrtcvideoengine_unittest.cc +++ b/talk/media/webrtc/webrtcvideoengine_unittest.cc @@ -1585,6 +1585,7 @@ TEST_F(WebRtcVideoEngineTestFake, RegisterEncoderIfFactoryIsGiven) { EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); } + TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderMultipleTimes) { encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); engine_.SetExternalEncoderFactory(&encoder_factory_);