• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "player_mock.h"
17 #include <fcntl.h>
18 #include <sys/stat.h>
19 #include "media_errors.h"
20 #include "transaction/rs_transaction.h"
21 #include "ui/rs_surface_node.h"
22 #include "window_option.h"
23 
24 using namespace OHOS::Media::PlayerTestParam;
25 
26 namespace OHOS {
27 namespace Media {
SetState(PlayerStates state)28 void PlayerCallbackTest::SetState(PlayerStates state)
29 {
30     state_ = state;
31 }
32 
SetSeekDoneFlag(bool seekDoneFlag)33 void PlayerCallbackTest::SetSeekDoneFlag(bool seekDoneFlag)
34 {
35     seekDoneFlag_ = seekDoneFlag;
36 }
37 
SetSpeedDoneFlag(bool speedDoneFlag)38 void PlayerCallbackTest::SetSpeedDoneFlag(bool speedDoneFlag)
39 {
40     speedDoneFlag_ = speedDoneFlag;
41 }
42 
SetSeekPosition(int32_t seekPosition)43 void PlayerCallbackTest::SetSeekPosition(int32_t seekPosition)
44 {
45     seekPosition_ = seekPosition;
46 }
47 
SetTrackDoneFlag(bool trackDoneFlag)48 void PlayerCallbackTest::SetTrackDoneFlag(bool trackDoneFlag)
49 {
50     std::unique_lock<std::mutex> lockSpeed(mutexCond_);
51     trackDoneFlag_ = trackDoneFlag;
52     trackChange_ = trackDoneFlag;
53 }
54 
PrepareSync()55 int32_t PlayerCallbackTest::PrepareSync()
56 {
57     if (state_ != PLAYER_PREPARED) {
58         std::unique_lock<std::mutex> lockPrepare(mutexCond_);
59         condVarPrepare_.wait_for(lockPrepare, std::chrono::seconds(waitsecond));
60         if (state_ != PLAYER_PREPARED) {
61             return -1;
62         }
63     }
64     return MSERR_OK;
65 }
66 
PlaySync()67 int32_t PlayerCallbackTest::PlaySync()
68 {
69     if (state_ != PLAYER_STARTED) {
70         std::unique_lock<std::mutex> lockPlay(mutexCond_);
71         condVarPlay_.wait_for(lockPlay, std::chrono::seconds(waitsecond));
72         if (state_ != PLAYER_STARTED && state_ != PLAYER_PLAYBACK_COMPLETE) {
73             return -1;
74         }
75     }
76     return MSERR_OK;
77 }
78 
PauseSync()79 int32_t PlayerCallbackTest::PauseSync()
80 {
81     if (state_ != PLAYER_PAUSED) {
82         std::unique_lock<std::mutex> lockPause(mutexCond_);
83         condVarPause_.wait_for(lockPause, std::chrono::seconds(waitsecond));
84         if (state_ != PLAYER_PAUSED) {
85             return -1;
86         }
87     }
88     return MSERR_OK;
89 }
90 
StopSync()91 int32_t PlayerCallbackTest::StopSync()
92 {
93     if (state_ != PLAYER_STOPPED) {
94         std::unique_lock<std::mutex> lockStop(mutexCond_);
95         condVarStop_.wait_for(lockStop, std::chrono::seconds(waitsecond));
96         if (state_ != PLAYER_STOPPED) {
97             return -1;
98         }
99     }
100     return MSERR_OK;
101 }
102 
ResetSync()103 int32_t PlayerCallbackTest::ResetSync()
104 {
105     if (state_ != PLAYER_IDLE) {
106         std::unique_lock<std::mutex> lockReset(mutexCond_);
107         condVarReset_.wait_for(lockReset, std::chrono::seconds(waitsecond));
108         if (state_ != PLAYER_IDLE) {
109             return -1;
110         }
111     }
112     return MSERR_OK;
113 }
114 
SeekSync()115 int32_t PlayerCallbackTest::SeekSync()
116 {
117     if (seekDoneFlag_ == false) {
118         std::unique_lock<std::mutex> lockSeek(mutexCond_);
119         condVarSeek_.wait_for(lockSeek, std::chrono::seconds(waitsecond));
120         if (seekDoneFlag_ == false) {
121             return -1;
122         }
123     }
124     return MSERR_OK;
125 }
126 
SpeedSync()127 int32_t PlayerCallbackTest::SpeedSync()
128 {
129     if (speedDoneFlag_ == false) {
130         std::unique_lock<std::mutex> lockSpeed(mutexCond_);
131         condVarSpeed_.wait_for(lockSpeed, std::chrono::seconds(waitsecond));
132         if (speedDoneFlag_ == false) {
133             return -1;
134         }
135     }
136     return MSERR_OK;
137 }
138 
TrackSync(bool & trackChange)139 int32_t PlayerCallbackTest::TrackSync(bool &trackChange)
140 {
141     if (trackDoneFlag_ == false) {
142         std::unique_lock<std::mutex> lockTrackDone(mutexCond_);
143         condVarTrackDone_.wait_for(lockTrackDone, std::chrono::seconds(waitsecond));
144         if (trackDoneFlag_ == false) {
145             return -1;
146         }
147     }
148 
149     trackChange = trackChange_;
150 
151     return MSERR_OK;
152 }
153 
TrackInfoUpdateSync()154 int32_t PlayerCallbackTest::TrackInfoUpdateSync()
155 {
156     if (trackInfoUpdate_ == false) {
157         std::unique_lock<std::mutex> lock(mutexCond_);
158         condVarTrackInfoUpdate_.wait_for(lock, std::chrono::seconds(waitsecond), [this]() {
159             return trackInfoUpdate_;
160         });
161         if (trackInfoUpdate_ == false) {
162             return -1;
163         }
164     }
165     trackInfoUpdate_ = false;
166     return MSERR_OK;
167 }
168 
HandleTrackChangeCallback(int32_t extra,const Format & infoBody)169 void PlayerCallbackTest::HandleTrackChangeCallback(int32_t extra, const Format &infoBody)
170 {
171     (void)extra;
172     trackChange_ = true;
173     trackDoneFlag_ = true;
174     int32_t index;
175     int32_t isSelect;
176     infoBody.GetIntValue(std::string(PlayerKeys::PLAYER_TRACK_INDEX), index);
177     infoBody.GetIntValue(std::string(PlayerKeys::PLAYER_IS_SELECT), isSelect);
178     std::cout << "INFO_TYPE_TRACKCHANGE: index " << index << " isSelect " << isSelect << std::endl;
179     condVarTrackDone_.notify_all();
180 }
181 
HandleSubtitleCallback(int32_t extra,const Format & infoBody)182 void PlayerCallbackTest::HandleSubtitleCallback(int32_t extra, const Format &infoBody)
183 {
184     (void)extra;
185     infoBody.GetStringValue(std::string(PlayerKeys::SUBTITLE_TEXT), text_);
186     std::cout << "text = " << text_ << std::endl;
187     textUpdate_ = true;
188     condVarText_.notify_all();
189 }
190 
HandleTrackInfoCallback(int32_t extra,const Format & infoBody)191 void PlayerCallbackTest::HandleTrackInfoCallback(int32_t extra, const Format &infoBody)
192 {
193     (void)extra;
194     std::cout << "track info update" << std::endl;
195     trackInfoUpdate_ = true;
196     condVarTrackInfoUpdate_.notify_all();
197 }
198 
OnInfo(PlayerOnInfoType type,int32_t extra,const Format & infoBody)199 void PlayerCallbackTest::OnInfo(PlayerOnInfoType type, int32_t extra, const Format &infoBody)
200 {
201     switch (type) {
202         case INFO_TYPE_SEEKDONE:
203             SetSeekDoneFlag(true);
204             SeekNotify(extra, infoBody);
205             break;
206         case INFO_TYPE_STATE_CHANGE:
207             state_ = static_cast<PlayerStates>(extra);
208             SetState(state_);
209             Notify(state_);
210             break;
211         case INFO_TYPE_SPEEDDONE:
212             SetSpeedDoneFlag(true);
213             condVarSpeed_.notify_all();
214             break;
215         case INFO_TYPE_POSITION_UPDATE:
216             std::cout << "cur position is " << static_cast<uint64_t>(extra) << std::endl;
217             break;
218         case INFO_TYPE_BITRATE_COLLECT:
219             std::cout << "INFO_TYPE_BITRATE_COLLECT: " << extra << std::endl;
220             break;
221         case INFO_TYPE_INTERRUPT_EVENT:
222             std::cout << "INFO_TYPE_INTERRUPT_EVENT: " << extra << std::endl;
223             break;
224         case INFO_TYPE_RESOLUTION_CHANGE:
225             std::cout << "INFO_TYPE_RESOLUTION_CHANGE: " << extra << std::endl;
226             break;
227         case INFO_TYPE_TRACKCHANGE:
228             HandleTrackChangeCallback(extra, infoBody);
229             break;
230         case INFO_TYPE_SUBTITLE_UPDATE: {
231             HandleSubtitleCallback(extra, infoBody);
232             break;
233         }
234         case INFO_TYPE_TRACK_INFO_UPDATE: {
235             HandleTrackInfoCallback(extra, infoBody);
236             break;
237         }
238         case INFO_TYPE_AUDIO_DEVICE_CHANGE: {
239             std::cout << "device change reason is " << extra;
240             break;
241         }
242         default:
243             break;
244     }
245 }
246 
SubtitleTextUpdate(std::string text)247 std::string PlayerCallbackTest::SubtitleTextUpdate(std::string text)
248 {
249     std::unique_lock<std::mutex> lock(subtitleMutex_);
250     std::cout << "wait for text update" <<std::endl;
251     condVarText_.wait_for(lock, std::chrono::seconds(waitsecond), [&, this]() {
252         if (text_ != text) {
253             return textUpdate_ = false;
254         }
255         return textUpdate_;
256     });
257     std::cout << "text updated" <<std::endl;
258     textUpdate_ = false;
259     return text_;
260 }
261 
GetState()262 PlayerStates PlayerCallbackTest::GetState()
263 {
264     return state_;
265 }
266 
OnError(int32_t errorCode,const std::string & errorMsg)267 void PlayerCallbackTest::OnError(int32_t errorCode, const std::string &errorMsg)
268 {
269     if (!trackDoneFlag_) {
270         trackDoneFlag_ = true;
271         condVarTrackDone_.notify_all();
272     }
273     std::cout << "Error received, errorCode: " << errorCode << " errorMsg: " << errorMsg << std::endl;
274 }
275 
Notify(PlayerStates currentState)276 void PlayerCallbackTest::Notify(PlayerStates currentState)
277 {
278     if (currentState == PLAYER_PREPARED) {
279         condVarPrepare_.notify_all();
280     } else if (currentState == PLAYER_STARTED) {
281         condVarPlay_.notify_all();
282     } else if (currentState == PLAYER_PAUSED) {
283         condVarPause_.notify_all();
284     } else if (currentState == PLAYER_STOPPED) {
285         condVarStop_.notify_all();
286     } else if (currentState == PLAYER_IDLE) {
287         condVarReset_.notify_all();
288     }
289 }
290 
SeekNotify(int32_t extra,const Format & infoBody)291 void PlayerCallbackTest::SeekNotify(int32_t extra, const Format &infoBody)
292 {
293     if (seekMode_ == PlayerSeekMode::SEEK_CLOSEST) {
294         if (seekPosition_ == extra) {
295             condVarSeek_.notify_all();
296         }
297     } else if (seekMode_ == PlayerSeekMode::SEEK_PREVIOUS_SYNC) {
298         if (seekPosition_ - extra < DELTA_TIME && extra - seekPosition_ >= 0) {
299             condVarSeek_.notify_all();
300         }
301     } else if (seekMode_ == PlayerSeekMode::SEEK_NEXT_SYNC) {
302         if (extra - seekPosition_ < DELTA_TIME && seekPosition_ - extra >= 0) {
303             condVarSeek_.notify_all();
304         }
305     } else if (abs(seekPosition_ - extra) <= DELTA_TIME) {
306         condVarSeek_.notify_all();
307     } else {
308         SetSeekDoneFlag(false);
309     }
310 }
311 
GetVideoSurface()312 sptr<Surface> PlayerMock::GetVideoSurface()
313 {
314     sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
315     option->SetWindowRect({ 0, 0, width_, height_ });
316     option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_TOAST);
317     option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
318     previewWindow_ = Rosen::Window::Create("xcomponent_window", option);
319     if (previewWindow_ == nullptr || previewWindow_->GetSurfaceNode() == nullptr) {
320         return nullptr;
321     }
322 
323     previewWindow_->Show();
324     auto surfaceNode = previewWindow_->GetSurfaceNode();
325     surfaceNode->SetFrameGravity(Rosen::Gravity::RESIZE);
326     Rosen::RSTransaction::FlushImplicitTransaction();
327     return surfaceNode->GetSurface();
328 }
329 
PlayerMock(std::shared_ptr<PlayerCallbackTest> & callback)330 PlayerMock::PlayerMock(std::shared_ptr<PlayerCallbackTest> &callback)
331 {
332     callback_ = callback;
333 }
334 
~PlayerMock()335 PlayerMock::~PlayerMock()
336 {
337     if (previewWindow_ != nullptr) {
338         previewWindow_->Destroy();
339         previewWindow_ = nullptr;
340     }
341 
342     if (previewWindowNext_ != nullptr) {
343         previewWindowNext_->Destroy();
344         previewWindowNext_ = nullptr;
345     }
346 }
347 
CreatePlayer()348 bool PlayerMock::CreatePlayer()
349 {
350     player_ = PlayerFactory::CreatePlayer();
351     return player_ != nullptr;
352 }
353 
SetMediaSource(const std::shared_ptr<AVMediaSource> & mediaSource,AVPlayStrategy strategy)354 int32_t PlayerMock::SetMediaSource(const std::shared_ptr<AVMediaSource> &mediaSource, AVPlayStrategy strategy)
355 {
356     std::unique_lock<std::mutex> lock(mutex_);
357     return player_->SetMediaSource(mediaSource, strategy);
358 }
359 
SetSource(const std::string url)360 int32_t PlayerMock::SetSource(const std::string url)
361 {
362     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
363     std::unique_lock<std::mutex> lock(mutex_);
364     int32_t ret = player_->SetSource(url);
365     return ret;
366 }
367 
SetSource(int32_t fd,int64_t offset,int64_t size)368 int32_t PlayerMock::SetSource(int32_t fd, int64_t offset, int64_t size)
369 {
370     std::unique_lock<std::mutex> lock(mutex_);
371     return player_->SetSource(fd, offset, size);
372 }
373 
SetSource(const std::string & path,int64_t offset,int64_t size)374 int32_t PlayerMock::SetSource(const std::string &path, int64_t offset, int64_t size)
375 {
376     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
377     std::string rawFile = path.substr(strlen("file://"));
378     int32_t fd = open(rawFile.c_str(), O_RDONLY);
379     if (fd <= 0) {
380         std::cout << "Open file failed" << std::endl;
381         return -1;
382     }
383 
384     struct stat64 st;
385     if (fstat64(fd, &st) != 0) {
386         std::cout << "Get file state failed" << std::endl;
387         (void)close(fd);
388         return -1;
389     }
390     int64_t length = static_cast<int64_t>(st.st_size);
391     if (size > 0) {
392         length = size;
393     }
394     int32_t ret = player_->SetSource(fd, offset, length);
395     if (ret != 0) {
396         (void)close(fd);
397         return -1;
398     }
399 
400     (void)close(fd);
401     return ret;
402 }
403 
SetDataSrc(const std::string & path,int32_t size,bool seekable)404 int32_t PlayerMock::SetDataSrc(const std::string &path, int32_t size, bool seekable)
405 {
406     if (seekable) {
407         dataSrc_ = MediaDataSourceTestSeekable::Create(path, size);
408     } else {
409         dataSrc_ = MediaDataSourceTestNoSeek::Create(path, size);
410     }
411     return player_->SetSource(dataSrc_);
412 }
413 
Prepare()414 int32_t PlayerMock::Prepare()
415 {
416     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
417     std::unique_lock<std::mutex> lock(mutex_);
418     int32_t ret = player_->Prepare();
419     if (ret == MSERR_OK) {
420         return callback_->PrepareSync();
421     }
422     return ret;
423 }
424 
PrepareAsync()425 int32_t PlayerMock::PrepareAsync()
426 {
427     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
428     std::unique_lock<std::mutex> lock(mutex_);
429     int ret = player_->PrepareAsync();
430     if (ret == MSERR_OK) {
431         return callback_->PrepareSync();
432     }
433     return ret;
434 }
435 
Play()436 int32_t PlayerMock::Play()
437 {
438     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
439     std::unique_lock<std::mutex> lock(mutex_);
440     int32_t ret = player_->Play();
441     if (ret == MSERR_OK) {
442         return callback_->PlaySync();
443     }
444     return ret;
445 }
446 
Pause()447 int32_t PlayerMock::Pause()
448 {
449     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
450     std::unique_lock<std::mutex> lock(mutex_);
451     int32_t ret = player_->Pause();
452     if (ret == MSERR_OK) {
453         return callback_->PauseSync();
454     }
455     return ret;
456 }
457 
Stop()458 int32_t PlayerMock::Stop()
459 {
460     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
461     std::unique_lock<std::mutex> lock(mutex_);
462     int32_t ret = player_->Stop();
463     if (ret == MSERR_OK) {
464         if (dataSrc_ != nullptr) {
465             dataSrc_->Reset();
466         }
467         return callback_->StopSync();
468     }
469     return ret;
470 }
471 
SeekPrepare(int32_t & mseconds,PlayerSeekMode & mode)472 void PlayerMock::SeekPrepare(int32_t &mseconds, PlayerSeekMode &mode)
473 {
474     UNITTEST_CHECK_AND_RETURN_LOG(player_ != nullptr && callback_ != nullptr, "player or callback is nullptr");
475     int32_t duration = 0;
476     int32_t seekPosition = 0;
477     callback_->SetSeekDoneFlag(false);
478     player_->GetDuration(duration);
479     if (mseconds < 0) {
480         seekPosition = 0;
481     } else if (mseconds > duration) {
482         seekPosition = duration;
483     } else {
484         seekPosition = mseconds;
485     }
486     callback_->SetSeekPosition(seekPosition);
487 }
488 
Seek(int32_t mseconds,PlayerSeekMode mode)489 int32_t PlayerMock::Seek(int32_t mseconds, PlayerSeekMode mode)
490 {
491     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
492     std::unique_lock<std::mutex> lock(mutex_);
493     SeekPrepare(mseconds, mode);
494     int32_t ret = player_->Seek(mseconds, mode);
495     if (ret == MSERR_OK) {
496         return callback_->SeekSync();
497     }
498     return ret;
499 }
500 
Reset()501 int32_t PlayerMock::Reset()
502 {
503     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
504     int32_t ret = player_->Reset();
505     if (ret == MSERR_OK) {
506         return callback_->ResetSync();
507     }
508     return ret;
509 }
510 
Release()511 int32_t PlayerMock::Release()
512 {
513     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
514     if (previewWindow_ != nullptr) {
515         previewWindow_->Destroy();
516         previewWindow_ = nullptr;
517     }
518     callback_ = nullptr;
519     return player_->Release();
520 }
521 
ReleaseSync()522 int32_t PlayerMock::ReleaseSync()
523 {
524     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
525     if (previewWindow_ != nullptr) {
526         previewWindow_->Destroy();
527         previewWindow_ = nullptr;
528     }
529     callback_ = nullptr;
530     return player_->ReleaseSync();
531 }
532 
SetVolume(float leftVolume,float rightVolume)533 int32_t PlayerMock::SetVolume(float leftVolume, float rightVolume)
534 {
535     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
536     std::unique_lock<std::mutex> lock(mutex_);
537     return player_->SetVolume(leftVolume, rightVolume);
538 }
539 
SetLooping(bool loop)540 int32_t PlayerMock::SetLooping(bool loop)
541 {
542     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
543     std::unique_lock<std::mutex> lock(mutex_);
544     return player_->SetLooping(loop);
545 }
546 
GetCurrentTime(int32_t & currentTime)547 int32_t PlayerMock::GetCurrentTime(int32_t &currentTime)
548 {
549     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
550     std::unique_lock<std::mutex> lock(mutex_);
551     return player_->GetCurrentTime(currentTime);
552 }
553 
GetVideoTrackInfo(std::vector<Format> & videoTrack)554 int32_t PlayerMock::GetVideoTrackInfo(std::vector<Format> &videoTrack)
555 {
556     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
557     return player_->GetVideoTrackInfo(videoTrack);
558 }
559 
GetPlaybackInfo(Format & playbackInfo)560 int32_t PlayerMock::GetPlaybackInfo(Format &playbackInfo)
561 {
562     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
563     return player_->GetPlaybackInfo(playbackInfo);
564 }
565 
GetAudioTrackInfo(std::vector<Format> & audioTrack)566 int32_t PlayerMock::GetAudioTrackInfo(std::vector<Format> &audioTrack)
567 {
568     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
569     return player_->GetAudioTrackInfo(audioTrack);
570 }
571 
GetVideoWidth()572 int32_t PlayerMock::GetVideoWidth()
573 {
574     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
575     return player_->GetVideoWidth();
576 }
577 
GetVideoHeight()578 int32_t PlayerMock::GetVideoHeight()
579 {
580     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
581     return player_->GetVideoHeight();
582 }
583 
GetDuration(int32_t & duration)584 int32_t PlayerMock::GetDuration(int32_t &duration)
585 {
586     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
587     return player_->GetDuration(duration);
588 }
589 
SetPlaybackSpeed(PlaybackRateMode mode)590 int32_t PlayerMock::SetPlaybackSpeed(PlaybackRateMode mode)
591 {
592     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
593     callback_->SetSpeedDoneFlag(false);
594     int32_t ret = player_->SetPlaybackSpeed(mode);
595     if (ret == MSERR_OK) {
596         return callback_->SpeedSync();
597     }
598     return player_->SetPlaybackSpeed(mode);
599 }
600 
GetPlaybackSpeed(PlaybackRateMode & mode)601 int32_t PlayerMock::GetPlaybackSpeed(PlaybackRateMode &mode)
602 {
603     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
604     return player_->GetPlaybackSpeed(mode);
605 }
606 
SelectBitRate(uint32_t bitRate)607 int32_t PlayerMock::SelectBitRate(uint32_t bitRate)
608 {
609     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
610     return player_->SelectBitRate(bitRate);
611 }
612 
IsPlaying()613 bool PlayerMock::IsPlaying()
614 {
615     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
616     std::unique_lock<std::mutex> lock(mutex_);
617     return player_->IsPlaying();
618 }
619 
IsLooping()620 bool PlayerMock::IsLooping()
621 {
622     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
623     std::unique_lock<std::mutex> lock(mutex_);
624     return player_->IsLooping();
625 }
626 
SetVolumeMode(int32_t mode)627 int32_t PlayerMock::SetVolumeMode(int32_t mode)
628 {
629     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
630     return player_->SetVolumeMode(mode);
631 }
632 
SetParameter(const Format & param)633 int32_t PlayerMock::SetParameter(const Format &param)
634 {
635     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
636     return player_->SetParameter(param);
637 }
638 
SetPlayerCallback(const std::shared_ptr<PlayerCallback> & callback)639 int32_t PlayerMock::SetPlayerCallback(const std::shared_ptr<PlayerCallback> &callback)
640 {
641     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
642     std::unique_lock<std::mutex> lock(mutex_);
643     return player_->SetPlayerCallback(callback);
644 }
645 
SetVideoSurface(sptr<Surface> surface)646 int32_t PlayerMock::SetVideoSurface(sptr<Surface> surface)
647 {
648     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
649     std::unique_lock<std::mutex> lock(mutex_);
650     return player_->SetVideoSurface(surface);
651 }
652 
SelectTrack(int32_t index,bool & trackChange)653 int32_t PlayerMock::SelectTrack(int32_t index, bool &trackChange)
654 {
655     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
656     std::unique_lock<std::mutex> lock(mutex_);
657     callback_->SetTrackDoneFlag(false);
658     int32_t ret = player_->SelectTrack(index, PlayerSwitchMode::SWITCH_SMOOTH);
659     if (callback_->TrackSync(trackChange) != MSERR_OK) {
660         return -1;
661     }
662     return ret;
663 }
664 
DeselectTrack(int32_t index,bool & trackChange)665 int32_t PlayerMock::DeselectTrack(int32_t index, bool &trackChange)
666 {
667     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
668     std::unique_lock<std::mutex> lock(mutex_);
669     callback_->SetTrackDoneFlag(false);
670     int32_t ret = player_->DeselectTrack(index);
671     if (callback_->TrackSync(trackChange) != MSERR_OK) {
672         return -1;
673     }
674     return ret;
675 }
676 
GetCurrentTrack(int32_t trackType,int32_t & index)677 int32_t PlayerMock::GetCurrentTrack(int32_t trackType, int32_t &index)
678 {
679     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
680     std::unique_lock<std::mutex> lock(mutex_);
681     return player_->GetCurrentTrack(trackType, index);
682 }
683 
AddSubSource(const std::string & url)684 int32_t PlayerMock::AddSubSource(const std::string &url)
685 {
686     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
687     (void)player_->AddSubSource(url);
688     std::cout << "wait for track info callback" << std::endl;
689     return callback_->TrackInfoUpdateSync();
690 }
691 
AddSubSource(const std::string & path,int64_t offset,int64_t size)692 int32_t PlayerMock::AddSubSource(const std::string &path, int64_t offset, int64_t size)
693 {
694     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr && callback_ != nullptr, -1, "player or callback is nullptr");
695     std::string rawFile = path.substr(strlen("file://"));
696     int32_t fileDescriptor = open(rawFile.c_str(), O_RDONLY);
697     if (fileDescriptor <= 0) {
698         std::cout << "Open file failed." << std::endl;
699         return -1;
700     }
701 
702     struct stat64 st;
703     if (fstat64(fileDescriptor, &st) != 0) {
704         std::cout << "Get file state failed" << std::endl;
705         (void)close(fileDescriptor);
706         return -1;
707     }
708     int64_t stLen = static_cast<int64_t>(st.st_size);
709     if (size > 0) {
710         stLen = size;
711     }
712     int32_t ret = player_->AddSubSource(fileDescriptor, offset, stLen);
713     if (ret != 0) {
714         (void)close(fileDescriptor);
715         return -1;
716     }
717     (void)close(fileDescriptor);
718     std::cout << "wait for track info callback" << std::endl;
719     return callback_->TrackInfoUpdateSync();
720 }
721 
GetSubtitleText(std::string text)722 std::string PlayerMock::GetSubtitleText(std::string text)
723 {
724     return callback_->SubtitleTextUpdate(text);
725 }
726 
GetVideoSurfaceNext()727 sptr<Surface> PlayerMock::GetVideoSurfaceNext()
728 {
729     sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
730     option->SetWindowRect({ 0, 0, nextSurfaceWidth_, nextSurfaceHeight_ });
731     option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_TOAST);
732     option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
733     previewWindowNext_ = Rosen::Window::Create("xcomponent_window_next", option);
734     if (previewWindowNext_ == nullptr || previewWindowNext_->GetSurfaceNode() == nullptr) {
735         return nullptr;
736     }
737 
738     previewWindowNext_->Show();
739     auto surfaceNode = previewWindowNext_->GetSurfaceNode();
740     surfaceNode->SetFrameGravity(Rosen::Gravity::RESIZE);
741     Rosen::RSTransaction::FlushImplicitTransaction();
742     return surfaceNode->GetSurface();
743 }
744 
GetState()745 PlayerStates PlayerMock::GetState()
746 {
747     return callback_->GetState();
748 }
749 
SetPlayRange(int64_t start,int64_t end)750 int32_t PlayerMock::SetPlayRange(int64_t start, int64_t end)
751 {
752     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
753     std::unique_lock<std::mutex> lock(mutex_);
754     return player_->SetPlayRange(start, end);
755 }
756 
SeekContinuous(int32_t mseconds)757 int32_t PlayerMock::SeekContinuous(int32_t mseconds)
758 {
759     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
760     std::unique_lock<std::mutex> lock(mutex_);
761     return player_->Seek(mseconds, PlayerSeekMode::SEEK_CONTINOUS);
762 }
763 
SetMaxAmplitudeCbStatus(bool status)764 int32_t PlayerMock::SetMaxAmplitudeCbStatus(bool status)
765 {
766     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
767     return player_->SetMaxAmplitudeCbStatus(status);
768 }
769 
SetPlaybackStrategy(AVPlayStrategy strategy)770 int32_t PlayerMock::SetPlaybackStrategy(AVPlayStrategy strategy)
771 {
772     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
773     std::unique_lock<std::mutex> lock(mutex_);
774     return player_->SetPlaybackStrategy(strategy);
775 }
776 
SetMediaMuted(OHOS::Media::MediaType mediaType,bool isMuted)777 int32_t PlayerMock::SetMediaMuted(OHOS::Media::MediaType mediaType, bool isMuted)
778 {
779     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
780     std::unique_lock<std::mutex> lock(mutex_);
781     return player_->SetMediaMuted(mediaType, isMuted);
782 }
783 
SetDeviceChangeCbStatus(bool status)784 int32_t PlayerMock::SetDeviceChangeCbStatus(bool status)
785 {
786     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
787     return player_->SetDeviceChangeCbStatus(status);
788 }
789 
SetSuperResolution(bool enabled)790 int32_t PlayerMock::SetSuperResolution(bool enabled)
791 {
792     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
793     return player_->SetSuperResolution(enabled);
794 }
795 
SetVideoWindowSize(int32_t width,int32_t height)796 int32_t PlayerMock::SetVideoWindowSize(int32_t width, int32_t height)
797 {
798     UNITTEST_CHECK_AND_RETURN_RET_LOG(player_ != nullptr, -1, "player_ == nullptr");
799     return player_->SetVideoWindowSize(width, height);
800 }
801 } // namespace Media
802 } // namespace OHOS
803