Add a new frame generator that cycles through randomly generated slides.

Like YuvFileGenerator, this also updates the display with a new slide on every Nth frame, but it generates the slides itself instead of reading them from files.

BUG=webrtc:8138

Review-Url: https://codereview.webrtc.org/3003193002
Cr-Commit-Position: refs/heads/master@{#19585}
diff --git a/webrtc/test/frame_generator_unittest.cc b/webrtc/test/frame_generator_unittest.cc
index 1ead698..79e7b63 100644
--- a/webrtc/test/frame_generator_unittest.cc
+++ b/webrtc/test/frame_generator_unittest.cc
@@ -81,6 +81,26 @@
     frame->set_timestamp(13);
   }
 
+  uint64_t Hash(VideoFrame* frame) {
+    // Generate a 64-bit hash from the frame's buffer.
+    uint64_t hash = 19;
+    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
+        frame->video_frame_buffer()->ToI420();
+    const uint8_t* buffer = i420_buffer->DataY();
+    for (int i = 0; i < y_size; ++i) {
+      hash = (37 * hash) + buffer[i];
+    }
+    buffer = i420_buffer->DataU();
+    for (int i = 0; i < uv_size; ++i) {
+      hash = (37 * hash) + buffer[i];
+    }
+    buffer = i420_buffer->DataV();
+    for (int i = 0; i < uv_size; ++i) {
+      hash = (37 * hash) + buffer[i];
+    }
+    return hash;
+  }
+
   std::string two_frame_filename_;
   std::string one_frame_filename_;
   const int y_size = kFrameWidth * kFrameHeight;
@@ -145,5 +165,25 @@
   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
 }
 
+TEST_F(FrameGeneratorTest, SlideGenerator) {
+  const int kGenCount = 9;
+  const int kRepeatCount = 3;
+  std::unique_ptr<FrameGenerator> generator(
+      FrameGenerator::CreateSlideGenerator(
+          kFrameWidth, kFrameHeight, kRepeatCount));
+  uint64_t hashes[kGenCount];
+  for (int i = 0; i < kGenCount; ++i) {
+    hashes[i] = Hash(generator->NextFrame());
+  }
+  // Check that the buffer changes only every |kRepeatCount| frames.
+  for (int i = 1; i < kGenCount; ++i) {
+    if (i % kRepeatCount == 0) {
+      EXPECT_NE(hashes[i-1], hashes[i]);
+    } else {
+      EXPECT_EQ(hashes[i-1], hashes[i]);
+    }
+  }
+}
+
 }  // namespace test
 }  // namespace webrtc