Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| index dc239349e4d65a872c5b0bee4f1603740e051823..7b16c5411944d33bb6c8145e37c762130f44f1bd 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| @@ -1241,8 +1241,6 @@ bool RenderWidgetHostViewAura::CanCopyToBitmap() const { |
| } |
| bool RenderWidgetHostViewAura::CanCopyToVideoFrame() const { |
| - // TODO(skaslev): Implement this path for s/w compositing by handling software |
| - // CopyOutputResult in CopyFromCompositingSurfaceHasResultForVideo(). |
| return GetCompositor() && |
| window_->layer()->has_external_content() && |
| host_->is_accelerated_compositing_active(); |
| @@ -1386,8 +1384,7 @@ void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() { |
| if (frame_subscriber()->ShouldCaptureFrame(present_time, |
| &frame, &callback)) { |
| CopyFromCompositingSurfaceToVideoFrame( |
| - gfx::Rect(ConvertSizeToDIP(current_surface_->device_scale_factor(), |
| - current_surface_->size())), |
| + gfx::Rect(current_frame_size_), |
|
danakj
2013/08/06 15:25:03
Why this change? We want to copy the full layer's
|
| frame, |
| base::Bind(callback, present_time)); |
| } |
| @@ -1887,8 +1884,35 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo( |
| // We only handle texture readbacks for now. If the compositor is in software |
| // mode, we could produce a software-backed VideoFrame here as well. |
| - if (!result->HasTexture()) |
| + if (!result->HasTexture()) { |
| + DCHECK(result->HasBitmap()); |
| + scoped_ptr<SkBitmap> bitmap = result->TakeBitmap(); |
| + // Scale the bitmap to the required size, if necessary. |
| + SkBitmap scaled_bitmap; |
| + if (result->size().width() != region_in_frame.width() || |
| + result->size().height() != region_in_frame.height()) { |
| + skia::ImageOperations::ResizeMethod method = |
| + skia::ImageOperations::RESIZE_GOOD; |
| + scaled_bitmap = skia::ImageOperations::Resize(*bitmap.get(), method, |
| + region_in_frame.width(), |
| + region_in_frame.height()); |
| + } else { |
| + scaled_bitmap = *bitmap.get(); |
| + } |
| + |
| + { |
| + SkAutoLockPixels scaled_bitmap_locker(scaled_bitmap); |
| + |
| + media::CopyRGBToVideoFrame( |
| + reinterpret_cast<uint8*>(scaled_bitmap.getPixels()), |
| + scaled_bitmap.rowBytes(), |
| + region_in_frame, |
| + video_frame.get()); |
| + } |
| + scoped_callback_runner.Release(); |
| + callback.Run(true); |
| return; |
| + } |
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| GLHelper* gl_helper = factory->GetGLHelper(); |