xref: /aosp_15_r20/external/webrtc/api/test/create_frame_generator.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "api/test/create_frame_generator.h"
12 
13 #include <cstdio>
14 #include <utility>
15 
16 #include "rtc_base/checks.h"
17 #include "test/frame_generator.h"
18 #include "test/testsupport/ivf_video_frame_generator.h"
19 
20 namespace webrtc {
21 namespace test {
22 
CreateSquareFrameGenerator(int width,int height,absl::optional<FrameGeneratorInterface::OutputType> type,absl::optional<int> num_squares)23 std::unique_ptr<FrameGeneratorInterface> CreateSquareFrameGenerator(
24     int width,
25     int height,
26     absl::optional<FrameGeneratorInterface::OutputType> type,
27     absl::optional<int> num_squares) {
28   return std::make_unique<SquareGenerator>(
29       width, height, type.value_or(FrameGeneratorInterface::OutputType::kI420),
30       num_squares.value_or(10));
31 }
32 
CreateFromYuvFileFrameGenerator(std::vector<std::string> filenames,size_t width,size_t height,int frame_repeat_count)33 std::unique_ptr<FrameGeneratorInterface> CreateFromYuvFileFrameGenerator(
34     std::vector<std::string> filenames,
35     size_t width,
36     size_t height,
37     int frame_repeat_count) {
38   RTC_DCHECK(!filenames.empty());
39   std::vector<FILE*> files;
40   for (const std::string& filename : filenames) {
41     FILE* file = fopen(filename.c_str(), "rb");
42     RTC_DCHECK(file != nullptr) << "Failed to open: '" << filename << "'\n";
43     files.push_back(file);
44   }
45 
46   return std::make_unique<YuvFileGenerator>(files, width, height,
47                                             frame_repeat_count);
48 }
49 
CreateFromNV12FileFrameGenerator(std::vector<std::string> filenames,size_t width,size_t height,int frame_repeat_count)50 std::unique_ptr<FrameGeneratorInterface> CreateFromNV12FileFrameGenerator(
51     std::vector<std::string> filenames,
52     size_t width,
53     size_t height,
54     int frame_repeat_count) {
55   RTC_DCHECK(!filenames.empty());
56   std::vector<FILE*> files;
57   for (const std::string& filename : filenames) {
58     FILE* file = fopen(filename.c_str(), "rb");
59     RTC_DCHECK(file != nullptr) << "Failed to open: '" << filename << "'\n";
60     files.push_back(file);
61   }
62 
63   return std::make_unique<NV12FileGenerator>(files, width, height,
64                                              frame_repeat_count);
65 }
66 
CreateFromIvfFileFrameGenerator(std::string filename)67 std::unique_ptr<FrameGeneratorInterface> CreateFromIvfFileFrameGenerator(
68     std::string filename) {
69   return std::make_unique<IvfVideoFrameGenerator>(std::move(filename));
70 }
71 
72 std::unique_ptr<FrameGeneratorInterface>
CreateScrollingInputFromYuvFilesFrameGenerator(Clock * clock,std::vector<std::string> filenames,size_t source_width,size_t source_height,size_t target_width,size_t target_height,int64_t scroll_time_ms,int64_t pause_time_ms)73 CreateScrollingInputFromYuvFilesFrameGenerator(
74     Clock* clock,
75     std::vector<std::string> filenames,
76     size_t source_width,
77     size_t source_height,
78     size_t target_width,
79     size_t target_height,
80     int64_t scroll_time_ms,
81     int64_t pause_time_ms) {
82   RTC_DCHECK(!filenames.empty());
83   std::vector<FILE*> files;
84   for (const std::string& filename : filenames) {
85     FILE* file = fopen(filename.c_str(), "rb");
86     RTC_DCHECK(file != nullptr);
87     files.push_back(file);
88   }
89 
90   return std::make_unique<ScrollingImageFrameGenerator>(
91       clock, files, source_width, source_height, target_width, target_height,
92       scroll_time_ms, pause_time_ms);
93 }
94 
95 std::unique_ptr<FrameGeneratorInterface>
CreateSlideFrameGenerator(int width,int height,int frame_repeat_count)96 CreateSlideFrameGenerator(int width, int height, int frame_repeat_count) {
97   return std::make_unique<SlideGenerator>(width, height, frame_repeat_count);
98 }
99 
100 }  // namespace test
101 }  // namespace webrtc
102