| Index: content/browser/media/capture/video_capture_oracle.cc
|
| diff --git a/content/browser/media/capture/video_capture_oracle.cc b/content/browser/media/capture/video_capture_oracle.cc
|
| index dad77c72e965da7e79bca59a1417f0b29a09a816..d870837429008c77cb78203a4ed4ff884d6fa785 100644
|
| --- a/content/browser/media/capture/video_capture_oracle.cc
|
| +++ b/content/browser/media/capture/video_capture_oracle.cc
|
| @@ -67,6 +67,8 @@ double FractionFromExpectedFrameRate(base::TimeDelta delta, int frame_rate) {
|
| VideoCaptureOracle::VideoCaptureOracle(base::TimeDelta min_capture_period)
|
| : frame_number_(0),
|
| last_delivered_frame_number_(-1),
|
| + first_failed_frame_number_(-1),
|
| + last_failed_frame_number_(-1),
|
| smoothing_sampler_(min_capture_period,
|
| kNumRedundantCapturesOfStaticContent),
|
| content_sampler_(min_capture_period) {
|
| @@ -120,7 +122,9 @@ bool VideoCaptureOracle::CompleteCapture(int frame_number,
|
| base::TimeTicks* frame_timestamp) {
|
| // Drop frame if previous frame number is higher.
|
| if (last_delivered_frame_number_ > frame_number) {
|
| - LOG(WARNING) << "Out of order frame delivery detected. Dropping frame.";
|
| + LOG(WARNING) << "Out of order frame delivery detected (have #"
|
| + << frame_number << ", last was #"
|
| + << last_delivered_frame_number_ << "). Dropping frame.";
|
| return false;
|
| }
|
| last_delivered_frame_number_ = frame_number;
|
| @@ -160,6 +164,26 @@ bool VideoCaptureOracle::CompleteCapture(int frame_number,
|
| return !frame_timestamp->is_null();
|
| }
|
|
|
| +void VideoCaptureOracle::CaptureAbortedOrFailed(int frame_number) {
|
| + VLOG(1) << "Capture aborted/failed for frame #" << frame_number;
|
| +
|
| + if (frame_number == (last_failed_frame_number_ + 1)) {
|
| + // Extending consecutive range of failed captures.
|
| + last_failed_frame_number_ = frame_number;
|
| + } else {
|
| + // Starting new consecutive range of failed captures.
|
| + first_failed_frame_number_ = last_failed_frame_number_ = frame_number;
|
| + }
|
| +
|
| + // Account for the case where the newer captures are aborted before an older
|
| + // capture succeeds. In this case, the older capture will contain the newest
|
| + // content and so its timestamp should reflect that. See
|
| + // content::DelegatedFrameHost::DidReceiveFrameFromRenderer().
|
| + const int prior_frame_number = first_failed_frame_number_ - 1;
|
| + if (prior_frame_number > last_delivered_frame_number_)
|
| + SetFrameTimestamp(prior_frame_number, GetFrameTimestamp(frame_number));
|
| +}
|
| +
|
| base::TimeTicks VideoCaptureOracle::GetFrameTimestamp(int frame_number) const {
|
| DCHECK_LE(frame_number, frame_number_);
|
| DCHECK_LT(frame_number_ - frame_number, kMaxFrameTimestamps);
|
|
|