| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 frame_rate_, media::PIXEL_FORMAT_YV12A)); | 78 frame_rate_, media::PIXEL_FORMAT_YV12A)); |
| 79 callback.Run(formats); | 79 callback.Run(formats); |
| 80 } | 80 } |
| 81 void StartCapture(const media::VideoCaptureParams& params, | 81 void StartCapture(const media::VideoCaptureParams& params, |
| 82 const VideoCaptureDeliverFrameCB& frame_callback, | 82 const VideoCaptureDeliverFrameCB& frame_callback, |
| 83 const RunningCallback& running_callback) override { | 83 const RunningCallback& running_callback) override { |
| 84 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 84 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 85 canvas_handler_->StartVideoCapture(params, frame_callback, | 85 canvas_handler_->StartVideoCapture(params, frame_callback, |
| 86 running_callback); | 86 running_callback); |
| 87 } | 87 } |
| 88 void RequestRefreshFrame() override { |
| 89 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 90 canvas_handler_->RequestRefreshFrame(); |
| 91 } |
| 88 void StopCapture() override { | 92 void StopCapture() override { |
| 89 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 93 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 90 if (canvas_handler_.get()) | 94 if (canvas_handler_.get()) |
| 91 canvas_handler_->StopVideoCapture(); | 95 canvas_handler_->StopVideoCapture(); |
| 92 } | 96 } |
| 93 | 97 |
| 94 private: | 98 private: |
| 95 const double frame_rate_; | 99 const double frame_rate_; |
| 96 // Bound to Main Render thread. | 100 // Bound to Main Render thread. |
| 97 base::ThreadChecker main_render_thread_checker_; | 101 base::ThreadChecker main_render_thread_checker_; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 DCHECK(params.requested_format.IsValid()); | 191 DCHECK(params.requested_format.IsValid()); |
| 188 | 192 |
| 189 // TODO(emircan): Accomodate to the given frame rate constraints here. | 193 // TODO(emircan): Accomodate to the given frame rate constraints here. |
| 190 capture_format_ = params.requested_format; | 194 capture_format_ = params.requested_format; |
| 191 delegate_.reset(new CanvasCaptureHandlerDelegate(new_frame_callback)); | 195 delegate_.reset(new CanvasCaptureHandlerDelegate(new_frame_callback)); |
| 192 DCHECK(delegate_); | 196 DCHECK(delegate_); |
| 193 ask_for_new_frame_ = true; | 197 ask_for_new_frame_ = true; |
| 194 running_callback.Run(true); | 198 running_callback.Run(true); |
| 195 } | 199 } |
| 196 | 200 |
| 201 void CanvasCaptureHandler::RequestRefreshFrame() { |
| 202 DVLOG(3) << __FUNCTION__; |
| 203 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 204 if (last_frame_ && delegate_) { |
| 205 io_task_runner_->PostTask( |
| 206 FROM_HERE, |
| 207 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: |
| 208 SendNewFrameOnIOThread, |
| 209 delegate_->GetWeakPtrForIOThread(), last_frame_, |
| 210 base::TimeTicks::Now())); |
| 211 } |
| 212 } |
| 213 |
| 197 void CanvasCaptureHandler::StopVideoCapture() { | 214 void CanvasCaptureHandler::StopVideoCapture() { |
| 198 DVLOG(3) << __FUNCTION__; | 215 DVLOG(3) << __FUNCTION__; |
| 199 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 216 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 200 ask_for_new_frame_ = false; | 217 ask_for_new_frame_ = false; |
| 201 io_task_runner_->DeleteSoon(FROM_HERE, delegate_.release()); | 218 io_task_runner_->DeleteSoon(FROM_HERE, delegate_.release()); |
| 202 } | 219 } |
| 203 | 220 |
| 204 void CanvasCaptureHandler::CreateNewFrame(const SkImage* image) { | 221 void CanvasCaptureHandler::CreateNewFrame(const SkImage* image) { |
| 222 DVLOG(4) << __FUNCTION__; |
| 205 DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 223 DCHECK(main_render_thread_checker_.CalledOnValidThread()); |
| 206 DCHECK(image); | 224 DCHECK(image); |
| 207 | 225 |
| 208 const gfx::Size size(image->width(), image->height()); | 226 const gfx::Size size(image->width(), image->height()); |
| 209 if (size != last_size) { | 227 if (size != last_size) { |
| 210 temp_data_.resize( | 228 temp_data_.resize( |
| 211 media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_ARGB, size)); | 229 media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_ARGB, size)); |
| 212 row_bytes_ = | 230 row_bytes_ = |
| 213 media::VideoFrame::RowBytes(0, media::PIXEL_FORMAT_ARGB, size.width()); | 231 media::VideoFrame::RowBytes(0, media::PIXEL_FORMAT_ARGB, size.width()); |
| 214 image_info_ = | 232 image_info_ = |
| (...skipping 21 matching lines...) Expand all Loading... |
| 236 video_frame->stride(media::VideoFrame::kUPlane), | 254 video_frame->stride(media::VideoFrame::kUPlane), |
| 237 video_frame->data(media::VideoFrame::kVPlane), | 255 video_frame->data(media::VideoFrame::kVPlane), |
| 238 video_frame->stride(media::VideoFrame::kVPlane), | 256 video_frame->stride(media::VideoFrame::kVPlane), |
| 239 size.width(), size.height()); | 257 size.width(), size.height()); |
| 240 if (!isOpaque) { | 258 if (!isOpaque) { |
| 241 // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572 | 259 // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572 |
| 242 // when it becomes available. | 260 // when it becomes available. |
| 243 CopyAlphaChannelIntoVideoFrame(temp_data_.data(), video_frame); | 261 CopyAlphaChannelIntoVideoFrame(temp_data_.data(), video_frame); |
| 244 } | 262 } |
| 245 | 263 |
| 264 last_frame_ = video_frame; |
| 246 io_task_runner_->PostTask( | 265 io_task_runner_->PostTask( |
| 247 FROM_HERE, | 266 FROM_HERE, |
| 248 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: | 267 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: |
| 249 SendNewFrameOnIOThread, | 268 SendNewFrameOnIOThread, |
| 250 delegate_->GetWeakPtrForIOThread(), video_frame, timestamp)); | 269 delegate_->GetWeakPtrForIOThread(), video_frame, timestamp)); |
| 251 } | 270 } |
| 252 | 271 |
| 253 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack( | 272 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack( |
| 254 scoped_ptr<media::VideoCapturerSource> source, | 273 scoped_ptr<media::VideoCapturerSource> source, |
| 255 blink::WebMediaStreamTrack* web_track) { | 274 blink::WebMediaStreamTrack* web_track) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 266 | 285 |
| 267 web_track->initialize(webkit_source); | 286 web_track->initialize(webkit_source); |
| 268 blink::WebMediaConstraints constraints; | 287 blink::WebMediaConstraints constraints; |
| 269 constraints.initialize(); | 288 constraints.initialize(); |
| 270 web_track->setExtraData(new MediaStreamVideoTrack( | 289 web_track->setExtraData(new MediaStreamVideoTrack( |
| 271 media_stream_source.release(), constraints, | 290 media_stream_source.release(), constraints, |
| 272 MediaStreamVideoSource::ConstraintsCallback(), true)); | 291 MediaStreamVideoSource::ConstraintsCallback(), true)); |
| 273 } | 292 } |
| 274 | 293 |
| 275 } // namespace content | 294 } // namespace content |
| OLD | NEW |