Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Side by Side Diff: remoting/host/client_session.cc

Issue 1472873005: Add VideoStream interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move_video_pump
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/client_session.h" 5 #include "remoting/host/client_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "remoting/base/capabilities.h" 12 #include "remoting/base/capabilities.h"
13 #include "remoting/base/logging.h" 13 #include "remoting/base/logging.h"
14 #include "remoting/codec/audio_encoder.h" 14 #include "remoting/codec/audio_encoder.h"
15 #include "remoting/codec/audio_encoder_opus.h" 15 #include "remoting/codec/audio_encoder_opus.h"
16 #include "remoting/codec/audio_encoder_verbatim.h" 16 #include "remoting/codec/audio_encoder_verbatim.h"
17 #include "remoting/codec/video_encoder.h"
18 #include "remoting/codec/video_encoder_verbatim.h"
19 #include "remoting/codec/video_encoder_vpx.h"
20 #include "remoting/host/audio_capturer.h" 17 #include "remoting/host/audio_capturer.h"
21 #include "remoting/host/audio_pump.h" 18 #include "remoting/host/audio_pump.h"
22 #include "remoting/host/desktop_capturer_proxy.h" 19 #include "remoting/host/desktop_capturer_proxy.h"
23 #include "remoting/host/desktop_environment.h" 20 #include "remoting/host/desktop_environment.h"
24 #include "remoting/host/host_extension_session.h" 21 #include "remoting/host/host_extension_session.h"
25 #include "remoting/host/input_injector.h" 22 #include "remoting/host/input_injector.h"
26 #include "remoting/host/mouse_shape_pump.h" 23 #include "remoting/host/mouse_shape_pump.h"
27 #include "remoting/host/screen_controls.h" 24 #include "remoting/host/screen_controls.h"
28 #include "remoting/host/screen_resolution.h" 25 #include "remoting/host/screen_resolution.h"
29 #include "remoting/proto/control.pb.h" 26 #include "remoting/proto/control.pb.h"
(...skipping 10 matching lines...) Expand all
40 // Default DPI to assume for old clients that use notifyClientDimensions. 37 // Default DPI to assume for old clients that use notifyClientDimensions.
41 const int kDefaultDPI = 96; 38 const int kDefaultDPI = 96;
42 39
43 namespace remoting { 40 namespace remoting {
44 41
45 namespace { 42 namespace {
46 43
47 // Name of command-line flag to disable use of I444 by default. 44 // Name of command-line flag to disable use of I444 by default.
48 const char kDisableI444SwitchName[] = "disable-i444"; 45 const char kDisableI444SwitchName[] = "disable-i444";
49 46
50 scoped_ptr<VideoEncoder> CreateVideoEncoder(
51 const protocol::SessionConfig& config) {
52 const protocol::ChannelConfig& video_config = config.video_config();
53
54 if (video_config.codec == protocol::ChannelConfig::CODEC_VP8) {
55 return VideoEncoderVpx::CreateForVP8().Pass();
56 } else if (video_config.codec == protocol::ChannelConfig::CODEC_VP9) {
57 return VideoEncoderVpx::CreateForVP9().Pass();
58 } else if (video_config.codec == protocol::ChannelConfig::CODEC_VERBATIM) {
59 return make_scoped_ptr(new VideoEncoderVerbatim());
60 }
61
62 NOTREACHED();
63 return nullptr;
64 }
65
66 scoped_ptr<AudioEncoder> CreateAudioEncoder( 47 scoped_ptr<AudioEncoder> CreateAudioEncoder(
67 const protocol::SessionConfig& config) { 48 const protocol::SessionConfig& config) {
68 const protocol::ChannelConfig& audio_config = config.audio_config(); 49 const protocol::ChannelConfig& audio_config = config.audio_config();
69 50
70 if (audio_config.codec == protocol::ChannelConfig::CODEC_VERBATIM) { 51 if (audio_config.codec == protocol::ChannelConfig::CODEC_VERBATIM) {
71 return make_scoped_ptr(new AudioEncoderVerbatim()); 52 return make_scoped_ptr(new AudioEncoderVerbatim());
72 } else if (audio_config.codec == protocol::ChannelConfig::CODEC_OPUS) { 53 } else if (audio_config.codec == protocol::ChannelConfig::CODEC_OPUS) {
73 return make_scoped_ptr(new AudioEncoderOpus()); 54 return make_scoped_ptr(new AudioEncoderOpus());
74 } 55 }
75 56
(...skipping 16 matching lines...) Expand all
92 const base::TimeDelta& max_duration, 73 const base::TimeDelta& max_duration,
93 scoped_refptr<protocol::PairingRegistry> pairing_registry, 74 scoped_refptr<protocol::PairingRegistry> pairing_registry,
94 const std::vector<HostExtension*>& extensions) 75 const std::vector<HostExtension*>& extensions)
95 : event_handler_(event_handler), 76 : event_handler_(event_handler),
96 connection_(connection.Pass()), 77 connection_(connection.Pass()),
97 client_jid_(connection_->session()->jid()), 78 client_jid_(connection_->session()->jid()),
98 desktop_environment_factory_(desktop_environment_factory), 79 desktop_environment_factory_(desktop_environment_factory),
99 input_tracker_(&host_input_filter_), 80 input_tracker_(&host_input_filter_),
100 remote_input_filter_(&input_tracker_), 81 remote_input_filter_(&input_tracker_),
101 mouse_clamping_filter_(&remote_input_filter_), 82 mouse_clamping_filter_(&remote_input_filter_),
102 disable_input_filter_(mouse_clamping_filter_.input_filter()), 83 disable_input_filter_(&mouse_clamping_filter_),
103 disable_clipboard_filter_(clipboard_echo_filter_.host_filter()), 84 disable_clipboard_filter_(clipboard_echo_filter_.host_filter()),
104 client_clipboard_factory_(clipboard_echo_filter_.client_filter()), 85 client_clipboard_factory_(clipboard_echo_filter_.client_filter()),
105 max_duration_(max_duration), 86 max_duration_(max_duration),
106 audio_task_runner_(audio_task_runner), 87 audio_task_runner_(audio_task_runner),
107 input_task_runner_(input_task_runner), 88 input_task_runner_(input_task_runner),
108 video_capture_task_runner_(video_capture_task_runner), 89 video_capture_task_runner_(video_capture_task_runner),
109 video_encode_task_runner_(video_encode_task_runner), 90 video_encode_task_runner_(video_encode_task_runner),
110 network_task_runner_(network_task_runner), 91 network_task_runner_(network_task_runner),
111 ui_task_runner_(ui_task_runner), 92 ui_task_runner_(ui_task_runner),
112 pairing_registry_(pairing_registry), 93 pairing_registry_(pairing_registry),
(...skipping 15 matching lines...) Expand all
128 // reaches |remote_input_filter_|. 109 // reaches |remote_input_filter_|.
129 remote_input_filter_.SetExpectLocalEcho(false); 110 remote_input_filter_.SetExpectLocalEcho(false);
130 #endif // defined(OS_WIN) 111 #endif // defined(OS_WIN)
131 } 112 }
132 113
133 ClientSession::~ClientSession() { 114 ClientSession::~ClientSession() {
134 DCHECK(CalledOnValidThread()); 115 DCHECK(CalledOnValidThread());
135 DCHECK(!audio_pump_); 116 DCHECK(!audio_pump_);
136 DCHECK(!desktop_environment_); 117 DCHECK(!desktop_environment_);
137 DCHECK(!input_injector_); 118 DCHECK(!input_injector_);
138 DCHECK(!screen_controls_); 119 DCHECK(!screen_controls_);
Jamie 2015/11/25 01:32:46 No DCHECK for video_stream_?
Sergey Ulanov 2015/11/27 22:11:34 Done.
139 DCHECK(!video_frame_pump_);
140 120
141 connection_.reset(); 121 connection_.reset();
142 } 122 }
143 123
144 void ClientSession::NotifyClientResolution( 124 void ClientSession::NotifyClientResolution(
145 const protocol::ClientResolution& resolution) { 125 const protocol::ClientResolution& resolution) {
146 DCHECK(CalledOnValidThread()); 126 DCHECK(CalledOnValidThread());
147 127
148 // TODO(sergeyu): Move these checks to protocol layer. 128 // TODO(sergeyu): Move these checks to protocol layer.
149 if (!resolution.has_dips_width() || !resolution.has_dips_height() || 129 if (!resolution.has_dips_width() || !resolution.has_dips_height() ||
(...skipping 14 matching lines...) Expand all
164 webrtc::DesktopSize(resolution.dips_width(), resolution.dips_height()), 144 webrtc::DesktopSize(resolution.dips_width(), resolution.dips_height()),
165 webrtc::DesktopVector(kDefaultDPI, kDefaultDPI)); 145 webrtc::DesktopVector(kDefaultDPI, kDefaultDPI));
166 146
167 // Try to match the client's resolution. 147 // Try to match the client's resolution.
168 screen_controls_->SetScreenResolution(client_resolution); 148 screen_controls_->SetScreenResolution(client_resolution);
169 } 149 }
170 150
171 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { 151 void ClientSession::ControlVideo(const protocol::VideoControl& video_control) {
172 DCHECK(CalledOnValidThread()); 152 DCHECK(CalledOnValidThread());
173 153
174 // Note that |video_frame_pump_| may be null, depending upon whether 154 // Note that |video_stream_| may be null, depending upon whether
175 // extensions choose to wrap or "steal" the video capturer or encoder. 155 // extensions choose to wrap or "steal" the video capturer or encoder.
176 if (video_control.has_enable()) { 156 if (video_control.has_enable()) {
177 VLOG(1) << "Received VideoControl (enable=" 157 VLOG(1) << "Received VideoControl (enable="
178 << video_control.enable() << ")"; 158 << video_control.enable() << ")";
179 pause_video_ = !video_control.enable(); 159 pause_video_ = !video_control.enable();
180 if (video_frame_pump_) 160 if (video_stream_)
181 video_frame_pump_->Pause(pause_video_); 161 video_stream_->Pause(pause_video_);
182 } 162 }
183 if (video_control.has_lossless_encode()) { 163 if (video_control.has_lossless_encode()) {
184 VLOG(1) << "Received VideoControl (lossless_encode=" 164 VLOG(1) << "Received VideoControl (lossless_encode="
185 << video_control.lossless_encode() << ")"; 165 << video_control.lossless_encode() << ")";
186 lossless_video_encode_ = video_control.lossless_encode(); 166 lossless_video_encode_ = video_control.lossless_encode();
187 if (video_frame_pump_) 167 if (video_stream_)
188 video_frame_pump_->SetLosslessEncode(lossless_video_encode_); 168 video_stream_->SetLosslessEncode(lossless_video_encode_);
189 } 169 }
190 if (video_control.has_lossless_color()) { 170 if (video_control.has_lossless_color()) {
191 VLOG(1) << "Received VideoControl (lossless_color=" 171 VLOG(1) << "Received VideoControl (lossless_color="
192 << video_control.lossless_color() << ")"; 172 << video_control.lossless_color() << ")";
193 lossless_video_color_ = video_control.lossless_color(); 173 lossless_video_color_ = video_control.lossless_color();
194 if (video_frame_pump_) 174 if (video_stream_)
195 video_frame_pump_->SetLosslessColor(lossless_video_color_); 175 video_stream_->SetLosslessColor(lossless_video_color_);
196 } 176 }
197 } 177 }
198 178
199 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) { 179 void ClientSession::ControlAudio(const protocol::AudioControl& audio_control) {
200 DCHECK(CalledOnValidThread()); 180 DCHECK(CalledOnValidThread());
201 181
202 if (audio_control.has_enable()) { 182 if (audio_control.has_enable()) {
203 VLOG(1) << "Received AudioControl (enable=" 183 VLOG(1) << "Received AudioControl (enable="
204 << audio_control.enable() << ")"; 184 << audio_control.enable() << ")";
205 if (audio_pump_) 185 if (audio_pump_)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 } 258 }
279 259
280 void ClientSession::OnConnectionAuthenticated( 260 void ClientSession::OnConnectionAuthenticated(
281 protocol::ConnectionToClient* connection) { 261 protocol::ConnectionToClient* connection) {
282 DCHECK(CalledOnValidThread()); 262 DCHECK(CalledOnValidThread());
283 DCHECK_EQ(connection_.get(), connection); 263 DCHECK_EQ(connection_.get(), connection);
284 DCHECK(!audio_pump_); 264 DCHECK(!audio_pump_);
285 DCHECK(!desktop_environment_); 265 DCHECK(!desktop_environment_);
286 DCHECK(!input_injector_); 266 DCHECK(!input_injector_);
287 DCHECK(!screen_controls_); 267 DCHECK(!screen_controls_);
288 DCHECK(!video_frame_pump_); 268 DCHECK(!video_stream_);
289 269
290 is_authenticated_ = true; 270 is_authenticated_ = true;
291 271
292 if (max_duration_ > base::TimeDelta()) { 272 if (max_duration_ > base::TimeDelta()) {
293 max_duration_timer_.Start( 273 max_duration_timer_.Start(
294 FROM_HERE, max_duration_, 274 FROM_HERE, max_duration_,
295 base::Bind(&ClientSession::DisconnectSession, base::Unretained(this), 275 base::Bind(&ClientSession::DisconnectSession, base::Unretained(this),
296 protocol::MAX_SESSION_LENGTH)); 276 protocol::MAX_SESSION_LENGTH));
297 } 277 }
298 278
299 // Notify EventHandler. 279 // Notify EventHandler.
300 event_handler_->OnSessionAuthenticated(this); 280 event_handler_->OnSessionAuthenticated(this);
301 281
302 // Create the desktop environment. Drop the connection if it could not be 282 // Create the desktop environment. Drop the connection if it could not be
303 // created for any reason (for instance the curtain could not initialize). 283 // created for any reason (for instance the curtain could not initialize).
304 desktop_environment_ = 284 desktop_environment_ =
305 desktop_environment_factory_->Create(weak_factory_.GetWeakPtr()); 285 desktop_environment_factory_->Create(weak_factory_.GetWeakPtr());
306 if (!desktop_environment_) { 286 if (!desktop_environment_) {
307 DisconnectSession(protocol::HOST_CONFIGURATION_ERROR); 287 DisconnectSession(protocol::HOST_CONFIGURATION_ERROR);
308 return; 288 return;
309 } 289 }
310 290
311 // Connect host stub. 291 // Connect host stub.
312 connection_->set_host_stub(this); 292 connection_->set_host_stub(this);
313 293
314 // Connect video stub.
315 mouse_clamping_filter_.set_video_stub(connection_->video_stub());
316
317 // Collate the set of capabilities to offer the client, if it supports them. 294 // Collate the set of capabilities to offer the client, if it supports them.
318 host_capabilities_ = desktop_environment_->GetCapabilities(); 295 host_capabilities_ = desktop_environment_->GetCapabilities();
319 if (!host_capabilities_.empty()) 296 if (!host_capabilities_.empty())
320 host_capabilities_.append(" "); 297 host_capabilities_.append(" ");
321 host_capabilities_.append(extension_manager_->GetCapabilities()); 298 host_capabilities_.append(extension_manager_->GetCapabilities());
322 299
323 // Create the object that controls the screen resolution. 300 // Create the object that controls the screen resolution.
324 screen_controls_ = desktop_environment_->CreateScreenControls(); 301 screen_controls_ = desktop_environment_->CreateScreenControls();
325 302
326 // Create the event executor. 303 // Create the event executor.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 // If the client never authenticated then the session failed. 362 // If the client never authenticated then the session failed.
386 if (!is_authenticated_) 363 if (!is_authenticated_)
387 event_handler_->OnSessionAuthenticationFailed(this); 364 event_handler_->OnSessionAuthenticationFailed(this);
388 365
389 // Ensure that any pressed keys or buttons are released. 366 // Ensure that any pressed keys or buttons are released.
390 input_tracker_.ReleaseAll(); 367 input_tracker_.ReleaseAll();
391 368
392 // Stop components access the client, audio or video stubs, which are no 369 // Stop components access the client, audio or video stubs, which are no
393 // longer valid once ConnectionToClient calls OnConnectionClosed(). 370 // longer valid once ConnectionToClient calls OnConnectionClosed().
394 audio_pump_.reset(); 371 audio_pump_.reset();
395 video_frame_pump_.reset(); 372 video_stream_.reset();
396 mouse_shape_pump_.reset(); 373 mouse_shape_pump_.reset();
397 client_clipboard_factory_.InvalidateWeakPtrs(); 374 client_clipboard_factory_.InvalidateWeakPtrs();
398 input_injector_.reset(); 375 input_injector_.reset();
399 screen_controls_.reset(); 376 screen_controls_.reset();
400 desktop_environment_.reset(); 377 desktop_environment_.reset();
401 378
402 // Notify the ChromotingHost that this client is disconnected. 379 // Notify the ChromotingHost that this client is disconnected.
403 event_handler_->OnSessionClosed(this); 380 event_handler_->OnSessionClosed(this);
404 } 381 }
405 382
383 void ClientSession::OnCreateVideoEncoder(scoped_ptr<VideoEncoder>* encoder) {
384 DCHECK(CalledOnValidThread());
385 extension_manager_->OnCreateVideoEncoder(encoder);
386 }
387
406 void ClientSession::OnInputEventReceived( 388 void ClientSession::OnInputEventReceived(
407 protocol::ConnectionToClient* connection, 389 protocol::ConnectionToClient* connection,
408 int64_t event_timestamp) { 390 int64_t event_timestamp) {
409 DCHECK(CalledOnValidThread()); 391 DCHECK(CalledOnValidThread());
410 DCHECK_EQ(connection_.get(), connection); 392 DCHECK_EQ(connection_.get(), connection);
411 393
412 if (video_frame_pump_.get()) 394 if (video_stream_.get())
413 video_frame_pump_->OnInputEventReceived(event_timestamp); 395 video_stream_->OnInputEventReceived(event_timestamp);
414 } 396 }
415 397
416 void ClientSession::OnRouteChange( 398 void ClientSession::OnRouteChange(
417 protocol::ConnectionToClient* connection, 399 protocol::ConnectionToClient* connection,
418 const std::string& channel_name, 400 const std::string& channel_name,
419 const protocol::TransportRoute& route) { 401 const protocol::TransportRoute& route) {
420 DCHECK(CalledOnValidThread()); 402 DCHECK(CalledOnValidThread());
421 DCHECK_EQ(connection_.get(), connection); 403 DCHECK_EQ(connection_.get(), connection);
422 event_handler_->OnSessionRouteChange(this, channel_name, route); 404 event_handler_->OnSessionRouteChange(this, channel_name, route);
423 } 405 }
(...skipping 24 matching lines...) Expand all
448 if (disable_inputs) 430 if (disable_inputs)
449 input_tracker_.ReleaseAll(); 431 input_tracker_.ReleaseAll();
450 432
451 disable_input_filter_.set_enabled(!disable_inputs); 433 disable_input_filter_.set_enabled(!disable_inputs);
452 disable_clipboard_filter_.set_enabled(!disable_inputs); 434 disable_clipboard_filter_.set_enabled(!disable_inputs);
453 } 435 }
454 436
455 void ClientSession::ResetVideoPipeline() { 437 void ClientSession::ResetVideoPipeline() {
456 DCHECK(CalledOnValidThread()); 438 DCHECK(CalledOnValidThread());
457 439
440 video_stream_.reset();
458 mouse_shape_pump_.reset(); 441 mouse_shape_pump_.reset();
459 connection_->set_video_feedback_stub(nullptr);
460 video_frame_pump_.reset();
461 442
462 // Create VideoEncoder and DesktopCapturer to match the session's video 443 // Create VideoEncoder and DesktopCapturer to match the session's video
463 // channel configuration. 444 // channel configuration.
464 scoped_ptr<webrtc::DesktopCapturer> video_capturer = 445 scoped_ptr<webrtc::DesktopCapturer> video_capturer =
465 desktop_environment_->CreateVideoCapturer(); 446 desktop_environment_->CreateVideoCapturer();
466 extension_manager_->OnCreateVideoCapturer(&video_capturer); 447 extension_manager_->OnCreateVideoCapturer(&video_capturer);
467 scoped_ptr<VideoEncoder> video_encoder =
468 CreateVideoEncoder(connection_->session()->config());
469 extension_manager_->OnCreateVideoEncoder(&video_encoder);
470 448
471 // Don't start the VideoFramePump if either capturer or encoder are missing. 449 // Don't start the video stream if the extension took ownership of the
472 if (!video_capturer || !video_encoder) 450 // capturer.
451 if (!video_capturer)
473 return; 452 return;
474 453
475 // Create MouseShapePump to send mouse cursor shape. 454 // Create MouseShapePump to send mouse cursor shape.
476 mouse_shape_pump_.reset( 455 mouse_shape_pump_.reset(
477 new MouseShapePump(video_capture_task_runner_, 456 new MouseShapePump(video_capture_task_runner_,
478 desktop_environment_->CreateMouseCursorMonitor(), 457 desktop_environment_->CreateMouseCursorMonitor(),
479 connection_->client_stub())); 458 connection_->client_stub()));
480 459
481 // Create a VideoFramePump to pump frames from the capturer to the client.' 460 // Create a VideoStream to pump frames from the capturer to the client.
482 // 461
483 // TODO(sergeyu): Move DesktopCapturerProxy creation to DesktopEnvironment. 462 // TODO(sergeyu): Move DesktopCapturerProxy creation to DesktopEnvironment.
484 // When using IpcDesktopCapturer the capture thread is not useful. 463 // When using IpcDesktopCapturer the capture thread is not useful.
485 scoped_ptr<DesktopCapturerProxy> capturer_proxy(new DesktopCapturerProxy( 464 scoped_ptr<webrtc::DesktopCapturer> capturer_proxy(new DesktopCapturerProxy(
486 video_capture_task_runner_, video_capturer.Pass())); 465 video_capture_task_runner_, video_capturer.Pass()));
487 video_frame_pump_.reset(new protocol::VideoFramePump(
488 video_encode_task_runner_, capturer_proxy.Pass(), video_encoder.Pass(),
489 &mouse_clamping_filter_));
490 466
491 // Apply video-control parameters to the new scheduler. 467 video_stream_ = connection_->StartVideoStream(capturer_proxy.Pass());
492 video_frame_pump_->SetLosslessEncode(lossless_video_encode_); 468 video_stream_->SetSizeCallback(
493 video_frame_pump_->SetLosslessColor(lossless_video_color_); 469 base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this)));
470
471 // Apply video-control parameters to the new stream.
472 video_stream_->SetLosslessEncode(lossless_video_encode_);
473 video_stream_->SetLosslessColor(lossless_video_color_);
494 474
495 // Pause capturing if necessary. 475 // Pause capturing if necessary.
496 video_frame_pump_->Pause(pause_video_); 476 video_stream_->Pause(pause_video_);
497
498 connection_->set_video_feedback_stub(
499 video_frame_pump_->video_feedback_stub());
500 } 477 }
501 478
502 void ClientSession::SetGnubbyAuthHandlerForTesting( 479 void ClientSession::SetGnubbyAuthHandlerForTesting(
503 GnubbyAuthHandler* gnubby_auth_handler) { 480 GnubbyAuthHandler* gnubby_auth_handler) {
504 DCHECK(CalledOnValidThread()); 481 DCHECK(CalledOnValidThread());
505 gnubby_auth_handler_.reset(gnubby_auth_handler); 482 gnubby_auth_handler_.reset(gnubby_auth_handler);
506 } 483 }
507 484
508 scoped_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() { 485 scoped_ptr<protocol::ClipboardStub> ClientSession::CreateClipboardProxy() {
509 DCHECK(CalledOnValidThread()); 486 DCHECK(CalledOnValidThread());
510 487
511 return make_scoped_ptr( 488 return make_scoped_ptr(
512 new protocol::ClipboardThreadProxy(client_clipboard_factory_.GetWeakPtr(), 489 new protocol::ClipboardThreadProxy(client_clipboard_factory_.GetWeakPtr(),
513 base::ThreadTaskRunnerHandle::Get())); 490 base::ThreadTaskRunnerHandle::Get()));
514 } 491 }
515 492
493 void ClientSession::OnScreenSizeChanged(const webrtc::DesktopSize& size) {
494 DCHECK(CalledOnValidThread());
495 mouse_clamping_filter_.set_input_size(size);
496 mouse_clamping_filter_.set_output_size(size);
497 }
498
516 } // namespace remoting 499 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698