OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |