Use new video capture API for DevTools tracing snapshots

Currently snapshots in DevTools traces don't work if the
VizDisplayCompositor feature is enabled. This is because the renderer's
CompositorFrames go directly to the gpu process and the existing
snapshot code is never run. Add a new code path that works with viz
by using FrameSinkVideoCapturer. Eventually the old code path will be
removed but for now we'll keep it around until we make sure the new
code path works as well as the old one.

[email protected]

Bug: 810919
Change-Id: Ie52e32aae06e8aed5a5ce570eb5318c3f3d3f793
Reviewed-on: https://chromium-review.googlesource.com/909965
Commit-Queue: Saman Sami <[email protected]>
Reviewed-by: Andrey Kosyakov <[email protected]>
Reviewed-by: Yuri Wiitala <[email protected]>
Cr-Commit-Position: refs/heads/master@{#538018}
diff --git a/content/browser/devtools/devtools_traceable_screenshot.cc b/content/browser/devtools/devtools_traceable_screenshot.cc
new file mode 100644
index 0000000..df9bc9d
--- /dev/null
+++ b/content/browser/devtools/devtools_traceable_screenshot.cc
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/devtools/devtools_traceable_screenshot.h"
+
+#include "base/base64.h"
+#include "ui/gfx/codec/jpeg_codec.h"
+
+namespace content {
+
+base::subtle::Atomic32 DevToolsTraceableScreenshot::number_of_instances_ = 0;
+
+// static
+base::subtle::Atomic32 DevToolsTraceableScreenshot::GetNumberOfInstances() {
+  return base::subtle::NoBarrier_Load(&number_of_instances_);
+}
+
+DevToolsTraceableScreenshot::DevToolsTraceableScreenshot(const SkBitmap& bitmap)
+    : frame_(bitmap) {
+  base::subtle::NoBarrier_AtomicIncrement(&number_of_instances_, 1);
+}
+
+DevToolsTraceableScreenshot::~DevToolsTraceableScreenshot() {
+  base::subtle::NoBarrier_AtomicIncrement(&number_of_instances_, -1);
+}
+
+void DevToolsTraceableScreenshot::AppendAsTraceFormat(std::string* out) const {
+  out->append("\"");
+  if (!frame_.drawsNothing()) {
+    std::vector<unsigned char> data;
+    bool encoded = gfx::JPEGCodec::Encode(frame_, 80, &data);
+    if (encoded) {
+      std::string encoded_data;
+      base::Base64Encode(
+          base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()),
+          &encoded_data);
+      out->append(encoded_data);
+    }
+  }
+  out->append("\"");
+}
+
+}  // namespace content