Index: webrtc/test/frame_generator.cc |
diff --git a/webrtc/test/frame_generator.cc b/webrtc/test/frame_generator.cc |
index 52ae14fe641707867b6a8f039fbd48142c5a088b..1956cdb3d7cd36e0030267613d3c24ef63d2450a 100644 |
--- a/webrtc/test/frame_generator.cc |
+++ b/webrtc/test/frame_generator.cc |
@@ -181,6 +181,85 @@ class YuvFileGenerator : public FrameGenerator { |
std::unique_ptr<VideoFrame> temp_frame_; |
}; |
+// SlideGenerator works similarly to YuvFileGenerator but it fills the frames |
+// with randomly sized and colored squares instead of reading their content |
+// from files. |
+class SlideGenerator : public FrameGenerator { |
+ public: |
+ SlideGenerator(int width, int height, int frame_repeat_count) |
+ : width_(width), |
+ height_(height), |
+ frame_display_count_(frame_repeat_count), |
+ current_display_count_(0), |
+ random_generator_(1234) { |
+ RTC_DCHECK_GT(width, 0); |
+ RTC_DCHECK_GT(height, 0); |
+ RTC_DCHECK_GT(frame_repeat_count, 0); |
+ } |
+ |
+ VideoFrame* NextFrame() override { |
+ if (current_display_count_ == 0) |
+ GenerateNewFrame(); |
+ if (++current_display_count_ >= frame_display_count_) |
+ current_display_count_ = 0; |
+ |
+ frame_.reset( |
+ new VideoFrame(buffer_, 0, 0, webrtc::kVideoRotation_0)); |
+ return frame_.get(); |
+ } |
+ |
+ // Generates some randomly sized and colored squares scattered |
+ // over the frame. |
+ void GenerateNewFrame() { |
+ // The squares should have a varying order of magnitude in order |
+ // to simulate variation in the slides' complexity. |
+ const int kSquareNum = 1 << (4 + (random_generator_.Rand(0, 3) * 4)); |
+ |
+ buffer_ = I420Buffer::Create(width_, height_); |
+ memset(buffer_->MutableDataY(), 127, height_ * buffer_->StrideY()); |
+ memset(buffer_->MutableDataU(), 127, |
+ buffer_->ChromaHeight() * buffer_->StrideU()); |
+ memset(buffer_->MutableDataV(), 127, |
+ buffer_->ChromaHeight() * buffer_->StrideV()); |
+ |
+ for (int i = 0; i < kSquareNum; ++i) { |
+ int length = random_generator_.Rand(1, width_ > 4 ? width_ / 4 : 1); |
+ // Limit the length of later squares so that they don't overwrite the |
+ // previous ones too much. |
+ length = (length * (kSquareNum - i)) / kSquareNum; |
+ |
+ int x = random_generator_.Rand(0, width_ - length); |
+ int y = random_generator_.Rand(0, height_ - length); |
+ uint8_t yuv_y = random_generator_.Rand(0, 255); |
+ uint8_t yuv_u = random_generator_.Rand(0, 255); |
+ uint8_t yuv_v = random_generator_.Rand(0, 255); |
+ |
+ for (int yy = y; yy < y + length; ++yy) { |
+ uint8_t* pos_y = |
+ (buffer_->MutableDataY() + x + yy * buffer_->StrideY()); |
+ memset(pos_y, yuv_y, length); |
+ } |
+ for (int yy = y; yy < y + length; yy += 2) { |
+ uint8_t* pos_u = |
+ (buffer_->MutableDataU() + x / 2 + yy / 2 * buffer_->StrideU()); |
+ memset(pos_u, yuv_u, length / 2); |
+ uint8_t* pos_v = |
+ (buffer_->MutableDataV() + x / 2 + yy / 2 * buffer_->StrideV()); |
+ memset(pos_v, yuv_v, length / 2); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ const int width_; |
+ const int height_; |
+ const int frame_display_count_; |
+ int current_display_count_; |
+ Random random_generator_; |
+ rtc::scoped_refptr<I420Buffer> buffer_; |
+ std::unique_ptr<VideoFrame> frame_; |
+}; |
+ |
class ScrollingImageFrameGenerator : public FrameGenerator { |
public: |
ScrollingImageFrameGenerator(Clock* clock, |
@@ -321,6 +400,12 @@ std::unique_ptr<FrameGenerator> FrameGenerator::CreateSquareGenerator( |
return std::unique_ptr<FrameGenerator>(new SquareGenerator(width, height)); |
} |
+std::unique_ptr<FrameGenerator> FrameGenerator::CreateSlideGenerator( |
+ int width, int height, int frame_repeat_count) { |
+ return std::unique_ptr<FrameGenerator>(new SlideGenerator( |
+ width, height, frame_repeat_count)); |
+} |
+ |
std::unique_ptr<FrameGenerator> FrameGenerator::CreateFromYuvFile( |
std::vector<std::string> filenames, |
size_t width, |