| Index: webrtc/media/engine/webrtcvideoengine2.cc
|
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
|
| index 02de6b8e6bd499ec67f44b337efc74e1d48a8c5f..daffc2fd3419f66ff615a90fd7a576d43fd744c9 100644
|
| --- a/webrtc/media/engine/webrtcvideoengine2.cc
|
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc
|
| @@ -1616,6 +1616,8 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer(
|
| }
|
| }
|
| capturer_ = capturer;
|
| + // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since
|
| + // that might cause a lock order inversion.
|
| capturer_->AddOrUpdateSink(this, sink_wants_);
|
| return true;
|
| }
|
| @@ -1631,6 +1633,8 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() {
|
| return false;
|
| }
|
|
|
| + // |capturer_->RemoveSink| may not be called while holding |lock_| since
|
| + // that might cause a lock order inversion.
|
| capturer_->RemoveSink(this);
|
| capturer_ = NULL;
|
| // Reset |cpu_restricted_counter_| if the capturer is changed. It is not
|
| @@ -1755,46 +1759,54 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
|
|
|
| void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
|
| const ChangedSendParameters& params) {
|
| - rtc::CritScope cs(&lock_);
|
| - // |recreate_stream| means construction-time parameters have changed and the
|
| - // sending stream needs to be reset with the new config.
|
| - bool recreate_stream = false;
|
| - if (params.rtcp_mode) {
|
| - parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
|
| - recreate_stream = true;
|
| - }
|
| + {
|
| + rtc::CritScope cs(&lock_);
|
| + // |recreate_stream| means construction-time parameters have changed and the
|
| + // sending stream needs to be reset with the new config.
|
| + bool recreate_stream = false;
|
| + if (params.rtcp_mode) {
|
| + parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
|
| + recreate_stream = true;
|
| + }
|
| + if (params.rtp_header_extensions) {
|
| + parameters_.config.rtp.extensions = *params.rtp_header_extensions;
|
| + recreate_stream = true;
|
| + }
|
| + if (params.max_bandwidth_bps) {
|
| + // Max bitrate has changed, reconfigure encoder settings on the next frame
|
| + // or stream recreation.
|
| + parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
|
| + pending_encoder_reconfiguration_ = true;
|
| + }
|
| + if (params.conference_mode) {
|
| + parameters_.conference_mode = *params.conference_mode;
|
| + }
|
| + if (params.options)
|
| + SetOptions(*params.options);
|
| +
|
| + // Set codecs and options.
|
| + if (params.codec) {
|
| + SetCodec(*params.codec);
|
| + return;
|
| + } else if (params.conference_mode && parameters_.codec_settings) {
|
| + SetCodec(*parameters_.codec_settings);
|
| + return;
|
| + }
|
| + if (recreate_stream) {
|
| + LOG(LS_INFO)
|
| + << "RecreateWebRtcStream (send) because of SetSendParameters";
|
| + RecreateWebRtcStream();
|
| + }
|
| + } // release |lock_|
|
| +
|
| + // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since
|
| + // that might cause a lock order inversion.
|
| if (params.rtp_header_extensions) {
|
| - parameters_.config.rtp.extensions = *params.rtp_header_extensions;
|
| sink_wants_.rotation_applied = !ContainsHeaderExtension(
|
| *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension);
|
| if (capturer_) {
|
| capturer_->AddOrUpdateSink(this, sink_wants_);
|
| }
|
| - recreate_stream = true;
|
| - }
|
| - if (params.max_bandwidth_bps) {
|
| - // Max bitrate has changed, reconfigure encoder settings on the next frame
|
| - // or stream recreation.
|
| - parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
|
| - pending_encoder_reconfiguration_ = true;
|
| - }
|
| - if (params.conference_mode) {
|
| - parameters_.conference_mode = *params.conference_mode;
|
| - }
|
| - if (params.options)
|
| - SetOptions(*params.options);
|
| -
|
| - // Set codecs and options.
|
| - if (params.codec) {
|
| - SetCodec(*params.codec);
|
| - return;
|
| - } else if (params.conference_mode && parameters_.codec_settings) {
|
| - SetCodec(*parameters_.codec_settings);
|
| - return;
|
| - }
|
| - if (recreate_stream) {
|
| - LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
|
| - RecreateWebRtcStream();
|
| }
|
| }
|
|
|
| @@ -1961,6 +1973,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) {
|
| sink_wants_.max_pixel_count = max_pixel_count;
|
| sink_wants_.max_pixel_count_step_up = max_pixel_count_step_up;
|
| }
|
| + // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since
|
| + // that might cause a lock order inversion.
|
| capturer_->AddOrUpdateSink(this, sink_wants_);
|
| }
|
|
|
|
|