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