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