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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/canvas_capture_handler.h" 5 #include "content/renderer/media/canvas_capture_handler.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 23 matching lines...) Expand all
34 34
35 protected: 35 protected:
36 void GetCurrentSupportedFormats( 36 void GetCurrentSupportedFormats(
37 int max_requested_width, 37 int max_requested_width,
38 int max_requested_height, 38 int max_requested_height,
39 double max_requested_frame_rate, 39 double max_requested_frame_rate,
40 const VideoCaptureDeviceFormatsCB& callback) override { 40 const VideoCaptureDeviceFormatsCB& callback) override {
41 const blink::WebSize& size = canvas_handler_->GetSourceSize(); 41 const blink::WebSize& size = canvas_handler_->GetSourceSize();
42 const media::VideoCaptureFormat format(gfx::Size(size.width, size.height), 42 const media::VideoCaptureFormat format(gfx::Size(size.width, size.height),
43 frame_rate_, 43 frame_rate_,
44 media::PIXEL_FORMAT_I420); 44 media::PIXEL_FORMAT_YV12A);
45 media::VideoCaptureFormats formats; 45 media::VideoCaptureFormats formats;
46 formats.push_back(format); 46 formats.push_back(format);
47 callback.Run(formats); 47 callback.Run(formats);
48 } 48 }
49 void StartCapture(const media::VideoCaptureParams& params, 49 void StartCapture(const media::VideoCaptureParams& params,
50 const VideoCaptureDeliverFrameCB& frame_callback, 50 const VideoCaptureDeliverFrameCB& frame_callback,
51 const RunningCallback& running_callback) override { 51 const RunningCallback& running_callback) override {
52 canvas_handler_->StartVideoCapture(params, frame_callback, 52 canvas_handler_->StartVideoCapture(params, frame_callback,
53 running_callback); 53 running_callback);
54 } 54 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 169
170 DCHECK(image); 170 DCHECK(image);
171 const gfx::Size size(image->width(), image->height()); 171 const gfx::Size size(image->width(), image->height());
172 if (size != last_size) { 172 if (size != last_size) {
173 temp_data_.resize( 173 temp_data_.resize(
174 media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_ARGB, size)); 174 media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_ARGB, size));
175 row_bytes_ = 175 row_bytes_ =
176 media::VideoFrame::RowBytes(0, media::PIXEL_FORMAT_ARGB, size.width()); 176 media::VideoFrame::RowBytes(0, media::PIXEL_FORMAT_ARGB, size.width());
177 image_info_ = 177 image_info_ =
178 SkImageInfo::Make(size.width(), size.height(), kBGRA_8888_SkColorType, 178 SkImageInfo::Make(size.width(), size.height(), kBGRA_8888_SkColorType,
179 kPremul_SkAlphaType); 179 kUnpremul_SkAlphaType);
180 last_size = size; 180 last_size = size;
181 } 181 }
182 182
183 image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0); 183 image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0);
184 scoped_refptr<media::VideoFrame> video_frame = 184 scoped_refptr<media::VideoFrame> video_frame =
185 frame_pool_.CreateFrame(media::PIXEL_FORMAT_I420, size, gfx::Rect(size), 185 frame_pool_.CreateFrame(media::PIXEL_FORMAT_YV12A, size, gfx::Rect(size),
186 size, base::TimeTicks::Now() - base::TimeTicks()); 186 size, base::TimeTicks::Now() - base::TimeTicks());
187 DCHECK(video_frame); 187 DCHECK(video_frame);
188 188
189 // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572
190 // when it becomes available.
189 libyuv::ARGBToI420(temp_data_.data(), row_bytes_, 191 libyuv::ARGBToI420(temp_data_.data(), row_bytes_,
190 video_frame->data(media::VideoFrame::kYPlane), 192 video_frame->data(media::VideoFrame::kYPlane),
191 video_frame->stride(media::VideoFrame::kYPlane), 193 video_frame->stride(media::VideoFrame::kYPlane),
192 video_frame->data(media::VideoFrame::kUPlane), 194 video_frame->data(media::VideoFrame::kUPlane),
193 video_frame->stride(media::VideoFrame::kUPlane), 195 video_frame->stride(media::VideoFrame::kUPlane),
194 video_frame->data(media::VideoFrame::kVPlane), 196 video_frame->data(media::VideoFrame::kVPlane),
195 video_frame->stride(media::VideoFrame::kVPlane), 197 video_frame->stride(media::VideoFrame::kVPlane),
196 size.width(), size.height()); 198 size.width(), size.height());
199 // Copy alpha channel directly.
200 for (int p = 0; p < size.GetArea(); ++p)
201 video_frame->data(media::VideoFrame::kAPlane)[p] = temp_data_[p * 4 + 3];
mcasas 2016/02/25 22:06:25 Hmm it looks like this deinterlaced could lower t
emircan 2016/02/26 01:33:07 Unfortunately, there isn't a libyuv method I can d
202
197 io_task_runner_->PostTask( 203 io_task_runner_->PostTask(
198 FROM_HERE, 204 FROM_HERE,
199 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: 205 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate::
200 SendNewFrameOnIOThread, 206 SendNewFrameOnIOThread,
201 delegate_->GetWeakPtrForIOThread(), video_frame, 207 delegate_->GetWeakPtrForIOThread(), video_frame,
202 base::TimeTicks())); 208 base::TimeTicks()));
203 } 209 }
204 210
205 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack( 211 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack(
206 scoped_ptr<media::VideoCapturerSource> source, 212 scoped_ptr<media::VideoCapturerSource> source,
(...skipping 11 matching lines...) Expand all
218 224
219 web_track->initialize(webkit_source); 225 web_track->initialize(webkit_source);
220 blink::WebMediaConstraints constraints; 226 blink::WebMediaConstraints constraints;
221 constraints.initialize(); 227 constraints.initialize();
222 web_track->setExtraData(new MediaStreamVideoTrack( 228 web_track->setExtraData(new MediaStreamVideoTrack(
223 media_stream_source.release(), constraints, 229 media_stream_source.release(), constraints,
224 MediaStreamVideoSource::ConstraintsCallback(), true)); 230 MediaStreamVideoSource::ConstraintsCallback(), true));
225 } 231 }
226 232
227 } // namespace content 233 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698