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