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 ¤tTime)
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 ¶m)
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