| 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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 // Computes the preferred size of the target RenderWidget for optimal capture. | 252 // Computes the preferred size of the target RenderWidget for optimal capture. |
| 253 gfx::Size ComputeOptimalTargetSize() const; | 253 gfx::Size ComputeOptimalTargetSize() const; |
| 254 | 254 |
| 255 // Response callback for RenderWidgetHost::CopyFromBackingStore(). | 255 // Response callback for RenderWidgetHost::CopyFromBackingStore(). |
| 256 void DidCopyFromBackingStore( | 256 void DidCopyFromBackingStore( |
| 257 const base::TimeTicks& start_time, | 257 const base::TimeTicks& start_time, |
| 258 const scoped_refptr<media::VideoFrame>& target, | 258 const scoped_refptr<media::VideoFrame>& target, |
| 259 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& | 259 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& |
| 260 deliver_frame_cb, | 260 deliver_frame_cb, |
| 261 bool success, | 261 bool success, |
| 262 const SkBitmap& bitmap); | 262 const SkBitmap& bitmap, |
| 263 const int& response); |
| 263 | 264 |
| 264 // Response callback for RWHVP::CopyFromCompositingSurfaceToVideoFrame(). | 265 // Response callback for RWHVP::CopyFromCompositingSurfaceToVideoFrame(). |
| 265 void DidCopyFromCompositingSurfaceToVideoFrame( | 266 void DidCopyFromCompositingSurfaceToVideoFrame( |
| 266 const base::TimeTicks& start_time, | 267 const base::TimeTicks& start_time, |
| 267 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& | 268 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& |
| 268 deliver_frame_cb, | 269 deliver_frame_cb, |
| 269 bool success); | 270 bool success); |
| 270 | 271 |
| 271 // Remove the old subscription, and start a new one if |rwh| is not NULL. | 272 // Remove the old subscription, and start a new one if |rwh| is not NULL. |
| 272 void RenewFrameSubscription(RenderWidgetHost* rwh); | 273 void RenewFrameSubscription(RenderWidgetHost* rwh); |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 VLOG(1) << "Computed optimal target size: " << optimal_size.ToString(); | 683 VLOG(1) << "Computed optimal target size: " << optimal_size.ToString(); |
| 683 return optimal_size; | 684 return optimal_size; |
| 684 } | 685 } |
| 685 | 686 |
| 686 void WebContentsCaptureMachine::DidCopyFromBackingStore( | 687 void WebContentsCaptureMachine::DidCopyFromBackingStore( |
| 687 const base::TimeTicks& start_time, | 688 const base::TimeTicks& start_time, |
| 688 const scoped_refptr<media::VideoFrame>& target, | 689 const scoped_refptr<media::VideoFrame>& target, |
| 689 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& | 690 const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback& |
| 690 deliver_frame_cb, | 691 deliver_frame_cb, |
| 691 bool success, | 692 bool success, |
| 692 const SkBitmap& bitmap) { | 693 const SkBitmap& bitmap, |
| 694 const int& response) { |
| 693 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 695 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 694 | 696 |
| 695 base::TimeTicks now = base::TimeTicks::Now(); | 697 base::TimeTicks now = base::TimeTicks::Now(); |
| 696 DCHECK(render_thread_.get()); | 698 DCHECK(render_thread_.get()); |
| 697 if (success) { | 699 if (success) { |
| 698 UMA_HISTOGRAM_TIMES("TabCapture.CopyTimeBitmap", now - start_time); | 700 UMA_HISTOGRAM_TIMES("TabCapture.CopyTimeBitmap", now - start_time); |
| 699 TRACE_EVENT_ASYNC_STEP_INTO0("mirroring", "Capture", target.get(), | 701 TRACE_EVENT_ASYNC_STEP_INTO0("mirroring", "Capture", target.get(), |
| 700 "Render"); | 702 "Render"); |
| 701 render_thread_->message_loop_proxy()->PostTask(FROM_HERE, base::Bind( | 703 render_thread_->message_loop_proxy()->PostTask(FROM_HERE, base::Bind( |
| 702 &RenderVideoFrame, bitmap, target, | 704 &RenderVideoFrame, bitmap, target, |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 scoped_ptr<Client> client) { | 790 scoped_ptr<Client> client) { |
| 789 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); | 791 DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); |
| 790 core_->AllocateAndStart(params, client.Pass()); | 792 core_->AllocateAndStart(params, client.Pass()); |
| 791 } | 793 } |
| 792 | 794 |
| 793 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { | 795 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { |
| 794 core_->StopAndDeAllocate(); | 796 core_->StopAndDeAllocate(); |
| 795 } | 797 } |
| 796 | 798 |
| 797 } // namespace content | 799 } // namespace content |
| OLD | NEW |