From be7e26d22968dbd681d7fae9c217eabed3fd2459 Mon Sep 17 00:00:00 2001 From: "henrike@webrtc.org" Date: Fri, 21 Mar 2014 16:40:18 +0000 Subject: [PATCH] (Auto)update libjingle 63503990-> 63547048 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5751 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/media/webrtc/webrtcvideoengine.cc | 22 +++++++++++++++++++ talk/media/webrtc/webrtcvideoengine.h | 5 +++++ .../webrtc/webrtcvideoengine_unittest.cc | 1 + 3 files changed, 28 insertions(+) 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_);