Index: content/renderer/media_capture_from_element/html_video_element_capturer_source.cc |
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc b/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc |
index 5314f254e938db0734f82fdde816f5ec728366d1..bbbb3faba0521b67c01ace0fdd3526ce3e32030c 100644 |
--- a/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc |
+++ b/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc |
@@ -9,8 +9,7 @@ |
#include "base/single_thread_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "base/trace_event/trace_event.h" |
-#include "cc/paint/paint_canvas.h" |
-#include "cc/paint/paint_surface.h" |
+#include "cc/paint/skia_paint_canvas.h" |
#include "content/public/renderer/render_thread.h" |
#include "content/renderer/media/media_stream_video_source.h" |
#include "content/renderer/media/webrtc_uma_histograms.h" |
@@ -94,12 +93,12 @@ void HtmlVideoElementCapturerSource::StartCapture( |
return; |
} |
const blink::WebSize resolution = web_media_player_->naturalSize(); |
- surface_ = cc::PaintSurface::MakeRasterN32Premul(resolution.width, |
- resolution.height); |
- if (!surface_) { |
+ if (!bitmap_.tryAllocPixels( |
+ SkImageInfo::MakeN32Premul(resolution.width, resolution.height))) { |
running_callback_.Run(false); |
return; |
} |
+ canvas_ = base::MakeUnique<cc::SkiaPaintCanvas>(bitmap_); |
new_frame_callback_ = new_frame_callback; |
// Force |capture_frame_rate_| to be in between k{Min,Max}FramesPerSecond. |
@@ -133,24 +132,20 @@ void HtmlVideoElementCapturerSource::sendNewFrame() { |
const base::TimeTicks current_time = base::TimeTicks::Now(); |
const blink::WebSize resolution = web_media_player_->naturalSize(); |
- cc::PaintCanvas* canvas = surface_->getCanvas(); |
cc::PaintFlags flags; |
flags.setBlendMode(SkBlendMode::kSrc); |
flags.setFilterQuality(kLow_SkFilterQuality); |
web_media_player_->paint( |
- canvas, blink::WebRect(0, 0, resolution.width, resolution.height), flags); |
- DCHECK_NE(kUnknown_SkColorType, canvas->imageInfo().colorType()); |
- DCHECK_EQ(canvas->imageInfo().width(), resolution.width); |
- DCHECK_EQ(canvas->imageInfo().height(), resolution.height); |
- |
- SkBitmap bitmap; |
- bitmap.setInfo(canvas->imageInfo()); |
- canvas->readPixels(&bitmap, 0, 0); |
- |
- DCHECK_NE(kUnknown_SkColorType, bitmap.colorType()); |
- DCHECK(!bitmap.drawsNothing()); |
- DCHECK(bitmap.getPixels()); |
- if (bitmap.colorType() != kN32_SkColorType) { |
+ canvas_.get(), blink::WebRect(0, 0, resolution.width, resolution.height), |
+ flags); |
+ DCHECK_NE(kUnknown_SkColorType, canvas_->imageInfo().colorType()); |
+ DCHECK_EQ(canvas_->imageInfo().width(), resolution.width); |
+ DCHECK_EQ(canvas_->imageInfo().height(), resolution.height); |
+ |
+ DCHECK_NE(kUnknown_SkColorType, bitmap_.colorType()); |
+ DCHECK(!bitmap_.drawsNothing()); |
+ DCHECK(bitmap_.getPixels()); |
+ if (bitmap_.colorType() != kN32_SkColorType) { |
DLOG(ERROR) << "Only supported color type is kN32_SkColorType (ARGB/ABGR)"; |
return; |
} |
@@ -164,22 +159,17 @@ void HtmlVideoElementCapturerSource::sendNewFrame() { |
(kN32_SkColorType == kRGBA_8888_SkColorType) ? libyuv::FOURCC_ABGR |
: libyuv::FOURCC_ARGB; |
- if (libyuv::ConvertToI420(static_cast<uint8*>(bitmap.getPixels()), |
- bitmap.getSize(), |
- frame->data(media::VideoFrame::kYPlane), |
- frame->stride(media::VideoFrame::kYPlane), |
- frame->data(media::VideoFrame::kUPlane), |
- frame->stride(media::VideoFrame::kUPlane), |
- frame->data(media::VideoFrame::kVPlane), |
- frame->stride(media::VideoFrame::kVPlane), |
- 0 /* crop_x */, |
- 0 /* crop_y */, |
- bitmap.info().width(), |
- bitmap.info().height(), |
- frame->coded_size().width(), |
- frame->coded_size().height(), |
- libyuv::kRotate0, |
- source_pixel_format) == 0) { |
+ if (libyuv::ConvertToI420( |
+ static_cast<uint8*>(bitmap_.getPixels()), bitmap_.getSize(), |
+ frame->data(media::VideoFrame::kYPlane), |
+ frame->stride(media::VideoFrame::kYPlane), |
+ frame->data(media::VideoFrame::kUPlane), |
+ frame->stride(media::VideoFrame::kUPlane), |
+ frame->data(media::VideoFrame::kVPlane), |
+ frame->stride(media::VideoFrame::kVPlane), 0 /* crop_x */, |
+ 0 /* crop_y */, bitmap_.info().width(), bitmap_.info().height(), |
+ frame->coded_size().width(), frame->coded_size().height(), |
+ libyuv::kRotate0, source_pixel_format) == 0) { |
// Success! |
io_task_runner_->PostTask( |
FROM_HERE, base::Bind(new_frame_callback_, frame, current_time)); |