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

Side by Side Diff: content/browser/renderer_host/media/desktop_capture_device_ash.cc

Issue 100313002: Fix screen capture slowness in Chrome OS feedback report. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments by sergeyu. Created 7 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/browser/renderer_host/media/desktop_capture_device_ash.h" 5 #include "content/browser/renderer_host/media/desktop_capture_device_ash.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/timer/timer.h" 8 #include "base/timer/timer.h"
9 #include "cc/output/copy_output_request.h" 9 #include "cc/output/copy_output_request.h"
10 #include "cc/output/copy_output_result.h" 10 #include "cc/output/copy_output_result.h"
(...skipping 23 matching lines...) Expand all
34 public: 34 public:
35 DesktopVideoCaptureMachine(const DesktopMediaID& source); 35 DesktopVideoCaptureMachine(const DesktopMediaID& source);
36 virtual ~DesktopVideoCaptureMachine(); 36 virtual ~DesktopVideoCaptureMachine();
37 37
38 // VideoCaptureFrameSource overrides. 38 // VideoCaptureFrameSource overrides.
39 virtual bool Start( 39 virtual bool Start(
40 const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) OVERRIDE; 40 const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) OVERRIDE;
41 virtual void Stop() OVERRIDE; 41 virtual void Stop() OVERRIDE;
42 42
43 // Implements aura::WindowObserver. 43 // Implements aura::WindowObserver.
44 virtual void OnWindowBoundsChanged(aura::Window* window,
45 const gfx::Rect& old_bounds,
46 const gfx::Rect& new_bounds) OVERRIDE;
44 virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 47 virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
45 48
46 // Implements ui::CompositorObserver. 49 // Implements ui::CompositorObserver.
47 virtual void OnCompositingDidCommit(ui::Compositor* compositor) OVERRIDE {} 50 virtual void OnCompositingDidCommit(ui::Compositor* compositor) OVERRIDE {}
48 virtual void OnCompositingStarted(ui::Compositor* compositor, 51 virtual void OnCompositingStarted(ui::Compositor* compositor,
49 base::TimeTicks start_time) OVERRIDE {} 52 base::TimeTicks start_time) OVERRIDE {}
50 virtual void OnCompositingEnded(ui::Compositor* compositor) OVERRIDE; 53 virtual void OnCompositingEnded(ui::Compositor* compositor) OVERRIDE;
51 virtual void OnCompositingAborted(ui::Compositor* compositor) OVERRIDE {} 54 virtual void OnCompositingAborted(ui::Compositor* compositor) OVERRIDE {}
52 virtual void OnCompositingLockStateChanged( 55 virtual void OnCompositingLockStateChanged(
53 ui::Compositor* compositor) OVERRIDE {} 56 ui::Compositor* compositor) OVERRIDE {}
54 virtual void OnUpdateVSyncParameters(ui::Compositor* compositor, 57 virtual void OnUpdateVSyncParameters(ui::Compositor* compositor,
55 base::TimeTicks timebase, 58 base::TimeTicks timebase,
56 base::TimeDelta interval) OVERRIDE {} 59 base::TimeDelta interval) OVERRIDE {}
57 60
58 private: 61 private:
59 // Captures a frame. 62 // Captures a frame.
60 // |dirty| is false for timer polls and true for compositor updates. 63 // |dirty| is false for timer polls and true for compositor updates.
61 void Capture(bool dirty); 64 void Capture(bool dirty);
62 65
66 // Update capture size. Must be called on the UI thread.
67 void UpdateCaptureSize();
68
63 // Response callback for cc::Layer::RequestCopyOfOutput(). 69 // Response callback for cc::Layer::RequestCopyOfOutput().
64 void DidCopyOutput( 70 void DidCopyOutput(
65 scoped_refptr<media::VideoFrame> video_frame, 71 scoped_refptr<media::VideoFrame> video_frame,
66 base::Time start_time, 72 base::Time start_time,
67 const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb, 73 const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb,
68 scoped_ptr<cc::CopyOutputResult> result); 74 scoped_ptr<cc::CopyOutputResult> result);
69 75
70 // The window associated with the desktop. 76 // The window associated with the desktop.
71 aura::Window* desktop_window_; 77 aura::Window* desktop_window_;
72 78
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 return false; 116 return false;
111 117
112 // If the desktop layer is already destroyed then return failure. 118 // If the desktop layer is already destroyed then return failure.
113 desktop_layer_ = desktop_window_->layer(); 119 desktop_layer_ = desktop_window_->layer();
114 if (!desktop_layer_) 120 if (!desktop_layer_)
115 return false; 121 return false;
116 122
117 DCHECK(oracle_proxy.get()); 123 DCHECK(oracle_proxy.get());
118 oracle_proxy_ = oracle_proxy; 124 oracle_proxy_ = oracle_proxy;
119 125
126 // Update capture size.
127 UpdateCaptureSize();
128
120 // Start observing window events. 129 // Start observing window events.
121 desktop_window_->AddObserver(this); 130 desktop_window_->AddObserver(this);
122 131
123 // Start observing compositor updates. 132 // Start observing compositor updates.
124 ui::Compositor* compositor = desktop_layer_->GetCompositor(); 133 ui::Compositor* compositor = desktop_layer_->GetCompositor();
125 if (!compositor) 134 if (!compositor)
126 return false; 135 return false;
127 136
128 compositor->AddObserver(this); 137 compositor->AddObserver(this);
129 138
(...skipping 19 matching lines...) Expand all
149 if (compositor) 158 if (compositor)
150 compositor->RemoveObserver(this); 159 compositor->RemoveObserver(this);
151 } 160 }
152 161
153 // Stop timer. 162 // Stop timer.
154 timer_.Stop(); 163 timer_.Stop();
155 164
156 started_ = false; 165 started_ = false;
157 } 166 }
158 167
168 void DesktopVideoCaptureMachine::UpdateCaptureSize() {
169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
170 if (oracle_proxy_ && desktop_layer_) {
171 oracle_proxy_->UpdateCaptureSize(ui::ConvertSizeToPixel(
172 desktop_layer_, desktop_layer_->bounds().size()));
173 }
174 }
175
159 void DesktopVideoCaptureMachine::Capture(bool dirty) { 176 void DesktopVideoCaptureMachine::Capture(bool dirty) {
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161 178
162 // Do not capture if the desktop layer is already destroyed. 179 // Do not capture if the desktop layer is already destroyed.
163 if (!desktop_layer_) 180 if (!desktop_layer_)
164 return; 181 return;
165 182
166 scoped_refptr<media::VideoFrame> frame; 183 scoped_refptr<media::VideoFrame> frame;
167 ThreadSafeCaptureOracle::CaptureFrameCallback capture_frame_cb; 184 ThreadSafeCaptureOracle::CaptureFrameCallback capture_frame_cb;
168 185
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 region_in_frame, 258 region_in_frame,
242 true, 259 true,
243 true)); 260 true));
244 } 261 }
245 yuv_readback_pipeline_->ReadbackYUV( 262 yuv_readback_pipeline_->ReadbackYUV(
246 texture_mailbox.name(), texture_mailbox.sync_point(), video_frame.get(), 263 texture_mailbox.name(), texture_mailbox.sync_point(), video_frame.get(),
247 base::Bind(&CopyOutputFinishedForVideo, start_time, capture_frame_cb, 264 base::Bind(&CopyOutputFinishedForVideo, start_time, capture_frame_cb,
248 base::Passed(&release_callback))); 265 base::Passed(&release_callback)));
249 } 266 }
250 267
268 void DesktopVideoCaptureMachine::OnWindowBoundsChanged(
269 aura::Window* window,
270 const gfx::Rect& old_bounds,
271 const gfx::Rect& new_bounds) {
272 DCHECK(desktop_window_ && window == desktop_window_);
273
274 // Post task to update capture size on UI thread.
275 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
276 &DesktopVideoCaptureMachine::UpdateCaptureSize, AsWeakPtr()));
277 }
278
251 void DesktopVideoCaptureMachine::OnWindowDestroyed(aura::Window* window) { 279 void DesktopVideoCaptureMachine::OnWindowDestroyed(aura::Window* window) {
252 DCHECK(desktop_window_ && window == desktop_window_); 280 DCHECK(desktop_window_ && window == desktop_window_);
253 desktop_window_ = NULL; 281 desktop_window_ = NULL;
254 desktop_layer_ = NULL; 282 desktop_layer_ = NULL;
255 283
256 // Post task to stop capture on UI thread. 284 // Post task to stop capture on UI thread.
257 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 285 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
258 &DesktopVideoCaptureMachine::Stop, AsWeakPtr())); 286 &DesktopVideoCaptureMachine::Stop, AsWeakPtr()));
259 } 287 }
260 288
(...skipping 29 matching lines...) Expand all
290 scoped_ptr<Client> client) { 318 scoped_ptr<Client> client) {
291 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); 319 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString();
292 impl_->AllocateAndStart(params, client.Pass()); 320 impl_->AllocateAndStart(params, client.Pass());
293 } 321 }
294 322
295 void DesktopCaptureDeviceAsh::StopAndDeAllocate() { 323 void DesktopCaptureDeviceAsh::StopAndDeAllocate() {
296 impl_->StopAndDeAllocate(); 324 impl_->StopAndDeAllocate();
297 } 325 }
298 326
299 } // namespace content 327 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698