Index: remoting/host/client_session.cc |
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc |
index d12a5ed2b0238e60e0105a5590b333ab0af57a27..b79d7b142b5fc8fbe425e68351212e45a0368c59 100644 |
--- a/remoting/host/client_session.cc |
+++ b/remoting/host/client_session.cc |
@@ -14,9 +14,6 @@ |
#include "remoting/codec/audio_encoder.h" |
#include "remoting/codec/audio_encoder_opus.h" |
#include "remoting/codec/audio_encoder_verbatim.h" |
-#include "remoting/codec/video_encoder.h" |
-#include "remoting/codec/video_encoder_verbatim.h" |
-#include "remoting/codec/video_encoder_vpx.h" |
#include "remoting/host/audio_capturer.h" |
#include "remoting/host/audio_pump.h" |
#include "remoting/host/desktop_capturer_proxy.h" |
@@ -47,22 +44,6 @@ namespace { |
// Name of command-line flag to disable use of I444 by default. |
const char kDisableI444SwitchName[] = "disable-i444"; |
-scoped_ptr<VideoEncoder> CreateVideoEncoder( |
- const protocol::SessionConfig& config) { |
- const protocol::ChannelConfig& video_config = config.video_config(); |
- |
- if (video_config.codec == protocol::ChannelConfig::CODEC_VP8) { |
- return VideoEncoderVpx::CreateForVP8().Pass(); |
- } else if (video_config.codec == protocol::ChannelConfig::CODEC_VP9) { |
- return VideoEncoderVpx::CreateForVP9().Pass(); |
- } else if (video_config.codec == protocol::ChannelConfig::CODEC_VERBATIM) { |
- return make_scoped_ptr(new VideoEncoderVerbatim()); |
- } |
- |
- NOTREACHED(); |
- return nullptr; |
-} |
- |
scoped_ptr<AudioEncoder> CreateAudioEncoder( |
const protocol::SessionConfig& config) { |
const protocol::ChannelConfig& audio_config = config.audio_config(); |
@@ -99,7 +80,7 @@ ClientSession::ClientSession( |
input_tracker_(&host_input_filter_), |
remote_input_filter_(&input_tracker_), |
mouse_clamping_filter_(&remote_input_filter_), |
- disable_input_filter_(mouse_clamping_filter_.input_filter()), |
+ disable_input_filter_(&mouse_clamping_filter_), |
disable_clipboard_filter_(clipboard_echo_filter_.host_filter()), |
client_clipboard_factory_(clipboard_echo_filter_.client_filter()), |
max_duration_(max_duration), |
@@ -136,7 +117,7 @@ ClientSession::~ClientSession() { |
DCHECK(!desktop_environment_); |
DCHECK(!input_injector_); |
DCHECK(!screen_controls_); |
- DCHECK(!video_frame_pump_); |
+ DCHECK(!video_stream_); |
connection_.reset(); |
} |
@@ -171,28 +152,28 @@ void ClientSession::NotifyClientResolution( |
void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { |
DCHECK(CalledOnValidThread()); |
- // Note that |video_frame_pump_| may be null, depending upon whether |
+ // Note that |video_stream_| may be null, depending upon whether |
// extensions choose to wrap or "steal" the video capturer or encoder. |
if (video_control.has_enable()) { |
VLOG(1) << "Received VideoControl (enable=" |
<< video_control.enable() << ")"; |
pause_video_ = !video_control.enable(); |
- if (video_frame_pump_) |
- video_frame_pump_->Pause(pause_video_); |
+ if (video_stream_) |
+ video_stream_->Pause(pause_video_); |
} |
if (video_control.has_lossless_encode()) { |
VLOG(1) << "Received VideoControl (lossless_encode=" |
<< video_control.lossless_encode() << ")"; |
lossless_video_encode_ = video_control.lossless_encode(); |
- if (video_frame_pump_) |
- video_frame_pump_->SetLosslessEncode(lossless_video_encode_); |
+ if (video_stream_) |
+ video_stream_->SetLosslessEncode(lossless_video_encode_); |
} |
if (video_control.has_lossless_color()) { |
VLOG(1) << "Received VideoControl (lossless_color=" |
<< video_control.lossless_color() << ")"; |
lossless_video_color_ = video_control.lossless_color(); |
- if (video_frame_pump_) |
- video_frame_pump_->SetLosslessColor(lossless_video_color_); |
+ if (video_stream_) |
+ video_stream_->SetLosslessColor(lossless_video_color_); |
} |
} |
@@ -285,7 +266,7 @@ void ClientSession::OnConnectionAuthenticated( |
DCHECK(!desktop_environment_); |
DCHECK(!input_injector_); |
DCHECK(!screen_controls_); |
- DCHECK(!video_frame_pump_); |
+ DCHECK(!video_stream_); |
is_authenticated_ = true; |
@@ -311,9 +292,6 @@ void ClientSession::OnConnectionAuthenticated( |
// Connect host stub. |
connection_->set_host_stub(this); |
- // Connect video stub. |
- mouse_clamping_filter_.set_video_stub(connection_->video_stub()); |
- |
// Collate the set of capabilities to offer the client, if it supports them. |
host_capabilities_ = desktop_environment_->GetCapabilities(); |
if (!host_capabilities_.empty()) |
@@ -392,7 +370,7 @@ void ClientSession::OnConnectionClosed( |
// Stop components access the client, audio or video stubs, which are no |
// longer valid once ConnectionToClient calls OnConnectionClosed(). |
audio_pump_.reset(); |
- video_frame_pump_.reset(); |
+ video_stream_.reset(); |
mouse_shape_pump_.reset(); |
client_clipboard_factory_.InvalidateWeakPtrs(); |
input_injector_.reset(); |
@@ -403,14 +381,19 @@ void ClientSession::OnConnectionClosed( |
event_handler_->OnSessionClosed(this); |
} |
+void ClientSession::OnCreateVideoEncoder(scoped_ptr<VideoEncoder>* encoder) { |
+ DCHECK(CalledOnValidThread()); |
+ extension_manager_->OnCreateVideoEncoder(encoder); |
+} |
+ |
void ClientSession::OnInputEventReceived( |
protocol::ConnectionToClient* connection, |
int64_t event_timestamp) { |
DCHECK(CalledOnValidThread()); |
DCHECK_EQ(connection_.get(), connection); |
- if (video_frame_pump_.get()) |
- video_frame_pump_->OnInputEventReceived(event_timestamp); |
+ if (video_stream_.get()) |
+ video_stream_->OnInputEventReceived(event_timestamp); |
} |
void ClientSession::OnRouteChange( |
@@ -455,21 +438,18 @@ void ClientSession::SetDisableInputs(bool disable_inputs) { |
void ClientSession::ResetVideoPipeline() { |
DCHECK(CalledOnValidThread()); |
+ video_stream_.reset(); |
mouse_shape_pump_.reset(); |
- connection_->set_video_feedback_stub(nullptr); |
- video_frame_pump_.reset(); |
// Create VideoEncoder and DesktopCapturer to match the session's video |
// channel configuration. |
scoped_ptr<webrtc::DesktopCapturer> video_capturer = |
desktop_environment_->CreateVideoCapturer(); |
extension_manager_->OnCreateVideoCapturer(&video_capturer); |
- scoped_ptr<VideoEncoder> video_encoder = |
- CreateVideoEncoder(connection_->session()->config()); |
- extension_manager_->OnCreateVideoEncoder(&video_encoder); |
- // Don't start the VideoFramePump if either capturer or encoder are missing. |
- if (!video_capturer || !video_encoder) |
+ // Don't start the video stream if the extension took ownership of the |
+ // capturer. |
+ if (!video_capturer) |
return; |
// Create MouseShapePump to send mouse cursor shape. |
@@ -478,25 +458,23 @@ void ClientSession::ResetVideoPipeline() { |
desktop_environment_->CreateMouseCursorMonitor(), |
connection_->client_stub())); |
- // Create a VideoFramePump to pump frames from the capturer to the client.' |
- // |
+ // Create a VideoStream to pump frames from the capturer to the client. |
+ |
// TODO(sergeyu): Move DesktopCapturerProxy creation to DesktopEnvironment. |
// When using IpcDesktopCapturer the capture thread is not useful. |
- scoped_ptr<DesktopCapturerProxy> capturer_proxy(new DesktopCapturerProxy( |
+ scoped_ptr<webrtc::DesktopCapturer> capturer_proxy(new DesktopCapturerProxy( |
video_capture_task_runner_, video_capturer.Pass())); |
- video_frame_pump_.reset(new protocol::VideoFramePump( |
- video_encode_task_runner_, capturer_proxy.Pass(), video_encoder.Pass(), |
- &mouse_clamping_filter_)); |
- // Apply video-control parameters to the new scheduler. |
- video_frame_pump_->SetLosslessEncode(lossless_video_encode_); |
- video_frame_pump_->SetLosslessColor(lossless_video_color_); |
+ video_stream_ = connection_->StartVideoStream(capturer_proxy.Pass()); |
+ video_stream_->SetSizeCallback( |
+ base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this))); |
- // Pause capturing if necessary. |
- video_frame_pump_->Pause(pause_video_); |
+ // Apply video-control parameters to the new stream. |
+ video_stream_->SetLosslessEncode(lossless_video_encode_); |
+ video_stream_->SetLosslessColor(lossless_video_color_); |
- connection_->set_video_feedback_stub( |
- video_frame_pump_->video_feedback_stub()); |
+ // Pause capturing if necessary. |
+ video_stream_->Pause(pause_video_); |
} |
void ClientSession::SetGnubbyAuthHandlerForTesting( |
@@ -513,4 +491,10 @@ scoped_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() { |
base::ThreadTaskRunnerHandle::Get())); |
} |
+void ClientSession::OnScreenSizeChanged(const webrtc::DesktopSize& size) { |
+ DCHECK(CalledOnValidThread()); |
+ mouse_clamping_filter_.set_input_size(size); |
+ mouse_clamping_filter_.set_output_size(size); |
+} |
+ |
} // namespace remoting |