OLD | NEW |
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 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 client_capabilities_ = make_scoped_ptr(new std::string()); | 190 client_capabilities_ = make_scoped_ptr(new std::string()); |
191 if (capabilities.has_capabilities()) | 191 if (capabilities.has_capabilities()) |
192 *client_capabilities_ = capabilities.capabilities(); | 192 *client_capabilities_ = capabilities.capabilities(); |
193 capabilities_ = IntersectCapabilities(*client_capabilities_, | 193 capabilities_ = IntersectCapabilities(*client_capabilities_, |
194 host_capabilities_); | 194 host_capabilities_); |
195 extension_manager_->OnNegotiatedCapabilities( | 195 extension_manager_->OnNegotiatedCapabilities( |
196 connection_->client_stub(), capabilities_); | 196 connection_->client_stub(), capabilities_); |
197 | 197 |
198 VLOG(1) << "Client capabilities: " << *client_capabilities_; | 198 VLOG(1) << "Client capabilities: " << *client_capabilities_; |
199 | 199 |
200 // Calculate the set of capabilities enabled by both client and host and | |
201 // pass it to the desktop environment if it is available. | |
202 desktop_environment_->SetCapabilities(capabilities_); | 200 desktop_environment_->SetCapabilities(capabilities_); |
| 201 |
| 202 if (pending_video_layout_message_) { |
| 203 connection_->client_stub()->SetVideoLayout(*pending_video_layout_message_); |
| 204 pending_video_layout_message_.reset(); |
| 205 } |
203 } | 206 } |
204 | 207 |
205 void ClientSession::RequestPairing( | 208 void ClientSession::RequestPairing( |
206 const protocol::PairingRequest& pairing_request) { | 209 const protocol::PairingRequest& pairing_request) { |
207 if (pairing_registry_.get() && pairing_request.has_client_name()) { | 210 if (pairing_registry_.get() && pairing_request.has_client_name()) { |
208 protocol::PairingRegistry::Pairing pairing = | 211 protocol::PairingRegistry::Pairing pairing = |
209 pairing_registry_->CreatePairing(pairing_request.client_name()); | 212 pairing_registry_->CreatePairing(pairing_request.client_name()); |
210 protocol::PairingResponse pairing_response; | 213 protocol::PairingResponse pairing_response; |
211 pairing_response.set_client_id(pairing.client_id()); | 214 pairing_response.set_client_id(pairing.client_id()); |
212 pairing_response.set_shared_secret(pairing.shared_secret()); | 215 pairing_response.set_shared_secret(pairing.shared_secret()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 // Connect the host input stubs. | 291 // Connect the host input stubs. |
289 connection_->set_input_stub(&disable_input_filter_); | 292 connection_->set_input_stub(&disable_input_filter_); |
290 host_input_filter_.set_input_stub(input_injector_.get()); | 293 host_input_filter_.set_input_stub(input_injector_.get()); |
291 | 294 |
292 // Connect the clipboard stubs. | 295 // Connect the clipboard stubs. |
293 connection_->set_clipboard_stub(&disable_clipboard_filter_); | 296 connection_->set_clipboard_stub(&disable_clipboard_filter_); |
294 clipboard_echo_filter_.set_host_stub(input_injector_.get()); | 297 clipboard_echo_filter_.set_host_stub(input_injector_.get()); |
295 clipboard_echo_filter_.set_client_stub(connection_->client_stub()); | 298 clipboard_echo_filter_.set_client_stub(connection_->client_stub()); |
296 } | 299 } |
297 | 300 |
| 301 void ClientSession::OnCreateVideoStreams( |
| 302 protocol::ConnectionToClient* connection) { |
| 303 DCHECK(CalledOnValidThread()); |
| 304 DCHECK_EQ(connection_.get(), connection); |
| 305 |
| 306 // Create a VideoStream to pump frames from the capturer to the client. |
| 307 video_stream_ = connection_->StartVideoStream( |
| 308 desktop_environment_->CreateVideoCapturer()); |
| 309 |
| 310 video_stream_->SetSizeCallback( |
| 311 base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this))); |
| 312 |
| 313 // Apply video-control parameters to the new stream. |
| 314 video_stream_->SetLosslessEncode(lossless_video_encode_); |
| 315 video_stream_->SetLosslessColor(lossless_video_color_); |
| 316 |
| 317 // Pause capturing if necessary. |
| 318 video_stream_->Pause(pause_video_); |
| 319 } |
| 320 |
298 void ClientSession::OnConnectionChannelsConnected( | 321 void ClientSession::OnConnectionChannelsConnected( |
299 protocol::ConnectionToClient* connection) { | 322 protocol::ConnectionToClient* connection) { |
300 DCHECK(CalledOnValidThread()); | 323 DCHECK(CalledOnValidThread()); |
301 DCHECK_EQ(connection_.get(), connection); | 324 DCHECK_EQ(connection_.get(), connection); |
302 | 325 |
303 // Negotiate capabilities with the client. | 326 // Negotiate capabilities with the client. |
304 VLOG(1) << "Host capabilities: " << host_capabilities_; | 327 VLOG(1) << "Host capabilities: " << host_capabilities_; |
305 protocol::Capabilities capabilities; | 328 protocol::Capabilities capabilities; |
306 capabilities.set_capabilities(host_capabilities_); | 329 capabilities.set_capabilities(host_capabilities_); |
307 connection_->client_stub()->SetCapabilities(capabilities); | 330 connection_->client_stub()->SetCapabilities(capabilities); |
308 | 331 |
309 // Start the event executor. | 332 // Start the event executor. |
310 input_injector_->Start(CreateClipboardProxy()); | 333 input_injector_->Start(CreateClipboardProxy()); |
311 SetDisableInputs(false); | 334 SetDisableInputs(false); |
312 | 335 |
313 // Create MouseShapePump to send mouse cursor shape. | 336 // Create MouseShapePump to send mouse cursor shape. |
314 mouse_shape_pump_.reset( | 337 mouse_shape_pump_.reset( |
315 new MouseShapePump(desktop_environment_->CreateMouseCursorMonitor(), | 338 new MouseShapePump(desktop_environment_->CreateMouseCursorMonitor(), |
316 connection_->client_stub())); | 339 connection_->client_stub())); |
317 | 340 |
318 // Create a VideoStream to pump frames from the capturer to the client. | |
319 video_stream_ = connection_->StartVideoStream( | |
320 desktop_environment_->CreateVideoCapturer()); | |
321 | |
322 video_stream_->SetSizeCallback( | |
323 base::Bind(&ClientSession::OnScreenSizeChanged, base::Unretained(this))); | |
324 | |
325 // Apply video-control parameters to the new stream. | |
326 video_stream_->SetLosslessEncode(lossless_video_encode_); | |
327 video_stream_->SetLosslessColor(lossless_video_color_); | |
328 | |
329 // Pause capturing if necessary. | |
330 video_stream_->Pause(pause_video_); | |
331 | |
332 // Create an AudioPump if audio is enabled, to pump audio samples. | 341 // Create an AudioPump if audio is enabled, to pump audio samples. |
333 if (connection_->session()->config().is_audio_enabled()) { | 342 if (connection_->session()->config().is_audio_enabled()) { |
334 scoped_ptr<AudioEncoder> audio_encoder = | 343 scoped_ptr<AudioEncoder> audio_encoder = |
335 CreateAudioEncoder(connection_->session()->config()); | 344 CreateAudioEncoder(connection_->session()->config()); |
336 audio_pump_.reset(new AudioPump( | 345 audio_pump_.reset(new AudioPump( |
337 audio_task_runner_, desktop_environment_->CreateAudioCapturer(), | 346 audio_task_runner_, desktop_environment_->CreateAudioCapturer(), |
338 std::move(audio_encoder), connection_->audio_stub())); | 347 std::move(audio_encoder), connection_->audio_stub())); |
339 } | 348 } |
340 | 349 |
341 // Notify the event handler that all our channels are now connected. | 350 // Notify the event handler that all our channels are now connected. |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 if (connection_->session()->config().protocol() == | 450 if (connection_->session()->config().protocol() == |
442 protocol::SessionConfig::Protocol::WEBRTC) { | 451 protocol::SessionConfig::Protocol::WEBRTC) { |
443 protocol::VideoLayout layout; | 452 protocol::VideoLayout layout; |
444 protocol::VideoTrackLayout* video_track = layout.add_video_track(); | 453 protocol::VideoTrackLayout* video_track = layout.add_video_track(); |
445 video_track->set_position_x(0); | 454 video_track->set_position_x(0); |
446 video_track->set_position_y(0); | 455 video_track->set_position_y(0); |
447 video_track->set_width(size.width() * kDefaultDpi / dpi.x()); | 456 video_track->set_width(size.width() * kDefaultDpi / dpi.x()); |
448 video_track->set_height(size.height() * kDefaultDpi / dpi.y()); | 457 video_track->set_height(size.height() * kDefaultDpi / dpi.y()); |
449 video_track->set_x_dpi(dpi.x()); | 458 video_track->set_x_dpi(dpi.x()); |
450 video_track->set_y_dpi(dpi.y()); | 459 video_track->set_y_dpi(dpi.y()); |
451 connection_->client_stub()->SetVideoLayout(layout); | 460 |
| 461 // VideoLayout can be sent only after capabilities negotiation has finished. |
| 462 if (client_capabilities_) { |
| 463 connection_->client_stub()->SetVideoLayout(layout); |
| 464 } else { |
| 465 pending_video_layout_message_.reset(new protocol::VideoLayout(layout)); |
| 466 } |
452 } | 467 } |
453 } | 468 } |
454 | 469 |
455 } // namespace remoting | 470 } // namespace remoting |
OLD | NEW |