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 |