| 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..f4dfb1059f4160454ea9a4d279c47021b6e31543 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"
|
|
|
| @@ -70,6 +71,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 +145,8 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture(
|
| *callback = base::Bind(&ThreadSafeCaptureOracle::DidCaptureFrame,
|
| this,
|
| frame_number,
|
| - output_buffer);
|
| + output_buffer,
|
| + capture_begin_time);
|
| return true;
|
| }
|
|
|
| @@ -188,6 +193,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 +207,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);
|
| }
|
| }
|
| }
|
|
|