| 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 // Implementation notes: This needs to work on a variety of hardware | 5 // Implementation notes: This needs to work on a variety of hardware |
| 6 // configurations where the speed of the CPU and GPU greatly affect overall | 6 // configurations where the speed of the CPU and GPU greatly affect overall |
| 7 // performance. Spanning several threads, the process of capturing has been | 7 // performance. Spanning several threads, the process of capturing has been |
| 8 // split up into four conceptual stages: | 8 // split up into four conceptual stages: |
| 9 // | 9 // |
| 10 // 1. Reserve Buffer: Before a frame can be captured, a slot in the client's | 10 // 1. Reserve Buffer: Before a frame can be captured, a slot in the client's |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 WebContentsCaptureMachine(int render_process_id, | 204 WebContentsCaptureMachine(int render_process_id, |
| 205 int main_render_frame_id, | 205 int main_render_frame_id, |
| 206 bool enable_auto_throttling); | 206 bool enable_auto_throttling); |
| 207 ~WebContentsCaptureMachine() override; | 207 ~WebContentsCaptureMachine() override; |
| 208 | 208 |
| 209 // VideoCaptureMachine overrides. | 209 // VideoCaptureMachine overrides. |
| 210 void Start(const scoped_refptr<media::ThreadSafeCaptureOracle>& oracle_proxy, | 210 void Start(const scoped_refptr<media::ThreadSafeCaptureOracle>& oracle_proxy, |
| 211 const media::VideoCaptureParams& params, | 211 const media::VideoCaptureParams& params, |
| 212 const base::Callback<void(bool)> callback) override; | 212 const base::Callback<void(bool)> callback) override; |
| 213 void Stop(const base::Closure& callback) override; | 213 void Stop(const base::Closure& callback) override; |
| 214 bool IsAutoThrottlingEnabled() const override { |
| 215 return auto_throttling_enabled_; |
| 216 } |
| 214 | 217 |
| 215 // Starts a copy from the backing store or the composited surface. Must be run | 218 // Starts a copy from the backing store or the composited surface. Must be run |
| 216 // on the UI BrowserThread. |deliver_frame_cb| will be run when the operation | 219 // on the UI BrowserThread. |deliver_frame_cb| will be run when the operation |
| 217 // completes. The copy will occur to |target|. | 220 // completes. The copy will occur to |target|. |
| 218 // | 221 // |
| 219 // This may be used as a ContentCaptureSubscription::CaptureCallback. | 222 // This may be used as a ContentCaptureSubscription::CaptureCallback. |
| 220 void Capture(const base::TimeTicks& start_time, | 223 void Capture(const base::TimeTicks& start_time, |
| 221 const scoped_refptr<media::VideoFrame>& target, | 224 const scoped_refptr<media::VideoFrame>& target, |
| 222 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& | 225 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& |
| 223 deliver_frame_cb); | 226 deliver_frame_cb); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 void UpdateCaptureSize(); | 259 void UpdateCaptureSize(); |
| 257 | 260 |
| 258 // Parameters saved in constructor. | 261 // Parameters saved in constructor. |
| 259 const int initial_render_process_id_; | 262 const int initial_render_process_id_; |
| 260 const int initial_main_render_frame_id_; | 263 const int initial_main_render_frame_id_; |
| 261 | 264 |
| 262 // Tracks events and calls back to RenewFrameSubscription() to maintain | 265 // Tracks events and calls back to RenewFrameSubscription() to maintain |
| 263 // capture on the correct RenderWidgetHost. | 266 // capture on the correct RenderWidgetHost. |
| 264 const scoped_refptr<WebContentsTracker> tracker_; | 267 const scoped_refptr<WebContentsTracker> tracker_; |
| 265 | 268 |
| 269 // Set to false to prevent the capture size from automatically adjusting in |
| 270 // response to end-to-end utilization. This is enabled via the throttling |
| 271 // option in the WebContentsVideoCaptureDevice device ID. |
| 272 const bool auto_throttling_enabled_; |
| 273 |
| 266 // A dedicated worker thread on which SkBitmap->VideoFrame conversion will | 274 // A dedicated worker thread on which SkBitmap->VideoFrame conversion will |
| 267 // occur. Only used when this activity cannot be done on the GPU. | 275 // occur. Only used when this activity cannot be done on the GPU. |
| 268 scoped_ptr<base::Thread> render_thread_; | 276 scoped_ptr<base::Thread> render_thread_; |
| 269 | 277 |
| 270 // Makes all the decisions about which frames to copy, and how. | 278 // Makes all the decisions about which frames to copy, and how. |
| 271 scoped_refptr<media::ThreadSafeCaptureOracle> oracle_proxy_; | 279 scoped_refptr<media::ThreadSafeCaptureOracle> oracle_proxy_; |
| 272 | 280 |
| 273 // Video capture parameters that this machine is started with. | 281 // Video capture parameters that this machine is started with. |
| 274 media::VideoCaptureParams capture_params_; | 282 media::VideoCaptureParams capture_params_; |
| 275 | 283 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 } | 485 } |
| 478 } | 486 } |
| 479 | 487 |
| 480 WebContentsCaptureMachine::WebContentsCaptureMachine( | 488 WebContentsCaptureMachine::WebContentsCaptureMachine( |
| 481 int render_process_id, | 489 int render_process_id, |
| 482 int main_render_frame_id, | 490 int main_render_frame_id, |
| 483 bool enable_auto_throttling) | 491 bool enable_auto_throttling) |
| 484 : initial_render_process_id_(render_process_id), | 492 : initial_render_process_id_(render_process_id), |
| 485 initial_main_render_frame_id_(main_render_frame_id), | 493 initial_main_render_frame_id_(main_render_frame_id), |
| 486 tracker_(new WebContentsTracker(true)), | 494 tracker_(new WebContentsTracker(true)), |
| 495 auto_throttling_enabled_(enable_auto_throttling), |
| 487 weak_ptr_factory_(this) { | 496 weak_ptr_factory_(this) { |
| 488 // TODO(miu): Use |enable_auto_throttling| to enable/disable the automatic | |
| 489 // video resolution changes based on resource utilization. | |
| 490 // http://crbug.com/156767. | |
| 491 DVLOG(1) << "Created WebContentsCaptureMachine for " | 497 DVLOG(1) << "Created WebContentsCaptureMachine for " |
| 492 << render_process_id << ':' << main_render_frame_id | 498 << render_process_id << ':' << main_render_frame_id |
| 493 << (enable_auto_throttling ? " with auto-throttling enabled" : ""); | 499 << (auto_throttling_enabled_ ? " with auto-throttling enabled" : ""); |
| 494 } | 500 } |
| 495 | 501 |
| 496 WebContentsCaptureMachine::~WebContentsCaptureMachine() {} | 502 WebContentsCaptureMachine::~WebContentsCaptureMachine() {} |
| 497 | 503 |
| 498 bool WebContentsCaptureMachine::IsStarted() const { | 504 bool WebContentsCaptureMachine::IsStarted() const { |
| 499 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 505 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 500 return weak_ptr_factory_.HasWeakPtrs(); | 506 return weak_ptr_factory_.HasWeakPtrs(); |
| 501 } | 507 } |
| 502 | 508 |
| 503 void WebContentsCaptureMachine::Start( | 509 void WebContentsCaptureMachine::Start( |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 scoped_ptr<Client> client) { | 799 scoped_ptr<Client> client) { |
| 794 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); | 800 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); |
| 795 core_->AllocateAndStart(params, client.Pass()); | 801 core_->AllocateAndStart(params, client.Pass()); |
| 796 } | 802 } |
| 797 | 803 |
| 798 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { | 804 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { |
| 799 core_->StopAndDeAllocate(); | 805 core_->StopAndDeAllocate(); |
| 800 } | 806 } |
| 801 | 807 |
| 802 } // namespace content | 808 } // namespace content |
| OLD | NEW |