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

Unified Diff: content/browser/media/capture/desktop_capture_device_aura.cc

Issue 213253005: Use texture-backed VideoFrane pipeline for Aura desktop capturing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 51d44e02 Initial. Created 6 years, 9 months 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/media/capture/desktop_capture_device_aura.cc
diff --git a/content/browser/media/capture/desktop_capture_device_aura.cc b/content/browser/media/capture/desktop_capture_device_aura.cc
index 2c7d196531b121795f84848105a6603edba4bf54..a4aa46da412ead0e6ec1d2a47bfdbd25eed1ea2a 100644
--- a/content/browser/media/capture/desktop_capture_device_aura.cc
+++ b/content/browser/media/capture/desktop_capture_device_aura.cc
@@ -95,8 +95,8 @@ class DesktopVideoCaptureMachine
virtual ~DesktopVideoCaptureMachine();
// VideoCaptureFrameSource overrides.
- virtual bool Start(
- const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) OVERRIDE;
+ virtual bool Start(const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy,
+ const media::VideoCaptureParams& params) OVERRIDE;
virtual void Stop(const base::Closure& callback) OVERRIDE;
// Implements aura::WindowObserver.
@@ -152,6 +152,9 @@ class DesktopVideoCaptureMachine
// Makes all the decisions about which frames to copy, and how.
scoped_refptr<ThreadSafeCaptureOracle> oracle_proxy_;
+ // The capture parameters for this capture.
+ media::VideoCaptureParams capture_params_;
+
// YUV readback pipeline.
scoped_ptr<content::ReadbackYUVInterface> yuv_readback_pipeline_;
@@ -173,7 +176,8 @@ DesktopVideoCaptureMachine::DesktopVideoCaptureMachine(
DesktopVideoCaptureMachine::~DesktopVideoCaptureMachine() {}
bool DesktopVideoCaptureMachine::Start(
- const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) {
+ const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy,
+ const media::VideoCaptureParams& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
desktop_window_ = content::DesktopMediaID::GetAuraWindowById(window_id_);
@@ -187,6 +191,7 @@ bool DesktopVideoCaptureMachine::Start(
DCHECK(oracle_proxy.get());
oracle_proxy_ = oracle_proxy;
+ capture_params_ = params;
// Update capture size.
UpdateCaptureSize();
@@ -284,7 +289,12 @@ void CopyOutputFinishedForVideo(
if (!cursor_bitmap.isNull())
RenderCursorOnVideoFrame(target, cursor_bitmap, cursor_position);
release_callback->Run(0, false);
- capture_frame_cb.Run(start_time, result);
+ capture_frame_cb.Run(target, start_time, result);
+}
+
+void RunSingleReleaseCallback(scoped_ptr<cc::SingleReleaseCallback> cb,
+ scoped_ptr<gpu::MailboxHolder> mailbox_holder) {
+ cb->Run(mailbox_holder->sync_point, false);
}
void DesktopVideoCaptureMachine::DidCopyOutput(
@@ -295,6 +305,29 @@ void DesktopVideoCaptureMachine::DidCopyOutput(
if (result->IsEmpty() || result->size().IsEmpty() || !desktop_layer_)
return;
+ if (capture_params_.requested_format.pixel_format ==
+ media::PIXEL_FORMAT_TEXTURE) {
+ DCHECK(!video_frame);
+ cc::TextureMailbox texture_mailbox;
+ scoped_ptr<cc::SingleReleaseCallback> release_callback;
+ result->TakeTexture(&texture_mailbox, &release_callback);
+ DCHECK(texture_mailbox.IsTexture());
+ if (!texture_mailbox.IsTexture())
+ return;
+ video_frame = media::VideoFrame::WrapNativeTexture(
+ make_scoped_ptr(new gpu::MailboxHolder(texture_mailbox.mailbox(),
+ texture_mailbox.target(),
+ texture_mailbox.sync_point())),
+ base::Bind(&RunSingleReleaseCallback, base::Passed(&release_callback)),
+ result->size(),
+ gfx::Rect(result->size()),
+ result->size(),
+ base::TimeDelta(),
Ami GONE FROM CHROMIUM 2014/04/01 18:03:38 Why the empty TimeDelta?
sheu 2014/04/21 20:39:39 Just stubbed for now. It would be better to have
+ media::VideoFrame::ReadPixelsCB());
Ami GONE FROM CHROMIUM 2014/04/01 18:03:38 Why the empty ReadPixelsCB?
sheu 2014/04/21 20:39:39 Not expecting this frame to be read back to softwa
+ capture_frame_cb.Run(video_frame, start_time, true);
+ return;
sheu 2014/04/01 00:11:26 Cursor compositing doesn't happen, of course.
+ }
+
// Compute the dest size we want after the letterboxing resize. Make the
// coordinates and sizes even because we letterbox in YUV space
// (see CopyRGBToVideoFrame). They need to be even for the UV samples to
@@ -439,7 +472,11 @@ void DesktopCaptureDeviceAura::AllocateAndStart(
const media::VideoCaptureParams& params,
scoped_ptr<Client> client) {
DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString();
- core_->AllocateAndStart(params, client.Pass());
+ media::VideoCaptureParams new_params = params;
+ // Desktop capture devices ignore the requested size and return the actual
+ // captured desktop size.
+ new_params.requested_format.frame_size.SetSize(0, 0);
+ core_->AllocateAndStart(new_params, client.Pass());
}
void DesktopCaptureDeviceAura::StopAndDeAllocate() {

Powered by Google App Engine
This is Rietveld 408576698