| 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 b470bcdb18d0b1de3e42f66a2bdb1d5ef827027b..d9956f1fec93d2dc413bbf9e919c03c5a65e1fac 100644
|
| --- a/content/browser/media/capture/content_video_capture_device_core.cc
|
| +++ b/content/browser/media/capture/content_video_capture_device_core.cc
|
| @@ -25,6 +25,7 @@
|
| #include "media/base/bind_to_current_loop.h"
|
| #include "media/base/video_capture_types.h"
|
| #include "media/base/video_frame.h"
|
| +#include "media/base/video_frame_metadata.h"
|
| #include "media/base/video_util.h"
|
| #include "ui/gfx/geometry/rect.h"
|
|
|
| @@ -71,6 +72,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_)
|
| @@ -142,7 +146,8 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture(
|
| *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame,
|
| this,
|
| frame_number,
|
| - output_buffer);
|
| + output_buffer,
|
| + capture_begin_time);
|
| return true;
|
| }
|
|
|
| @@ -189,6 +194,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) {
|
| @@ -202,13 +208,14 @@ 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::VideoFrameMetadata::FRAME_RATE,
|
| + params_.requested_format.frame_rate);
|
| + frame->metadata()->SetTimeTicks(
|
| + media::VideoFrameMetadata::CAPTURE_BEGIN_TIME, capture_begin_time);
|
| + frame->metadata()->SetTimeTicks(
|
| + media::VideoFrameMetadata::CAPTURE_END_TIME, base::TimeTicks::Now());
|
| + client_->OnIncomingCapturedVideoFrame(buffer, frame, timestamp);
|
| }
|
| }
|
| }
|
|
|