• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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