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