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 f16150b1b94e39e016b05eb26c50b8824565e431..ead104c7eaf256efa39dce954633b30c8d31d5ae 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" |
@@ -46,7 +47,7 @@ static const char kJpeg[] = "jpeg"; |
static int kDefaultScreenshotQuality = 80; |
static int kFrameRetryDelayMs = 100; |
static int kCaptureRetryLimit = 2; |
-static int kMaxScreencastFramesInFlight = 4; |
+static int kMaxScreencastFramesInFlight = 2; |
void QueryUsageAndQuotaCompletedOnIOThread( |
const UsageAndQuotaQuery::Callback& callback, |
@@ -477,31 +478,14 @@ 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( |
- 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(kFrameRetryDelayMs)); |
- } |
- return; |
- } |
- |
+static std::string EncodeScreencastFrame(const SkBitmap& bitmap, |
dgozman
2014/11/20 14:23:05
Let's move to the namespace at the top and remove
vkuzkokov
2014/11/20 14:55:27
Done.
|
+ const std::string& format, |
+ int quality) { |
std::vector<unsigned char> data; |
SkAutoLockPixels lock_image(bitmap); |
bool encoded; |
@@ -525,15 +509,45 @@ void PageHandler::ScreencastFrameCaptured( |
} |
if (!encoded) |
- return; |
+ return std::string(); |
std::string base_64_data; |
base::Base64Encode( |
base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()), |
&base_64_data); |
+ return 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(kFrameRetryDelayMs)); |
+ } |
+ return; |
+ } |
+ base::PostTaskAndReplyWithResult( |
+ base::WorkerPool::GetTaskRunner(true).get(), |
+ FROM_HERE, |
+ base::Bind(&EncodeScreencastFrame, |
+ bitmap, screencast_format_, screencast_quality_), |
+ base::Bind(&PageHandler::ScreencastFrameEncoded, |
+ weak_factory_.GetWeakPtr(), metadata)); |
+} |
+ |
+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_) |
+ if (metadata.device_scale_factor == 0 || !host_ || data.empty()) |
return; |
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
@@ -552,7 +566,7 @@ void PageHandler::ScreencastFrameCaptured( |
->set_scroll_offset_x(metadata.root_scroll_offset.x()) |
->set_scroll_offset_y(metadata.root_scroll_offset.y()); |
client_->ScreencastFrame(ScreencastFrameParams::Create() |
- ->set_data(base_64_data) |
+ ->set_data(data) |
->set_metadata(param_metadata) |
->set_frame_number(++screencast_frame_sent_)); |
} |