Chromium Code Reviews| 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 |