Chromium Code Reviews| Index: webrtc/media/engine/webrtcvideoengine2.cc | 
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc | 
| index 9f74a86a8480a1ec7b47948090a875ed2ce6a537..8cc3067a0abfcdc487521ccbd7e8a99fae6bfc2e 100644 | 
| --- a/webrtc/media/engine/webrtcvideoengine2.cc | 
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc | 
| @@ -998,21 +998,27 @@ bool WebRtcVideoChannel2::SetSend(bool send) { | 
| return true; | 
| } | 
| -bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, | 
| - const VideoOptions* options) { | 
| +bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, | 
| + bool enable, | 
| + const VideoOptions* options, | 
| + VideoCapturer* capturer) { | 
| TRACE_EVENT0("webrtc", "SetVideoSend"); | 
| + RTC_DCHECK(ssrc != 0); | 
| LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable | 
| << "options: " << (options ? options->ToString() : "nullptr") | 
| - << ")."; | 
| + << ", capturer = " | 
| + << (capturer != nullptr ? "(capturer)" : "NULL") << ")"; | 
| // TODO(solenberg): The state change should be fully rolled back if any one of | 
| // these calls fail. | 
| - if (!MuteStream(ssrc, !enable)) { | 
| + rtc::CritScope stream_lock(&stream_crit_); | 
| + const auto& kv = send_streams_.find(ssrc); | 
| + if (kv == send_streams_.end()) { | 
| + LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | 
| return false; | 
| } | 
| - if (enable && options) { | 
| - SetOptions(ssrc, *options); | 
| - } | 
| + | 
| + kv->second->SetVideoSend(enable, options, capturer); | 
| return true; | 
| } | 
| @@ -1312,24 +1318,6 @@ void WebRtcVideoChannel2::FillBandwidthEstimationStats( | 
| video_media_info->bw_estimations.push_back(bwe_info); | 
| } | 
| -bool WebRtcVideoChannel2::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { | 
| - LOG(LS_INFO) << "SetCapturer: " << ssrc << " -> " | 
| - << (capturer != NULL ? "(capturer)" : "NULL"); | 
| - RTC_DCHECK(ssrc != 0); | 
| - { | 
| - rtc::CritScope stream_lock(&stream_crit_); | 
| - const auto& kv = send_streams_.find(ssrc); | 
| - if (kv == send_streams_.end()) { | 
| - LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | 
| - return false; | 
| - } | 
| - if (!kv->second->SetCapturer(capturer)) { | 
| - return false; | 
| - } | 
| - } | 
| - return true; | 
| -} | 
| - | 
| void WebRtcVideoChannel2::OnPacketReceived( | 
| rtc::CopyOnWriteBuffer* packet, | 
| const rtc::PacketTime& packet_time) { | 
| @@ -1410,34 +1398,6 @@ void WebRtcVideoChannel2::OnReadyToSend(bool ready) { | 
| ready ? webrtc::kNetworkUp : webrtc::kNetworkDown); | 
| } | 
| -bool WebRtcVideoChannel2::MuteStream(uint32_t ssrc, bool mute) { | 
| - LOG(LS_VERBOSE) << "MuteStream: " << ssrc << " -> " | 
| - << (mute ? "mute" : "unmute"); | 
| - RTC_DCHECK(ssrc != 0); | 
| - rtc::CritScope stream_lock(&stream_crit_); | 
| - const auto& kv = send_streams_.find(ssrc); | 
| - if (kv == send_streams_.end()) { | 
| - LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; | 
| - return false; | 
| - } | 
| - | 
| - kv->second->MuteStream(mute); | 
| - return true; | 
| -} | 
| - | 
| -// TODO(pbos): Remove SetOptions in favor of SetSendParameters. | 
| -void WebRtcVideoChannel2::SetOptions(uint32_t ssrc, | 
| - const VideoOptions& options) { | 
| - LOG(LS_INFO) << "SetOptions: ssrc " << ssrc << ": " << options.ToString(); | 
| - | 
| - rtc::CritScope stream_lock(&stream_crit_); | 
| - const auto& kv = send_streams_.find(ssrc); | 
| - if (kv == send_streams_.end()) { | 
| - return; | 
| - } | 
| - kv->second->SetOptions(options); | 
| -} | 
| - | 
| void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) { | 
| MediaChannel::SetInterface(iface); | 
| // Set the RTP recv/send buffer to a bigger size | 
| @@ -1610,23 +1570,40 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( | 
| stream_->Input()->IncomingCapturedFrame(video_frame); | 
| } | 
| -bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 
| +bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( | 
| + bool enable, | 
| + const VideoOptions* options, | 
| VideoCapturer* capturer) { | 
| - TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetCapturer"); | 
| + TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend"); | 
| RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| - if (!DisconnectCapturer() && capturer == NULL) { | 
| - return false; | 
| + | 
| + bool capturer_changing = capturer_ != capturer; | 
| + if (capturer_changing) { | 
| + if (!DisconnectCapturer() && capturer == nullptr) { | 
| + return false; | 
| + } | 
| } | 
| { | 
| rtc::CritScope cs(&lock_); | 
| - // Reset timestamps to realign new incoming frames to a webrtc timestamp. A | 
| - // new capturer may have a different timestamp delta than the previous one. | 
| - first_frame_timestamp_ms_ = 0; | 
| + muted_ = !enable; | 
| + if (enable && options) { | 
| + VideoOptions old_options = parameters_.options; | 
| + parameters_.options.SetAll(*options); | 
| + if (parameters_.options != old_options) { | 
| + // Reconfigure encoder settings on the next frame or stream recreation. | 
| + pending_encoder_reconfiguration_ = true; | 
| + } | 
| + } | 
| + | 
| + if (capturer_changing) { | 
| + // Reset timestamps to realign new incoming frames to a webrtc timestamp. | 
| + // A new capturer may have a different timestamp delta than the previous | 
| + // one. | 
| + first_frame_timestamp_ms_ = 0; | 
| - if (capturer == NULL) { | 
| - if (stream_ != NULL) { | 
| + if (capturer == nullptr && stream_ != nullptr) { | 
| LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; | 
| webrtc::VideoFrame black_frame; | 
| @@ -1642,23 +1619,18 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 
| black_frame.set_render_time_ms(last_frame_timestamp_ms_); | 
| stream_->Input()->IncomingCapturedFrame(black_frame); | 
| } | 
| - | 
| - capturer_ = NULL; | 
| - return true; | 
| 
 
Taylor Brandstetter
2016/03/29 22:30:35
I got rid of this early return and added "if (capt
 
 | 
| + capturer_ = capturer; | 
| } | 
| } | 
| - capturer_ = capturer; | 
| + | 
| // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since | 
| // that might cause a lock order inversion. | 
| - capturer_->AddOrUpdateSink(this, sink_wants_); | 
| + if (capturer_changing && capturer_ != nullptr) { | 
| + capturer_->AddOrUpdateSink(this, sink_wants_); | 
| + } | 
| return true; | 
| } | 
| -void WebRtcVideoChannel2::WebRtcVideoSendStream::MuteStream(bool mute) { | 
| - rtc::CritScope cs(&lock_); | 
| - muted_ = mute; | 
| -} | 
| - | 
| bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() { | 
| RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| if (capturer_ == NULL) { | 
| @@ -1682,16 +1654,6 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { | 
| return ssrcs_; | 
| } | 
| -void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( | 
| - const VideoOptions& options) { | 
| - rtc::CritScope cs(&lock_); | 
| - | 
| - parameters_.options.SetAll(options); | 
| - // Reconfigure encoder settings on the next frame or stream | 
| - // recreation. | 
| - pending_encoder_reconfiguration_ = true; | 
| -} | 
| - | 
| webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { | 
| if (CodecNamesEq(name, kVp8CodecName)) { | 
| return webrtc::kVideoCodecVP8; |