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

Unified Diff: media/capture/content/smooth_event_sampler_unittest.cc

Issue 1865283003: Revert of Tab/Desktop Capture: Use requests instead of timer-based refreshing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@video_refresh_from_sinks
Patch Set: Created 4 years, 8 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
« no previous file with comments | « media/capture/content/smooth_event_sampler.cc ('k') | media/capture/content/thread_safe_capture_oracle.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/capture/content/smooth_event_sampler_unittest.cc
diff --git a/media/capture/content/smooth_event_sampler_unittest.cc b/media/capture/content/smooth_event_sampler_unittest.cc
index abd7d4ccfa78268fb83542fae9a1b09351b6f2f8..428a863012d39d57adbf88cad9ad3f4d45034e3c 100644
--- a/media/capture/content/smooth_event_sampler_unittest.cc
+++ b/media/capture/content/smooth_event_sampler_unittest.cc
@@ -28,7 +28,9 @@
ASSERT_TRUE(sampler->HasUnrecordedEvent());
sampler->RecordSample();
ASSERT_FALSE(sampler->HasUnrecordedEvent());
+ ASSERT_FALSE(sampler->IsOverdueForSamplingAt(*t));
*t += vsync;
+ ASSERT_FALSE(sampler->IsOverdueForSamplingAt(*t));
}
void SteadyStateNoSampleAndAdvance(base::TimeDelta vsync,
@@ -36,13 +38,44 @@
base::TimeTicks* t) {
ASSERT_FALSE(AddEventAndConsiderSampling(sampler, *t));
ASSERT_TRUE(sampler->HasUnrecordedEvent());
+ ASSERT_FALSE(sampler->IsOverdueForSamplingAt(*t));
*t += vsync;
+ ASSERT_FALSE(sampler->IsOverdueForSamplingAt(*t));
}
base::TimeTicks InitialTestTimeTicks() {
return base::TimeTicks() + base::TimeDelta::FromSeconds(1);
}
+void TestRedundantCaptureStrategy(base::TimeDelta capture_period,
+ int redundant_capture_goal,
+ SmoothEventSampler* sampler,
+ base::TimeTicks* t) {
+ // Before any events have been considered, we're overdue for sampling.
+ ASSERT_TRUE(sampler->IsOverdueForSamplingAt(*t));
+
+ // Consider the first event. We want to sample that.
+ ASSERT_FALSE(sampler->HasUnrecordedEvent());
+ ASSERT_TRUE(AddEventAndConsiderSampling(sampler, *t));
+ ASSERT_TRUE(sampler->HasUnrecordedEvent());
+ sampler->RecordSample();
+ ASSERT_FALSE(sampler->HasUnrecordedEvent());
+
+ // After more than 250 ms has passed without considering an event, we should
+ // repeatedly be overdue for sampling. However, once the redundant capture
+ // goal is achieved, we should no longer be overdue for sampling.
+ *t += base::TimeDelta::FromMilliseconds(250);
+ for (int i = 0; i < redundant_capture_goal; i++) {
+ SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_FALSE(sampler->HasUnrecordedEvent());
+ ASSERT_TRUE(sampler->IsOverdueForSamplingAt(*t))
+ << "Should sample until redundant capture goal is hit";
+ sampler->RecordSample();
+ *t += capture_period; // Timer fires once every capture period.
+ }
+ ASSERT_FALSE(sampler->IsOverdueForSamplingAt(*t))
+ << "Should not be overdue once redundant capture goal achieved.";
+}
} // namespace
@@ -50,10 +83,14 @@
// much more comprehensive before/after/edge-case scenarios than the others.
TEST(SmoothEventSamplerTest, Sample60HertzAt30Hertz) {
const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const int redundant_capture_goal = 200;
const base::TimeDelta vsync = base::TimeDelta::FromSeconds(1) / 60;
- SmoothEventSampler sampler(capture_period);
+ SmoothEventSampler sampler(capture_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(capture_period, redundant_capture_goal, &sampler,
+ &t);
// Steady state, we should capture every other vsync, indefinitely.
for (int i = 0; i < 100; i++) {
@@ -66,6 +103,7 @@
// case we are adding events but not sampling them.
for (int i = 0; i < 20; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_EQ(i >= 14, sampler.IsOverdueForSamplingAt(t));
ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
ASSERT_TRUE(sampler.HasUnrecordedEvent());
t += vsync;
@@ -73,6 +111,7 @@
// Now suppose we can sample again. We should be back in the steady state,
// but at a different phase.
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t));
for (int i = 0; i < 100; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
@@ -83,10 +122,14 @@
// 50Hz sampled at 30Hz should produce a sequence where some frames are skipped.
TEST(SmoothEventSamplerTest, Sample50HertzAt30Hertz) {
const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const int redundant_capture_goal = 2;
const base::TimeDelta vsync = base::TimeDelta::FromSeconds(1) / 50;
- SmoothEventSampler sampler(capture_period);
+ SmoothEventSampler sampler(capture_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(capture_period, redundant_capture_goal, &sampler,
+ &t);
// Steady state, we should capture 1st, 2nd and 4th frames out of every five
// frames, indefinitely.
@@ -103,12 +146,14 @@
// case we are adding events but not sampling them.
for (int i = 0; i < 20; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_EQ(i >= 11, sampler.IsOverdueForSamplingAt(t));
ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
t += vsync;
}
// Now suppose we can sample again. We should be back in the steady state
// again.
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t));
for (int i = 0; i < 100; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
@@ -122,10 +167,14 @@
// 75Hz sampled at 30Hz should produce a sequence where some frames are skipped.
TEST(SmoothEventSamplerTest, Sample75HertzAt30Hertz) {
const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const int redundant_capture_goal = 32;
const base::TimeDelta vsync = base::TimeDelta::FromSeconds(1) / 75;
- SmoothEventSampler sampler(capture_period);
+ SmoothEventSampler sampler(capture_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(capture_period, redundant_capture_goal, &sampler,
+ &t);
// Steady state, we should capture 1st and 3rd frames out of every five
// frames, indefinitely.
@@ -144,12 +193,14 @@
// case we are adding events but not sampling them.
for (int i = 0; i < 20; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_EQ(i >= 16, sampler.IsOverdueForSamplingAt(t));
ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
t += vsync;
}
// Now suppose we can sample again. We capture the next frame, and not the one
// after that, and then we're back in the steady state again.
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t));
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
SteadyStateNoSampleAndAdvance(vsync, &sampler, &t);
for (int i = 0; i < 100; i++) {
@@ -165,10 +216,14 @@
// 30Hz sampled at 30Hz should produce 30Hz.
TEST(SmoothEventSamplerTest, Sample30HertzAt30Hertz) {
const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const int redundant_capture_goal = 1;
const base::TimeDelta vsync = base::TimeDelta::FromSeconds(1) / 30;
- SmoothEventSampler sampler(capture_period);
+ SmoothEventSampler sampler(capture_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(capture_period, redundant_capture_goal, &sampler,
+ &t);
// Steady state, we should capture every vsync, indefinitely.
for (int i = 0; i < 200; i++) {
@@ -180,11 +235,13 @@
// case we are adding events but not sampling them.
for (int i = 0; i < 10; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_EQ(i >= 7, sampler.IsOverdueForSamplingAt(t));
ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
t += vsync;
}
// Now suppose we can sample again. We should be back in the steady state.
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t));
for (int i = 0; i < 100; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
@@ -194,10 +251,14 @@
// 24Hz sampled at 30Hz should produce 24Hz.
TEST(SmoothEventSamplerTest, Sample24HertzAt30Hertz) {
const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const int redundant_capture_goal = 333;
const base::TimeDelta vsync = base::TimeDelta::FromSeconds(1) / 24;
- SmoothEventSampler sampler(capture_period);
+ SmoothEventSampler sampler(capture_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(capture_period, redundant_capture_goal, &sampler,
+ &t);
// Steady state, we should capture every vsync, indefinitely.
for (int i = 0; i < 200; i++) {
@@ -209,11 +270,13 @@
// case we are adding events but not sampling them.
for (int i = 0; i < 10; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
+ ASSERT_EQ(i >= 6, sampler.IsOverdueForSamplingAt(t));
ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
t += vsync;
}
// Now suppose we can sample again. We should be back in the steady state.
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t));
for (int i = 0; i < 100; i++) {
SCOPED_TRACE(base::StringPrintf("Iteration %d", i));
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
@@ -228,9 +291,13 @@
const base::TimeDelta two_to_one_period = vsync * 2;
const base::TimeDelta two_and_three_to_one_period =
base::TimeDelta::FromSeconds(1) / 24;
-
- SmoothEventSampler sampler(one_to_one_period);
+ const int redundant_capture_goal = 1;
+
+ SmoothEventSampler sampler(one_to_one_period, redundant_capture_goal);
base::TimeTicks t = InitialTestTimeTicks();
+
+ TestRedundantCaptureStrategy(one_to_one_period, redundant_capture_goal,
+ &sampler, &t);
// With the capture rate at 60 Hz, we should capture every vsync.
for (int i = 0; i < 100; i++) {
@@ -266,6 +333,30 @@
SteadyStateNoSampleAndAdvance(vsync, &sampler, &t);
SteadyStateSampleAndAdvance(vsync, &sampler, &t);
}
+}
+
+TEST(SmoothEventSamplerTest, DoubleDrawAtOneTimeStillDirties) {
+ const base::TimeDelta capture_period = base::TimeDelta::FromSeconds(1) / 30;
+ const base::TimeDelta overdue_period = base::TimeDelta::FromSeconds(1);
+
+ SmoothEventSampler sampler(capture_period, 1);
+ base::TimeTicks t = InitialTestTimeTicks();
+
+ ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
+ sampler.RecordSample();
+ ASSERT_FALSE(sampler.IsOverdueForSamplingAt(t))
+ << "Sampled last event; should not be dirty.";
+ t += overdue_period;
+
+ // Now simulate 2 events with the same clock value.
+ ASSERT_TRUE(AddEventAndConsiderSampling(&sampler, t));
+ sampler.RecordSample();
+ ASSERT_FALSE(AddEventAndConsiderSampling(&sampler, t))
+ << "Two events at same time -- expected second not to be sampled.";
+ ASSERT_TRUE(sampler.IsOverdueForSamplingAt(t + overdue_period))
+ << "Second event should dirty the capture state.";
+ sampler.RecordSample();
+ ASSERT_FALSE(sampler.IsOverdueForSamplingAt(t + overdue_period));
}
namespace {
@@ -368,7 +459,7 @@
{true, 33.44},
{false, 0}};
- SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30);
+ SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30, 3);
ReplayCheckingSamplerDecisions(data_points, arraysize(data_points), &sampler);
}
@@ -477,7 +568,7 @@
{true, 33.44},
{true, 33.44}};
- SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30);
+ SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30, 3);
ReplayCheckingSamplerDecisions(data_points, arraysize(data_points), &sampler);
}
@@ -610,7 +701,7 @@
{true, 16.72},
{true, 50.16}};
- SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30);
+ SmoothEventSampler sampler(base::TimeDelta::FromSeconds(1) / 30, 3);
ReplayCheckingSamplerDecisions(data_points, arraysize(data_points), &sampler);
}
« no previous file with comments | « media/capture/content/smooth_event_sampler.cc ('k') | media/capture/content/thread_safe_capture_oracle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698