| 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/desktop_session_agent.h" | 5 #include "remoting/host/desktop_session_agent.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 } // namespace | 153 } // namespace |
| 154 | 154 |
| 155 DesktopSessionAgent::Delegate::~Delegate() {} | 155 DesktopSessionAgent::Delegate::~Delegate() {} |
| 156 | 156 |
| 157 DesktopSessionAgent::DesktopSessionAgent( | 157 DesktopSessionAgent::DesktopSessionAgent( |
| 158 scoped_refptr<AutoThreadTaskRunner> audio_capture_task_runner, | 158 scoped_refptr<AutoThreadTaskRunner> audio_capture_task_runner, |
| 159 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, | 159 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, |
| 160 scoped_refptr<AutoThreadTaskRunner> input_task_runner, | 160 scoped_refptr<AutoThreadTaskRunner> input_task_runner, |
| 161 scoped_refptr<AutoThreadTaskRunner> io_task_runner, | 161 scoped_refptr<AutoThreadTaskRunner> io_task_runner) |
| 162 scoped_refptr<AutoThreadTaskRunner> video_capture_task_runner) | |
| 163 : audio_capture_task_runner_(audio_capture_task_runner), | 162 : audio_capture_task_runner_(audio_capture_task_runner), |
| 164 caller_task_runner_(caller_task_runner), | 163 caller_task_runner_(caller_task_runner), |
| 165 input_task_runner_(input_task_runner), | 164 input_task_runner_(input_task_runner), |
| 166 io_task_runner_(io_task_runner), | 165 io_task_runner_(io_task_runner), |
| 167 video_capture_task_runner_(video_capture_task_runner), | |
| 168 weak_factory_(this) { | 166 weak_factory_(this) { |
| 169 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 167 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 170 } | 168 } |
| 171 | 169 |
| 172 bool DesktopSessionAgent::OnMessageReceived(const IPC::Message& message) { | 170 bool DesktopSessionAgent::OnMessageReceived(const IPC::Message& message) { |
| 173 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 171 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 174 | 172 |
| 175 bool handled = true; | 173 bool handled = true; |
| 176 if (started_) { | 174 if (started_) { |
| 177 IPC_BEGIN_MESSAGE_MAP(DesktopSessionAgent, message) | 175 IPC_BEGIN_MESSAGE_MAP(DesktopSessionAgent, message) |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 | 306 |
| 309 // Start the audio capturer. | 307 // Start the audio capturer. |
| 310 if (delegate_->desktop_environment_factory().SupportsAudioCapture()) { | 308 if (delegate_->desktop_environment_factory().SupportsAudioCapture()) { |
| 311 audio_capturer_ = desktop_environment_->CreateAudioCapturer(); | 309 audio_capturer_ = desktop_environment_->CreateAudioCapturer(); |
| 312 audio_capture_task_runner_->PostTask( | 310 audio_capture_task_runner_->PostTask( |
| 313 FROM_HERE, base::Bind(&DesktopSessionAgent::StartAudioCapturer, this)); | 311 FROM_HERE, base::Bind(&DesktopSessionAgent::StartAudioCapturer, this)); |
| 314 } | 312 } |
| 315 | 313 |
| 316 // Start the video capturer and mouse cursor monitor. | 314 // Start the video capturer and mouse cursor monitor. |
| 317 video_capturer_ = desktop_environment_->CreateVideoCapturer(); | 315 video_capturer_ = desktop_environment_->CreateVideoCapturer(); |
| 316 video_capturer_->Start(this); |
| 317 video_capturer_->SetSharedMemoryFactory( |
| 318 rtc_make_scoped_ptr(new SharedMemoryFactoryImpl( |
| 319 base::Bind(&DesktopSessionAgent::SendToNetwork, this)))); |
| 318 mouse_cursor_monitor_ = desktop_environment_->CreateMouseCursorMonitor(); | 320 mouse_cursor_monitor_ = desktop_environment_->CreateMouseCursorMonitor(); |
| 319 video_capture_task_runner_->PostTask( | 321 mouse_cursor_monitor_->Init(this, webrtc::MouseCursorMonitor::SHAPE_ONLY); |
| 320 FROM_HERE, base::Bind( | |
| 321 &DesktopSessionAgent::StartVideoCapturerAndMouseMonitor, this)); | |
| 322 } | 322 } |
| 323 | 323 |
| 324 void DesktopSessionAgent::OnCaptureCompleted(webrtc::DesktopFrame* frame) { | 324 void DesktopSessionAgent::OnCaptureCompleted(webrtc::DesktopFrame* frame) { |
| 325 DCHECK(video_capture_task_runner_->BelongsToCurrentThread()); | 325 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 326 | 326 |
| 327 last_frame_.reset(frame); | 327 last_frame_.reset(frame); |
| 328 | 328 |
| 329 current_size_ = frame->size(); | 329 current_size_ = frame->size(); |
| 330 | 330 |
| 331 // Serialize webrtc::DesktopFrame. | 331 // Serialize webrtc::DesktopFrame. |
| 332 SerializedDesktopFrame serialized_frame; | 332 SerializedDesktopFrame serialized_frame; |
| 333 serialized_frame.shared_buffer_id = frame->shared_memory()->id(); | 333 serialized_frame.shared_buffer_id = frame->shared_memory()->id(); |
| 334 serialized_frame.bytes_per_row = frame->stride(); | 334 serialized_frame.bytes_per_row = frame->stride(); |
| 335 serialized_frame.dimensions = frame->size(); | 335 serialized_frame.dimensions = frame->size(); |
| 336 serialized_frame.capture_time_ms = frame->capture_time_ms(); | 336 serialized_frame.capture_time_ms = frame->capture_time_ms(); |
| 337 serialized_frame.dpi = frame->dpi(); | 337 serialized_frame.dpi = frame->dpi(); |
| 338 for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); | 338 for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); |
| 339 !i.IsAtEnd(); i.Advance()) { | 339 !i.IsAtEnd(); i.Advance()) { |
| 340 serialized_frame.dirty_region.push_back(i.rect()); | 340 serialized_frame.dirty_region.push_back(i.rect()); |
| 341 } | 341 } |
| 342 | 342 |
| 343 SendToNetwork(make_scoped_ptr( | 343 SendToNetwork(make_scoped_ptr( |
| 344 new ChromotingDesktopNetworkMsg_CaptureCompleted(serialized_frame))); | 344 new ChromotingDesktopNetworkMsg_CaptureCompleted(serialized_frame))); |
| 345 } | 345 } |
| 346 | 346 |
| 347 void DesktopSessionAgent::OnMouseCursor(webrtc::MouseCursor* cursor) { | 347 void DesktopSessionAgent::OnMouseCursor(webrtc::MouseCursor* cursor) { |
| 348 DCHECK(video_capture_task_runner_->BelongsToCurrentThread()); | 348 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 349 | 349 |
| 350 scoped_ptr<webrtc::MouseCursor> owned_cursor(cursor); | 350 scoped_ptr<webrtc::MouseCursor> owned_cursor(cursor); |
| 351 | 351 |
| 352 SendToNetwork(make_scoped_ptr( | 352 SendToNetwork(make_scoped_ptr( |
| 353 new ChromotingDesktopNetworkMsg_MouseCursor(*owned_cursor))); | 353 new ChromotingDesktopNetworkMsg_MouseCursor(*owned_cursor))); |
| 354 } | 354 } |
| 355 | 355 |
| 356 void DesktopSessionAgent::OnMouseCursorPosition( | 356 void DesktopSessionAgent::OnMouseCursorPosition( |
| 357 webrtc::MouseCursorMonitor::CursorState state, | 357 webrtc::MouseCursorMonitor::CursorState state, |
| 358 const webrtc::DesktopVector& position) { | 358 const webrtc::DesktopVector& position) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 | 433 |
| 434 desktop_environment_.reset(); | 434 desktop_environment_.reset(); |
| 435 input_injector_.reset(); | 435 input_injector_.reset(); |
| 436 screen_controls_.reset(); | 436 screen_controls_.reset(); |
| 437 | 437 |
| 438 // Stop the audio capturer. | 438 // Stop the audio capturer. |
| 439 audio_capture_task_runner_->PostTask( | 439 audio_capture_task_runner_->PostTask( |
| 440 FROM_HERE, base::Bind(&DesktopSessionAgent::StopAudioCapturer, this)); | 440 FROM_HERE, base::Bind(&DesktopSessionAgent::StopAudioCapturer, this)); |
| 441 | 441 |
| 442 // Stop the video capturer. | 442 // Stop the video capturer. |
| 443 video_capture_task_runner_->PostTask( | 443 video_capturer_.reset(); |
| 444 FROM_HERE, base::Bind( | 444 last_frame_.reset(); |
| 445 &DesktopSessionAgent::StopVideoCapturerAndMouseMonitor, this)); | 445 mouse_cursor_monitor_.reset(); |
| 446 } | 446 } |
| 447 } | 447 } |
| 448 | 448 |
| 449 void DesktopSessionAgent::OnCaptureFrame() { | 449 void DesktopSessionAgent::OnCaptureFrame() { |
| 450 if (!video_capture_task_runner_->BelongsToCurrentThread()) { | 450 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 451 video_capture_task_runner_->PostTask( | |
| 452 FROM_HERE, | |
| 453 base::Bind(&DesktopSessionAgent::OnCaptureFrame, this)); | |
| 454 return; | |
| 455 } | |
| 456 | 451 |
| 457 mouse_cursor_monitor_->Capture(); | 452 mouse_cursor_monitor_->Capture(); |
| 458 | 453 |
| 459 // webrtc::DesktopCapturer supports a very few (currently 2) outstanding | 454 // webrtc::DesktopCapturer supports a very few (currently 2) outstanding |
| 460 // capture requests. The requests are serialized on | 455 // capture requests. The requests are serialized on |
| 461 // |video_capture_task_runner()| task runner. If the client issues more | 456 // |video_capture_task_runner()| task runner. If the client issues more |
| 462 // requests, pixel data in captured frames will likely be corrupted but | 457 // requests, pixel data in captured frames will likely be corrupted but |
| 463 // stability of webrtc::DesktopCapturer will not be affected. | 458 // stability of webrtc::DesktopCapturer will not be affected. |
| 464 video_capturer_->Capture(webrtc::DesktopRegion()); | 459 video_capturer_->Capture(webrtc::DesktopRegion()); |
| 465 } | 460 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 this)); | 571 this)); |
| 577 } | 572 } |
| 578 } | 573 } |
| 579 | 574 |
| 580 void DesktopSessionAgent::StopAudioCapturer() { | 575 void DesktopSessionAgent::StopAudioCapturer() { |
| 581 DCHECK(audio_capture_task_runner_->BelongsToCurrentThread()); | 576 DCHECK(audio_capture_task_runner_->BelongsToCurrentThread()); |
| 582 | 577 |
| 583 audio_capturer_.reset(); | 578 audio_capturer_.reset(); |
| 584 } | 579 } |
| 585 | 580 |
| 586 void DesktopSessionAgent::StartVideoCapturerAndMouseMonitor() { | |
| 587 DCHECK(video_capture_task_runner_->BelongsToCurrentThread()); | |
| 588 | |
| 589 if (video_capturer_) { | |
| 590 video_capturer_->Start(this); | |
| 591 video_capturer_->SetSharedMemoryFactory( | |
| 592 rtc_make_scoped_ptr(new SharedMemoryFactoryImpl( | |
| 593 base::Bind(&DesktopSessionAgent::SendToNetwork, this)))); | |
| 594 } | |
| 595 | |
| 596 if (mouse_cursor_monitor_) { | |
| 597 mouse_cursor_monitor_->Init(this, webrtc::MouseCursorMonitor::SHAPE_ONLY); | |
| 598 } | |
| 599 } | |
| 600 | |
| 601 void DesktopSessionAgent::StopVideoCapturerAndMouseMonitor() { | |
| 602 DCHECK(video_capture_task_runner_->BelongsToCurrentThread()); | |
| 603 | |
| 604 video_capturer_.reset(); | |
| 605 last_frame_.reset(); | |
| 606 mouse_cursor_monitor_.reset(); | |
| 607 } | |
| 608 | |
| 609 } // namespace remoting | 581 } // namespace remoting |
| OLD | NEW |