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 e65b4facef29d5d4ec7f512398613db66f2e576c..5bc7efef46614792d9a0d02906ba5dfd881ed20b 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 { |
@@ -248,18 +249,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)); |
} |
} |
@@ -402,7 +413,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. |
@@ -795,6 +806,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); |
@@ -899,4 +912,3 @@ void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, |
} |
} // namespace content |
- |