OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "remoting/host/screen_capturer_proxy.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/location.h" | |
9 #include "base/single_thread_task_runner.h" | |
10 #include "remoting/proto/control.pb.h" | |
11 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" | |
12 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | |
13 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h" | |
14 | |
15 namespace remoting { | |
16 | |
17 class ScreenCapturerProxy::Core : public webrtc::DesktopCapturer::Callback { | |
Wez
2015/02/11 01:05:07
nit: You could make this class purely a DesktopCap
Sergey Ulanov
2015/02/11 19:21:35
the capturer and the callback would still need to
| |
18 public: | |
19 Core(base::WeakPtr<ScreenCapturerProxy> proxy, | |
20 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner, | |
21 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, | |
22 scoped_ptr<webrtc::DesktopCapturer> capturer); | |
23 ~Core(); | |
24 | |
25 void Start(); | |
26 void Capture(); | |
27 | |
28 private: | |
29 // webrtc::DesktopCapturer::Callback implementation. | |
30 webrtc::SharedMemory* CreateSharedMemory(size_t size) override; | |
31 void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; | |
32 | |
33 | |
Wez
2015/02/11 01:05:07
nit: Duplicate blank line?
Sergey Ulanov
2015/02/11 19:21:35
Done.
| |
34 base::WeakPtr<ScreenCapturerProxy> proxy_; | |
35 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; | |
36 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_; | |
37 scoped_ptr<webrtc::DesktopCapturer> capturer_; | |
38 | |
39 DISALLOW_COPY_AND_ASSIGN(Core); | |
40 }; | |
41 | |
42 ScreenCapturerProxy::Core::Core( | |
43 base::WeakPtr<ScreenCapturerProxy> proxy, | |
44 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner, | |
45 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, | |
46 scoped_ptr<webrtc::DesktopCapturer> capturer) | |
47 : proxy_(proxy), | |
48 network_task_runner_(network_task_runner), | |
49 capture_task_runner_(capture_task_runner), | |
50 capturer_(capturer.Pass()) { | |
51 } | |
52 | |
53 void ScreenCapturerProxy::Core::Start() { | |
54 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | |
55 | |
56 capturer_->Start(this); | |
57 } | |
58 | |
59 ScreenCapturerProxy::Core::~Core() { | |
Wez
2015/02/11 01:05:07
nit: This seems to be in the wrong order wrt Start
Sergey Ulanov
2015/02/11 19:21:35
Done.
| |
60 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | |
61 } | |
62 | |
63 void ScreenCapturerProxy::Core::Capture() { | |
64 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | |
65 | |
66 capturer_->Capture(webrtc::DesktopRegion()); | |
67 } | |
68 | |
69 webrtc::SharedMemory* ScreenCapturerProxy::Core::CreateSharedMemory( | |
70 size_t size) { | |
71 return nullptr; | |
72 } | |
73 | |
74 void ScreenCapturerProxy::Core::OnCaptureCompleted( | |
75 webrtc::DesktopFrame* frame) { | |
76 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | |
77 | |
78 network_task_runner_->PostTask( | |
79 FROM_HERE, base::Bind(&ScreenCapturerProxy::OnFrameCaptured, proxy_, | |
80 base::Passed(make_scoped_ptr(frame)))); | |
81 } | |
Wez
2015/02/11 01:05:07
nit: Missing blank line.
Sergey Ulanov
2015/02/11 19:21:35
Done.
| |
82 ScreenCapturerProxy::ScreenCapturerProxy( | |
83 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner, | |
84 scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, | |
85 scoped_ptr<webrtc::DesktopCapturer> capturer) | |
86 : network_task_runner_(network_task_runner), | |
87 capture_task_runner_(capture_task_runner), | |
88 weak_factory_(this) { | |
89 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
90 | |
91 core_.reset(new Core(weak_factory_.GetWeakPtr(), network_task_runner, | |
92 capture_task_runner, capturer.Pass())); | |
93 } | |
94 | |
95 void ScreenCapturerProxy::Init( | |
96 const FrameCapturedCallback& frame_captured_callback) { | |
97 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
98 | |
99 frame_captured_callback_ = frame_captured_callback; | |
100 | |
101 capture_task_runner_->PostTask( | |
102 FROM_HERE, base::Bind(&Core::Start, base::Unretained(core_.get()))); | |
103 } | |
104 | |
105 ScreenCapturerProxy::~ScreenCapturerProxy() { | |
106 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
107 | |
108 capture_task_runner_->DeleteSoon(FROM_HERE, core_.release()); | |
109 } | |
110 | |
111 void ScreenCapturerProxy::Capture() { | |
112 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
113 | |
114 // Start() must be called before Capture(). | |
115 DCHECK(!frame_captured_callback_.is_null()); | |
116 | |
117 capture_task_runner_->PostTask( | |
118 FROM_HERE, base::Bind(&Core::Capture, base::Unretained(core_.get()))); | |
119 } | |
120 | |
121 void ScreenCapturerProxy::OnFrameCaptured( | |
122 scoped_ptr<webrtc::DesktopFrame> frame) { | |
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
124 | |
125 frame_captured_callback_.Run(frame.Pass()); | |
126 } | |
127 | |
128 } // namespace remoting | |
OLD | NEW |