1 /*
2 * Copyright (c) 2021 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 "core/components/video/resource/player.h"
17
18 namespace OHOS::Ace {
19
20 const char PLAYER_PARAM_WIDTH[] = "width";
21 const char PLAYER_PARAM_HEIGHT[] = "height";
22 const char PLAYER_PARAM_DURATION[] = "duration";
23 const char PLAYER_PARAM_CURRENTPOS[] = "currentpos";
24 const char PLAYER_PARAM_ISPLAYING[] = "isplaying";
25 const char PLAYER_PARAM_SRC[] = "src";
26 const char PLAYER_PARAM_ISAUTOPLAY[] = "autoplay";
27 const char PLAYER_PARAM_ISMUTE[] = "mute";
28 const char PLAYER_PARAM_TEXTURE[] = "texture";
29 const char PLAYER_PARAM_NEEDFRESHFORCE[] = "needRefreshForce";
30 const char PLAYER_PARAM_LOOP[] = "loop";
31 const char PLAYER_PARAM_SEEKMODE[] = "seekMode";
32 const char PLAYER_PARAM_ISTEXTURE[] = "isTexture";
33
34 const char PLAYER_METHOD_INIT[] = "init";
35 const char PLAYER_METHOD_GETPOSITION[] = "getposition";
36 const char PLAYER_METHOD_START[] = "start";
37 const char PLAYER_METHOD_PAUSE[] = "pause";
38 const char PLAYER_METHOD_SEEKTO[] = "seekto";
39 const char PLAYER_METHOD_STOP[] = "stop";
40 const char PLAYER_METHOD_SETVOLUME[] = "setvolume";
41 const char PLAYER_METHOD_FULLSCREEN[] = "fullscreen";
42 const char PLAYER_METHOD_ENABLE_LOOPING[] = "enablelooping";
43 const char PLAYER_METHOD_SETSPEED[] = "setspeed";
44 const char PLAYER_METHOD_SETDIRECTION[] = "setdirection";
45 const char PLAYER_METHOD_SETLANDSCAPE[] = "setlandscape";
46 const char PLAYER_METHOD_SETSURFACE[] = "setsurface";
47 const char PLAYER_METHOD_UPDATERESOURCE[] = "updateresource";
48
49 const char PLAYER_EVENT_PREPARED[] = "prepared";
50 const char PLAYER_EVENT_COMPLETION[] = "completion";
51 const char PLAYER_EVENT_SEEKCOMPLETE[] = "seekcomplete";
52 const char PLAYER_EVENT_ONPLAYSTATUS[] = "onplaystatus";
53 const char PLAYER_EVENT_ONGETCURRENTTIME[] = "ongetcurrenttime";
54
55 const char PLAYER_ERROR_CODE_CREATEFAIL[] = "error_video_000001";
56 const char PLAYER_ERROR_MSG_CREATEFAIL[] = "Create player failed.";
57 const char PLAYER_ERROR_CODE_FILEINVALID[] = "error_video_000002";
58 const char PLAYER_ERROR_MSG_FILEINVALID[] = "File invalid.";
59 const int32_t DURATION_THOUSAND = 1000;
60
Create(const std::function<void (int64_t)> & onCreate)61 void Player::Create(const std::function<void(int64_t)>& onCreate)
62 {
63 scheduler_ = SchedulerBuilder::Build(
64 [weak = WeakClaim(this)](uint64_t timestamp) {
65 auto player = weak.Upgrade();
66 if (player) {
67 player->OnTick(timestamp);
68 }
69 },
70 context_);
71 auto context = context_.Upgrade();
72 if (!context) {
73 LOGE("fail to get context to create player");
74 return;
75 }
76
77 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
78
79 platformTaskExecutor.PostTask([weak = WeakClaim(this), onCreate] {
80 auto player = weak.Upgrade();
81 if (player) {
82 player->CreatePlayer(onCreate);
83 }
84 }, "ArkUIVideoCreatePlayer");
85 }
86
CreatePlayer(const std::function<void (int64_t)> & onCreate)87 void Player::CreatePlayer(const std::function<void(int64_t)>& onCreate)
88 {
89 auto context = context_.Upgrade();
90 if (!context) {
91 return;
92 }
93 auto resRegister = context->GetPlatformResRegister();
94 if (resRegister == nullptr) {
95 return;
96 }
97 std::stringstream paramStream;
98 paramStream << PLAYER_PARAM_TEXTURE << PARAM_EQUALS << textureId_;
99 std::string param = paramStream.str();
100 id_ = resRegister->CreateResource(type_, param);
101 if (id_ == INVALID_ID) {
102 if (onError_) {
103 onError_(PLAYER_ERROR_CODE_CREATEFAIL, PLAYER_ERROR_MSG_CREATEFAIL);
104 }
105 return;
106 }
107 hash_ = MakeResourceHash();
108 resRegister->RegisterEvent(
109 MakeEventHash(PLAYER_EVENT_PREPARED), [weak = WeakClaim(this)](const std::string& param) {
110 auto player = weak.Upgrade();
111 if (player) {
112 player->OnPrepared(param);
113 }
114 });
115 resRegister->RegisterEvent(
116 MakeEventHash(PLAYER_EVENT_COMPLETION), [weak = WeakClaim(this)](const std::string& param) {
117 auto player = weak.Upgrade();
118 if (player) {
119 player->OnCompletion(param);
120 }
121 });
122 resRegister->RegisterEvent(
123 MakeEventHash(PLAYER_EVENT_SEEKCOMPLETE), [weak = WeakClaim(this)](const std::string& param) {
124 auto player = weak.Upgrade();
125 if (player) {
126 player->OnSeekComplete(param);
127 }
128 });
129 resRegister->RegisterEvent(
130 MakeEventHash(PLAYER_EVENT_ONPLAYSTATUS), [weak = WeakClaim(this)](const std::string& param) {
131 auto player = weak.Upgrade();
132 if (player) {
133 player->OnPlayStatus(param);
134 }
135 });
136 resRegister->RegisterEvent(
137 MakeEventHash(PLAYER_EVENT_ONGETCURRENTTIME), [weak = WeakClaim(this)](const std::string& param) {
138 auto player = weak.Upgrade();
139 if (player) {
140 player->OnTimeGetted(param);
141 }
142 });
143 if (onCreate) {
144 onCreate(id_);
145 }
146 InitPlay();
147 }
148
InitPlay()149 void Player::InitPlay()
150 {
151 std::stringstream paramStream;
152 paramStream << PLAYER_PARAM_SRC << PARAM_EQUALS << src_ << PARAM_AND << PLAYER_PARAM_ISMUTE << PARAM_EQUALS
153 << (isMute_ ? 1 : 0) << PARAM_AND << PLAYER_PARAM_ISAUTOPLAY << PARAM_EQUALS << (isAutoPlay_ ? 1 : 0);
154
155 std::string param = paramStream.str();
156 CallResRegisterMethod(MakeMethodHash(PLAYER_METHOD_INIT), param, [weak = WeakClaim(this)](std::string& result) {
157 auto player = weak.Upgrade();
158 if (player) {
159 if (!player->IsResultSuccess(result)) {
160 player->OnError(PLAYER_ERROR_CODE_FILEINVALID, PLAYER_ERROR_MSG_FILEINVALID);
161 }
162 }
163 });
164
165 isInit_ = true;
166 }
167
SetSource(const std::string & src)168 void Player::SetSource(const std::string& src)
169 {
170 src_ = src;
171 if (isInit_) {
172 std::stringstream paramStream;
173 paramStream << PLAYER_PARAM_SRC << PARAM_EQUALS << src_;
174 std::string param = paramStream.str();
175 CallResRegisterMethod(MakeMethodHash(PLAYER_METHOD_UPDATERESOURCE), param,
176 [weak = WeakClaim(this)](std::string& result) {
177 auto player = weak.Upgrade();
178 if (player) {
179 if (!player->IsResultSuccess(result)) {
180 player->OnError(PLAYER_ERROR_CODE_FILEINVALID, PLAYER_ERROR_MSG_FILEINVALID);
181 }
182 }
183 });
184 }
185 }
186
SetSurfaceId(int64_t id,bool isTexture)187 void Player::SetSurfaceId(int64_t id, bool isTexture)
188 {
189 textureId_ = id;
190 std::stringstream paramStream;
191 paramStream << PARAM_VALUE << PARAM_EQUALS << textureId_ << PARAM_AND
192 << PLAYER_PARAM_ISTEXTURE << PARAM_EQUALS << (isTexture ? "1" : "0");
193 std::string param = paramStream.str();
194 CallResRegisterMethod(MakeMethodHash(PLAYER_METHOD_SETSURFACE), param);
195 }
196
OnPrepared(const std::string & param)197 void Player::OnPrepared(const std::string& param)
198 {
199 currentPos_ = 0;
200 width_ = static_cast<uint32_t>(GetIntParam(param, PLAYER_PARAM_WIDTH));
201 height_ = static_cast<uint32_t>(GetIntParam(param, PLAYER_PARAM_HEIGHT));
202 duration_ = static_cast<uint32_t>(GetIntParam(param, PLAYER_PARAM_DURATION) / DURATION_THOUSAND);
203 isPlaying_ = GetIntParam(param, PLAYER_PARAM_ISPLAYING) == 1;
204 isNeedFreshForce_ = GetIntParam(param, PLAYER_PARAM_NEEDFRESHFORCE) == 1;
205 isPrepared_ = true;
206 if (width_ == 0 || height_ == 0 || duration_ == 0) {
207 if (onError_) {
208 onError_(PLAYER_ERROR_CODE_FILEINVALID, PLAYER_ERROR_MSG_FILEINVALID);
209 }
210 return;
211 }
212 getCurrentPosMethod_ = MakeMethodHash(PLAYER_METHOD_GETPOSITION);
213 playMethod_ = MakeMethodHash(PLAYER_METHOD_START);
214 pauseMethod_ = MakeMethodHash(PLAYER_METHOD_PAUSE);
215 seekMethod_ = MakeMethodHash(PLAYER_METHOD_SEEKTO);
216 stopMethod_ = MakeMethodHash(PLAYER_METHOD_STOP);
217 setVolumeMethod_ = MakeMethodHash(PLAYER_METHOD_SETVOLUME);
218 fullscreenMethod_ = MakeMethodHash(PLAYER_METHOD_FULLSCREEN);
219 enableloopingMethod_ = MakeMethodHash(PLAYER_METHOD_ENABLE_LOOPING);
220 setSpeedMethod_ = MakeMethodHash(PLAYER_METHOD_SETSPEED);
221 setDirectionMethod_ = MakeMethodHash(PLAYER_METHOD_SETDIRECTION);
222 setLandsacpeMethod_ = MakeMethodHash(PLAYER_METHOD_SETLANDSCAPE);
223
224 if (isPlaying_) {
225 SetTickActive(true);
226 }
227
228 for (const auto& listener : onPreparedListener_) {
229 listener(width_, height_, isPlaying_, duration_, currentPos_, true);
230 }
231 }
232
OnCompletion(const std::string & param)233 void Player::OnCompletion(const std::string& param)
234 {
235 isPlaying_ = false;
236 currentPos_ = duration_;
237 SetTickActive(isPlaying_);
238 for (const auto& listener : onCompletionListener_) {
239 listener();
240 }
241 }
242
OnSeekComplete(const std::string & param)243 void Player::OnSeekComplete(const std::string& param)
244 {
245 currentPos_ = static_cast<uint32_t>(GetIntParam(param, PLAYER_PARAM_CURRENTPOS));
246 if (!onSeekDoneListener_.empty()) {
247 onSeekDoneListener_.back()(currentPos_);
248 }
249 }
250
OnPlayStatus(const std::string & param)251 void Player::OnPlayStatus(const std::string& param)
252 {
253 isPlaying_ = GetIntParam(param, PLAYER_PARAM_ISPLAYING) == 1;
254 SetTickActive(isPlaying_);
255 for (const auto& listener : onPlayStatusListener_) {
256 listener(isPlaying_);
257 }
258 }
259
SetTickActive(bool isActive)260 void Player::SetTickActive(bool isActive)
261 {
262 auto context = context_.Upgrade();
263 if (!context) {
264 LOGE("fail to get context to set tick active");
265 return;
266 }
267
268 auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI);
269 uiTaskExecutor.PostSyncTask(
270 [this, isActive] {
271 if (scheduler_) {
272 if (isActive) {
273 scheduler_->Start();
274 } else {
275 scheduler_->Stop();
276 }
277 }
278 },
279 "ArkUIVideoSetTickActive");
280 }
281
OnTick(uint64_t timeStamp)282 void Player::OnTick(uint64_t timeStamp)
283 {
284 timeStamp_ += timeStamp;
285 if (isNeedFreshForce_) {
286 if (!onRefreshRenderListener_.empty()) {
287 onRefreshRenderListener_.back()();
288 }
289 }
290 if (timeStamp_ > FREAUENCY_GET_CURRENT_TIME) {
291 GetCurrentTime();
292 timeStamp_ -= FREAUENCY_GET_CURRENT_TIME;
293 }
294 }
295
GetCurrentTime()296 void Player::GetCurrentTime()
297 {
298 CallResRegisterMethod(getCurrentPosMethod_, PARAM_NONE);
299 }
300
OnTimeGetted(const std::string & result)301 void Player::OnTimeGetted(const std::string& result)
302 {
303 currentPos_ = static_cast<uint32_t>(GetIntParam(result, PLAYER_PARAM_CURRENTPOS));
304 if (!onCurrentPosListener_.empty()) {
305 onCurrentPosListener_.back()(currentPos_);
306 }
307 }
308
Start()309 void Player::Start()
310 {
311 CallResRegisterMethod(playMethod_, PARAM_NONE, [weak = WeakClaim(this)](std::string& result) {
312 auto player = weak.Upgrade();
313 if (player) {
314 player->OnStarted();
315 }
316 });
317 }
318
OnStarted()319 void Player::OnStarted()
320 {
321 isPlaying_ = true;
322 SetTickActive(isPlaying_);
323
324 for (const auto& listener : onPlayStatusListener_) {
325 listener(isPlaying_);
326 }
327 }
328
Pause()329 void Player::Pause()
330 {
331 CallResRegisterMethod(pauseMethod_, PARAM_NONE, [weak = WeakClaim(this)](std::string& result) {
332 auto player = weak.Upgrade();
333 if (player) {
334 player->OnPaused();
335 }
336 });
337 }
338
OnPaused()339 void Player::OnPaused()
340 {
341 isPlaying_ = false;
342 SetTickActive(isPlaying_);
343
344 for (const auto& listener : onPlayStatusListener_) {
345 listener(isPlaying_);
346 }
347 }
348
Stop()349 void Player::Stop()
350 {
351 if (scheduler_) {
352 scheduler_->Stop();
353 }
354
355 CallResRegisterMethod(stopMethod_, PARAM_NONE, [weak = WeakClaim(this)](std::string& result) {
356 LOGI("callback play OnStop.");
357 auto player = weak.Upgrade();
358 if (player) {
359 player->OnStop();
360 }
361 });
362 }
363
OnStop()364 void Player::OnStop()
365 {
366 isPlaying_ = false;
367 currentPos_ = 0;
368 SetTickActive(isPlaying_);
369
370 for (const auto& listener : onPlayStatusListener_) {
371 listener(isPlaying_);
372 }
373 }
374
UnregisterEvent()375 void Player::UnregisterEvent()
376 {
377 auto context = context_.Upgrade();
378 if (!context) {
379 LOGE("fail to get context");
380 return;
381 }
382 auto resRegister = context->GetPlatformResRegister();
383 if (resRegister == nullptr) {
384 return;
385 }
386 resRegister->UnregisterEvent(MakeEventHash(PLAYER_EVENT_PREPARED));
387 resRegister->UnregisterEvent(MakeEventHash(PLAYER_EVENT_COMPLETION));
388 resRegister->UnregisterEvent(MakeEventHash(PLAYER_EVENT_SEEKCOMPLETE));
389 resRegister->UnregisterEvent(MakeEventHash(PLAYER_EVENT_ONPLAYSTATUS));
390 }
391
EnterFullScreen()392 void Player::EnterFullScreen()
393 {
394 CallResRegisterMethod(fullscreenMethod_, PARAM_NONE);
395 }
396
SeekTo(uint32_t pos)397 void Player::SeekTo(uint32_t pos)
398 {
399 std::stringstream paramStream;
400 paramStream << PARAM_VALUE << PARAM_EQUALS << pos;
401
402 std::string param = paramStream.str();
403 CallResRegisterMethod(seekMethod_, param);
404 }
405
SeekTo(uint32_t pos,uint32_t mode)406 void Player::SeekTo(uint32_t pos, uint32_t mode)
407 {
408 std::stringstream paramStream;
409 paramStream << PARAM_VALUE << PARAM_EQUALS << pos << PARAM_AND <<
410 PLAYER_PARAM_SEEKMODE << PARAM_EQUALS << mode;
411
412 std::string param = paramStream.str();
413 CallResRegisterMethod(seekMethod_, param);
414 }
415
SetVolume(float volume)416 void Player::SetVolume(float volume)
417 {
418 std::stringstream paramStream;
419 paramStream << PARAM_VALUE << PARAM_EQUALS << volume;
420
421 std::string param = paramStream.str();
422 CallResRegisterMethod(setVolumeMethod_, param);
423 }
424
AddPreparedListener(PreparedListener && listener)425 void Player::AddPreparedListener(PreparedListener&& listener)
426 {
427 auto context = context_.Upgrade();
428 if (!context) {
429 LOGE("fail to get context");
430 return;
431 }
432
433 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
434 platformTaskExecutor.PostTask(
435 [weak = WeakClaim(this), listener = std::move(listener)]() mutable {
436 auto player = weak.Upgrade();
437 if (player) {
438 player->OnAddPreparedListener(std::move(listener));
439 }
440 },
441 "ArkUIVideoAddPreparedListener");
442 }
443
OnAddPreparedListener(PreparedListener && listener)444 void Player::OnAddPreparedListener(PreparedListener&& listener)
445 {
446 onPreparedListener_.push_back(std::move(listener));
447 if (isPrepared_) {
448 onPreparedListener_.back()(width_, height_, isPlaying_, duration_, currentPos_, false);
449 }
450 }
451
AddPlayStatusListener(PlayStatusListener && listener)452 void Player::AddPlayStatusListener(PlayStatusListener&& listener)
453 {
454 auto context = context_.Upgrade();
455 if (!context) {
456 LOGE("fail to get context");
457 return;
458 }
459
460 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
461 platformTaskExecutor.PostTask(
462 [weak = WeakClaim(this), listener = std::move(listener)]() mutable {
463 auto player = weak.Upgrade();
464 if (player) {
465 player->OnAddPlayStatusListener(std::move(listener));
466 }
467 },
468 "ArkUIVideoAddPlayStatusListener");
469 }
470
OnAddPlayStatusListener(PlayStatusListener && listener)471 void Player::OnAddPlayStatusListener(PlayStatusListener&& listener)
472 {
473 onPlayStatusListener_.push_back(std::move(listener));
474 }
475
AddCurrentPosListener(CurrentPosListener && listener)476 void Player::AddCurrentPosListener(CurrentPosListener&& listener)
477 {
478 auto context = context_.Upgrade();
479 if (!context) {
480 LOGE("fail to get context");
481 return;
482 }
483
484 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
485 platformTaskExecutor.PostTask(
486 [weak = WeakClaim(this), listener = std::move(listener)]() mutable {
487 auto player = weak.Upgrade();
488 if (player) {
489 player->OnAddCurrentPosListener(std::move(listener));
490 }
491 },
492 "ArkUIVideoAddCurrentPosListener");
493 }
494
OnAddCurrentPosListener(CurrentPosListener && listener)495 void Player::OnAddCurrentPosListener(CurrentPosListener&& listener)
496 {
497 onCurrentPosListener_.push_back(std::move(listener));
498 }
499
AddSeekDoneListener(SeekDoneListener && listener)500 void Player::AddSeekDoneListener(SeekDoneListener&& listener)
501 {
502 auto context = context_.Upgrade();
503 if (!context) {
504 LOGE("fail to get context");
505 return;
506 }
507
508 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
509 platformTaskExecutor.PostTask(
510 [weak = WeakClaim(this), listener = std::move(listener)]() mutable {
511 auto player = weak.Upgrade();
512 if (player) {
513 player->OnAddSeekDoneListener(std::move(listener));
514 }
515 },
516 "ArkUIVideoAddSeekDoneListener");
517 }
518
OnAddSeekDoneListener(SeekDoneListener && listener)519 void Player::OnAddSeekDoneListener(SeekDoneListener&& listener)
520 {
521 onSeekDoneListener_.push_back(std::move(listener));
522 }
523
AddCompletionListener(CompletionListener && listener)524 void Player::AddCompletionListener(CompletionListener&& listener)
525 {
526 auto context = context_.Upgrade();
527 if (!context) {
528 LOGE("fail to get context");
529 return;
530 }
531
532 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
533 platformTaskExecutor.PostTask(
534 [weak = WeakClaim(this), listener = std::move(listener)]() mutable {
535 auto player = weak.Upgrade();
536 if (player) {
537 player->OnAddCompletionListener(std::move(listener));
538 }
539 },
540 "ArkUIVideoAddCompletionListener");
541 }
542
OnAddCompletionListener(CompletionListener && listener)543 void Player::OnAddCompletionListener(CompletionListener&& listener)
544 {
545 onCompletionListener_.push_back(std::move(listener));
546 }
547
PopListener()548 void Player::PopListener()
549 {
550 onRefreshRenderListener_.pop_back();
551 auto context = context_.Upgrade();
552 if (!context) {
553 LOGE("fail to get context");
554 return;
555 }
556
557 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
558 platformTaskExecutor.PostTask(
559 [weak = WeakClaim(this)] {
560 auto player = weak.Upgrade();
561 if (player) {
562 player->OnPopListener();
563 }
564 },
565 "ArkUIVideoPopListener");
566 }
567
AddRefreshRenderListener(RefreshRenderListener && listener)568 void Player::AddRefreshRenderListener(RefreshRenderListener&& listener)
569 {
570 onRefreshRenderListener_.push_back(std::move(listener));
571 }
572
EnableLooping(bool loop)573 void Player::EnableLooping(bool loop)
574 {
575 std::stringstream paramStream;
576 paramStream << PLAYER_PARAM_LOOP << PARAM_EQUALS << (loop ? "1" : "0");
577
578 std::string param = paramStream.str();
579 CallResRegisterMethod(enableloopingMethod_, param);
580 }
581
SetSpeed(float speed)582 void Player::SetSpeed(float speed)
583 {
584 std::stringstream paramStream;
585 paramStream << PARAM_VALUE << PARAM_EQUALS << speed;
586
587 std::string param = paramStream.str();
588 CallResRegisterMethod(setSpeedMethod_, param);
589 }
590
SetDirection(std::string & direction)591 void Player::SetDirection(std::string& direction)
592 {
593 std::stringstream paramStream;
594 paramStream << PARAM_VALUE << PARAM_EQUALS << direction;
595
596 std::string param = paramStream.str();
597 CallResRegisterMethod(setDirectionMethod_, param);
598 }
599
SetLandscape()600 void Player::SetLandscape()
601 {
602 CallResRegisterMethod(setLandsacpeMethod_, PARAM_NONE);
603 }
604
OnPopListener()605 void Player::OnPopListener()
606 {
607 onPreparedListener_.pop_back();
608 onPlayStatusListener_.pop_back();
609 onCurrentPosListener_.pop_back();
610 onSeekDoneListener_.pop_back();
611 onCompletionListener_.pop_back();
612 if (!onCurrentPosListener_.empty()) {
613 onCurrentPosListener_.back()(currentPos_);
614 }
615 }
616
SetFullScreenChange(bool isFullScreen)617 void Player::SetFullScreenChange(bool isFullScreen)
618 {
619 std::stringstream paramStream;
620 paramStream << PARAM_VALUE << PARAM_EQUALS << (isFullScreen ? "1" : "0");
621
622 std::string param = paramStream.str();
623 CallResRegisterMethod(fullscreenMethod_, param);
624 }
625
Release(const std::function<void (bool)> & onRelease)626 void Player::Release(const std::function<void(bool)>& onRelease)
627 {
628 // The destructor will be executed at platform thread, so destroy scheduler at here.
629 if (scheduler_) {
630 scheduler_.Reset();
631 }
632
633 auto context = context_.Upgrade();
634 if (!context) {
635 LOGE("fail to get context");
636 return;
637 }
638 auto platformTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::PLATFORM);
639 if (platformTaskExecutor.IsRunOnCurrentThread()) {
640 UnregisterEvent();
641 } else {
642 platformTaskExecutor.PostTask(
643 [weak = WeakClaim(this)] {
644 auto player = weak.Upgrade();
645 if (player) {
646 player->UnregisterEvent();
647 }
648 },
649 "ArkUIVideoPlayerUnregisterEvent");
650 }
651
652 Resource::Release(onRelease);
653
654 isInit_ = false;
655 }
656 } // namespace OHOS::Ace