| 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 kUnpremul_SkAlphaType); | 187 kUnpremul_SkAlphaType); |
| 188 last_size = size; | 188 last_size = size; |
| 189 } | 189 } |
| 190 | 190 |
| 191 if(!image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0)) { | 191 if(!image->readPixels(image_info_, &temp_data_[0], row_bytes_, 0, 0)) { |
| 192 DLOG(ERROR) << "Couldn't read SkImage pixels"; | 192 DLOG(ERROR) << "Couldn't read SkImage pixels"; |
| 193 return; | 193 return; |
| 194 } | 194 } |
| 195 | 195 |
| 196 const bool isOpaque = image->isOpaque(); | 196 const bool isOpaque = image->isOpaque(); |
| 197 const base::TimeTicks timestamp = base::TimeTicks::Now(); |
| 197 scoped_refptr<media::VideoFrame> video_frame = frame_pool_.CreateFrame( | 198 scoped_refptr<media::VideoFrame> video_frame = frame_pool_.CreateFrame( |
| 198 isOpaque ? media::PIXEL_FORMAT_I420 : media::PIXEL_FORMAT_YV12A, size, | 199 isOpaque ? media::PIXEL_FORMAT_I420 : media::PIXEL_FORMAT_YV12A, size, |
| 199 gfx::Rect(size), size, base::TimeTicks::Now() - base::TimeTicks()); | 200 gfx::Rect(size), size, timestamp - base::TimeTicks()); |
| 200 DCHECK(video_frame); | 201 DCHECK(video_frame); |
| 201 | 202 |
| 202 // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572 | 203 // TODO(emircan): Use https://code.google.com/p/libyuv/issues/detail?id=572 |
| 203 // when it becomes available. | 204 // when it becomes available. |
| 204 libyuv::ARGBToI420(temp_data_.data(), row_bytes_, | 205 libyuv::ARGBToI420(temp_data_.data(), row_bytes_, |
| 205 video_frame->data(media::VideoFrame::kYPlane), | 206 video_frame->data(media::VideoFrame::kYPlane), |
| 206 video_frame->stride(media::VideoFrame::kYPlane), | 207 video_frame->stride(media::VideoFrame::kYPlane), |
| 207 video_frame->data(media::VideoFrame::kUPlane), | 208 video_frame->data(media::VideoFrame::kUPlane), |
| 208 video_frame->stride(media::VideoFrame::kUPlane), | 209 video_frame->stride(media::VideoFrame::kUPlane), |
| 209 video_frame->data(media::VideoFrame::kVPlane), | 210 video_frame->data(media::VideoFrame::kVPlane), |
| 210 video_frame->stride(media::VideoFrame::kVPlane), | 211 video_frame->stride(media::VideoFrame::kVPlane), |
| 211 size.width(), size.height()); | 212 size.width(), size.height()); |
| 212 if (!isOpaque) { | 213 if (!isOpaque) { |
| 213 for (int p = 0; p < size.GetArea(); ++p) | 214 for (int p = 0; p < size.GetArea(); ++p) |
| 214 video_frame->data(media::VideoFrame::kAPlane)[p] = temp_data_[p * 4 + 3]; | 215 video_frame->data(media::VideoFrame::kAPlane)[p] = temp_data_[p * 4 + 3]; |
| 215 } | 216 } |
| 216 | 217 |
| 217 io_task_runner_->PostTask( | 218 io_task_runner_->PostTask( |
| 218 FROM_HERE, | 219 FROM_HERE, |
| 219 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: | 220 base::Bind(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate:: |
| 220 SendNewFrameOnIOThread, | 221 SendNewFrameOnIOThread, |
| 221 delegate_->GetWeakPtrForIOThread(), video_frame, | 222 delegate_->GetWeakPtrForIOThread(), video_frame, timestamp)); |
| 222 base::TimeTicks::Now())); | |
| 223 } | 223 } |
| 224 | 224 |
| 225 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack( | 225 void CanvasCaptureHandler::AddVideoCapturerSourceToVideoTrack( |
| 226 scoped_ptr<media::VideoCapturerSource> source, | 226 scoped_ptr<media::VideoCapturerSource> source, |
| 227 blink::WebMediaStreamTrack* web_track) { | 227 blink::WebMediaStreamTrack* web_track) { |
| 228 std::string str_track_id; | 228 std::string str_track_id; |
| 229 base::Base64Encode(base::RandBytesAsString(64), &str_track_id); | 229 base::Base64Encode(base::RandBytesAsString(64), &str_track_id); |
| 230 const blink::WebString track_id = base::UTF8ToUTF16(str_track_id); | 230 const blink::WebString track_id = base::UTF8ToUTF16(str_track_id); |
| 231 blink::WebMediaStreamSource webkit_source; | 231 blink::WebMediaStreamSource webkit_source; |
| 232 scoped_ptr<MediaStreamVideoSource> media_stream_source( | 232 scoped_ptr<MediaStreamVideoSource> media_stream_source( |
| 233 new MediaStreamVideoCapturerSource( | 233 new MediaStreamVideoCapturerSource( |
| 234 MediaStreamSource::SourceStoppedCallback(), std::move(source))); | 234 MediaStreamSource::SourceStoppedCallback(), std::move(source))); |
| 235 webkit_source.initialize(track_id, blink::WebMediaStreamSource::TypeVideo, | 235 webkit_source.initialize(track_id, blink::WebMediaStreamSource::TypeVideo, |
| 236 track_id, false, true); | 236 track_id, false, true); |
| 237 webkit_source.setExtraData(media_stream_source.get()); | 237 webkit_source.setExtraData(media_stream_source.get()); |
| 238 | 238 |
| 239 web_track->initialize(webkit_source); | 239 web_track->initialize(webkit_source); |
| 240 blink::WebMediaConstraints constraints; | 240 blink::WebMediaConstraints constraints; |
| 241 constraints.initialize(); | 241 constraints.initialize(); |
| 242 web_track->setExtraData(new MediaStreamVideoTrack( | 242 web_track->setExtraData(new MediaStreamVideoTrack( |
| 243 media_stream_source.release(), constraints, | 243 media_stream_source.release(), constraints, |
| 244 MediaStreamVideoSource::ConstraintsCallback(), true)); | 244 MediaStreamVideoSource::ConstraintsCallback(), true)); |
| 245 } | 245 } |
| 246 | 246 |
| 247 } // namespace content | 247 } // namespace content |
| OLD | NEW |