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

Unified Diff: content/browser/devtools/protocol/page_handler.cc

Issue 716053003: [DevTools] Move PNG encoding from UI to worker thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « content/browser/devtools/protocol/page_handler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
}
« no previous file with comments | « content/browser/devtools/protocol/page_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698