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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 const gfx::Rect& damage_rect, | 129 const gfx::Rect& damage_rect, |
130 base::TimeTicks present_time, | 130 base::TimeTicks present_time, |
131 scoped_refptr<media::VideoFrame>* storage, | 131 scoped_refptr<media::VideoFrame>* storage, |
132 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback* | 132 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback* |
133 deliver_frame_cb) override; | 133 deliver_frame_cb) override; |
134 | 134 |
135 static void DidCaptureFrame( | 135 static void DidCaptureFrame( |
136 base::WeakPtr<FrameSubscriber> frame_subscriber_, | 136 base::WeakPtr<FrameSubscriber> frame_subscriber_, |
137 const media::ThreadSafeCaptureOracle::CaptureFrameCallback& | 137 const media::ThreadSafeCaptureOracle::CaptureFrameCallback& |
138 capture_frame_cb, | 138 capture_frame_cb, |
139 const scoped_refptr<media::VideoFrame>& frame, | 139 scoped_refptr<media::VideoFrame> frame, |
140 base::TimeTicks timestamp, | 140 base::TimeTicks timestamp, |
141 const gfx::Rect& region_in_frame, | 141 const gfx::Rect& region_in_frame, |
142 bool success); | 142 bool success); |
143 | 143 |
144 bool IsUserInteractingWithContent(); | 144 bool IsUserInteractingWithContent(); |
145 | 145 |
146 private: | 146 private: |
147 const media::VideoCaptureOracle::Event event_type_; | 147 const media::VideoCaptureOracle::Event event_type_; |
148 scoped_refptr<media::ThreadSafeCaptureOracle> oracle_proxy_; | 148 scoped_refptr<media::ThreadSafeCaptureOracle> oracle_proxy_; |
149 // We need a weak pointer since FrameSubscriber is owned externally and | 149 // We need a weak pointer since FrameSubscriber is owned externally and |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 *deliver_frame_cb = | 351 *deliver_frame_cb = |
352 base::Bind(&FrameSubscriber::DidCaptureFrame, | 352 base::Bind(&FrameSubscriber::DidCaptureFrame, |
353 weak_ptr_factory_.GetWeakPtr(), capture_frame_cb, *storage); | 353 weak_ptr_factory_.GetWeakPtr(), capture_frame_cb, *storage); |
354 return oracle_decision; | 354 return oracle_decision; |
355 } | 355 } |
356 | 356 |
357 void FrameSubscriber::DidCaptureFrame( | 357 void FrameSubscriber::DidCaptureFrame( |
358 base::WeakPtr<FrameSubscriber> frame_subscriber_, | 358 base::WeakPtr<FrameSubscriber> frame_subscriber_, |
359 const media::ThreadSafeCaptureOracle::CaptureFrameCallback& | 359 const media::ThreadSafeCaptureOracle::CaptureFrameCallback& |
360 capture_frame_cb, | 360 capture_frame_cb, |
361 const scoped_refptr<media::VideoFrame>& frame, | 361 scoped_refptr<media::VideoFrame> frame, |
362 base::TimeTicks timestamp, | 362 base::TimeTicks timestamp, |
363 const gfx::Rect& region_in_frame, | 363 const gfx::Rect& region_in_frame, |
364 bool success) { | 364 bool success) { |
365 // We can get a callback in the shutdown sequence for the browser main loop | 365 // We can get a callback in the shutdown sequence for the browser main loop |
366 // and this can result in a DCHECK failure. Avoid this by doing DCHECK only | 366 // and this can result in a DCHECK failure. Avoid this by doing DCHECK only |
367 // on success. | 367 // on success. |
368 if (success) { | 368 if (success) { |
369 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 369 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
370 // TODO(isheriff): Unclear if taking a snapshot of cursor here affects user | 370 // TODO(isheriff): Unclear if taking a snapshot of cursor here affects user |
371 // experience in any particular scenarios. Doing it prior to capture may | 371 // experience in any particular scenarios. Doing it prior to capture may |
372 // require evaluating region_in_frame in this file. | 372 // require evaluating region_in_frame in this file. |
373 if (frame_subscriber_ && frame_subscriber_->cursor_renderer_) { | 373 if (frame_subscriber_ && frame_subscriber_->cursor_renderer_) { |
374 CursorRenderer* cursor_renderer = | 374 CursorRenderer* cursor_renderer = |
375 frame_subscriber_->cursor_renderer_.get(); | 375 frame_subscriber_->cursor_renderer_.get(); |
376 if (cursor_renderer->SnapshotCursorState(region_in_frame)) | 376 if (cursor_renderer->SnapshotCursorState(region_in_frame)) |
377 cursor_renderer->RenderOnVideoFrame(frame); | 377 cursor_renderer->RenderOnVideoFrame(frame); |
378 frame->metadata()->SetBoolean( | 378 frame->metadata()->SetBoolean( |
379 media::VideoFrameMetadata::INTERACTIVE_CONTENT, | 379 media::VideoFrameMetadata::INTERACTIVE_CONTENT, |
380 frame_subscriber_->IsUserInteractingWithContent()); | 380 frame_subscriber_->IsUserInteractingWithContent()); |
381 } | 381 } |
382 } | 382 } |
383 capture_frame_cb.Run(frame, timestamp, success); | 383 capture_frame_cb.Run(std::move(frame), timestamp, success); |
384 } | 384 } |
385 | 385 |
386 bool FrameSubscriber::IsUserInteractingWithContent() { | 386 bool FrameSubscriber::IsUserInteractingWithContent() { |
387 bool interactive_mode = false; | 387 bool interactive_mode = false; |
388 bool ui_activity = false; | 388 bool ui_activity = false; |
389 if (window_activity_tracker_) { | 389 if (window_activity_tracker_) { |
390 ui_activity = window_activity_tracker_->IsUiInteractionActive(); | 390 ui_activity = window_activity_tracker_->IsUiInteractionActive(); |
391 } | 391 } |
392 if (cursor_renderer_) { | 392 if (cursor_renderer_) { |
393 bool animation_active = | 393 bool animation_active = |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 | 951 |
952 void WebContentsVideoCaptureDevice::Resume() { | 952 void WebContentsVideoCaptureDevice::Resume() { |
953 core_->Resume(); | 953 core_->Resume(); |
954 } | 954 } |
955 | 955 |
956 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { | 956 void WebContentsVideoCaptureDevice::StopAndDeAllocate() { |
957 core_->StopAndDeAllocate(); | 957 core_->StopAndDeAllocate(); |
958 } | 958 } |
959 | 959 |
960 } // namespace content | 960 } // namespace content |
OLD | NEW |