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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/media/capture/video_capture_oracle.h" 5 #include "content/browser/media/capture/video_capture_oracle.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 base::TimeDelta::FromSeconds(1) / frame_rate; 60 base::TimeDelta::FromSeconds(1) / frame_rate;
61 return (delta - expected_delta).InMillisecondsF() / 61 return (delta - expected_delta).InMillisecondsF() /
62 expected_delta.InMillisecondsF(); 62 expected_delta.InMillisecondsF();
63 } 63 }
64 64
65 } // anonymous namespace 65 } // anonymous namespace
66 66
67 VideoCaptureOracle::VideoCaptureOracle(base::TimeDelta min_capture_period) 67 VideoCaptureOracle::VideoCaptureOracle(base::TimeDelta min_capture_period)
68 : frame_number_(0), 68 : frame_number_(0),
69 last_delivered_frame_number_(-1), 69 last_delivered_frame_number_(-1),
70 first_failed_frame_number_(-1),
71 last_failed_frame_number_(-1),
70 smoothing_sampler_(min_capture_period, 72 smoothing_sampler_(min_capture_period,
71 kNumRedundantCapturesOfStaticContent), 73 kNumRedundantCapturesOfStaticContent),
72 content_sampler_(min_capture_period) { 74 content_sampler_(min_capture_period) {
73 } 75 }
74 76
75 VideoCaptureOracle::~VideoCaptureOracle() {} 77 VideoCaptureOracle::~VideoCaptureOracle() {}
76 78
77 bool VideoCaptureOracle::ObserveEventAndDecideCapture( 79 bool VideoCaptureOracle::ObserveEventAndDecideCapture(
78 Event event, 80 Event event,
79 const gfx::Rect& damage_rect, 81 const gfx::Rect& damage_rect,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 int VideoCaptureOracle::RecordCapture() { 115 int VideoCaptureOracle::RecordCapture() {
114 smoothing_sampler_.RecordSample(); 116 smoothing_sampler_.RecordSample();
115 content_sampler_.RecordSample(GetFrameTimestamp(frame_number_)); 117 content_sampler_.RecordSample(GetFrameTimestamp(frame_number_));
116 return frame_number_++; 118 return frame_number_++;
117 } 119 }
118 120
119 bool VideoCaptureOracle::CompleteCapture(int frame_number, 121 bool VideoCaptureOracle::CompleteCapture(int frame_number,
120 base::TimeTicks* frame_timestamp) { 122 base::TimeTicks* frame_timestamp) {
121 // Drop frame if previous frame number is higher. 123 // Drop frame if previous frame number is higher.
122 if (last_delivered_frame_number_ > frame_number) { 124 if (last_delivered_frame_number_ > frame_number) {
123 LOG(WARNING) << "Out of order frame delivery detected. Dropping frame."; 125 LOG(WARNING) << "Out of order frame delivery detected (have #"
126 << frame_number << ", last was #"
127 << last_delivered_frame_number_ << "). Dropping frame.";
124 return false; 128 return false;
125 } 129 }
126 last_delivered_frame_number_ = frame_number; 130 last_delivered_frame_number_ = frame_number;
127 131
128 *frame_timestamp = GetFrameTimestamp(frame_number); 132 *frame_timestamp = GetFrameTimestamp(frame_number);
129 133
130 // If enabled, log a measurement of how this frame timestamp has incremented 134 // If enabled, log a measurement of how this frame timestamp has incremented
131 // in relation to an ideal increment. 135 // in relation to an ideal increment.
132 if (VLOG_IS_ON(2) && frame_number > 0) { 136 if (VLOG_IS_ON(2) && frame_number > 0) {
133 const base::TimeDelta delta = 137 const base::TimeDelta delta =
(...skipping 19 matching lines...) Expand all
153 delta.InMicroseconds(), 157 delta.InMicroseconds(),
154 100.0 * FractionFromExpectedFrameRate(delta, 30), 158 100.0 * FractionFromExpectedFrameRate(delta, 30),
155 100.0 * FractionFromExpectedFrameRate(delta, 25), 159 100.0 * FractionFromExpectedFrameRate(delta, 25),
156 100.0 * FractionFromExpectedFrameRate(delta, 24)); 160 100.0 * FractionFromExpectedFrameRate(delta, 24));
157 } 161 }
158 } 162 }
159 163
160 return !frame_timestamp->is_null(); 164 return !frame_timestamp->is_null();
161 } 165 }
162 166
167 void VideoCaptureOracle::CaptureAbortedOrFailed(int frame_number) {
168 VLOG(1) << "Capture aborted/failed for frame #" << frame_number;
169
170 if (frame_number == (last_failed_frame_number_ + 1)) {
171 // Extending consecutive range of failed captures.
172 last_failed_frame_number_ = frame_number;
173 } else {
174 // Starting new consecutive range of failed captures.
175 first_failed_frame_number_ = last_failed_frame_number_ = frame_number;
176 }
177
178 // Account for the case where the newer captures are aborted before an older
179 // capture succeeds. In this case, the older capture will contain the newest
180 // content and so its timestamp should reflect that. See
181 // content::DelegatedFrameHost::DidReceiveFrameFromRenderer().
182 const int prior_frame_number = first_failed_frame_number_ - 1;
183 if (prior_frame_number > last_delivered_frame_number_)
184 SetFrameTimestamp(prior_frame_number, GetFrameTimestamp(frame_number));
185 }
186
163 base::TimeTicks VideoCaptureOracle::GetFrameTimestamp(int frame_number) const { 187 base::TimeTicks VideoCaptureOracle::GetFrameTimestamp(int frame_number) const {
164 DCHECK_LE(frame_number, frame_number_); 188 DCHECK_LE(frame_number, frame_number_);
165 DCHECK_LT(frame_number_ - frame_number, kMaxFrameTimestamps); 189 DCHECK_LT(frame_number_ - frame_number, kMaxFrameTimestamps);
166 return frame_timestamps_[frame_number % kMaxFrameTimestamps]; 190 return frame_timestamps_[frame_number % kMaxFrameTimestamps];
167 } 191 }
168 192
169 void VideoCaptureOracle::SetFrameTimestamp(int frame_number, 193 void VideoCaptureOracle::SetFrameTimestamp(int frame_number,
170 base::TimeTicks timestamp) { 194 base::TimeTicks timestamp) {
171 frame_timestamps_[frame_number % kMaxFrameTimestamps] = timestamp; 195 frame_timestamps_[frame_number % kMaxFrameTimestamps] = timestamp;
172 } 196 }
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 if (borrowed_time_ >= min_capture_period_) { 442 if (borrowed_time_ >= min_capture_period_) {
419 borrowed_time_ -= min_capture_period_; 443 borrowed_time_ -= min_capture_period_;
420 frame_timestamp_ = base::TimeTicks(); 444 frame_timestamp_ = base::TimeTicks();
421 } else { 445 } else {
422 sequence_offset_ += advancement; 446 sequence_offset_ += advancement;
423 frame_timestamp_ = timebase + sequence_offset_; 447 frame_timestamp_ = timebase + sequence_offset_;
424 } 448 }
425 } 449 }
426 450
427 } // namespace content 451 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698