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

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

Issue 1673723002: Use IpcVideoFrameCapturer on network thread instead of capturer thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months 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
« no previous file with comments | « remoting/host/desktop_session_agent.h ('k') | remoting/host/desktop_session_proxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
OLDNEW
« no previous file with comments | « remoting/host/desktop_session_agent.h ('k') | remoting/host/desktop_session_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698