Chromium Code Reviews| Index: webrtc/media/engine/webrtcvideoengine2.cc | 
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc | 
| index 3cff1e6fbd63778fa4a72721d0d4beac49f4a51e..15ea3b55f01a738d6c56d878adb10dedb2c6dbfd 100644 | 
| --- a/webrtc/media/engine/webrtcvideoengine2.cc | 
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc | 
| @@ -21,8 +21,6 @@ | 
| #include "webrtc/base/timeutils.h" | 
| #include "webrtc/base/trace_event.h" | 
| #include "webrtc/call.h" | 
| -#include "webrtc/media/base/videocapturer.h" | 
| -#include "webrtc/media/base/videorenderer.h" | 
| #include "webrtc/media/engine/constants.h" | 
| #include "webrtc/media/engine/simulcast.h" | 
| #include "webrtc/media/engine/webrtcmediaengine.h" | 
| @@ -999,6 +997,9 @@ bool WebRtcVideoChannel2::SetSend(bool send) { | 
| return true; | 
| } | 
| +// TODO(nisse): The enable argument was used for mute logic which has | 
| +// been moved elsewhere. So delete this method, and use SetOptions | 
| +// instead. | 
| bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, | 
| const VideoOptions* options) { | 
| TRACE_EVENT0("webrtc", "SetVideoSend"); | 
| @@ -1006,11 +1007,6 @@ bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, | 
| << "options: " << (options ? options->ToString() : "nullptr") | 
| << ")."; | 
| - // TODO(solenberg): The state change should be fully rolled back if any one of | 
| - // these calls fail. | 
| - if (!MuteStream(ssrc, !enable)) { | 
| - return false; | 
| - } | 
| if (enable && options) { | 
| SetOptions(ssrc, *options); | 
| } | 
| @@ -1328,22 +1324,21 @@ 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"); | 
| +void WebRtcVideoChannel2::SetSource( | 
| + uint32_t ssrc, | 
| + rtc::VideoSourceInterface<cricket::VideoFrame>* source) { | 
| + LOG(LS_INFO) << "SetSource: " << ssrc << " -> " | 
| + << (source ? "(source)" : "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; | 
| - } | 
| + | 
| + rtc::CritScope stream_lock(&stream_crit_); | 
| + const auto& kv = send_streams_.find(ssrc); | 
| + if (kv == send_streams_.end()) { | 
| + // Allow unknown ssrc only if source is null. | 
| + RTC_CHECK(source == nullptr); | 
| + } else { | 
| + kv->second->SetSource(source); | 
| } | 
| - return true; | 
| } | 
| void WebRtcVideoChannel2::OnPacketReceived( | 
| @@ -1424,21 +1419,6 @@ void WebRtcVideoChannel2::OnReadyToSend(bool ready) { | 
| call_->SignalNetworkState(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) { | 
| @@ -1545,7 +1525,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( | 
| call_(call), | 
| cpu_restricted_counter_(0), | 
| number_of_cpu_adapt_changes_(0), | 
| - capturer_(nullptr), | 
| + source_(nullptr), | 
| external_encoder_factory_(external_encoder_factory), | 
| stream_(nullptr), | 
| parameters_(config, options, max_bitrate_bps, codec_settings), | 
| @@ -1553,7 +1533,6 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( | 
| pending_encoder_reconfiguration_(false), | 
| allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), | 
| sending_(false), | 
| - muted_(false), | 
| first_frame_timestamp_ms_(0), | 
| last_frame_timestamp_ms_(0) { | 
| parameters_.config.rtp.max_packet_size = kVideoMtu; | 
| @@ -1579,7 +1558,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( | 
| } | 
| WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { | 
| - DisconnectCapturer(); | 
| + DisconnectSource(); | 
| if (stream_ != NULL) { | 
| call_->DestroyVideoSendStream(stream_); | 
| } | 
| @@ -1612,14 +1591,6 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( | 
| return; | 
| } | 
| - if (muted_) { | 
| - // Create a black frame to transmit instead. | 
| - CreateBlackFrame(&video_frame, | 
| - static_cast<int>(frame.GetWidth()), | 
| - static_cast<int>(frame.GetHeight()), | 
| - video_frame.rotation()); | 
| - } | 
| - | 
| int64_t frame_delta_ms = frame.GetTimeStamp() / rtc::kNumNanosecsPerMillisec; | 
| // frame->GetTimeStamp() is essentially a delta, align to webrtc time | 
| if (first_frame_timestamp_ms_ == 0) { | 
| @@ -1642,13 +1613,14 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( | 
| stream_->Input()->IncomingCapturedFrame(video_frame); | 
| } | 
| -bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 
| - VideoCapturer* capturer) { | 
| - TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetCapturer"); | 
| +void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSource( | 
| + rtc::VideoSourceInterface<cricket::VideoFrame>* source) { | 
| + TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetSource"); | 
| RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| - if (!DisconnectCapturer() && capturer == NULL) { | 
| - return false; | 
| - } | 
| + | 
| + if (!source && !source_) | 
| + return; | 
| + DisconnectSource(); | 
| { | 
| rtc::CritScope cs(&lock_); | 
| @@ -1657,7 +1629,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 
| // new capturer may have a different timestamp delta than the previous one. | 
| first_frame_timestamp_ms_ = 0; | 
| - if (capturer == NULL) { | 
| + if (source == NULL) { | 
| if (stream_ != NULL) { | 
| LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; | 
| webrtc::VideoFrame black_frame; | 
| @@ -1674,39 +1646,33 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( | 
| black_frame.set_render_time_ms(last_frame_timestamp_ms_); | 
| stream_->Input()->IncomingCapturedFrame(black_frame); | 
| } | 
| - | 
| - capturer_ = NULL; | 
| - return true; | 
| } | 
| + // Clear the original dimensions, set it from first frame. | 
| + input_dimensions_.width = input_dimensions_.height = 0; | 
| } | 
| - capturer_ = capturer; | 
| - // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since | 
| + source_ = source; | 
| + // |source_->AddOrUpdateSink| may not be called while holding |lock_| since | 
| // that might cause a lock order inversion. | 
| - capturer_->AddOrUpdateSink(this, sink_wants_); | 
| - return true; | 
| -} | 
| - | 
| -void WebRtcVideoChannel2::WebRtcVideoSendStream::MuteStream(bool mute) { | 
| - rtc::CritScope cs(&lock_); | 
| - muted_ = mute; | 
| + if (source_) { | 
| + source_->AddOrUpdateSink(this, sink_wants_); | 
| 
 
pbos-webrtc
2016/03/23 12:45:23
This causes the current code to be incorrect (sinc
 
perkj_webrtc
2016/03/24 11:02:50
Is your concern just input_dimensions_? 
I realis
 
 | 
| + } | 
| } | 
| -bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() { | 
| +void WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectSource() { | 
| RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| - if (capturer_ == NULL) { | 
| - return false; | 
| + if (source_ == NULL) { | 
| + return; | 
| } | 
| - // |capturer_->RemoveSink| may not be called while holding |lock_| since | 
| + // |source_->RemoveSink| may not be called while holding |lock_| since | 
| // that might cause a lock order inversion. | 
| - capturer_->RemoveSink(this); | 
| - capturer_ = NULL; | 
| + source_->RemoveSink(this); | 
| + source_ = NULL; | 
| // Reset |cpu_restricted_counter_| if the capturer is changed. It is not | 
| // possible to know if the video resolution is restricted by CPU usage after | 
| // the capturer is changed since the next capturer might be screen capture | 
| // with another resolution and frame rate. | 
| cpu_restricted_counter_ = 0; | 
| - return true; | 
| } | 
| const std::vector<uint32_t>& | 
| @@ -1864,8 +1830,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( | 
| if (params.rtp_header_extensions) { | 
| sink_wants_.rotation_applied = !ContainsHeaderExtension( | 
| *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension); | 
| - if (capturer_) { | 
| - capturer_->AddOrUpdateSink(this, sink_wants_); | 
| + if (source_) { | 
| + source_->AddOrUpdateSink(this, sink_wants_); | 
| } | 
| } | 
| } | 
| @@ -1966,6 +1932,15 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( | 
| void WebRtcVideoChannel2::WebRtcVideoSendStream::SetDimensions( | 
| int width, | 
| int height) { | 
| + // TODO(nisse): Using the dimensions of the first seen frame is a | 
| + // crude hack, which happens to more-or-less work with the current | 
| + // cpu adaptation. The proper solution is to add attributes to the | 
| 
 
perkj_webrtc
2016/03/24 11:02:50
I am not sure that is a proper solution either sin
 
 | 
| + // frame with the original, pre-adaptation, size. We may want that | 
| + // also for lazy scaling of frames. | 
| + if (input_dimensions_.width == 0 && input_dimensions_.height == 0) { | 
| + input_dimensions_.width = width; | 
| + input_dimensions_.height = height; | 
| + } | 
| if (last_dimensions_.width == width && last_dimensions_.height == height && | 
| !pending_encoder_reconfiguration_) { | 
| // Configured using the same parameters, do not reconfigure. | 
| @@ -2018,7 +1993,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) { | 
| return; | 
| } | 
| RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 
| - if (!capturer_) { | 
| + if (!source_) { | 
| return; | 
| } | 
| { | 
| @@ -2065,9 +2040,9 @@ 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 | 
| + // |source_->AddOrUpdateSink| may not be called while holding |lock_| since | 
| // that might cause a lock order inversion. | 
| - capturer_->AddOrUpdateSink(this, sink_wants_); | 
| + source_->AddOrUpdateSink(this, sink_wants_); | 
| } | 
| VideoSenderInfo | 
| @@ -2096,19 +2071,15 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo() { | 
| return info; | 
| stats = stream_->GetStats(); | 
| + | 
| + info.input_frame_width = input_dimensions_.width; | 
| + info.input_frame_height = input_dimensions_.height; | 
| } | 
| info.adapt_changes = number_of_cpu_adapt_changes_; | 
| info.adapt_reason = cpu_restricted_counter_ <= 0 | 
| ? CoordinatedVideoAdapter::ADAPTREASON_NONE | 
| : CoordinatedVideoAdapter::ADAPTREASON_CPU; | 
| - if (capturer_) { | 
| - VideoFormat last_captured_frame_format; | 
| - capturer_->GetStats(&last_captured_frame_format); | 
| - info.input_frame_width = last_captured_frame_format.width; | 
| - info.input_frame_height = last_captured_frame_format.height; | 
| - } | 
| - | 
| // Get bandwidth limitation info from stream_->GetStats(). | 
| // Input resolution (output from video_adapter) can be further scaled down or | 
| // higher video layer(s) can be dropped due to bitrate constraints. |