xref: /aosp_15_r20/external/webrtc/test/frame_generator_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "test/frame_generator.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <stdio.h>
14*d9f75844SAndroid Build Coastguard Worker #include <string.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
17*d9f75844SAndroid Build Coastguard Worker #include <memory>
18*d9f75844SAndroid Build Coastguard Worker #include <string>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/test/create_frame_generator.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/test/frame_generator_interface.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame_buffer.h"
24*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
25*d9f75844SAndroid Build Coastguard Worker #include "test/testsupport/file_utils.h"
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
28*d9f75844SAndroid Build Coastguard Worker namespace test {
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker constexpr int kFrameWidth = 4;
31*d9f75844SAndroid Build Coastguard Worker constexpr int kFrameHeight = 4;
32*d9f75844SAndroid Build Coastguard Worker constexpr int y_size = kFrameWidth * kFrameHeight;
33*d9f75844SAndroid Build Coastguard Worker constexpr int uv_size = ((kFrameHeight + 1) / 2) * ((kFrameWidth + 1) / 2);
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker class FrameGeneratorTest : public ::testing::Test {
36*d9f75844SAndroid Build Coastguard Worker  public:
SetUp()37*d9f75844SAndroid Build Coastguard Worker   void SetUp() override {
38*d9f75844SAndroid Build Coastguard Worker     two_frame_yuv_filename_ =
39*d9f75844SAndroid Build Coastguard Worker         test::TempFilename(test::OutputPath(), "2_frame_yuv_file");
40*d9f75844SAndroid Build Coastguard Worker     one_frame_yuv_filename_ =
41*d9f75844SAndroid Build Coastguard Worker         test::TempFilename(test::OutputPath(), "1_frame_yuv_file");
42*d9f75844SAndroid Build Coastguard Worker     two_frame_nv12_filename_ =
43*d9f75844SAndroid Build Coastguard Worker         test::TempFilename(test::OutputPath(), "2_frame_nv12_file");
44*d9f75844SAndroid Build Coastguard Worker     one_frame_nv12_filename_ =
45*d9f75844SAndroid Build Coastguard Worker         test::TempFilename(test::OutputPath(), "1_frame_nv12_file");
46*d9f75844SAndroid Build Coastguard Worker 
47*d9f75844SAndroid Build Coastguard Worker     FILE* file = fopen(two_frame_yuv_filename_.c_str(), "wb");
48*d9f75844SAndroid Build Coastguard Worker     WriteYuvFile(file, 0, 0, 0);
49*d9f75844SAndroid Build Coastguard Worker     WriteYuvFile(file, 127, 128, 129);
50*d9f75844SAndroid Build Coastguard Worker     fclose(file);
51*d9f75844SAndroid Build Coastguard Worker     file = fopen(one_frame_yuv_filename_.c_str(), "wb");
52*d9f75844SAndroid Build Coastguard Worker     WriteYuvFile(file, 255, 255, 255);
53*d9f75844SAndroid Build Coastguard Worker     fclose(file);
54*d9f75844SAndroid Build Coastguard Worker     file = fopen(two_frame_nv12_filename_.c_str(), "wb");
55*d9f75844SAndroid Build Coastguard Worker     WriteNV12File(file, 0, 0, 0);
56*d9f75844SAndroid Build Coastguard Worker     WriteNV12File(file, 127, 128, 129);
57*d9f75844SAndroid Build Coastguard Worker     fclose(file);
58*d9f75844SAndroid Build Coastguard Worker     file = fopen(one_frame_nv12_filename_.c_str(), "wb");
59*d9f75844SAndroid Build Coastguard Worker     WriteNV12File(file, 255, 255, 255);
60*d9f75844SAndroid Build Coastguard Worker     fclose(file);
61*d9f75844SAndroid Build Coastguard Worker   }
62*d9f75844SAndroid Build Coastguard Worker 
TearDown()63*d9f75844SAndroid Build Coastguard Worker   void TearDown() override {
64*d9f75844SAndroid Build Coastguard Worker     remove(one_frame_yuv_filename_.c_str());
65*d9f75844SAndroid Build Coastguard Worker     remove(two_frame_yuv_filename_.c_str());
66*d9f75844SAndroid Build Coastguard Worker     remove(one_frame_nv12_filename_.c_str());
67*d9f75844SAndroid Build Coastguard Worker     remove(two_frame_nv12_filename_.c_str());
68*d9f75844SAndroid Build Coastguard Worker   }
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker  protected:
WriteYuvFile(FILE * file,uint8_t y,uint8_t u,uint8_t v)71*d9f75844SAndroid Build Coastguard Worker   void WriteYuvFile(FILE* file, uint8_t y, uint8_t u, uint8_t v) {
72*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK(file);
73*d9f75844SAndroid Build Coastguard Worker     std::unique_ptr<uint8_t[]> plane_buffer(new uint8_t[y_size]);
74*d9f75844SAndroid Build Coastguard Worker     memset(plane_buffer.get(), y, y_size);
75*d9f75844SAndroid Build Coastguard Worker     fwrite(plane_buffer.get(), 1, y_size, file);
76*d9f75844SAndroid Build Coastguard Worker     memset(plane_buffer.get(), u, uv_size);
77*d9f75844SAndroid Build Coastguard Worker     fwrite(plane_buffer.get(), 1, uv_size, file);
78*d9f75844SAndroid Build Coastguard Worker     memset(plane_buffer.get(), v, uv_size);
79*d9f75844SAndroid Build Coastguard Worker     fwrite(plane_buffer.get(), 1, uv_size, file);
80*d9f75844SAndroid Build Coastguard Worker   }
81*d9f75844SAndroid Build Coastguard Worker 
WriteNV12File(FILE * file,uint8_t y,uint8_t u,uint8_t v)82*d9f75844SAndroid Build Coastguard Worker   void WriteNV12File(FILE* file, uint8_t y, uint8_t u, uint8_t v) {
83*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK(file);
84*d9f75844SAndroid Build Coastguard Worker     uint8_t plane_buffer[y_size];
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker     memset(&plane_buffer, y, y_size);
87*d9f75844SAndroid Build Coastguard Worker     fwrite(&plane_buffer, 1, y_size, file);
88*d9f75844SAndroid Build Coastguard Worker     for (size_t i = 0; i < uv_size; ++i) {
89*d9f75844SAndroid Build Coastguard Worker       plane_buffer[2 * i] = u;
90*d9f75844SAndroid Build Coastguard Worker       plane_buffer[2 * i + 1] = v;
91*d9f75844SAndroid Build Coastguard Worker     }
92*d9f75844SAndroid Build Coastguard Worker     fwrite(&plane_buffer, 1, 2 * uv_size, file);
93*d9f75844SAndroid Build Coastguard Worker   }
94*d9f75844SAndroid Build Coastguard Worker 
CheckFrameAndMutate(const FrameGeneratorInterface::VideoFrameData & frame,uint8_t y,uint8_t u,uint8_t v)95*d9f75844SAndroid Build Coastguard Worker   void CheckFrameAndMutate(const FrameGeneratorInterface::VideoFrameData& frame,
96*d9f75844SAndroid Build Coastguard Worker                            uint8_t y,
97*d9f75844SAndroid Build Coastguard Worker                            uint8_t u,
98*d9f75844SAndroid Build Coastguard Worker                            uint8_t v) {
99*d9f75844SAndroid Build Coastguard Worker     // Check that frame is valid, has the correct color and timestamp are clean.
100*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<I420BufferInterface> i420_buffer =
101*d9f75844SAndroid Build Coastguard Worker         frame.buffer->ToI420();
102*d9f75844SAndroid Build Coastguard Worker     const uint8_t* buffer;
103*d9f75844SAndroid Build Coastguard Worker     buffer = i420_buffer->DataY();
104*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < y_size; ++i)
105*d9f75844SAndroid Build Coastguard Worker       ASSERT_EQ(y, buffer[i]);
106*d9f75844SAndroid Build Coastguard Worker     buffer = i420_buffer->DataU();
107*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < uv_size; ++i)
108*d9f75844SAndroid Build Coastguard Worker       ASSERT_EQ(u, buffer[i]);
109*d9f75844SAndroid Build Coastguard Worker     buffer = i420_buffer->DataV();
110*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < uv_size; ++i)
111*d9f75844SAndroid Build Coastguard Worker       ASSERT_EQ(v, buffer[i]);
112*d9f75844SAndroid Build Coastguard Worker   }
113*d9f75844SAndroid Build Coastguard Worker 
Hash(const FrameGeneratorInterface::VideoFrameData & frame)114*d9f75844SAndroid Build Coastguard Worker   uint64_t Hash(const FrameGeneratorInterface::VideoFrameData& frame) {
115*d9f75844SAndroid Build Coastguard Worker     // Generate a 64-bit hash from the frame's buffer.
116*d9f75844SAndroid Build Coastguard Worker     uint64_t hash = 19;
117*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<I420BufferInterface> i420_buffer =
118*d9f75844SAndroid Build Coastguard Worker         frame.buffer->ToI420();
119*d9f75844SAndroid Build Coastguard Worker     const uint8_t* buffer = i420_buffer->DataY();
120*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < y_size; ++i) {
121*d9f75844SAndroid Build Coastguard Worker       hash = (37 * hash) + buffer[i];
122*d9f75844SAndroid Build Coastguard Worker     }
123*d9f75844SAndroid Build Coastguard Worker     buffer = i420_buffer->DataU();
124*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < uv_size; ++i) {
125*d9f75844SAndroid Build Coastguard Worker       hash = (37 * hash) + buffer[i];
126*d9f75844SAndroid Build Coastguard Worker     }
127*d9f75844SAndroid Build Coastguard Worker     buffer = i420_buffer->DataV();
128*d9f75844SAndroid Build Coastguard Worker     for (int i = 0; i < uv_size; ++i) {
129*d9f75844SAndroid Build Coastguard Worker       hash = (37 * hash) + buffer[i];
130*d9f75844SAndroid Build Coastguard Worker     }
131*d9f75844SAndroid Build Coastguard Worker     return hash;
132*d9f75844SAndroid Build Coastguard Worker   }
133*d9f75844SAndroid Build Coastguard Worker 
134*d9f75844SAndroid Build Coastguard Worker   std::string two_frame_yuv_filename_;
135*d9f75844SAndroid Build Coastguard Worker   std::string one_frame_yuv_filename_;
136*d9f75844SAndroid Build Coastguard Worker   std::string two_frame_nv12_filename_;
137*d9f75844SAndroid Build Coastguard Worker   std::string one_frame_nv12_filename_;
138*d9f75844SAndroid Build Coastguard Worker };
139*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,SingleFrameYuvFile)140*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, SingleFrameYuvFile) {
141*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
142*d9f75844SAndroid Build Coastguard Worker       CreateFromYuvFileFrameGenerator(
143*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, one_frame_yuv_filename_), kFrameWidth,
144*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, 1));
145*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
146*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
147*d9f75844SAndroid Build Coastguard Worker }
148*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,TwoFrameYuvFile)149*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, TwoFrameYuvFile) {
150*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
151*d9f75844SAndroid Build Coastguard Worker       CreateFromYuvFileFrameGenerator(
152*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, two_frame_yuv_filename_), kFrameWidth,
153*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, 1));
154*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
155*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
156*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
157*d9f75844SAndroid Build Coastguard Worker }
158*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,MultipleFrameYuvFiles)159*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, MultipleFrameYuvFiles) {
160*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> files;
161*d9f75844SAndroid Build Coastguard Worker   files.push_back(two_frame_yuv_filename_);
162*d9f75844SAndroid Build Coastguard Worker   files.push_back(one_frame_yuv_filename_);
163*d9f75844SAndroid Build Coastguard Worker 
164*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
165*d9f75844SAndroid Build Coastguard Worker       CreateFromYuvFileFrameGenerator(files, kFrameWidth, kFrameHeight, 1));
166*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
167*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
168*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
169*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
170*d9f75844SAndroid Build Coastguard Worker }
171*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,TwoFrameYuvFileWithRepeat)172*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, TwoFrameYuvFileWithRepeat) {
173*d9f75844SAndroid Build Coastguard Worker   const int kRepeatCount = 3;
174*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
175*d9f75844SAndroid Build Coastguard Worker       CreateFromYuvFileFrameGenerator(
176*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, two_frame_yuv_filename_), kFrameWidth,
177*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, kRepeatCount));
178*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
179*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
180*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
181*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
182*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
183*d9f75844SAndroid Build Coastguard Worker }
184*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,MultipleFrameYuvFilesWithRepeat)185*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, MultipleFrameYuvFilesWithRepeat) {
186*d9f75844SAndroid Build Coastguard Worker   const int kRepeatCount = 3;
187*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> files;
188*d9f75844SAndroid Build Coastguard Worker   files.push_back(two_frame_yuv_filename_);
189*d9f75844SAndroid Build Coastguard Worker   files.push_back(one_frame_yuv_filename_);
190*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
191*d9f75844SAndroid Build Coastguard Worker       CreateFromYuvFileFrameGenerator(files, kFrameWidth, kFrameHeight,
192*d9f75844SAndroid Build Coastguard Worker                                       kRepeatCount));
193*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
194*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
195*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
196*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
197*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
198*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
199*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,SingleFrameNV12File)202*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, SingleFrameNV12File) {
203*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
204*d9f75844SAndroid Build Coastguard Worker       CreateFromNV12FileFrameGenerator(
205*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, one_frame_nv12_filename_), kFrameWidth,
206*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, 1));
207*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
208*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
209*d9f75844SAndroid Build Coastguard Worker }
210*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,TwoFrameNV12File)211*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, TwoFrameNV12File) {
212*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
213*d9f75844SAndroid Build Coastguard Worker       CreateFromNV12FileFrameGenerator(
214*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, two_frame_nv12_filename_), kFrameWidth,
215*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, 1));
216*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
217*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
218*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
219*d9f75844SAndroid Build Coastguard Worker }
220*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,MultipleFrameNV12Files)221*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, MultipleFrameNV12Files) {
222*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> files;
223*d9f75844SAndroid Build Coastguard Worker   files.push_back(two_frame_nv12_filename_);
224*d9f75844SAndroid Build Coastguard Worker   files.push_back(one_frame_nv12_filename_);
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
227*d9f75844SAndroid Build Coastguard Worker       CreateFromNV12FileFrameGenerator(files, kFrameWidth, kFrameHeight, 1));
228*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
229*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
230*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
231*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
232*d9f75844SAndroid Build Coastguard Worker }
233*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,TwoFrameNV12FileWithRepeat)234*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, TwoFrameNV12FileWithRepeat) {
235*d9f75844SAndroid Build Coastguard Worker   const int kRepeatCount = 3;
236*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
237*d9f75844SAndroid Build Coastguard Worker       CreateFromNV12FileFrameGenerator(
238*d9f75844SAndroid Build Coastguard Worker           std::vector<std::string>(1, two_frame_nv12_filename_), kFrameWidth,
239*d9f75844SAndroid Build Coastguard Worker           kFrameHeight, kRepeatCount));
240*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
241*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
242*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
243*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
244*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
245*d9f75844SAndroid Build Coastguard Worker }
246*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,MultipleFrameNV12FilesWithRepeat)247*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, MultipleFrameNV12FilesWithRepeat) {
248*d9f75844SAndroid Build Coastguard Worker   const int kRepeatCount = 3;
249*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> files;
250*d9f75844SAndroid Build Coastguard Worker   files.push_back(two_frame_nv12_filename_);
251*d9f75844SAndroid Build Coastguard Worker   files.push_back(one_frame_nv12_filename_);
252*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
253*d9f75844SAndroid Build Coastguard Worker       CreateFromNV12FileFrameGenerator(files, kFrameWidth, kFrameHeight,
254*d9f75844SAndroid Build Coastguard Worker                                        kRepeatCount));
255*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
256*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
257*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
258*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 127, 128, 129);
259*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kRepeatCount; ++i)
260*d9f75844SAndroid Build Coastguard Worker     CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
261*d9f75844SAndroid Build Coastguard Worker   CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
262*d9f75844SAndroid Build Coastguard Worker }
263*d9f75844SAndroid Build Coastguard Worker 
TEST_F(FrameGeneratorTest,SlideGenerator)264*d9f75844SAndroid Build Coastguard Worker TEST_F(FrameGeneratorTest, SlideGenerator) {
265*d9f75844SAndroid Build Coastguard Worker   const int kGenCount = 9;
266*d9f75844SAndroid Build Coastguard Worker   const int kRepeatCount = 3;
267*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameGeneratorInterface> generator(
268*d9f75844SAndroid Build Coastguard Worker       CreateSlideFrameGenerator(kFrameWidth, kFrameHeight, kRepeatCount));
269*d9f75844SAndroid Build Coastguard Worker   uint64_t hashes[kGenCount];
270*d9f75844SAndroid Build Coastguard Worker   for (int i = 0; i < kGenCount; ++i) {
271*d9f75844SAndroid Build Coastguard Worker     hashes[i] = Hash(generator->NextFrame());
272*d9f75844SAndroid Build Coastguard Worker   }
273*d9f75844SAndroid Build Coastguard Worker   // Check that the buffer changes only every `kRepeatCount` frames.
274*d9f75844SAndroid Build Coastguard Worker   for (int i = 1; i < kGenCount; ++i) {
275*d9f75844SAndroid Build Coastguard Worker     if (i % kRepeatCount == 0) {
276*d9f75844SAndroid Build Coastguard Worker       EXPECT_NE(hashes[i - 1], hashes[i]);
277*d9f75844SAndroid Build Coastguard Worker     } else {
278*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(hashes[i - 1], hashes[i]);
279*d9f75844SAndroid Build Coastguard Worker     }
280*d9f75844SAndroid Build Coastguard Worker   }
281*d9f75844SAndroid Build Coastguard Worker }
282*d9f75844SAndroid Build Coastguard Worker 
283*d9f75844SAndroid Build Coastguard Worker }  // namespace test
284*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
285