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

Side by Side Diff: content/renderer/media/canvas_capture_handler.cc

Issue 1782193003: Fix timestamp drift in CanvasCaptureHandler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698