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); |