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 
CreateFromIvfFileFrameGenerator(std::string filename)50 std::unique_ptr<FrameGeneratorInterface> CreateFromIvfFileFrameGenerator(
51     std::string filename) {
52   return std::make_unique<IvfVideoFrameGenerator>(std::move(filename));
53 }
54 
55 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)56 CreateScrollingInputFromYuvFilesFrameGenerator(
57     Clock* clock,
58     std::vector<std::string> filenames,
59     size_t source_width,
60     size_t source_height,
61     size_t target_width,
62     size_t target_height,
63     int64_t scroll_time_ms,
64     int64_t pause_time_ms) {
65   RTC_DCHECK(!filenames.empty());
66   std::vector<FILE*> files;
67   for (const std::string& filename : filenames) {
68     FILE* file = fopen(filename.c_str(), "rb");
69     RTC_DCHECK(file != nullptr);
70     files.push_back(file);
71   }
72 
73   return std::make_unique<ScrollingImageFrameGenerator>(
74       clock, files, source_width, source_height, target_width, target_height,
75       scroll_time_ms, pause_time_ms);
76 }
77 
78 std::unique_ptr<FrameGeneratorInterface>
CreateSlideFrameGenerator(int width,int height,int frame_repeat_count)79 CreateSlideFrameGenerator(int width, int height, int frame_repeat_count) {
80   return std::make_unique<SlideGenerator>(width, height, frame_repeat_count);
81 }
82 
83 }  // namespace test
84 }  // namespace webrtc
85