• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
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_server_mem.h"
17 #include <unistd.h>
18 #include "media_log.h"
19 #include "media_errors.h"
20 #include "player_mem_manage.h"
21 #include "mem_mgr_client.h"
22 #include "media_dfx.h"
23 #include "param_wrapper.h"
24 #include "ipc_skeleton.h"
25 #include "player_server_mem_state.h"
26 #include "av_common.h"
27 
28 namespace {
29     constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_PLAYER, "PlayerServerMem"};
30 }
31 
32 namespace OHOS {
33 namespace Media {
34 constexpr int32_t CONTINUE_RESET_MAX_NUM = 5;
35 constexpr int32_t WAIT_RECOVER_TIME_SEC = 1;
36 constexpr double APP_BACK_GROUND_DESTROY_MEMERY_LAST_SET_TIME = 60.0;
37 constexpr double APP_FRONT_GROUND_DESTROY_MEMERY_LAST_SET_TIME = 120.0;
Create()38 std::shared_ptr<IPlayerService> PlayerServerMem::Create()
39 {
40     MEDIA_LOGD("Create new PlayerServerMem");
41     std::shared_ptr<PlayerServerMem> playerServerMem = std::make_shared<PlayerServerMem>();
42     CHECK_AND_RETURN_RET_LOG(playerServerMem != nullptr, nullptr, "failed to new PlayerServerMem");
43 
44     (void)playerServerMem->Init();
45     return playerServerMem;
46 }
47 
SetStateMap()48 void PlayerServerMem::SetStateMap()
49 {
50     stateMap_[idleState_.get()] = std::static_pointer_cast<MemBaseState>(memIdleState_);
51     stateMap_[initializedState_.get()] = std::static_pointer_cast<MemBaseState>(memInitializedState_);
52     stateMap_[preparingState_.get()] = std::static_pointer_cast<MemBaseState>(memPreparingState_);
53     stateMap_[preparedState_.get()] = std::static_pointer_cast<MemBaseState>(memPreparedState_);
54     stateMap_[playingState_.get()] = std::static_pointer_cast<MemBaseState>(memPlayingState_);
55     stateMap_[pausedState_.get()] = std::static_pointer_cast<MemBaseState>(memPausedState_);
56     stateMap_[stoppedState_.get()] = std::static_pointer_cast<MemBaseState>(memStoppedState_);
57     stateMap_[playbackCompletedState_.get()] = std::static_pointer_cast<MemBaseState>(memPlaybackCompletedState_);
58 }
59 
Init()60 int32_t PlayerServerMem::Init()
61 {
62     memIdleState_ = std::make_shared<MemIdleState>(*this);
63     memInitializedState_ = std::make_shared<MemInitializedState>(*this);
64     memPreparingState_ = std::make_shared<MemPreparingState>(*this);
65     memPreparedState_ = std::make_shared<MemPreparedState>(*this);
66     memPlayingState_ = std::make_shared<MemPlayingState>(*this);
67     memPausedState_ = std::make_shared<MemPausedState>(*this);
68     memStoppedState_ = std::make_shared<MemStoppedState>(*this);
69     memPlaybackCompletedState_ = std::make_shared<MemPlaybackCompletedState>(*this);
70 
71     recoverConfig_.currState = std::static_pointer_cast<MemBaseState>(memIdleState_);
72     lastestUserSetTime_ = std::chrono::steady_clock::now();
73     auto ret = PlayerServer::Init();
74     SetStateMap();
75     return ret;
76 }
77 
PlayerServerMem()78 PlayerServerMem::PlayerServerMem()
79 {
80     MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
81 }
82 
~PlayerServerMem()83 PlayerServerMem::~PlayerServerMem()
84 {
85     MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
86 }
87 
SetSourceInternal()88 int32_t PlayerServerMem::SetSourceInternal()
89 {
90     int32_t ret;
91     FdDesInfo fdInfo;
92     MEDIA_LOGI("sourceType:%{public}d", recoverConfig_.sourceType);
93     switch (recoverConfig_.sourceType) {
94         case static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_URL):
95             ret = PlayerServer::SetSource(recoverConfig_.url);
96             break;
97 
98         case static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_DATASRC):
99             ret = PlayerServer::SetSource(recoverConfig_.dataSrc);
100             break;
101 
102         case static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_FD):
103             CHECK_AND_RETURN_RET(uriHelper_ != nullptr, MSERR_INVALID_VAL);
104             fdInfo = uriHelper_->GetFdInfo();
105             ret = PlayerServer::SetSource(fdInfo.fd, fdInfo.offset, fdInfo.size);
106             break;
107 
108         default:
109             ret = MSERR_INVALID_OPERATION;
110             break;
111     }
112     return ret;
113 }
114 
AddSubSourceInternal()115 int32_t PlayerServerMem::AddSubSourceInternal()
116 {
117     if (!recoverConfig_.subUrl.empty()) {
118         for (auto &url : recoverConfig_.subUrl) {
119             (void)PlayerServer::AddSubSource(url);
120         }
121     }
122 
123     if (!recoverConfig_.subFdSrc.empty()) {
124         for (auto &fdSrc : recoverConfig_.subFdSrc) {
125             (void)PlayerServer::AddSubSource(fdSrc.fd, fdSrc.offset, fdSrc.size);
126         }
127     }
128 
129     return MSERR_OK;
130 }
131 
SetPlayerServerConfig()132 void PlayerServerMem::SetPlayerServerConfig()
133 {
134     errorCbOnce_ = playerServerConfig_.errorCbOnce;
135     disableStoppedCb_ = playerServerConfig_.disableStoppedCb;
136     lastErrMsg_ = playerServerConfig_.lastErrMsg;
137     uriHelper_ = std::move(playerServerConfig_.uriHelper);
138 }
139 
GetPlayerServerConfig()140 void PlayerServerMem::GetPlayerServerConfig()
141 {
142     playerServerConfig_.errorCbOnce = errorCbOnce_;
143     playerServerConfig_.disableStoppedCb = disableStoppedCb_;
144     playerServerConfig_.lastErrMsg = lastErrMsg_;
145     playerServerConfig_.uriHelper = std::move(uriHelper_);
146 }
147 
SetConfigInternal()148 int32_t PlayerServerMem::SetConfigInternal()
149 {
150     int32_t ret = MSERR_OK;
151     MEDIA_LOGI("leftVolume:%{public}f rightVolume:%{public}f loop:%{public}d bitRate:%{public}d",
152         recoverConfig_.leftVolume, recoverConfig_.rightVolume, recoverConfig_.loop, recoverConfig_.bitRate);
153     if (recoverConfig_.leftVolume != 1.0f || recoverConfig_.rightVolume != 1.0f) {
154         ret = PlayerServer::SetVolume(recoverConfig_.leftVolume, recoverConfig_.rightVolume);
155         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetVolume");
156     }
157 
158     if (recoverConfig_.surface != nullptr) {
159         ret = PlayerServer::SetVideoSurface(recoverConfig_.surface);
160         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetVideoSurface");
161     }
162 
163     if (recoverConfig_.loop != false) {
164         ret = PlayerServer::SetLooping(recoverConfig_.loop);
165         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetLooping");
166     }
167 
168     ret = SetSaveParameter();
169     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetParameter");
170 
171     if (recoverConfig_.bitRate != 0) {
172         ret = PlayerServer::SelectBitRate(recoverConfig_.bitRate);
173         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SelectBitRate");
174     }
175 
176     return ret;
177 }
178 
SetBehaviorInternal()179 int32_t PlayerServerMem::SetBehaviorInternal()
180 {
181     int ret = MSERR_OK;
182     MEDIA_LOGI("speedMode:%{public}d currentTime:%{public}d audioIndex:%{public}d",
183         recoverConfig_.speedMode, recoverConfig_.currentTime, recoverConfig_.audioIndex);
184     if (recoverConfig_.speedMode != SPEED_FORWARD_1_00_X) {
185         ret = PlayerServer::SetPlaybackSpeed(recoverConfig_.speedMode);
186         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetPlaybackSpeed");
187     }
188 
189     if (recoverConfig_.currentTime != 0) {
190         ret = PlayerServer::Seek(recoverConfig_.currentTime, SEEK_CLOSEST);
191         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to Seek");
192     }
193 
194     if (NeedSelectAudioTrack()) {
195         ret = PlayerServer::SelectTrack(recoverConfig_.audioIndex, PlayerSwitchMode::SWITCH_SMOOTH);
196         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SelectTrack");
197     }
198 
199     return ret;
200 }
201 
SetPlaybackSpeedInternal()202 int32_t PlayerServerMem::SetPlaybackSpeedInternal()
203 {
204     MEDIA_LOGI("speedMode:%{public}d audioIndex:%{public}d", recoverConfig_.speedMode, recoverConfig_.audioIndex);
205     int ret;
206     if (recoverConfig_.speedMode != SPEED_FORWARD_1_00_X) {
207         ret = PlayerServer::SetPlaybackSpeed(recoverConfig_.speedMode);
208         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "PreparedState failed to SetPlaybackSpeed");
209     }
210 
211     if (NeedSelectAudioTrack()) {
212         ret = PlayerServer::SelectTrack(recoverConfig_.audioIndex, PlayerSwitchMode::SWITCH_SMOOTH);
213         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SelectTrack");
214     }
215     return MSERR_OK;
216 }
217 
SetResourceTypeBySysParam()218 void PlayerServerMem::SetResourceTypeBySysParam()
219 {
220     std::string cmd;
221     int32_t ret = OHOS::system::GetStringParameter("sys.media.player.resource.type", cmd, "");
222     if (ret == 0 && !cmd.empty()) {
223         if (cmd == "NetWork") {
224             isLocalResource_ = false;
225         } else if (cmd == "Local") {
226             isLocalResource_ = true;
227         }
228     }
229 }
230 
SetSource(const std::string & url)231 int32_t PlayerServerMem::SetSource(const std::string &url)
232 {
233     std::unique_lock<std::mutex> lock(mutex_);
234     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
235 
236     lastestUserSetTime_ = std::chrono::steady_clock::now();
237     recoverConfig_.url = url;
238     recoverConfig_.sourceType = static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_URL);
239     auto ret = PlayerServer::SetSource(url);
240     if (ret == MSERR_OK) {
241         isLocalResource_ = false;
242         if (url.find("fd://") != std::string::npos || url.find("file://") != std::string::npos) {
243             isLocalResource_ = true;
244         }
245         SetResourceTypeBySysParam();
246     }
247     return ret;
248 }
249 
SetSource(const std::shared_ptr<IMediaDataSource> & dataSrc)250 int32_t PlayerServerMem::SetSource(const std::shared_ptr<IMediaDataSource> &dataSrc)
251 {
252     std::unique_lock<std::mutex> lock(mutex_);
253     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
254 
255     lastestUserSetTime_ = std::chrono::steady_clock::now();
256     recoverConfig_.dataSrc = dataSrc;
257     recoverConfig_.sourceType = static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_DATASRC);
258     auto ret = PlayerServer::SetSource(dataSrc);
259     if (ret == MSERR_OK) {
260         isLocalResource_ = false;
261     }
262     return ret;
263 }
264 
SetSource(int32_t fd,int64_t offset,int64_t size)265 int32_t PlayerServerMem::SetSource(int32_t fd, int64_t offset, int64_t size)
266 {
267     std::unique_lock<std::mutex> lock(mutex_);
268     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
269 
270     lastestUserSetTime_ = std::chrono::steady_clock::now();
271 
272     recoverConfig_.fd = fd;
273     recoverConfig_.offset = offset;
274     recoverConfig_.size = size;
275     recoverConfig_.sourceType = static_cast<int32_t>(PlayerSourceType::SOURCE_TYPE_FD);
276     auto ret = PlayerServer::SetSource(fd, offset, size);
277     if (ret == MSERR_OK) {
278         isLocalResource_ = true;
279     }
280     return ret;
281 }
282 
AddSubSource(const std::string & url)283 int32_t PlayerServerMem::AddSubSource(const std::string &url)
284 {
285     std::unique_lock<std::mutex> lock(mutex_);
286     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
287 
288     lastestUserSetTime_ = std::chrono::steady_clock::now();
289     recoverConfig_.subUrl.emplace_back(url);
290     return PlayerServer::AddSubSource(url);
291 }
292 
AddSubSource(int32_t fd,int64_t offset,int64_t size)293 int32_t PlayerServerMem::AddSubSource(int32_t fd, int64_t offset, int64_t size)
294 {
295     std::unique_lock<std::mutex> lock(mutex_);
296     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
297 
298     lastestUserSetTime_ = std::chrono::steady_clock::now();
299     FdSrcInfo fdSrc {fd, offset, size};
300     recoverConfig_.subFdSrc.emplace_back(fdSrc);
301     return PlayerServer::AddSubSource(fd, offset, size);
302 }
303 
Play()304 int32_t PlayerServerMem::Play()
305 {
306     std::unique_lock<std::mutex> lock(mutex_);
307     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
308 
309     lastestUserSetTime_ = std::chrono::steady_clock::now();
310     return PlayerServer::Play();
311 }
312 
Prepare()313 int32_t PlayerServerMem::Prepare()
314 {
315     std::unique_lock<std::mutex> lock(mutex_);
316     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
317 
318     lastestUserSetTime_ = std::chrono::steady_clock::now();
319     return PlayerServer::Prepare();
320 }
321 
PrepareAsync()322 int32_t PlayerServerMem::PrepareAsync()
323 {
324     std::unique_lock<std::mutex> lock(mutex_);
325     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
326 
327     lastestUserSetTime_ = std::chrono::steady_clock::now();
328     return PlayerServer::PrepareAsync();
329 }
330 
PrepareAsyncInner()331 int32_t PlayerServerMem::PrepareAsyncInner()
332 {
333     return PlayerServer::PrepareAsync();
334 }
335 
Pause()336 int32_t PlayerServerMem::Pause()
337 {
338     std::unique_lock<std::mutex> lock(mutex_);
339     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
340 
341     lastestUserSetTime_ = std::chrono::steady_clock::now();
342     return PlayerServer::Pause();
343 }
344 
Stop()345 int32_t PlayerServerMem::Stop()
346 {
347     std::unique_lock<std::mutex> lock(mutex_);
348     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "Stop:RecoverMemByUser fail");
349 
350     recoverCond_.wait_for(lock, std::chrono::seconds(WAIT_RECOVER_TIME_SEC), [this] {
351         return isLocalResource_ ? (!isRecoverMemByUser_) : (!isSeekToCurrentTime_);
352     });
353     lastestUserSetTime_ = std::chrono::steady_clock::now();
354     return PlayerServer::Stop();
355 }
356 
Reset()357 int32_t PlayerServerMem::Reset()
358 {
359     std::unique_lock<std::mutex> lock(mutex_);
360     if (RecoverMemByUser() != MSERR_OK) {
361         lastestUserSetTime_ = std::chrono::steady_clock::now();
362         MEDIA_LOGE("Reset:RecoverMemByUser failed, force reset!");
363         return PlayerServer::Reset();
364     }
365 
366     recoverCond_.wait_for(lock, std::chrono::seconds(WAIT_RECOVER_TIME_SEC), [this] {
367         return isLocalResource_ ? (!isRecoverMemByUser_) : (!isSeekToCurrentTime_);
368     });
369     lastestUserSetTime_ = std::chrono::steady_clock::now();
370     return PlayerServer::Reset();
371 }
372 
Release()373 int32_t PlayerServerMem::Release()
374 {
375     std::unique_lock<std::mutex> lock(mutex_);
376     if (RecoverMemByUser() != MSERR_OK) {
377         lastestUserSetTime_ = std::chrono::steady_clock::now();
378         MEDIA_LOGE("Release:RecoverMemByUser failed, force release!");
379         return PlayerServer::Release();
380     }
381 
382     recoverCond_.wait_for(lock, std::chrono::seconds(WAIT_RECOVER_TIME_SEC), [this] {
383         return isLocalResource_ ? (!isRecoverMemByUser_) : (!isSeekToCurrentTime_);
384     });
385     lastestUserSetTime_ = std::chrono::steady_clock::now();
386     return PlayerServer::Release();
387 }
388 
SetVolume(float leftVolume,float rightVolume)389 int32_t PlayerServerMem::SetVolume(float leftVolume, float rightVolume)
390 {
391     std::unique_lock<std::mutex> lock(mutex_);
392     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
393 
394     lastestUserSetTime_ = std::chrono::steady_clock::now();
395     recoverConfig_.leftVolume = leftVolume;
396     recoverConfig_.rightVolume = rightVolume;
397     return PlayerServer::SetVolume(leftVolume, rightVolume);
398 }
399 
Seek(int32_t mSeconds,PlayerSeekMode mode)400 int32_t PlayerServerMem::Seek(int32_t mSeconds, PlayerSeekMode mode)
401 {
402     std::unique_lock<std::mutex> lock(mutex_);
403     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
404 
405     lastestUserSetTime_ = std::chrono::steady_clock::now();
406     return PlayerServer::Seek(mSeconds, mode);
407 }
408 
GetCurrentTime(int32_t & currentTime)409 int32_t PlayerServerMem::GetCurrentTime(int32_t &currentTime)
410 {
411     std::unique_lock<std::mutex> lock(mutex_);
412     if (isLocalResource_ && isReleaseMemByManage_) {
413         MEDIA_LOGI("User call GetCurrentTime:%{public}d", recoverConfig_.currentTime);
414         currentTime = recoverConfig_.currentTime;
415         return MSERR_OK;
416     }
417     return PlayerServer::GetCurrentTime(currentTime);
418 }
419 
GetPlaybackPosition(int32_t & playbackPosition)420 int32_t PlayerServerMem::GetPlaybackPosition(int32_t &playbackPosition)
421 {
422     std::unique_lock<std::mutex> lock(mutex_);
423     if (isLocalResource_ && isReleaseMemByManage_) {
424         MEDIA_LOGI("User call GetPlaybackPosition:%{public}d", recoverConfig_.playbackPosition);
425         playbackPosition = recoverConfig_.playbackPosition;
426         return MSERR_OK;
427     }
428     return PlayerServer::GetPlaybackPosition(playbackPosition);
429 }
430 
GetVideoTrackInfo(std::vector<Format> & videoTrack)431 int32_t PlayerServerMem::GetVideoTrackInfo(std::vector<Format> &videoTrack)
432 {
433     std::unique_lock<std::mutex> lock(mutex_);
434     if (isLocalResource_ && isReleaseMemByManage_) {
435         MEDIA_LOGI("User call GetVideoTrackInfo");
436         videoTrack = recoverConfig_.videoTrack;
437         return MSERR_OK;
438     }
439     return PlayerServer::GetVideoTrackInfo(videoTrack);
440 }
441 
GetAudioTrackInfo(std::vector<Format> & audioTrack)442 int32_t PlayerServerMem::GetAudioTrackInfo(std::vector<Format> &audioTrack)
443 {
444     std::unique_lock<std::mutex> lock(mutex_);
445     if (isLocalResource_ && isReleaseMemByManage_) {
446         MEDIA_LOGI("User call GetAudioTrackInfo");
447         audioTrack = recoverConfig_.audioTrack;
448         return MSERR_OK;
449     }
450     return PlayerServer::GetAudioTrackInfo(audioTrack);
451 }
452 
GetVideoWidth()453 int32_t PlayerServerMem::GetVideoWidth()
454 {
455     std::unique_lock<std::mutex> lock(mutex_);
456     if (isLocalResource_ && isReleaseMemByManage_) {
457         MEDIA_LOGI("User call GetVideoWidth:%{public}d", recoverConfig_.videoWidth);
458         return recoverConfig_.videoWidth;
459     }
460     return PlayerServer::GetVideoWidth();
461 }
462 
GetVideoHeight()463 int32_t PlayerServerMem::GetVideoHeight()
464 {
465     std::unique_lock<std::mutex> lock(mutex_);
466     if (isLocalResource_ && isReleaseMemByManage_) {
467         MEDIA_LOGI("User call GetVideoHeight:%{public}d", recoverConfig_.videoHeight);
468         return recoverConfig_.videoHeight;
469     }
470     return PlayerServer::GetVideoHeight();
471 }
472 
GetDuration(int32_t & duration)473 int32_t PlayerServerMem::GetDuration(int32_t &duration)
474 {
475     std::unique_lock<std::mutex> lock(mutex_);
476     if (isLocalResource_ && isReleaseMemByManage_) {
477         MEDIA_LOGI("User call GetDuration:%{public}d", recoverConfig_.duration);
478         duration = recoverConfig_.duration;
479         return MSERR_OK;
480     }
481     return PlayerServer::GetDuration(duration);
482 }
483 
SetPlaybackSpeed(PlaybackRateMode mode)484 int32_t PlayerServerMem::SetPlaybackSpeed(PlaybackRateMode mode)
485 {
486     std::unique_lock<std::mutex> lock(mutex_);
487     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
488 
489     lastestUserSetTime_ = std::chrono::steady_clock::now();
490     recoverConfig_.speedMode = mode;
491     return PlayerServer::SetPlaybackSpeed(mode);
492 }
493 
GetPlaybackSpeed(PlaybackRateMode & mode)494 int32_t PlayerServerMem::GetPlaybackSpeed(PlaybackRateMode &mode)
495 {
496     std::unique_lock<std::mutex> lock(mutex_);
497     if (isLocalResource_ && isReleaseMemByManage_) {
498         MEDIA_LOGI("User call GetPlaybackSpeed:%{public}d", recoverConfig_.speedMode);
499         mode = recoverConfig_.speedMode;
500         return MSERR_OK;
501     }
502     return PlayerServer::GetPlaybackSpeed(mode);
503 }
504 
505 #ifdef SUPPORT_VIDEO
SetVideoSurface(sptr<Surface> surface)506 int32_t PlayerServerMem::SetVideoSurface(sptr<Surface> surface)
507 {
508     std::unique_lock<std::mutex> lock(mutex_);
509     isAudioPlayer_ = false;
510     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
511 
512     lastestUserSetTime_ = std::chrono::steady_clock::now();
513     recoverConfig_.surface = surface;
514     return PlayerServer::SetVideoSurface(surface);
515 }
516 #endif
517 
IsPlaying()518 bool PlayerServerMem::IsPlaying()
519 {
520     std::unique_lock<std::mutex> lock(mutex_);
521     if (isLocalResource_ && isReleaseMemByManage_) {
522         MEDIA_LOGI("User call IsPlaying:%{public}d", recoverConfig_.isPlaying);
523         return recoverConfig_.isPlaying;
524     }
525     return PlayerServer::IsPlaying();
526 }
527 
IsLooping()528 bool PlayerServerMem::IsLooping()
529 {
530     std::unique_lock<std::mutex> lock(mutex_);
531     if (isLocalResource_ && isReleaseMemByManage_) {
532         MEDIA_LOGI("User call IsLooping:%{public}d", recoverConfig_.loop);
533         return recoverConfig_.loop;
534     }
535     return PlayerServer::IsLooping();
536 }
537 
SetLooping(bool loop)538 int32_t PlayerServerMem::SetLooping(bool loop)
539 {
540     std::unique_lock<std::mutex> lock(mutex_);
541     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
542 
543     lastestUserSetTime_ = std::chrono::steady_clock::now();
544     recoverConfig_.loop = loop;
545     return PlayerServer::SetLooping(loop);
546 }
547 
SaveParameter(const Format & param)548 void PlayerServerMem::SaveParameter(const Format &param)
549 {
550     if (param.ContainKey(PlayerKeys::VIDEO_SCALE_TYPE)) {
551         param.GetIntValue(PlayerKeys::VIDEO_SCALE_TYPE, recoverConfig_.videoScaleType);
552     }
553     if (param.ContainKey(PlayerKeys::CONTENT_TYPE) && param.ContainKey(PlayerKeys::STREAM_USAGE)) {
554         param.GetIntValue(PlayerKeys::CONTENT_TYPE, recoverConfig_.contentType);
555         param.GetIntValue(PlayerKeys::STREAM_USAGE, recoverConfig_.streamUsage);
556         param.GetIntValue(PlayerKeys::RENDERER_FLAG, recoverConfig_.rendererFlag);
557         param.GetIntValue(PlayerKeys::VOLUME_MODE, recoverConfig_.volumeMode);
558     }
559     if (param.ContainKey(PlayerKeys::AUDIO_INTERRUPT_MODE)) {
560         param.GetIntValue(PlayerKeys::AUDIO_INTERRUPT_MODE, recoverConfig_.interruptMode);
561     }
562 }
563 
SetSaveParameter()564 int32_t PlayerServerMem::SetSaveParameter()
565 {
566     CHECK_AND_RETURN_RET_LOG(playerEngine_ != nullptr, MSERR_NO_MEMORY, "playerEngine_ is nullptr");
567     int32_t ret = MSERR_OK;
568     if (recoverConfig_.videoScaleType != -1) {
569         ret = playerEngine_->SetVideoScaleType(Plugins::VideoScaleType(recoverConfig_.videoScaleType));
570         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetVideoScaleType");
571     }
572     if (recoverConfig_.contentType != -1 && recoverConfig_.streamUsage != -1) {
573         ret = playerEngine_->SetAudioRendererInfo(recoverConfig_.contentType,
574             recoverConfig_.streamUsage, recoverConfig_.rendererFlag, recoverConfig_.volumeMode);
575         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetAudioRendererInfo");
576     }
577     if (recoverConfig_.interruptMode != -1) {
578         ret = playerEngine_->SetAudioInterruptMode(recoverConfig_.interruptMode);
579         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to SetAudioInterruptMode");
580     }
581     config_.effectMode = recoverConfig_.effectMode;
582     return ret;
583 }
584 
SetParameter(const Format & param)585 int32_t PlayerServerMem::SetParameter(const Format &param)
586 {
587     std::unique_lock<std::mutex> lock(mutex_);
588     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
589 
590     lastestUserSetTime_ = std::chrono::steady_clock::now();
591     SaveParameter(param);
592     return PlayerServer::SetParameter(param);
593 }
594 
SetPlayerCallback(const std::shared_ptr<PlayerCallback> & callback)595 int32_t PlayerServerMem::SetPlayerCallback(const std::shared_ptr<PlayerCallback> &callback)
596 {
597     std::unique_lock<std::mutex> lock(mutex_);
598     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
599 
600     lastestUserSetTime_ = std::chrono::steady_clock::now();
601     recoverConfig_.callback = callback;
602     return PlayerServer::SetPlayerCallback(callback);
603 }
604 
SelectBitRate(uint32_t bitRate)605 int32_t PlayerServerMem::SelectBitRate(uint32_t bitRate)
606 {
607     std::unique_lock<std::mutex> lock(mutex_);
608     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
609 
610     lastestUserSetTime_ = std::chrono::steady_clock::now();
611     recoverConfig_.bitRate = bitRate;
612     return PlayerServer::SelectBitRate(bitRate);
613 }
614 
SelectTrack(int32_t index,PlayerSwitchMode mode)615 int32_t PlayerServerMem::SelectTrack(int32_t index, PlayerSwitchMode mode)
616 {
617     std::unique_lock<std::mutex> lock(mutex_);
618     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
619 
620     lastestUserSetTime_ = std::chrono::steady_clock::now();
621     return PlayerServer::SelectTrack(index, mode);
622 }
623 
DeselectTrack(int32_t index)624 int32_t PlayerServerMem::DeselectTrack(int32_t index)
625 {
626     std::unique_lock<std::mutex> lock(mutex_);
627     CHECK_AND_RETURN_RET_LOG(RecoverMemByUser() == MSERR_OK, MSERR_INVALID_OPERATION, "RecoverMemByUser fail");
628 
629     lastestUserSetTime_ = std::chrono::steady_clock::now();
630     return PlayerServer::DeselectTrack(index);
631 }
632 
GetCurrentTrack(int32_t trackType,int32_t & index)633 int32_t PlayerServerMem::GetCurrentTrack(int32_t trackType, int32_t &index)
634 {
635     std::unique_lock<std::mutex> lock(mutex_);
636     if (isLocalResource_ && isReleaseMemByManage_) {
637         if (trackType == MediaType::MEDIA_TYPE_AUD) {
638             index = recoverConfig_.audioIndex;
639         } else if (trackType == MediaType::MEDIA_TYPE_VID) {
640             index = recoverConfig_.videoIndex;
641         } else if (trackType == MediaType::MEDIA_TYPE_SUBTITLE) {
642             index = recoverConfig_.textIndex;
643         }  else {
644             MEDIA_LOGE("User call GetCurrentTrack, Invalid trackType %{public}d", trackType);
645             return MSERR_INVALID_OPERATION;
646         }
647 
648         MEDIA_LOGI("User call GetCurrentTrack, type %{public}d, index %{public}d", trackType, index);
649         return MSERR_OK;
650     }
651     return PlayerServer::GetCurrentTrack(trackType, index);
652 }
653 
DumpInfo(int32_t fd)654 int32_t PlayerServerMem::DumpInfo(int32_t fd)
655 {
656     PlayerServer::DumpInfo(fd);
657     std::string dumpString;
658     dumpString += "PlayerServer has been reset by memory manage: ";
659     if (isReleaseMemByManage_) {
660         dumpString += "Yes\n";
661     } else {
662         dumpString += "No\n";
663     }
664     write(fd, dumpString.c_str(), dumpString.size());
665 
666     return MSERR_OK;
667 }
668 
HandleCodecBuffers(bool enable)669 int32_t PlayerServerMem::HandleCodecBuffers(bool enable)
670 {
671     std::lock_guard<std::mutex> lock(PlayerServer::mutex_);
672     CHECK_AND_RETURN_RET_LOG(playerEngine_ != nullptr, MSERR_NO_MEMORY, "playerEngine_ is nullptr");
673     MEDIA_LOGD("HandleCodecBuffers in, enable:%{public}d", enable);
674 
675     if (lastOpStatus_ != PLAYER_PREPARED && lastOpStatus_ != PLAYER_PAUSED &&
676         lastOpStatus_ != PLAYER_PLAYBACK_COMPLETE) {
677         MEDIA_LOGE("0x%{public}06" PRIXPTR " Instance Can not HandleCodecBuffers, currentState is %{public}s",
678             FAKE_POINTER(this), GetStatusDescription(lastOpStatus_).c_str());
679         return MSERR_INVALID_OPERATION;
680     }
681     return playerEngine_->HandleCodecBuffers(enable);
682 }
683 
SeekToCurrentTime(int32_t mSeconds,PlayerSeekMode mode)684 int32_t PlayerServerMem::SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode)
685 {
686     std::lock_guard<std::mutex> lock(PlayerServer::mutex_);
687     CHECK_AND_RETURN_RET_LOG(playerEngine_ != nullptr, MSERR_NO_MEMORY, "playerEngine_ is nullptr");
688 
689     if (lastOpStatus_ != PLAYER_PLAYBACK_COMPLETE && lastOpStatus_ != PLAYER_PAUSED &&
690         lastOpStatus_ != PLAYER_PREPARED) {
691         MEDIA_LOGE("Can not Seek, currentState is %{public}s", GetStatusDescription(lastOpStatus_).c_str());
692         return MSERR_INVALID_OPERATION;
693     }
694 
695     CHECK_AND_RETURN_RET_LOG(IsValidSeekMode(mode) == true, MSERR_INVALID_VAL, "Seek failed, inValid mode");
696 
697     if (isLiveStream_) {
698         MEDIA_LOGE("Can not Seek, it is live-stream.");
699         OnErrorMessage(MSERR_EXT_API9_UNSUPPORT_CAPABILITY, "Can not Seek, it is live-stream.");
700         return MSERR_INVALID_OPERATION;
701     }
702 
703     MEDIA_LOGD("seek position %{public}d, seek mode is %{public}d.", mSeconds, mode);
704     mSeconds = std::max(0, mSeconds);
705 
706     auto seekTask = std::make_shared<TaskHandler<void>>([this, mSeconds, mode]() {
707         MediaTrace::TraceBegin("PlayerServerMem::Seek", FAKE_POINTER(this));
708         playerEngine_->SeekToCurrentTime(mSeconds, mode);
709     });
710 
711     auto cancelTask = std::make_shared<TaskHandler<void>>([&, this]() {
712         MEDIA_LOGI("Interrupted seek action");
713         taskMgr_.MarkTaskDone("interrupted seek done");
714     });
715     isSeekToCurrentTime_ = true;
716     int32_t ret = taskMgr_.SeekTask(seekTask, cancelTask, "seek", mode, mSeconds);
717     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "Seek failed");
718     recoverCond_.notify_all();
719     return MSERR_OK;
720 }
721 
OnInfo(PlayerOnInfoType type,int32_t extra,const Format & infoBody)722 void PlayerServerMem::OnInfo(PlayerOnInfoType type, int32_t extra, const Format &infoBody)
723 {
724     if (isLocalResource_) {
725         std::unique_lock<std::mutex> lockCb(mutexCb_);
726         GetDefaultTrack(type, extra, infoBody);
727         PlayerServer::OnInfo(type, extra, infoBody);
728         CheckHasRecover(type, extra);
729     } else {
730         if (isSeekToCurrentTime_ && type == INFO_TYPE_SEEKDONE) {
731             MediaTrace::TraceEnd("PlayerServerMem::Seek", FAKE_POINTER(this));
732             std::lock_guard<std::mutex> lockCb(PlayerServer::mutexCb_);
733             isSeekToCurrentTime_ = false;
734             recoverCond_.notify_all();
735             PlayerServer::HandleMessage(type, extra, infoBody);
736         } else {
737             PlayerServer::OnInfo(type, extra, infoBody);
738         }
739     }
740 }
741 
GetInformationBeforeMemReset()742 int32_t PlayerServerMem::GetInformationBeforeMemReset()
743 {
744     auto ret = PlayerServer::GetCurrentTime(recoverConfig_.currentTime);
745     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetCurrentTime");
746     ret = PlayerServer::GetVideoTrackInfo(recoverConfig_.videoTrack);
747     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetVideoTrack");
748     ret = PlayerServer::GetAudioTrackInfo(recoverConfig_.audioTrack);
749     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetAudioTrack");
750 
751     ret = PlayerServer::GetCurrentTrack(MediaType::MEDIA_TYPE_AUD, recoverConfig_.audioIndex);
752     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetCurrentTrack");
753     ret = PlayerServer::GetCurrentTrack(MediaType::MEDIA_TYPE_VID, recoverConfig_.videoIndex);
754     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetCurrentTrack");
755     ret = PlayerServer::GetCurrentTrack(MediaType::MEDIA_TYPE_SUBTITLE, recoverConfig_.textIndex);
756     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetCurrentTrack");
757 
758     recoverConfig_.videoWidth = PlayerServer::GetVideoWidth();
759     recoverConfig_.videoHeight = PlayerServer::GetVideoHeight();
760     ret = PlayerServer::GetDuration(recoverConfig_.duration);
761     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_INVALID_OPERATION, "failed to GetDuration");
762     recoverConfig_.isPlaying = PlayerServer::IsPlaying();
763     recoverConfig_.effectMode = config_.effectMode;
764     GetPlayerServerConfig();
765 
766     return MSERR_OK;
767 }
768 
LocalResourceRelease()769 int32_t PlayerServerMem::LocalResourceRelease()
770 {
771     if (isReleaseMemByManage_ || isRecoverMemByUser_) {
772         return MSERR_OK;
773     }
774 
775     auto itSatetMap = stateMap_.find(GetCurrState().get());
776     CHECK_AND_RETURN_RET_LOG(itSatetMap != stateMap_.end(), MSERR_INVALID_OPERATION, "Not find correct stateMap");
777 
778     recoverConfig_.currState = itSatetMap->second;
779     auto ret = recoverConfig_.currState->MemStateRelease();
780     CHECK_AND_RETURN_RET(ret != MSERR_INVALID_STATE, MSERR_OK);
781 
782     playerCb_ = nullptr;
783     ClearConfigInfo();
784     ret = PlayerServer::Reset();
785     CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "PlayerServer::Reset fail");
786 
787     isReleaseMemByManage_ = true;
788     MEDIA_LOGI("exit");
789     return ret;
790 }
791 
NetworkResourceRelease()792 int32_t PlayerServerMem::NetworkResourceRelease()
793 {
794     if (!isReleaseMemByManage_) {
795         MediaTrace trace("PlayerServerMem::ReleaseMemByManage");
796         MEDIA_LOGI("0x%{public}06" PRIXPTR " Instance NetworkResourceRelease enter", FAKE_POINTER(this));
797         int32_t ret = HandleCodecBuffers(true);
798         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "0x%{public}06" PRIXPTR " Instance FreeCodecBuffers Fail",
799             FAKE_POINTER(this));
800         isReleaseMemByManage_ = true;
801         MEDIA_LOGI("0x%{public}06" PRIXPTR " Instance NetworkResourceRelease success", FAKE_POINTER(this));
802     }
803     return MSERR_OK;
804 }
805 
ReleaseMemByManage()806 int32_t PlayerServerMem::ReleaseMemByManage()
807 {
808     if (isLocalResource_) {
809         return LocalResourceRelease();
810     } else {
811         return NetworkResourceRelease();
812     }
813 }
814 
LocalResourceRecover()815 int32_t PlayerServerMem::LocalResourceRecover()
816 {
817     if (!isReleaseMemByManage_ || isRecoverMemByUser_) {
818         return MSERR_OK;
819     }
820     MEDIA_LOGI("Enter, currState:%{public}s", recoverConfig_.currState->GetStateName().c_str());
821 
822     isReleaseMemByManage_ = false;
823     isRecoverMemByUser_ = true;
824     auto ret = recoverConfig_.currState->MemStateRecover();
825     if (ret != MSERR_OK) {
826         MEDIA_LOGE("StateRecover fail");
827         isReleaseMemByManage_ = true;
828         isRecoverMemByUser_ = false;
829         return ret;
830     }
831 
832     MEDIA_LOGI("exit");
833     return ret;
834 }
835 
NetworkRecover()836 int32_t PlayerServerMem::NetworkRecover()
837 {
838     if (isReleaseMemByManage_) {
839         MediaTrace trace("PlayerServerMem::RecoverMemByUser");
840         MEDIA_LOGI("enter");
841         int32_t ret = HandleCodecBuffers(false);
842         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "RecoverCodecBuffers Fail");
843         int32_t currentTime = 0;
844         if (!IsCompleted()) {
845             ret = PlayerServer::GetCurrentTime(currentTime);
846             CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "GetCurrentTime Fail");
847         }
848         ret = SeekToCurrentTime(currentTime, SEEK_CLOSEST);
849         CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "Seek Fail");
850         isReleaseMemByManage_ = false;
851         MEDIA_LOGI("exit");
852     }
853     return MSERR_OK;
854 }
855 
RecoverMemByUser()856 int32_t PlayerServerMem::RecoverMemByUser()
857 {
858     if (isLocalResource_) {
859         return LocalResourceRecover();
860     } else {
861         return NetworkRecover();
862     }
863 }
864 
RecoverPlayerCb()865 int32_t PlayerServerMem::RecoverPlayerCb()
866 {
867     MEDIA_LOGI("enter");
868     if (recoverConfig_.callback != nullptr) {
869         playerCb_ = recoverConfig_.callback;
870     }
871     isRecoverMemByUser_ = false;
872     recoverCond_.notify_all();
873     return MSERR_OK;
874 }
875 
RecoverToInitialized(PlayerOnInfoType type,int32_t extra)876 void PlayerServerMem::RecoverToInitialized(PlayerOnInfoType type, int32_t extra)
877 {
878     if (type == INFO_TYPE_STATE_CHANGE && extra == PLAYER_INITIALIZED) {
879         (void)RecoverPlayerCb();
880     }
881 }
882 
RecoverToPrepared(PlayerOnInfoType type,int32_t extra)883 void PlayerServerMem::RecoverToPrepared(PlayerOnInfoType type, int32_t extra)
884 {
885     if (NeedSelectAudioTrack() && type == INFO_TYPE_TRACKCHANGE) {
886         (void)RecoverPlayerCb();
887     } else if (recoverConfig_.currentTime != 0 && type == INFO_TYPE_SEEKDONE) {
888         (void)RecoverPlayerCb();
889     } else if (recoverConfig_.speedMode != SPEED_FORWARD_1_00_X && type == INFO_TYPE_SPEEDDONE) {
890         (void)RecoverPlayerCb();
891     } else if (type == INFO_TYPE_STATE_CHANGE && extra == PLAYER_PREPARED) {
892         (void)RecoverPlayerCb();
893         (void)AddSubSourceInternal();
894     }
895 }
896 
RecoverToCompleted(PlayerOnInfoType type,int32_t extra)897 void PlayerServerMem::RecoverToCompleted(PlayerOnInfoType type, int32_t extra)
898 {
899     if (NeedSelectAudioTrack() && type == INFO_TYPE_TRACKCHANGE) {
900         (void)RecoverPlayerCb();
901     } else if (recoverConfig_.speedMode != SPEED_FORWARD_1_00_X && type == INFO_TYPE_SPEEDDONE) {
902         (void)RecoverPlayerCb();
903     } else if (type == INFO_TYPE_STATE_CHANGE && extra == PLAYER_PREPARED) {
904         (void)RecoverPlayerCb();
905         (void)AddSubSourceInternal();
906     }
907 }
908 
CheckHasRecover(PlayerOnInfoType type,int32_t extra)909 void PlayerServerMem::CheckHasRecover(PlayerOnInfoType type, int32_t extra)
910 {
911     if (isRecoverMemByUser_) {
912         MEDIA_LOGI("enter, type:%{public}d, extra:%{public}d", type, extra);
913         recoverConfig_.currState->MemPlayerCbRecover(type, extra);
914     }
915 }
916 
ResetFrontGroundForMemManage()917 void PlayerServerMem::ResetFrontGroundForMemManage()
918 {
919     std::unique_lock<std::mutex> lock(mutex_);
920     if (!PlayerServer::IsPrepared() || isAudioPlayer_) {
921         continueReset = 0;
922         return;
923     }
924     if (continueReset < CONTINUE_RESET_MAX_NUM) {
925         continueReset++;
926         return;
927     }
928     continueReset = 0;
929 
930     std::chrono::duration<double> lastSetToNow = std::chrono::duration_cast<
931         std::chrono::duration<double>>(std::chrono::steady_clock::now() - lastestUserSetTime_);
932     if (lastSetToNow.count() > APP_FRONT_GROUND_DESTROY_MEMERY_LAST_SET_TIME) {
933         ReleaseMemByManage();
934     }
935 }
936 
ResetBackGroundForMemManage()937 void PlayerServerMem::ResetBackGroundForMemManage()
938 {
939     std::unique_lock<std::mutex> lock(mutex_);
940     if (isAudioPlayer_ || PlayerServer::IsPlaying()) {
941         continueReset = 0;
942         return;
943     }
944     if (continueReset < CONTINUE_RESET_MAX_NUM) {
945         continueReset++;
946         return;
947     }
948     continueReset = 0;
949 
950     std::chrono::duration<double> lastSetToNow = std::chrono::duration_cast<std::chrono::duration<double>>(
951         std::chrono::steady_clock::now() - lastestUserSetTime_);
952     if (lastSetToNow.count() > APP_BACK_GROUND_DESTROY_MEMERY_LAST_SET_TIME) {
953         ReleaseMemByManage();
954     }
955 }
956 
ResetMemmgrForMemManage()957 void PlayerServerMem::ResetMemmgrForMemManage()
958 {
959     std::unique_lock<std::mutex> lock(mutex_);
960     if (!(isAudioPlayer_ || PlayerServer::IsPlaying())) {
961         ReleaseMemByManage();
962     }
963 }
964 
RecoverByMemManage()965 void PlayerServerMem::RecoverByMemManage()
966 {
967     std::unique_lock<std::mutex> lock(mutex_);
968     CHECK_AND_RETURN_LOG(RecoverMemByUser() == MSERR_OK, "RecoverMemByUser fail");
969 }
970 
NeedSelectAudioTrack()971 bool PlayerServerMem::NeedSelectAudioTrack()
972 {
973     return (recoverConfig_.audioIndex >= 0 && defaultAudioIndex_ >= 0 &&
974         recoverConfig_.audioIndex != defaultAudioIndex_);
975 }
976 
GetDefaultTrack(PlayerOnInfoType type,int32_t extra,const Format & infoBody)977 void PlayerServerMem::GetDefaultTrack(PlayerOnInfoType type, int32_t extra, const Format &infoBody)
978 {
979     (void)extra;
980     if (type == INFO_TYPE_DEFAULTTRACK) {
981         int32_t mediaType = -1;
982         (void)infoBody.GetIntValue(std::string(PlayerKeys::PLAYER_TRACK_TYPE), mediaType);
983         if (mediaType == MediaType::MEDIA_TYPE_AUD) {
984             infoBody.GetIntValue(std::string(PlayerKeys::PLAYER_TRACK_INDEX), defaultAudioIndex_);
985             MEDIA_LOGI("default audio track index %{public}d", defaultAudioIndex_);
986         }
987         return;
988     }
989 }
990 }
991 }