Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(896)

Unified Diff: content/browser/media/capture/video_capture_oracle.cc

Issue 986823002: De-dupe copy requests for tab capture in DelegatedFrameHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove redundant portion of new test. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698