Chromium Code Reviews| Index: content/browser/media/capture/content_video_capture_device_core.cc |
| diff --git a/content/browser/media/capture/content_video_capture_device_core.cc b/content/browser/media/capture/content_video_capture_device_core.cc |
| index e2a51c4594be3d97bc1e36bde2868998cd5f1742..dcaa3535a023051f4d770dbe5ebd6bfeaaad3a7d 100644 |
| --- a/content/browser/media/capture/content_video_capture_device_core.cc |
| +++ b/content/browser/media/capture/content_video_capture_device_core.cc |
| @@ -70,6 +70,9 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
| base::TimeTicks event_time, |
| scoped_refptr<media::VideoFrame>* storage, |
| CaptureFrameCallback* callback) { |
| + // Grab the current time before waiting to acquire the |lock_|. |
| + const base::TimeTicks capture_begin_time = base::TimeTicks::Now(); |
| + |
| base::AutoLock guard(lock_); |
| if (!client_) |
| @@ -141,7 +144,8 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( |
| *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame, |
| this, |
| frame_number, |
| - output_buffer); |
| + output_buffer, |
| + capture_begin_time); |
| return true; |
| } |
| @@ -188,6 +192,7 @@ void ThreadSafeCaptureOracle::ReportError(const std::string& reason) { |
| void ThreadSafeCaptureOracle::DidCaptureFrame( |
| int frame_number, |
| const scoped_refptr<media::VideoCaptureDevice::Client::Buffer>& buffer, |
| + base::TimeTicks capture_begin_time, |
| const scoped_refptr<media::VideoFrame>& frame, |
| base::TimeTicks timestamp, |
| bool success) { |
| @@ -201,13 +206,22 @@ void ThreadSafeCaptureOracle::DidCaptureFrame( |
| if (success) { |
| if (oracle_->CompleteCapture(frame_number, ×tamp)) { |
| - media::VideoCaptureFormat format = params_.requested_format; |
| - // TODO(miu): Passing VideoCaptureFormat here introduces ambiguities. The |
| - // following is a hack where frame_size takes on a different meaning than |
| - // everywhere else (i.e., coded size, not visible size). Will fix in |
| - // soon-upcoming code change. |
| - format.frame_size = frame->coded_size(); |
| - client_->OnIncomingCapturedVideoFrame(buffer, format, frame, timestamp); |
| + // TODO(miu): Use the locked-in frame rate from AnimatedContentSampler. |
| + frame->metadata().SetDouble(media::VideoFrame::kFrameRateMetadataKey, |
| + params_.requested_format.frame_rate); |
| + // Provide capture begin/end timestamps in the VideoFrame metadata. |
| + // Casting the int64 internal value of the start and end TimeTickses to |
| + // double is reasonable here. This will guarantee 1us resolution for |
| + // values up to 2^53 (e.g., ~285 years since kernel boot). Alternative |
| + // approaches are much more heavyweight (e.g., storing the low and high 32 |
| + // bits as separate fields, storing as formatted ASCII strings, etc.). |
| + frame->metadata().SetDouble( |
| + "captureBeginTimeTicks", |
|
Alpha Left Google
2015/02/26 21:17:23
Can these names be defined in video_frame.h as wel
miu
2015/02/26 23:25:18
I'm uncomfortable with starting the practice of pu
|
| + static_cast<double>(capture_begin_time.ToInternalValue())); |
| + frame->metadata().SetDouble( |
| + "captureEndTimeTicks", |
| + static_cast<double>(base::TimeTicks::Now().ToInternalValue())); |
| + client_->OnIncomingCapturedVideoFrame(buffer, frame, timestamp); |
| } |
| } |
| } |