Index: content/browser/media/capture/video_capture_oracle_unittest.cc |
diff --git a/content/browser/media/capture/video_capture_oracle_unittest.cc b/content/browser/media/capture/video_capture_oracle_unittest.cc |
index 630e081bec37ec043b76a3d4783ab967aa7f4d43..f6d8712d22edbcb633ea91d45afd239602225993 100644 |
--- a/content/browser/media/capture/video_capture_oracle_unittest.cc |
+++ b/content/browser/media/capture/video_capture_oracle_unittest.cc |
@@ -1145,6 +1145,57 @@ TEST(VideoCaptureOracleTest, EnforcesFramesDeliveredInOrder) { |
} |
} |
+// Tests that VideoCaptureOracle modifies the timestamp of an older capture when |
+// newer captures have been aborted before the older one succeeds (since the |
+// older frame will contain newer content). |
+TEST(VideoCaptureOracleTest, ModifiesTimestampsDueToAbortedCaptures) { |
+ const base::TimeDelta min_capture_period = |
+ base::TimeDelta::FromSeconds(1) / 30; |
+ const gfx::Rect empty_damage_rect; |
+ const base::TimeDelta event_increment = min_capture_period * 2; |
+ |
+ VideoCaptureOracle oracle(min_capture_period); |
+ |
+ // Start with a stream of captures alternating success vs failure. |
+ base::TimeTicks t = InitialTestTimeTicks(); |
+ int last_frame_number; |
+ base::TimeTicks timestamp; |
+ for (int i = 0; i < 10; ++i) { |
+ t += event_increment; |
+ ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
+ VideoCaptureOracle::kCompositorUpdate, |
+ empty_damage_rect, t)); |
+ last_frame_number = oracle.RecordCapture(); |
+ if (i % 2 == 0) { |
+ ASSERT_TRUE(oracle.CompleteCapture(last_frame_number, ×tamp)); |
+ ASSERT_EQ(t, timestamp); |
+ } else { |
+ oracle.CaptureAbortedOrFailed(last_frame_number); |
+ } |
+ } |
+ |
+ // One capture will succeed after the 1 to 3 captures scheduled after it are |
+ // first aborted. |
+ for (int num_aborts = 1; num_aborts <= 3; ++num_aborts) { |
+ t += event_increment; |
+ ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
+ VideoCaptureOracle::kCompositorUpdate, |
+ empty_damage_rect, t)); |
+ last_frame_number = oracle.RecordCapture(); |
+ for (int i = 0; i < num_aborts; ++i) { |
+ t += event_increment; |
+ ASSERT_TRUE(oracle.ObserveEventAndDecideCapture( |
+ VideoCaptureOracle::kCompositorUpdate, |
+ empty_damage_rect, t)); |
+ last_frame_number = oracle.RecordCapture(); |
+ oracle.CaptureAbortedOrFailed(last_frame_number); |
+ } |
+ ASSERT_TRUE(oracle.CompleteCapture( |
+ last_frame_number - num_aborts, ×tamp)); |
+ ASSERT_EQ(t, timestamp); |
+ } |
+} |
+ |
// Tests that VideoCaptureOracle transitions between using its two samplers in a |
// way that does not introduce severe jank, pauses, etc. |
TEST(VideoCaptureOracleTest, TransitionsSmoothlyBetweenSamplers) { |