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

Unified Diff: content/browser/compositor/delegated_frame_host.cc

Issue 418283003: "Buttery Smooth" Tab Capture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Now pixel-weighted. Lots of add'l unit tests. (rebased against ToT) Created 6 years, 5 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/compositor/delegated_frame_host.cc
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index 4a8ccc7172482cb662158829d33235ef5356b2ee..d6fb5d941815f6fb91807dac870fd355e11193a3 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -19,6 +19,7 @@
#include "media/base/video_frame.h"
#include "media/base/video_util.h"
#include "skia/ext/image_operations.h"
+#include "ui/gfx/frame_time.h"
namespace content {
@@ -247,18 +248,28 @@ void DelegatedFrameHost::CheckResizeLock() {
}
}
-void DelegatedFrameHost::DidReceiveFrameFromRenderer() {
- if (frame_subscriber() && CanCopyToVideoFrame()) {
- const base::TimeTicks present_time = base::TimeTicks::Now();
- scoped_refptr<media::VideoFrame> frame;
- RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
- if (frame_subscriber()->ShouldCaptureFrame(present_time,
- &frame, &callback)) {
- CopyFromCompositingSurfaceToVideoFrame(
- gfx::Rect(current_frame_size_in_dip_),
- frame,
- base::Bind(callback, present_time));
- }
+void DelegatedFrameHost::DidReceiveFrameFromRenderer(
+ const gfx::Rect& damage_rect) {
+ if (!frame_subscriber() || !CanCopyToVideoFrame())
+ return;
+
+ const base::TimeTicks now = gfx::FrameTime::Now();
+ base::TimeTicks present_time;
+ if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) {
+ present_time = now;
+ } else {
+ const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_;
+ present_time = vsync_timebase_ + (intervals_elapsed + 1) * vsync_interval_;
+ }
+
+ scoped_refptr<media::VideoFrame> frame;
+ RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
+ if (frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time,
+ &frame, &callback)) {
+ CopyFromCompositingSurfaceToVideoFrame(
+ gfx::Rect(current_frame_size_in_dip_),
+ frame,
+ base::Bind(callback, present_time));
}
}
@@ -401,7 +412,7 @@ void DelegatedFrameHost::SwapDelegatedFrame(
AsWeakPtr(),
output_surface_id));
}
- DidReceiveFrameFromRenderer();
+ DidReceiveFrameFromRenderer(damage_rect);
if (frame_provider_.get() || !surface_id_.is_null())
delegated_frame_evictor_->SwappedFrame(!host->is_hidden());
// Note: the frame may have been evicted immediately.
@@ -794,6 +805,8 @@ void DelegatedFrameHost::OnCompositingLockStateChanged(
void DelegatedFrameHost::OnUpdateVSyncParameters(
base::TimeTicks timebase,
base::TimeDelta interval) {
+ vsync_timebase_ = timebase;
+ vsync_interval_ = interval;
RenderWidgetHostImpl* host = client_->GetHost();
if (client_->IsVisible())
host->UpdateVSyncParameters(timebase, interval);
@@ -898,4 +911,3 @@ void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer,
}
} // namespace content
-

Powered by Google App Engine
This is Rietveld 408576698