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 91c8e035ceefcbef7fe1d401eaf64c2764a0cba0..6c2997b390e1b7d4095000ef01216d716be05fe7 100644 |
--- a/content/browser/compositor/delegated_frame_host.cc |
+++ b/content/browser/compositor/delegated_frame_host.cc |
@@ -18,6 +18,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)); |
} |
} |
@@ -378,7 +389,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( |
AsWeakPtr(), |
output_surface_id)); |
} |
- DidReceiveFrameFromRenderer(); |
+ DidReceiveFrameFromRenderer(damage_rect); |
if (frame_provider_.get()) |
delegated_frame_evictor_->SwappedFrame(!host->is_hidden()); |
// Note: the frame may have been evicted immediately. |
@@ -750,6 +761,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); |
@@ -849,4 +862,3 @@ void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer, |
} |
} // namespace content |
- |