1 /*
2 * Copyright (C) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "gtest/gtest.h"
17 #include "filter/filter.h"
18 #include "video_sink.h"
19 #include "sink/media_synchronous_sink.h"
20 #include "media_sync_center_mock.h"
21
22 using namespace testing::ext;
23
24 namespace OHOS {
25 namespace Media {
26 namespace Test {
27 using namespace Pipeline;
28
29 class TestEventReceiver : public EventReceiver {
30 public:
TestEventReceiver()31 explicit TestEventReceiver()
32 {
33 }
34
OnEvent(const Event &event)35 void OnEvent(const Event &event)
36 {
37 (void)event;
38 }
39
40 private:
41 };
42
43 class TestVideoSink : public testing::Test {
44 public:
45 // SetUpTestCase: Called before all test cases
SetUpTestCase(void)46 static void SetUpTestCase(void) { }
47 // TearDownTestCase: Called after all test case
TearDownTestCase(void)48 static void TearDownTestCase(void) { }
49 // SetUp: Called before each test cases
SetUp(void)50 void SetUp(void)
51 {
52 videoSink_ = std::make_shared<VideoSink>();
53 ASSERT_TRUE(videoSink_ != nullptr);
54 }
55 // TearDown: Called after each test cases
TearDown(void)56 void TearDown(void)
57 {
58 videoSink_ = nullptr;
59 }
60 public:
61 std::shared_ptr<VideoSink> videoSink_ = nullptr;
62 };
63
HWTEST_F(TestVideoSink, do_sync_write_not_eos, TestSize.Level1)64 HWTEST_F(TestVideoSink, do_sync_write_not_eos, TestSize.Level1)
65 {
66 auto syncCenter = std::make_shared<MediaSyncManager>();
67 ASSERT_TRUE(syncCenter != nullptr);
68 videoSink_->SetSyncCenter(syncCenter);
69 std::shared_ptr<EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
70 ASSERT_TRUE(testEventReceiver != nullptr);
71 videoSink_->SetEventReceiver(testEventReceiver);
72 auto meta = std::make_shared<Meta>();
73 ASSERT_TRUE(meta != nullptr);
74 auto setParam = videoSink_->SetParameter(meta);
75 ASSERT_TRUE(setParam == Status::OK);
76 videoSink_->ResetSyncInfo();
77 videoSink_->SetLastPts(0);
78 videoSink_->SetFirstPts(HST_TIME_NONE);
79 videoSink_->SetSeekFlag();
80 uint64_t latency = 0;
81 auto getLatency = videoSink_->GetLatency(latency);
82 ASSERT_TRUE(getLatency == Status::OK);
83 AVBufferConfig config;
84 config.size = 4;
85 config.memoryType = MemoryType::SHARED_MEMORY;
86 const std::shared_ptr<AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
87 ASSERT_TRUE(buffer != nullptr);
88 buffer->flag_ = 0; // not eos
89 videoSink_->DoSyncWrite(buffer);
90 buffer->flag_ = BUFFER_FLAG_EOS;
91 videoSink_->DoSyncWrite(buffer);
92 buffer->pts_ = 1;
93 videoSink_->lastBufferTime_ = 1;
94 videoSink_->seekFlag_ = false;
95 (void)videoSink_->CheckBufferLatenessMayWait(buffer);
96 float speed = 0;
97 videoSink_->GetSpeed(speed);
98 }
99
HWTEST_F(TestVideoSink, do_sync_write_two_frames, TestSize.Level1)100 HWTEST_F(TestVideoSink, do_sync_write_two_frames, TestSize.Level1)
101 {
102 auto syncCenter = std::make_shared<MediaSyncManager>();
103 ASSERT_TRUE(syncCenter != nullptr);
104 videoSink_->SetSyncCenter(syncCenter);
105 std::shared_ptr<EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
106 ASSERT_TRUE(testEventReceiver != nullptr);
107 videoSink_->SetEventReceiver(testEventReceiver);
108 auto meta = std::make_shared<Meta>();
109 ASSERT_TRUE(meta != nullptr);
110 auto setParam = videoSink_->SetParameter(meta);
111 ASSERT_TRUE(setParam == Status::OK);
112 videoSink_->ResetSyncInfo();
113 videoSink_->SetLastPts(0);
114 videoSink_->SetFirstPts(HST_TIME_NONE);
115 videoSink_->SetSeekFlag();
116 AVBufferConfig config;
117 config.size = 4;
118 config.memoryType = MemoryType::SHARED_MEMORY;
119 const std::shared_ptr<AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
120 ASSERT_TRUE(buffer != nullptr);
121 buffer->flag_ = 0; // not eos
122 videoSink_->DoSyncWrite(buffer);
123 const std::shared_ptr<AVBuffer> buffer2 = AVBuffer::CreateAVBuffer(config);
124 ASSERT_TRUE(buffer2 != nullptr);
125 buffer->flag_ = 0; // not eos
126 videoSink_->DoSyncWrite(buffer2);
127 buffer->pts_ = 1;
128 videoSink_->lastBufferTime_ = 1;
129 videoSink_->seekFlag_ = false;
130 (void)videoSink_->CheckBufferLatenessMayWait(buffer);
131 float speed = 0;
132 videoSink_->GetSpeed(speed);
133 }
134
HWTEST_F(TestVideoSink, do_sync_write_eos, TestSize.Level1)135 HWTEST_F(TestVideoSink, do_sync_write_eos, TestSize.Level1)
136 {
137 auto syncCenter = std::make_shared<MediaSyncManager>();
138 ASSERT_TRUE(syncCenter != nullptr);
139 videoSink_->SetSyncCenter(syncCenter);
140 std::shared_ptr<EventReceiver> testEventReceiver = std::make_shared<TestEventReceiver>();
141 ASSERT_TRUE(testEventReceiver != nullptr);
142 videoSink_->SetEventReceiver(testEventReceiver);
143 auto meta = std::make_shared<Meta>();
144 ASSERT_TRUE(meta != nullptr);
145 auto setParam = videoSink_->SetParameter(meta);
146 ASSERT_TRUE(setParam == Status::OK);
147 videoSink_->ResetSyncInfo();
148 videoSink_->SetLastPts(0);
149 videoSink_->SetFirstPts(HST_TIME_NONE);
150 videoSink_->SetSeekFlag();
151 AVBufferConfig config;
152 config.size = 4;
153 config.memoryType = MemoryType::SHARED_MEMORY;
154 const std::shared_ptr<AVBuffer> buffer = AVBuffer::CreateAVBuffer(config);
155 ASSERT_TRUE(buffer != nullptr);
156 buffer->flag_ = 1; // eos
157 videoSink_->DoSyncWrite(buffer);
158 videoSink_->DoSyncWrite(buffer);
159 buffer->flag_ = BUFFER_FLAG_EOS;
160 videoSink_->DoSyncWrite(buffer);
161 buffer->pts_ = 1;
162 videoSink_->lastBufferTime_ = 1;
163 videoSink_->seekFlag_ = false;
164 (void)videoSink_->CheckBufferLatenessMayWait(buffer);
165 float speed = 0;
166 videoSink_->GetSpeed(speed);
167 }
168
HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_001, TestSize.Level1)169 HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_001, TestSize.Level1)
170 {
171 AVBufferConfig config;
172 config.size = 4;
173 config.memoryType = MemoryType::SHARED_MEMORY;
174 auto buffer = AVBuffer::CreateAVBuffer(config);
175 ASSERT_TRUE(buffer != nullptr);
176 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
177 videoSink_->SetSyncCenter(syncCenter);
178
179 syncCenter->returnInt64Queue_.push(Plugins::HST_TIME_NONE);
180 bool result = videoSink_->CheckBufferLatenessMayWait(buffer);
181 EXPECT_EQ(result, 0);
182 }
183
HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_002, TestSize.Level1)184 HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_002, TestSize.Level1)
185 {
186 AVBufferConfig config;
187 config.size = 4;
188 config.memoryType = MemoryType::SHARED_MEMORY;
189 auto buffer = AVBuffer::CreateAVBuffer(config);
190 ASSERT_TRUE(buffer != nullptr);
191 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
192 videoSink_->SetSyncCenter(syncCenter);
193
194 syncCenter->returnInt64Queue_.push(1000);
195 syncCenter->returnInt64Queue_.push(2000);
196 buffer->pts_ = 1500;
197 bool result = videoSink_->CheckBufferLatenessMayWait(buffer);
198 EXPECT_EQ(result, 0);
199 }
200
HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_003, TestSize.Level1)201 HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_003, TestSize.Level1)
202 {
203 AVBufferConfig config;
204 config.size = 4;
205 config.memoryType = MemoryType::SHARED_MEMORY;
206 auto buffer = AVBuffer::CreateAVBuffer(config);
207 ASSERT_TRUE(buffer != nullptr);
208 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
209 videoSink_->SetSyncCenter(syncCenter);
210
211 syncCenter->returnInt64Queue_.push(1000);
212 syncCenter->returnInt64Queue_.push(2000);
213 buffer->pts_ = 1500;
214 bool result = videoSink_->CheckBufferLatenessMayWait(buffer);
215 EXPECT_EQ(result, false);
216 }
217
HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_004, TestSize.Level1)218 HWTEST_F(TestVideoSink, CheckBufferLatenessMayWait_004, TestSize.Level1)
219 {
220 AVBufferConfig config;
221 config.size = 4;
222 config.memoryType = MemoryType::SHARED_MEMORY;
223 auto buffer = AVBuffer::CreateAVBuffer(config);
224 ASSERT_TRUE(buffer != nullptr);
225 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
226 videoSink_->SetSyncCenter(syncCenter);
227 videoSink_->lastBufferTime_ = 1000;
228 syncCenter->returnInt64Queue_.push(1000);
229 syncCenter->returnInt64Queue_.push(2000);
230 buffer->pts_ = 1500;
231 bool result = videoSink_->CheckBufferLatenessMayWait(buffer);
232 EXPECT_EQ(result, false);
233 }
234
235 // Scenario1: Test when firstPts_ is HST_TIME_NONE, SetFirstPts should set firstPts_ to pts.
HWTEST_F(TestVideoSink, SetFirstPts_ShouldSetFirstPts_WhenFirstPtsIsNone, TestSize.Level0)236 HWTEST_F(TestVideoSink, SetFirstPts_ShouldSetFirstPts_WhenFirstPtsIsNone, TestSize.Level0)
237 {
238 int64_t pts = 100;
239 videoSink_->SetFirstPts(pts);
240 EXPECT_EQ(videoSink_->firstPts_, pts);
241 }
242
243 // Scenario2: Test when firstPts_ is not HST_TIME_NONE, SetFirstPts should not change firstPts_.
HWTEST_F(TestVideoSink, SetFirstPts_ShouldNotChangeFirstPts_WhenFirstPtsIsNotNone, TestSize.Level0)244 HWTEST_F(TestVideoSink, SetFirstPts_ShouldNotChangeFirstPts_WhenFirstPtsIsNotNone, TestSize.Level0)
245 {
246 int64_t pts = 100;
247 videoSink_->firstPts_ = 200;
248 videoSink_->SetFirstPts(pts);
249 EXPECT_EQ(videoSink_->firstPts_, 200);
250 }
251
252 // Scenario1: Test when speed is 0.0f then GetSpeed returns 1.0f.
HWTEST_F(TestVideoSink, GetSpeed_ShouldReturn1_WhenSpeedIs0, TestSize.Level0)253 HWTEST_F(TestVideoSink, GetSpeed_ShouldReturn1_WhenSpeedIs0, TestSize.Level0)
254 {
255 float speed = 0.0f;
256 float result = videoSink_->GetSpeed(speed);
257 ASSERT_EQ(result, 1.0f);
258 }
259
260 // Scenario2: Test when speed is not 0.0f then GetSpeed returns the same speed.
HWTEST_F(TestVideoSink, GetSpeed_ShouldReturnSameSpeed_WhenSpeedIsNot0, TestSize.Level0)261 HWTEST_F(TestVideoSink, GetSpeed_ShouldReturnSameSpeed_WhenSpeedIsNot0, TestSize.Level0)
262 {
263 float speed = 0.5f;
264 float result = videoSink_->GetSpeed(speed);
265 ASSERT_EQ(result, speed);
266 }
267
HWTEST_F(TestVideoSink, SetLastPts_001, TestSize.Level0)268 HWTEST_F(TestVideoSink, SetLastPts_001, TestSize.Level0)
269 {
270 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
271 videoSink_->SetSyncCenter(syncCenter);
272 syncCenter->returnInt64Queue_.push(987654321);
273 int64_t lastPts = 123456789;
274 videoSink_->SetLastPts(lastPts);
275 EXPECT_EQ(videoSink_->lastPts_, lastPts);
276 }
277
HWTEST_F(TestVideoSink, SetLastPts_002, TestSize.Level0)278 HWTEST_F(TestVideoSink, SetLastPts_002, TestSize.Level0)
279 {
280 auto syncCenter = std::make_shared<MockMediaSyncCenter>();
281 videoSink_->SetSyncCenter(nullptr);
282 int64_t lastPts = 123456789;
283 videoSink_->SetLastPts(lastPts);
284 EXPECT_EQ(videoSink_->lastPts_, lastPts);
285 }
286 } // namespace Test
287 } // namespace Media
288 } // namespace OHOS