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

Unified Diff: content/renderer/media/canvas_capture_handler.cc

Issue 1737253002: Handle Alpha channel in Canvas capture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months 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
Index: content/renderer/media/canvas_capture_handler.cc
diff --git a/content/renderer/media/canvas_capture_handler.cc b/content/renderer/media/canvas_capture_handler.cc
index 634267eb153f612d0acd24f9c742b8edd48e1039..c38a815a9908c253703db7f3df033fce614dbcc7 100644
--- a/content/renderer/media/canvas_capture_handler.cc
+++ b/content/renderer/media/canvas_capture_handler.cc
@@ -39,11 +39,13 @@ class CanvasCaptureHandler::VideoCapturerSource
double max_requested_frame_rate,
const VideoCaptureDeviceFormatsCB& callback) override {
const blink::WebSize& size = canvas_handler_->GetSourceSize();
- const media::VideoCaptureFormat format(gfx::Size(size.width, size.height),
- frame_rate_,
- media::PIXEL_FORMAT_I420);
media::VideoCaptureFormats formats;
- formats.push_back(format);
+ formats.push_back(
+ media::VideoCaptureFormat(gfx::Size(size.width, size.height),
+ frame_rate_, media::PIXEL_FORMAT_I420));
+ formats.push_back(
+ media::VideoCaptureFormat(gfx::Size(size.width, size.height),
+ frame_rate_, media::PIXEL_FORMAT_YV12A));
callback.Run(formats);
}
void StartCapture(const media::VideoCaptureParams& params,
@@ -166,8 +168,8 @@ void CanvasCaptureHandler::StopVideoCapture() {
void CanvasCaptureHandler::CreateNewFrame(const SkImage* image) {
DCHECK(thread_checker_.CalledOnValidThread());
-
DCHECK(image);
+
const gfx::Size size(image->width(), image->height());
if (size != last_size) {
temp_data_.resize(
@@ -176,16 +178,23 @@ void CanvasCaptureHandler::CreateNewFrame(const SkImage* image) {
media::VideoFrame::RowBytes(0, media::PIXEL_FORMAT_ARGB, size.width());
image_info_ =
SkImageInfo::Make(size.width(), size.height(), kBGRA_8888_SkColorType,
- kPremul_SkAlphaType);
+ kUnpremul_SkAlphaType);
last_size = size;
}
- image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0);
- scoped_refptr<media::VideoFrame> video_frame =
- frame_pool_.CreateFrame(media::PIXEL_FORMAT_I420, size, gfx::Rect(size),
- size, base::TimeTicks::Now() - base::TimeTicks());
+ const bool isOpaque = image->isOpaque();
mcasas 2016/02/29 23:48:00 Move to l.190.
emircan 2016/03/01 20:07:55 Done.
+ if(!image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0)) {
+ DLOG(ERROR) << "Couldn't read SkImage pixels";
+ return;
+ }
+
+ scoped_refptr<media::VideoFrame> video_frame = frame_pool_.CreateFrame(
+ isOpaque ? media::PIXEL_FORMAT_I420 : media::PIXEL_FORMAT_YV12A, size,
+ gfx::Rect(size), size, base::TimeTicks::Now() - base::TimeTicks());
DCHECK(video_frame);
+ // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572
+ // when it becomes available.
libyuv::ARGBToI420(temp_data_.data(), row_bytes_,
video_frame->data(media::VideoFrame::kYPlane),
video_frame->stride(media::VideoFrame::kYPlane),
@@ -194,6 +203,11 @@ void CanvasCaptureHandler::CreateNewFrame(const SkImage* image) {
video_frame->data(media::VideoFrame::kVPlane),
video_frame->stride(media::VideoFrame::kVPlane),
size.width(), size.height());
+ if (!isOpaque) {
+ for (int p = 0; p < size.GetArea(); ++p)
+ video_frame->data(media::VideoFrame::kAPlane)[p] = temp_data_[p * 4 + 3];
+ }
+
io_task_runner_->PostTask(
FROM_HERE,
base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate::

Powered by Google App Engine
This is Rietveld 408576698