Index: content/browser/devtools/protocol/page_handler.cc |
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc |
index ec771aea83dcb1432732e4f2d131a384460d3e69..3c1bad86113a078edf6292dd6c295bbe6730b8dc 100644 |
--- a/content/browser/devtools/protocol/page_handler.cc |
+++ b/content/browser/devtools/protocol/page_handler.cc |
@@ -10,6 +10,7 @@ |
#include "base/bind.h" |
#include "base/strings/string16.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/threading/worker_pool.h" |
#include "content/browser/devtools/protocol/color_picker.h" |
#include "content/browser/devtools/protocol/usage_and_quota_query.h" |
#include "content/browser/geolocation/geolocation_service_context.h" |
@@ -476,31 +477,16 @@ void PageHandler::InnerSwapCompositorFrame() { |
snapshot_size_dip, |
base::Bind(&PageHandler::ScreencastFrameCaptured, |
weak_factory_.GetWeakPtr(), |
- screencast_format_, |
- screencast_quality_, |
last_compositor_frame_metadata_), |
kN32_SkColorType); |
} |
} |
-void PageHandler::ScreencastFrameCaptured( |
+static void EncodeScreencastFrame( |
+ const SkBitmap& bitmap, |
const std::string& format, |
int quality, |
- const cc::CompositorFrameMetadata& metadata, |
- const SkBitmap& bitmap, |
- ReadbackResponse response) { |
- if (response != READBACK_SUCCESS) { |
- if (capture_retry_count_) { |
- --capture_retry_count_; |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&PageHandler::InnerSwapCompositorFrame, |
- weak_factory_.GetWeakPtr()), |
- base::TimeDelta::FromMilliseconds(kFrameRateThresholdMs)); |
- } |
- return; |
- } |
- |
+ const base::Callback<void(const std::string&)> callback) { |
std::vector<unsigned char> data; |
SkAutoLockPixels lock_image(bitmap); |
bool encoded; |
@@ -531,6 +517,39 @@ void PageHandler::ScreencastFrameCaptured( |
base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()), |
&base_64_data); |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(callback, base_64_data)); |
+} |
+ |
+void PageHandler::ScreencastFrameCaptured( |
+ const cc::CompositorFrameMetadata& metadata, |
+ const SkBitmap& bitmap, |
+ ReadbackResponse response) { |
+ if (response != READBACK_SUCCESS) { |
+ if (capture_retry_count_) { |
+ --capture_retry_count_; |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&PageHandler::InnerSwapCompositorFrame, |
+ weak_factory_.GetWeakPtr()), |
+ base::TimeDelta::FromMilliseconds(kFrameRateThresholdMs)); |
+ } |
+ return; |
+ } |
+ base::WorkerPool::PostTask( |
dgozman
2014/11/17 14:03:59
Maybe use PostTaskAndReply?
vkuzkokov
2014/11/17 14:47:47
PostTaskAndReplyWithResult. Done.
|
+ FROM_HERE, |
+ base::Bind(&EncodeScreencastFrame, |
+ bitmap, |
+ screencast_format_, |
dgozman
2014/11/17 14:03:59
We passed these as params for the case when e.g. f
vkuzkokov
2014/11/17 14:47:47
This way we use more recent settings for format an
|
+ screencast_quality_, |
+ base::Bind(&PageHandler::ScreencastFrameEncoded, |
+ weak_factory_.GetWeakPtr(), metadata)), |
+ true); |
+} |
+ |
+void PageHandler::ScreencastFrameEncoded( |
+ const cc::CompositorFrameMetadata& metadata, |
+ const std::string& data) { |
// Consider metadata empty in case it has no device scale factor. |
if (metadata.device_scale_factor == 0 || !host_) |
return; |
@@ -564,7 +583,7 @@ void PageHandler::ScreencastFrameCaptured( |
->set_width(metadata.scrollable_viewport_size.width()) |
->set_height(metadata.scrollable_viewport_size.height())); |
client_->ScreencastFrame(ScreencastFrameParams::Create() |
- ->set_data(base_64_data) |
+ ->set_data(data) |
->set_metadata(param_metadata)); |
} |