1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "media_server_manager.h"
17 #include <unordered_set>
18 #ifdef SUPPORT_RECORDER
19 #include "recorder_service_stub.h"
20 #include "recorder_profiles_service_stub.h"
21 #endif
22 #ifdef SUPPORT_TRANSCODER
23 #include "transcoder_service_stub.h"
24 #endif
25 #ifdef SUPPORT_PLAYER
26 #include "player_service_stub.h"
27 #ifdef PLAYER_USE_MEMORY_MANAGE
28 #include "player_service_stub_mem.h"
29 #endif
30 #endif
31 #ifdef SUPPORT_METADATA
32 #include "avmetadatahelper_service_stub.h"
33 #endif
34 #ifdef SUPPORT_SCREEN_CAPTURE
35 #include "screen_capture_service_stub.h"
36 #include "screen_capture_monitor_service_stub.h"
37 #include "screen_capture_controller_stub.h"
38 #endif
39 #ifdef SUPPORT_LPP_AUDIO_STRAMER
40 #include "lpp_audio_streamer_service_stub.h"
41 #endif
42 #ifdef SUPPORT_LPP_VIDEO_STRAMER
43 #include "lpp_video_streamer_service_stub.h"
44 #endif
45 #include "monitor_service_stub.h"
46 #include "media_log.h"
47 #include "media_errors.h"
48 #include "media_dfx.h"
49 #include "service_dump_manager.h"
50 #include "player_xcollie.h"
51 #include "client/memory_collector_client.h"
52 #include <set>
53
54 namespace {
55 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_PLAYER, "MediaServerManager"};
56 constexpr uint32_t REPORT_TIME = 100000000; // us
57 constexpr int32_t RELEASE_THRESHOLD = 3; // relese task
58 }
59
60 namespace OHOS {
61 namespace Media {
62 constexpr uint32_t SERVER_MAX_NUMBER = 16;
GetInstance()63 MediaServerManager &MediaServerManager::GetInstance()
64 {
65 static MediaServerManager instance;
66 return instance;
67 }
68
WriteInfo(int32_t fd,std::string & dumpString,std::vector<Dumper> dumpers,bool needDetail)69 int32_t WriteInfo(int32_t fd, std::string &dumpString, std::vector<Dumper> dumpers, bool needDetail)
70 {
71 int32_t i = 0;
72 for (auto iter : dumpers) {
73 dumpString += "-----#" + std::to_string(i) + ": ";
74 dumpString += "pid = ";
75 dumpString += std::to_string(iter.pid_);
76 if (iter.insFakePointer_.size() > 0) {
77 dumpString += " ins = ";
78 dumpString += iter.insFakePointer_;
79 }
80 if (iter.createInsTime_ > 0) {
81 std::tm *pTm = std::localtime(&(iter.createInsTime_));
82 if (pTm != nullptr) {
83 dumpString += " time = ";
84 dumpString += std::to_string(pTm->tm_mon + 1) + "-" + std::to_string(pTm->tm_mday) + " " +
85 std::to_string(pTm->tm_hour) + ":" + std::to_string(pTm->tm_min) + ":" +
86 std::to_string(pTm->tm_sec);
87 }
88 }
89 dumpString += "-----\n";
90 if (fd != -1) {
91 write(fd, dumpString.c_str(), dumpString.size());
92 dumpString.clear();
93 }
94 i++;
95 if (needDetail && iter.entry_(fd) != MSERR_OK) {
96 return OHOS::INVALID_OPERATION;
97 }
98 }
99 if (fd != -1) {
100 write(fd, dumpString.c_str(), dumpString.size());
101 } else {
102 MEDIA_LOGD("%{public}s", dumpString.c_str());
103 }
104 dumpString.clear();
105
106 return OHOS::NO_ERROR;
107 }
108
Dump(int32_t fd,const std::vector<std::u16string> & args)109 int32_t MediaServerManager::Dump(int32_t fd, const std::vector<std::u16string> &args)
110 {
111 std::string dumpString;
112 std::unordered_set<std::u16string> argSets;
113 for (decltype(args.size()) index = 0; index < args.size(); ++index) {
114 argSets.insert(args[index]);
115 }
116
117 dumpString += "------------------PlayerServer------------------\n";
118 auto ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::PLAYER],
119 argSets.find(u"player") != argSets.end());
120 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
121 OHOS::INVALID_OPERATION, "Failed to write PlayerServer information");
122
123 dumpString += "------------------RecorderServer------------------\n";
124 ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::RECORDER],
125 argSets.find(u"recorder") != argSets.end());
126 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
127 OHOS::INVALID_OPERATION, "Failed to write RecorderServer information");
128
129 dumpString += "------------------CodecServer------------------\n";
130 ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::AVCODEC],
131 argSets.find(u"codec") != argSets.end());
132 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
133 OHOS::INVALID_OPERATION, "Failed to write CodecServer information");
134
135 dumpString += "------------------AVMetaServer------------------\n";
136 ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::AVMETADATAHELPER], false);
137 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
138 OHOS::INVALID_OPERATION, "Failed to write AVMetaServer information");
139
140 dumpString += "------------------TranscoderServer------------------\n";
141 ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::TRANSCODER],
142 argSets.find(u"transcoder") != argSets.end());
143 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
144 OHOS::INVALID_OPERATION, "Failed to write Transcoder information");
145
146 dumpString += "------------------ScreenCaptureServer------------------\n";
147 ret = WriteInfo(fd, dumpString, dumperTbl_[StubType::SCREEN_CAPTURE],
148 argSets.find(u"screencapture") != argSets.end());
149 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
150 OHOS::INVALID_OPERATION, "Failed to write ScreenCapture information");
151
152 ret = ServiceDumpManager::GetInstance().Dump(fd, argSets);
153 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
154 OHOS::INVALID_OPERATION, "Failed to write dfx dump information");
155
156 ret = PlayerXCollie::GetInstance().Dump(fd);
157 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
158 OHOS::INVALID_OPERATION, "Failed to write xcollie dump information");
159
160 ret = MonitorServiceStub::GetInstance()->DumpInfo(fd,
161 argSets.find(u"monitor") != argSets.end());
162 CHECK_AND_RETURN_RET_LOG(ret == NO_ERROR,
163 OHOS::INVALID_OPERATION, "Failed to write monitor dump information");
164 return OHOS::NO_ERROR;
165 }
166
MediaServerManager()167 MediaServerManager::MediaServerManager()
168 {
169 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
170 }
171
~MediaServerManager()172 MediaServerManager::~MediaServerManager()
173 {
174 std::unique_ptr<Task> memoryReportTask;
175 {
176 std::lock_guard<std::mutex> lock(mutex_);
177 memoryReportTask = std::move(memoryReportTask_);
178 }
179 if (memoryReportTask) {
180 memoryReportTask->Stop();
181 }
182 playerPidMem_.clear();
183 dumperTbl_.clear();
184 recorderStubMap_.clear();
185 playerStubMap_.clear();
186 avMetadataHelperStubMap_.clear();
187 avCodecListStubMap_.clear();
188 avCodecStubMap_.clear();
189 recorderProfilesStubMap_.clear();
190 screenCaptureStubMap_.clear();
191 screenCaptureMonitorStubMap_.clear();
192 screenCaptureControllerStubMap_.clear();
193 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
194 }
195
FreezeStubForPids(const std::set<int32_t> & pidList,bool isProxy)196 int32_t MediaServerManager::FreezeStubForPids(const std::set<int32_t> &pidList, bool isProxy)
197 {
198 std::lock_guard<std::mutex> lock(mutex_);
199 for (const auto &pid : pidList) {
200 auto pidIt = pidToPlayerStubMap_.find(pid);
201 if (pidIt == pidToPlayerStubMap_.end()) {
202 MEDIA_LOGD("PID(%{public}d) has no player stubs, skip freeze", pid);
203 continue;
204 }
205
206 const auto &stubSet = pidIt->second;
207 MEDIA_LOGI("Freezing %{public}zu player stubs for PID = %{public}d, isProxy: %{public}d",
208 stubSet.size(), pid, isProxy);
209
210 for (const auto &stubObj : stubSet) {
211 auto playerStub = iface_cast<PlayerServiceStub>(stubObj);
212 CHECK_AND_CONTINUE_LOG(playerStub != nullptr,
213 "failed to cast PlayerServiceStub, pid = %{public}d", pid);
214
215 if (isProxy) {
216 playerStub->Freeze();
217 } else {
218 playerStub->UnFreeze();
219 }
220 }
221 }
222 return MSERR_OK;
223 }
224
ResetAllProxy()225 int32_t MediaServerManager::ResetAllProxy()
226 {
227 std::lock_guard<std::mutex> lock(mutex_);
228 MEDIA_LOGI("received ResetAllProxy");
229 for (const auto &pidEntry : pidToPlayerStubMap_) {
230 for (const auto &remoteObj : pidEntry.second) {
231 auto playerStub = iface_cast<PlayerServiceStub>(remoteObj);
232 CHECK_AND_CONTINUE_LOG(playerStub != nullptr,
233 "failed to cast PlayerServiceStub, pid = %{public}d", pidEntry.first);
234 playerStub->UnFreeze();
235 }
236 }
237 return MSERR_OK;
238 }
239
CreateStubObject(StubType type)240 sptr<IRemoteObject> MediaServerManager::CreateStubObject(StubType type)
241 {
242 std::lock_guard<std::mutex> lock(mutex_);
243 switch (type) {
244 #ifdef SUPPORT_RECORDER
245 case RECORDER:
246 return CreateRecorderStubObject();
247 case RECORDERPROFILES:
248 return CreateRecorderProfilesStubObject();
249 #endif
250 #ifdef SUPPORT_TRANSCODER
251 case TRANSCODER:
252 return CreateTransCoderStubObject();
253 #endif
254 #ifdef SUPPORT_PLAYER
255 case PLAYER:
256 return CreatePlayerStubObject();
257 #endif
258 #ifdef SUPPORT_METADATA
259 case AVMETADATAHELPER:
260 return CreateAVMetadataHelperStubObject();
261 #endif
262 #ifdef SUPPORT_SCREEN_CAPTURE
263 case SCREEN_CAPTURE:
264 return CreateScreenCaptureStubObject();
265 case SCREEN_CAPTURE_MONITOR:
266 return CreateScreenCaptureMonitorStubObject();
267 case SCREEN_CAPTURE_CONTROLLER:
268 return CreateScreenCaptureControllerStubObject();
269 #endif
270 #ifdef SUPPORT_LPP_AUDIO_STRAMER
271 case LPP_AUDIO_PLAYER:
272 MEDIA_LOGI("LPP_AUDIO_PLAYER start");
273 return CreateLppAudioPlayerStubObject();
274 #endif
275 #ifdef SUPPORT_LPP_VIDEO_STRAMER
276 case LPP_VIDEO_PLAYER:
277 MEDIA_LOGI("LPP_VIDEO_PLAYER start");
278 return CreateLppVideoPlayerStubObject();
279 #endif
280 case MONITOR:
281 return GetMonitorStubObject();
282 default:
283 MEDIA_LOGE("default case, media server manager failed");
284 return nullptr;
285 }
286 }
287
288 #ifdef SUPPORT_PLAYER
CreatePlayerStubObject()289 sptr<IRemoteObject> MediaServerManager::CreatePlayerStubObject()
290 {
291 #ifdef PLAYER_USE_MEMORY_MANAGE
292 sptr<PlayerServiceStub> playerStub;
293 if (isMemMgrLoaded_.load()) {
294 playerStub = PlayerServiceStubMem::Create();
295 } else {
296 MEDIA_LOGW("create player stub object when memmgr has not been loaded");
297 playerStub = PlayerServiceStub::Create();
298 }
299 #else
300 sptr<PlayerServiceStub> playerStub = PlayerServiceStub::Create();
301 #endif
302 CHECK_AND_RETURN_RET_LOG(playerStub != nullptr, nullptr, "failed to create PlayerServiceStub");
303 std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
304 const uint8_t MAX_INSTANCE_LENGTH = 255;
305 char text[MAX_INSTANCE_LENGTH];
306 auto ret = sprintf_s(text, MAX_INSTANCE_LENGTH, "0x%06" PRIXPTR, FAKE_POINTER(playerStub.GetRefPtr()));
307 std::string InsPointerStr = "";
308 if (ret > 0) {
309 InsPointerStr.assign(text, ret);
310 }
311
312 sptr<IRemoteObject> object = playerStub->AsObject();
313 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create PlayerServiceStub");
314
315 pid_t pid = IPCSkeleton::GetCallingPid();
316 playerStubMap_[object] = pid;
317
318 StartMemoryReportTask();
319
320 auto &instanceSet = pidToPlayerStubMap_[pid];
321 instanceSet.insert(object);
322
323 Dumper dumper;
324 dumper.entry_ = [player = playerStub](int32_t fd) -> int32_t {
325 return player->DumpInfo(fd);
326 };
327 dumper.pid_ = pid;
328 dumper.uid_ = IPCSkeleton::GetCallingUid();
329 dumper.createInsTime_ = now;
330 dumper.insFakePointer_ = InsPointerStr;
331 dumper.remoteObject_ = object;
332 dumperTbl_[StubType::PLAYER].emplace_back(dumper);
333 MEDIA_LOGD("The number of player services(%{public}zu) pid(%{public}d).",
334 playerStubMap_.size(), pid);
335 MediaTrace::CounterTrace("The number of player", playerStubMap_.size());
336 (void)Dump(-1, std::vector<std::u16string>());
337 return object;
338 }
339 #endif
340
341 #ifdef SUPPORT_RECORDER
CreateRecorderStubObject()342 sptr<IRemoteObject> MediaServerManager::CreateRecorderStubObject()
343 {
344 sptr<RecorderServiceStub> recorderStub = RecorderServiceStub::Create();
345 CHECK_AND_RETURN_RET_LOG(recorderStub != nullptr, nullptr, "failed to create RecorderServiceStub");
346
347 sptr<IRemoteObject> object = recorderStub->AsObject();
348 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create RecorderServiceStub");
349
350 pid_t pid = IPCSkeleton::GetCallingPid();
351 recorderStubMap_[object] = pid;
352
353 Dumper dumper;
354 dumper.entry_ = [recorder = recorderStub](int32_t fd) -> int32_t {
355 return recorder->DumpInfo(fd);
356 };
357 dumper.pid_ = pid;
358 dumper.uid_ = IPCSkeleton::GetCallingUid();
359 dumper.remoteObject_ = object;
360 dumperTbl_[StubType::RECORDER].emplace_back(dumper);
361 MEDIA_LOGD("The number of recorder services(%{public}zu) pid(%{public}d).",
362 recorderStubMap_.size(), pid);
363 (void)Dump(-1, std::vector<std::u16string>());
364 return object;
365 }
366
CreateRecorderProfilesStubObject()367 sptr<IRemoteObject> MediaServerManager::CreateRecorderProfilesStubObject()
368 {
369 CHECK_AND_RETURN_RET_LOG(recorderProfilesStubMap_.size() < SERVER_MAX_NUMBER,
370 nullptr, "The number of recorder_profiles services(%{public}zu) has reached the upper limit."
371 "Please release the applied resources.", recorderProfilesStubMap_.size());
372
373 sptr<RecorderProfilesServiceStub> recorderProfilesStub = RecorderProfilesServiceStub::Create();
374 CHECK_AND_RETURN_RET_LOG(recorderProfilesStub != nullptr, nullptr,
375 "failed to create recorderProfilesStub");
376
377 sptr<IRemoteObject> object = recorderProfilesStub->AsObject();
378 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create recorderProfilesStub");
379
380 pid_t pid = IPCSkeleton::GetCallingPid();
381 recorderProfilesStubMap_[object] = pid;
382 MEDIA_LOGD("The number of recorder_profiles services(%{public}zu).", recorderProfilesStubMap_.size());
383 return object;
384 }
385 #endif
386
387 #ifdef SUPPORT_TRANSCODER
CreateTransCoderStubObject()388 sptr<IRemoteObject> MediaServerManager::CreateTransCoderStubObject()
389 {
390 sptr<TransCoderServiceStub> transCoderStub = TransCoderServiceStub::Create();
391 CHECK_AND_RETURN_RET_LOG(transCoderStub != nullptr, nullptr, "failed to create TransCoderServiceStub");
392
393 sptr<IRemoteObject> object = transCoderStub->AsObject();
394 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create TransCoderServiceStub");
395
396 pid_t pid = IPCSkeleton::GetCallingPid();
397 transCoderStubMap_[object] = pid;
398
399 Dumper dumper;
400 dumper.entry_ = [transCoder = transCoderStub](int32_t fd) -> int32_t {
401 return transCoder->DumpInfo(fd);
402 };
403 dumper.pid_ = pid;
404 dumper.uid_ = IPCSkeleton::GetCallingUid();
405 dumper.remoteObject_ = object;
406 dumperTbl_[StubType::TRANSCODER].emplace_back(dumper);
407 MEDIA_LOGD("The number of transCoder services(%{public}zu) pid(%{public}d).",
408 transCoderStubMap_.size(), pid);
409 (void)Dump(-1, std::vector<std::u16string>());
410 return object;
411 }
412 #endif
413
414 #ifdef SUPPORT_METADATA
CreateAVMetadataHelperStubObject()415 sptr<IRemoteObject> MediaServerManager::CreateAVMetadataHelperStubObject()
416 {
417 sptr<AVMetadataHelperServiceStub> avMetadataHelperStub = AVMetadataHelperServiceStub::Create();
418 CHECK_AND_RETURN_RET_LOG(avMetadataHelperStub != nullptr, nullptr,
419 "failed to create AVMetadataHelperServiceStub");
420
421 sptr<IRemoteObject> object = avMetadataHelperStub->AsObject();
422 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr,
423 "failed to create AVMetadataHelperServiceStub");
424
425 pid_t pid = IPCSkeleton::GetCallingPid();
426 avMetadataHelperStubMap_[object] = pid;
427
428 Dumper dumper;
429 dumper.pid_ = pid;
430 dumper.uid_ = IPCSkeleton::GetCallingUid();
431 dumper.remoteObject_ = object;
432 dumperTbl_[StubType::AVMETADATAHELPER].emplace_back(dumper);
433
434 MEDIA_LOGD("The number of avmetadatahelper services(%{public}zu) pid(%{public}d).",
435 avMetadataHelperStubMap_.size(), pid);
436 (void)Dump(-1, std::vector<std::u16string>());
437 return object;
438 }
439 #endif
440
441 #ifdef SUPPORT_SCREEN_CAPTURE
CreateScreenCaptureStubObject()442 sptr<IRemoteObject> MediaServerManager::CreateScreenCaptureStubObject()
443 {
444 sptr<ScreenCaptureServiceStub> screenCaptureStub = ScreenCaptureServiceStub::Create();
445 CHECK_AND_RETURN_RET_LOG(screenCaptureStub != nullptr, nullptr,
446 "failed to create ScreenCaptureServiceStub");
447
448 sptr<IRemoteObject> object = screenCaptureStub->AsObject();
449 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create ScreenCaptureServiceStub");
450
451 pid_t pid = IPCSkeleton::GetCallingPid();
452 screenCaptureStubMap_[object] = pid;
453
454 Dumper dumper;
455 dumper.pid_ = pid;
456 dumper.uid_ = IPCSkeleton::GetCallingUid();
457 dumper.remoteObject_ = object;
458 dumperTbl_[StubType::SCREEN_CAPTURE].emplace_back(dumper);
459 MEDIA_LOGD("The number of screen capture services(%{public}zu).", screenCaptureStubMap_.size());
460 (void)Dump(-1, std::vector<std::u16string>());
461 return object;
462 }
463
CreateScreenCaptureMonitorStubObject()464 sptr<IRemoteObject> MediaServerManager::CreateScreenCaptureMonitorStubObject()
465 {
466 sptr<ScreenCaptureMonitorServiceStub> screenCaptureMonitorStub = ScreenCaptureMonitorServiceStub::Create();
467 CHECK_AND_RETURN_RET_LOG(screenCaptureMonitorStub != nullptr, nullptr,
468 "failed to create ScreenCaptureMonitorServiceStub");
469
470 sptr<IRemoteObject> object = screenCaptureMonitorStub->AsObject();
471 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create ScreenCaptureMonitorServiceStub");
472
473 pid_t pid = IPCSkeleton::GetCallingPid();
474 screenCaptureMonitorStubMap_[object] = pid;
475
476 Dumper dumper;
477 dumper.pid_ = pid;
478 dumper.uid_ = IPCSkeleton::GetCallingUid();
479 dumper.remoteObject_ = object;
480 dumperTbl_[StubType::SCREEN_CAPTURE_MONITOR].emplace_back(dumper);
481 MEDIA_LOGD("The number of screen capture monitor services(%{public}zu).", screenCaptureMonitorStubMap_.size());
482 (void)Dump(-1, std::vector<std::u16string>());
483 return object;
484 }
485
CreateScreenCaptureControllerStubObject()486 sptr<IRemoteObject> MediaServerManager::CreateScreenCaptureControllerStubObject()
487 {
488 sptr<ScreenCaptureControllerStub> screenCaptureControllerStub = ScreenCaptureControllerStub::Create();
489 CHECK_AND_RETURN_RET_LOG(screenCaptureControllerStub != nullptr, nullptr,
490 "failed to create ScreenCaptureControllerStub");
491
492 sptr<IRemoteObject> object = screenCaptureControllerStub->AsObject();
493 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "failed to create screenCaptureControllerStub");
494
495 pid_t pid = IPCSkeleton::GetCallingPid();
496 screenCaptureControllerStubMap_[object] = pid;
497 MEDIA_LOGD("The number of screen capture services(%{public}zu).", screenCaptureControllerStubMap_.size());
498 MEDIA_LOGI("MediaServerManager::CreateScreenCaptureControllerStubObject() end");
499 return object;
500 }
501 #endif
502
503 #ifdef SUPPORT_LPP_AUDIO_STRAMER
CreateLppAudioPlayerStubObject()504 sptr<IRemoteObject> MediaServerManager::CreateLppAudioPlayerStubObject()
505 {
506 MEDIA_LOGI("CreateLppAudioPlayerStubObject start");
507 sptr<LppAudioStreamerServiceStub> lppAudioPlayerStub = LppAudioStreamerServiceStub::Create();
508 CHECK_AND_RETURN_RET_LOG(lppAudioPlayerStub != nullptr, nullptr,
509 "failed to create LppAudioStreamerServiceStub");
510
511 sptr<IRemoteObject> object = lppAudioPlayerStub->AsObject();
512 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr,
513 "failed to create LppAudioStreamerServiceStub");
514
515 pid_t pid = IPCSkeleton::GetCallingPid();
516 lppAudioPlayerStubMap_[object] = pid;
517
518 Dumper dumper;
519 dumper.pid_ = pid;
520 dumper.uid_ = IPCSkeleton::GetCallingUid();
521 dumper.remoteObject_ = object;
522 dumperTbl_[StubType::LPP_AUDIO_PLAYER].emplace_back(dumper);
523
524 MEDIA_LOGD("The number of lppaudio player services(%{public}zu) pid(%{public}d).",
525 lppAudioPlayerStubMap_.size(), pid);
526 (void)Dump(-1, std::vector<std::u16string>());
527 MEDIA_LOGI("CreateLppAudioPlayerStubObject end");
528 return object;
529 }
530 #endif
531
532 #ifdef SUPPORT_LPP_VIDEO_STRAMER
CreateLppVideoPlayerStubObject()533 sptr<IRemoteObject> MediaServerManager::CreateLppVideoPlayerStubObject()
534 {
535 MEDIA_LOGI("CreateLppVideoPlayerStubObject start");
536 sptr<LppVideoStreamerServiceStub> lppVideoPlayerStub = LppVideoStreamerServiceStub::Create();
537
538 CHECK_AND_RETURN_RET_LOG(lppVideoPlayerStub != nullptr, nullptr,
539 "failed to create LppVideoStreamerServiceStub");
540
541 sptr<IRemoteObject> object = lppVideoPlayerStub->AsObject();
542 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr,
543 "failed to create LppVideoStreamerServiceStub");
544
545 pid_t pid = IPCSkeleton::GetCallingPid();
546 lppVideoPlayerStubMap_[object] = pid;
547
548 Dumper dumper;
549 dumper.pid_ = pid;
550 dumper.uid_ = IPCSkeleton::GetCallingUid();
551 dumper.remoteObject_ = object;
552 dumperTbl_[StubType::LPP_VIDEO_PLAYER].emplace_back(dumper);
553
554 MEDIA_LOGD("The number of lppvideo player services(%{public}zu) pid(%{public}d).",
555 lppVideoPlayerStubMap_.size(), pid);
556 (void)Dump(-1, std::vector<std::u16string>());
557 MEDIA_LOGI("CreateLppVideoPlayerStubObject end");
558 return object;
559 }
560 #endif
561
GetMonitorStubObject()562 sptr<IRemoteObject> MediaServerManager::GetMonitorStubObject()
563 {
564 sptr<MonitorServiceStub> monitorStub = MonitorServiceStub::GetInstance();
565 CHECK_AND_RETURN_RET_LOG(monitorStub != nullptr, nullptr, "failed to create MonitorServiceStub");
566 sptr<IRemoteObject> object = monitorStub->AsObject();
567 return object;
568 }
569
DestroyAVCodecStub(StubType type,sptr<IRemoteObject> object,pid_t pid)570 void MediaServerManager::DestroyAVCodecStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
571 {
572 switch (type) {
573 case AVCODEC: {
574 for (auto it = avCodecStubMap_.begin(); it != avCodecStubMap_.end(); it++) {
575 if (it->first == object) {
576 MEDIA_LOGD("destroy avcodec stub services(%{public}zu) pid(%{public}d).",
577 avCodecStubMap_.size(), pid);
578 (void)avCodecStubMap_.erase(it);
579 return;
580 }
581 }
582 MEDIA_LOGE("find avcodec object failed, pid(%{public}d).", pid);
583 break;
584 }
585 case AVCODECLIST: {
586 for (auto it = avCodecListStubMap_.begin(); it != avCodecListStubMap_.end(); it++) {
587 if (it->first == object) {
588 MEDIA_LOGD("destroy avcodeclist stub services(%{public}zu) pid(%{public}d).",
589 avCodecListStubMap_.size(), pid);
590 (void)avCodecListStubMap_.erase(it);
591 return;
592 }
593 }
594 MEDIA_LOGE("find avcodeclist object failed, pid(%{public}d).", pid);
595 break;
596 }
597 default:
598 break;
599 }
600 }
601
DestroyAVTransCoderStub(StubType type,sptr<IRemoteObject> object,pid_t pid)602 void MediaServerManager::DestroyAVTransCoderStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
603 {
604 switch (type) {
605 case TRANSCODER: {
606 for (auto it = transCoderStubMap_.begin(); it != transCoderStubMap_.end(); it++) {
607 if (it->first == object) {
608 MEDIA_LOGD("destroy transCoder stub services(%{public}zu) pid(%{public}d).",
609 transCoderStubMap_.size(), pid);
610 (void)transCoderStubMap_.erase(it);
611 return;
612 }
613 }
614 MEDIA_LOGE("find transCoder object failed, pid(%{public}d).", pid);
615 break;
616 }
617 default:
618 break;
619 }
620 }
621
DestroyAVPlayerStub(StubType type,sptr<IRemoteObject> object,pid_t pid)622 void MediaServerManager::DestroyAVPlayerStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
623 {
624 switch (type) {
625 case PLAYER: {
626 for (auto it = playerStubMap_.begin(); it != playerStubMap_.end(); it++) {
627 CHECK_AND_CONTINUE(it->first == object);
628 RemovePlayerStubFromMap(object, it->second);
629 MEDIA_LOGD("destroy player stub services(%{public}zu) pid(%{public}d).",
630 playerStubMap_.size(), pid);
631 (void)playerStubMap_.erase(it);
632 MediaTrace::CounterTrace("The number of player", playerStubMap_.size());
633 return;
634 }
635 MEDIA_LOGE("find player object failed, pid(%{public}d).", pid);
636 break;
637 }
638 case AVMETADATAHELPER: {
639 for (auto it = avMetadataHelperStubMap_.begin(); it != avMetadataHelperStubMap_.end(); it++) {
640 if (it->first == object) {
641 MEDIA_LOGD("destroy avmetadatahelper stub services(%{public}zu) pid(%{public}d).",
642 avMetadataHelperStubMap_.size(), pid);
643 (void)avMetadataHelperStubMap_.erase(it);
644 return;
645 }
646 }
647 MEDIA_LOGE("find avmetadatahelper object failed, pid(%{public}d).", pid);
648 break;
649 }
650 default:
651 break;
652 }
653 }
654
RemovePlayerStubFromMap(sptr<IRemoteObject> object,pid_t pid)655 void MediaServerManager::RemovePlayerStubFromMap(sptr<IRemoteObject> object, pid_t pid)
656 {
657 auto pidIt = pidToPlayerStubMap_.find(pid);
658 if (pidIt == pidToPlayerStubMap_.end()) {
659 return;
660 }
661
662 pidIt->second.erase(object);
663 if (pidIt->second.empty()) {
664 pidToPlayerStubMap_.erase(pidIt);
665 }
666 }
667
DestroyAVRecorderStub(StubType type,sptr<IRemoteObject> object,pid_t pid)668 void MediaServerManager::DestroyAVRecorderStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
669 {
670 switch (type) {
671 case RECORDER: {
672 for (auto it = recorderStubMap_.begin(); it != recorderStubMap_.end(); it++) {
673 if (it->first == object) {
674 MEDIA_LOGD("destroy recorder stub services(%{public}zu) pid(%{public}d).",
675 recorderStubMap_.size(), pid);
676 (void)recorderStubMap_.erase(it);
677 return;
678 }
679 }
680 MEDIA_LOGE("find recorder object failed, pid(%{public}d).", pid);
681 break;
682 }
683 case RECORDERPROFILES: {
684 for (auto it = recorderProfilesStubMap_.begin(); it != recorderProfilesStubMap_.end(); it++) {
685 if (it->first == object) {
686 MEDIA_LOGD("destroy mediaprofile stub services(%{public}zu) pid(%{public}d).",
687 recorderProfilesStubMap_.size(), pid);
688 (void)recorderProfilesStubMap_.erase(it);
689 return;
690 }
691 }
692 MEDIA_LOGE("find mediaprofile object failed, pid(%{public}d).", pid);
693 break;
694 }
695 default:
696 break;
697 }
698 }
699
DestroyAVScreenCaptureStub(StubType type,sptr<IRemoteObject> object,pid_t pid)700 void MediaServerManager::DestroyAVScreenCaptureStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
701 {
702 switch (type) {
703 case SCREEN_CAPTURE: {
704 for (auto it = screenCaptureStubMap_.begin(); it != screenCaptureStubMap_.end(); it++) {
705 if (it->first == object) {
706 MEDIA_LOGD("destroy screen capture stub services(%{public}zu) pid(%{public}d).",
707 screenCaptureStubMap_.size(), pid);
708 (void)screenCaptureStubMap_.erase(it);
709 return;
710 }
711 }
712 MEDIA_LOGE("find screen capture object failed, pid(%{public}d).", pid);
713 break;
714 }
715 case SCREEN_CAPTURE_MONITOR: {
716 for (auto it = screenCaptureMonitorStubMap_.begin(); it != screenCaptureMonitorStubMap_.end(); it++) {
717 if (it->first == object) {
718 MEDIA_LOGD("destroy screen capture monitor stub services(%{public}zu) pid(%{public}d).",
719 screenCaptureMonitorStubMap_.size(), pid);
720 (void)screenCaptureMonitorStubMap_.erase(it);
721 return;
722 }
723 }
724 MEDIA_LOGE("find screen capture monitor object failed, pid(%{public}d).", pid);
725 break;
726 }
727 case SCREEN_CAPTURE_CONTROLLER: {
728 for (auto it = screenCaptureControllerStubMap_.begin();
729 it != screenCaptureControllerStubMap_.end(); it++) {
730 if (it->first == object) {
731 MEDIA_LOGD("destroy screen capture controller stub services(%{public}zu) pid(%{public}d).",
732 screenCaptureControllerStubMap_.size(), pid);
733 (void)screenCaptureControllerStubMap_.erase(it);
734 return;
735 }
736 }
737 MEDIA_LOGE("find screen capture controller object failed, pid(%{public}d).", pid);
738 break;
739 }
740 default:
741 break;
742 }
743 }
744
DestroyLppAudioPlayerStub(StubType type,sptr<IRemoteObject> object,pid_t pid)745 void MediaServerManager::DestroyLppAudioPlayerStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
746 {
747 switch (type) {
748 case LPP_AUDIO_PLAYER: {
749 for (auto it = lppAudioPlayerStubMap_.begin(); it != lppAudioPlayerStubMap_.end(); it++) {
750 if (it->first == object) {
751 MEDIA_LOGD("destroy lppaudio player stub services(%{public}zu) pid(%{public}d).",
752 lppAudioPlayerStubMap_.size(), pid);
753 (void)lppAudioPlayerStubMap_.erase(it);
754 return;
755 }
756 }
757 MEDIA_LOGE("find lppaudio player object failed, pid(%{public}d).", pid);
758 break;
759 }
760 default:
761 break;
762 }
763 }
764
DestroyLppVideoPlayerStub(StubType type,sptr<IRemoteObject> object,pid_t pid)765 void MediaServerManager::DestroyLppVideoPlayerStub(StubType type, sptr<IRemoteObject> object, pid_t pid)
766 {
767 switch (type) {
768 case LPP_VIDEO_PLAYER: {
769 for (auto it = lppVideoPlayerStubMap_.begin(); it != lppVideoPlayerStubMap_.end(); it++) {
770 if (it->first == object) {
771 MEDIA_LOGD("destroy lppvideo player stub services(%{public}zu) pid(%{public}d).",
772 lppVideoPlayerStubMap_.size(), pid);
773 (void)lppVideoPlayerStubMap_.erase(it);
774 return;
775 }
776 }
777 MEDIA_LOGE("find lppvideo player object failed, pid(%{public}d).", pid);
778 break;
779 }
780 default:
781 break;
782 }
783 }
784
DestroyStubObject(StubType type,sptr<IRemoteObject> object)785 void MediaServerManager::DestroyStubObject(StubType type, sptr<IRemoteObject> object)
786 {
787 std::lock_guard<std::mutex> lock(mutex_);
788 pid_t pid = IPCSkeleton::GetCallingPid();
789 DestroyDumper(type, object);
790 switch (type) {
791 case TRANSCODER:
792 DestroyAVTransCoderStub(type, object, pid);
793 break;
794 case RECORDER:
795 case RECORDERPROFILES:
796 DestroyAVRecorderStub(type, object, pid);
797 break;
798 case PLAYER:
799 case AVMETADATAHELPER:
800 DestroyAVPlayerStub(type, object, pid);
801 break;
802 case AVCODEC:
803 case AVCODECLIST:
804 DestroyAVCodecStub(type, object, pid);
805 break;
806 case SCREEN_CAPTURE:
807 case SCREEN_CAPTURE_MONITOR:
808 case SCREEN_CAPTURE_CONTROLLER:
809 DestroyAVScreenCaptureStub(type, object, pid);
810 break;
811 case LPP_AUDIO_PLAYER:
812 DestroyLppAudioPlayerStub(type, object, pid);
813 break;
814 case LPP_VIDEO_PLAYER:
815 DestroyLppVideoPlayerStub(type, object, pid);
816 break;
817 default: {
818 MEDIA_LOGE("default case, media server manager failed, pid(%{public}d).", pid);
819 break;
820 }
821 }
822 #ifdef SUPPORT_START_STOP_ON_DEMAND
823 UpdateAllInstancesReleasedTime();
824 #endif
825 }
826
DestroyAVScreenCaptureStubForPid(pid_t pid)827 void MediaServerManager::DestroyAVScreenCaptureStubForPid(pid_t pid)
828 {
829 MEDIA_LOGD("ScreenCapture stub services(%{public}zu) pid(%{public}d).", screenCaptureStubMap_.size(), pid);
830 for (auto itScreenCapture = screenCaptureStubMap_.begin(); itScreenCapture != screenCaptureStubMap_.end();) {
831 if (itScreenCapture->second == pid) {
832 executor_.Commit(itScreenCapture->first);
833 itScreenCapture = screenCaptureStubMap_.erase(itScreenCapture);
834 } else {
835 itScreenCapture++;
836 }
837 }
838 MEDIA_LOGD("ScreenCapture stub services(%{public}zu).", screenCaptureStubMap_.size());
839 MEDIA_LOGD("ScreenCapture monitor stub services(%{public}zu) pid(%{public}d).",
840 screenCaptureMonitorStubMap_.size(), pid);
841 for (auto itScreenCaptureMonitor = screenCaptureMonitorStubMap_.begin();
842 itScreenCaptureMonitor != screenCaptureMonitorStubMap_.end();) {
843 if (itScreenCaptureMonitor->second == pid) {
844 executor_.Commit(itScreenCaptureMonitor->first);
845 itScreenCaptureMonitor = screenCaptureMonitorStubMap_.erase(itScreenCaptureMonitor);
846 } else {
847 itScreenCaptureMonitor++;
848 }
849 }
850 MEDIA_LOGD("ScreenCapture monitor stub services(%{public}zu).", screenCaptureMonitorStubMap_.size());
851 MEDIA_LOGD("ScreenCapture controller stub services(%{public}zu) pid(%{public}d).",
852 screenCaptureControllerStubMap_.size(), pid);
853 for (auto itScreenCaptureController = screenCaptureControllerStubMap_.begin();
854 itScreenCaptureController != screenCaptureControllerStubMap_.end();) {
855 if (itScreenCaptureController->second == pid) {
856 executor_.Commit(itScreenCaptureController->first);
857 itScreenCaptureController = screenCaptureControllerStubMap_.erase(itScreenCaptureController);
858 } else {
859 itScreenCaptureController++;
860 }
861 }
862 MEDIA_LOGD("ScreenCapture controller stub services(%{public}zu).", screenCaptureControllerStubMap_.size());
863 }
864
DestroyAVTranscoderStubForPid(pid_t pid)865 void MediaServerManager::DestroyAVTranscoderStubForPid(pid_t pid)
866 {
867 MEDIA_LOGD("AVTranscoder stub services(%{public}zu) pid(%{public}d).", transCoderStubMap_.size(), pid);
868 for (auto itTranscoder = transCoderStubMap_.begin(); itTranscoder != transCoderStubMap_.end();) {
869 if (itTranscoder->second == pid) {
870 executor_.Commit(itTranscoder->first);
871 itTranscoder = transCoderStubMap_.erase(itTranscoder);
872 } else {
873 itTranscoder++;
874 }
875 }
876 MEDIA_LOGD("AVTranscoder stub services(%{public}zu).", transCoderStubMap_.size());
877 }
878
DestroyAVCodecStubForPid(pid_t pid)879 void MediaServerManager::DestroyAVCodecStubForPid(pid_t pid)
880 {
881 MEDIA_LOGD("avcodec stub services(%{public}zu) pid(%{public}d).", avCodecStubMap_.size(), pid);
882 for (auto itAvCodec = avCodecStubMap_.begin(); itAvCodec != avCodecStubMap_.end();) {
883 if (itAvCodec->second == pid) {
884 executor_.Commit(itAvCodec->first);
885 itAvCodec = avCodecStubMap_.erase(itAvCodec);
886 } else {
887 itAvCodec++;
888 }
889 }
890 MEDIA_LOGD("avcodec stub services(%{public}zu).", avCodecStubMap_.size());
891
892 MEDIA_LOGD("avcodeclist stub services(%{public}zu) pid(%{public}d).", avCodecListStubMap_.size(), pid);
893 for (auto itAvCodecList = avCodecListStubMap_.begin(); itAvCodecList != avCodecListStubMap_.end();) {
894 if (itAvCodecList->second == pid) {
895 executor_.Commit(itAvCodecList->first);
896 itAvCodecList = avCodecListStubMap_.erase(itAvCodecList);
897 } else {
898 itAvCodecList++;
899 }
900 }
901 MEDIA_LOGD("avcodeclist stub services(%{public}zu).", avCodecListStubMap_.size());
902 }
903
DestroyAVPlayerStubForPid(pid_t pid)904 void MediaServerManager::DestroyAVPlayerStubForPid(pid_t pid)
905 {
906 MEDIA_LOGD("player stub services(%{public}zu) pid(%{public}d).", playerStubMap_.size(), pid);
907 auto pidIt = pidToPlayerStubMap_.find(pid);
908 if (pidIt != pidToPlayerStubMap_.end()) {
909 pidToPlayerStubMap_.erase(pidIt);
910 }
911 for (auto itPlayer = playerStubMap_.begin(); itPlayer != playerStubMap_.end();) {
912 if (itPlayer->second == pid) {
913 executor_.Commit(itPlayer->first);
914 itPlayer = playerStubMap_.erase(itPlayer);
915 } else {
916 itPlayer++;
917 }
918 }
919 MEDIA_LOGD("player stub services(%{public}zu).", playerStubMap_.size());
920
921 MEDIA_LOGD("avmetadatahelper stub services(%{public}zu) pid(%{public}d).", avMetadataHelperStubMap_.size(), pid);
922 for (auto itAvMetadata = avMetadataHelperStubMap_.begin(); itAvMetadata != avMetadataHelperStubMap_.end();) {
923 if (itAvMetadata->second == pid) {
924 executor_.Commit(itAvMetadata->first);
925 itAvMetadata = avMetadataHelperStubMap_.erase(itAvMetadata);
926 } else {
927 itAvMetadata++;
928 }
929 }
930 MEDIA_LOGD("avmetadatahelper stub services(%{public}zu).", avMetadataHelperStubMap_.size());
931 }
932
DestroyAVRecorderStubForPid(pid_t pid)933 void MediaServerManager::DestroyAVRecorderStubForPid(pid_t pid)
934 {
935 MEDIA_LOGD("recorder stub services(%{public}zu) pid(%{public}d).", recorderStubMap_.size(), pid);
936 for (auto itRecorder = recorderStubMap_.begin(); itRecorder != recorderStubMap_.end();) {
937 if (itRecorder->second == pid) {
938 executor_.Commit(itRecorder->first);
939 itRecorder = recorderStubMap_.erase(itRecorder);
940 } else {
941 itRecorder++;
942 }
943 }
944 MEDIA_LOGD("recorder stub services(%{public}zu).", recorderStubMap_.size());
945
946 MEDIA_LOGD("mediaprofile stub services(%{public}zu) pid(%{public}d).", recorderProfilesStubMap_.size(), pid);
947 for (auto itMediaProfile = recorderProfilesStubMap_.begin(); itMediaProfile != recorderProfilesStubMap_.end();) {
948 if (itMediaProfile->second == pid) {
949 executor_.Commit(itMediaProfile->first);
950 itMediaProfile = recorderProfilesStubMap_.erase(itMediaProfile);
951 } else {
952 itMediaProfile++;
953 }
954 }
955 MEDIA_LOGD("mediaprofile stub services(%{public}zu).", recorderProfilesStubMap_.size());
956 }
957
DestroyLppAudioPlayerStubForPid(pid_t pid)958 void MediaServerManager::DestroyLppAudioPlayerStubForPid(pid_t pid)
959 {
960 MEDIA_LOGD("LppAudioPlayer stub services(%{public}zu) pid(%{public}d).", lppAudioPlayerStubMap_.size(), pid);
961 for (auto itLppAudioPlayer = lppAudioPlayerStubMap_.begin(); itLppAudioPlayer != lppAudioPlayerStubMap_.end();) {
962 if (itLppAudioPlayer->second == pid) {
963 executor_.Commit(itLppAudioPlayer->first);
964 itLppAudioPlayer = lppAudioPlayerStubMap_.erase(itLppAudioPlayer);
965 } else {
966 itLppAudioPlayer++;
967 }
968 }
969 MEDIA_LOGD("LppAudioPlayer stub services(%{public}zu).", lppAudioPlayerStubMap_.size());
970 }
971
DestroyLppVideoPlayerStubForPid(pid_t pid)972 void MediaServerManager::DestroyLppVideoPlayerStubForPid(pid_t pid)
973 {
974 MEDIA_LOGD("LppVideoPlayer stub services(%{public}zu) pid(%{public}d).", lppVideoPlayerStubMap_.size(), pid);
975 for (auto itLppVideoPlayer = lppVideoPlayerStubMap_.begin(); itLppVideoPlayer != lppVideoPlayerStubMap_.end();) {
976 if (itLppVideoPlayer->second == pid) {
977 executor_.Commit(itLppVideoPlayer->first);
978 itLppVideoPlayer = lppVideoPlayerStubMap_.erase(itLppVideoPlayer);
979 } else {
980 itLppVideoPlayer++;
981 }
982 }
983 MEDIA_LOGD("LppVideoPlayer stub services(%{public}zu).", lppVideoPlayerStubMap_.size());
984 }
985
DestroyStubObjectForPid(pid_t pid)986 void MediaServerManager::DestroyStubObjectForPid(pid_t pid)
987 {
988 std::lock_guard<std::mutex> lock(mutex_);
989 DestroyDumperForPid(pid);
990 DestroyAVRecorderStubForPid(pid);
991 DestroyAVPlayerStubForPid(pid);
992 DestroyAVCodecStubForPid(pid);
993 DestroyAVTranscoderStubForPid(pid);
994 DestroyAVScreenCaptureStubForPid(pid);
995 DestroyLppAudioPlayerStubForPid(pid);
996 DestroyLppVideoPlayerStubForPid(pid);
997 MonitorServiceStub::GetInstance()->OnClientDie(pid);
998 executor_.Clear();
999 #ifdef SUPPORT_START_STOP_ON_DEMAND
1000 UpdateAllInstancesReleasedTime();
1001 #endif
1002 }
1003
GetPlayerPids()1004 std::vector<pid_t> MediaServerManager::GetPlayerPids()
1005 {
1006 std::lock_guard<std::mutex> lock(mutex_);
1007 std::vector<pid_t> res;
1008 CHECK_AND_RETURN_RET_NOLOG(!playerStubMap_.empty(), res);
1009 std::unordered_set<pid_t> tmpRes;
1010 for (const auto& [object, pid] : playerStubMap_) {
1011 (void)tmpRes.insert(pid);
1012 }
1013 for (auto &uniqPid : tmpRes) {
1014 res.emplace_back(uniqPid);
1015 }
1016 return res;
1017 }
1018
DestroyDumper(StubType type,sptr<IRemoteObject> object)1019 void MediaServerManager::DestroyDumper(StubType type, sptr<IRemoteObject> object)
1020 {
1021 for (auto it = dumperTbl_[type].begin(); it != dumperTbl_[type].end(); it++) {
1022 if (it->remoteObject_ == object) {
1023 (void)dumperTbl_[type].erase(it);
1024 MEDIA_LOGD("MediaServerManager::DestroyDumper");
1025 (void)Dump(-1, std::vector<std::u16string>());
1026 return;
1027 }
1028 }
1029 }
1030
DestroyDumperForPid(pid_t pid)1031 void MediaServerManager::DestroyDumperForPid(pid_t pid)
1032 {
1033 for (auto &dumpers : dumperTbl_) {
1034 for (auto it = dumpers.second.begin(); it != dumpers.second.end();) {
1035 if (it->pid_ == pid) {
1036 it = dumpers.second.erase(it);
1037 MEDIA_LOGD("MediaServerManager::DestroyDumperForPid");
1038 } else {
1039 it++;
1040 }
1041 }
1042 }
1043 (void)Dump(-1, std::vector<std::u16string>());
1044 }
1045
StartMemoryReportTask()1046 void MediaServerManager::StartMemoryReportTask()
1047 {
1048 MediaTrace trace("MediaServerManager::StartMemoryReport");
1049 if (memoryReportTask_ == nullptr) {
1050 memoryReportTask_ = std::make_unique<Task>("playerMemReport", "",
1051 TaskType::SINGLETON, TaskPriority::NORMAL, true);
1052 memoryReportTask_->RegisterJob([this] {
1053 this->ReportAppMemoryUsage();
1054 return REPORT_TIME;
1055 });
1056 needReleaseTaskCount_ = 0;
1057 }
1058 if (memoryReportTask_ && !memoryReportTask_->IsTaskRunning()) {
1059 memoryReportTask_->Start();
1060 }
1061 }
1062
GetMemUsageForPlayer()1063 bool MediaServerManager::GetMemUsageForPlayer()
1064 {
1065 std::lock_guard<std::mutex> lock(mutex_);
1066 std::unordered_map<pid_t, uint32_t> memoryList;
1067 for (const auto& [object, pid] : playerStubMap_) {
1068 auto stub = iface_cast<PlayerServiceStub>(object);
1069 auto num = stub->GetMemoryUsage();
1070 if (num == 0) {
1071 continue;
1072 }
1073 memoryList[pid] += num;
1074 }
1075
1076 for (const auto &[pid, mem] : playerPidMem_) {
1077 if (memoryList.find(pid) == memoryList.end() && mem != 0) {
1078 memoryList[pid] = 0;
1079 }
1080 }
1081 playerPidMem_.swap(memoryList);
1082 if (playerPidMem_.empty()) {
1083 needReleaseTaskCount_.fetch_add(1, std::memory_order_relaxed);
1084 if (needReleaseTaskCount_ >= RELEASE_THRESHOLD) {
1085 std::thread([memoryReportTask = std::move(memoryReportTask_)]() mutable -> void {
1086 MEDIA_LOGI("memoryReportTask: release");
1087 }).detach();
1088 }
1089 return false;
1090 }
1091 needReleaseTaskCount_ = 0;
1092 return true;
1093 }
1094
ReportAppMemoryUsage()1095 void MediaServerManager::ReportAppMemoryUsage()
1096 {
1097 CHECK_AND_RETURN_LOG(GetMemUsageForPlayer(), "no need report");
1098 auto memoryCollector = HiviewDFX::UCollectClient::MemoryCollector::Create();
1099 CHECK_AND_RETURN_LOG(memoryCollector != nullptr, "Create Hiview DFX memory collector failed");
1100
1101 std::vector<HiviewDFX::UCollectClient::MemoryCaller> memList;
1102 memList.reserve(playerPidMem_.size());
1103
1104 for (auto &[pid, mem] : playerPidMem_) {
1105 MEDIA_LOGI("memory usage pid(%{public}d) mem(%{public}d KB).", pid, static_cast<int32_t>(mem));
1106 HiviewDFX::UCollectClient::MemoryCaller memoryCaller = {
1107 .pid = pid,
1108 .resourceType = "media_service",
1109 .limitValue = mem,
1110 };
1111 memList.emplace_back(memoryCaller);
1112 }
1113 memoryCollector->SetSplitMemoryValue(memList);
1114 }
1115
NotifyMemMgrLoaded()1116 void MediaServerManager::NotifyMemMgrLoaded()
1117 {
1118 isMemMgrLoaded_.store(true);
1119 }
1120
DestoryMemoryReportTask()1121 void MediaServerManager::DestoryMemoryReportTask()
1122 {
1123 MediaTrace trace("MediaServerManager::DestoryMemoryReportTask");
1124 MEDIA_LOGI("DestoryMemoryReportTask");
1125 std::unique_ptr<Task> memoryReportTask{nullptr};
1126 {
1127 std::lock_guard<std::mutex> lock(mutex_);
1128 memoryReportTask = std::move(memoryReportTask_);
1129 if (memoryReportTask && memoryReportTask->IsTaskRunning()) {
1130 memoryReportTask->StopAsync();
1131 }
1132 }
1133 }
1134
Commit(sptr<IRemoteObject> obj)1135 void MediaServerManager::AsyncExecutor::Commit(sptr<IRemoteObject> obj)
1136 {
1137 std::lock_guard<std::mutex> lock(listMutex_);
1138 freeList_.push_back(obj);
1139 }
1140
Clear()1141 void MediaServerManager::AsyncExecutor::Clear()
1142 {
1143 std::thread(&MediaServerManager::AsyncExecutor::HandleAsyncExecution, this).detach();
1144 }
1145
HandleAsyncExecution()1146 void MediaServerManager::AsyncExecutor::HandleAsyncExecution()
1147 {
1148 std::list<sptr<IRemoteObject>> tempList;
1149 {
1150 std::lock_guard<std::mutex> lock(listMutex_);
1151 freeList_.swap(tempList);
1152 }
1153 tempList.clear();
1154 }
1155
1156 #ifdef SUPPORT_START_STOP_ON_DEMAND
GetInstanceCountLocked()1157 int32_t MediaServerManager::GetInstanceCountLocked()
1158 {
1159 std::lock_guard<std::mutex> lock(mutex_);
1160 return GetInstanceCount();
1161 }
1162
GetInstanceCount()1163 int32_t MediaServerManager::GetInstanceCount()
1164 {
1165 return static_cast<int32_t>(recorderStubMap_.size() + playerStubMap_.size() + avMetadataHelperStubMap_.size() +
1166 avCodecListStubMap_.size() + avCodecStubMap_.size() + recorderProfilesStubMap_.size() +
1167 screenCaptureStubMap_.size() + screenCaptureControllerStubMap_.size() +
1168 screenCaptureMonitorStubMap_.size() + transCoderStubMap_.size());
1169 }
1170
GetCurrentSystemClockMs()1171 int64_t MediaServerManager::GetCurrentSystemClockMs()
1172 {
1173 return std::chrono::duration_cast<std::chrono::milliseconds>(
1174 std::chrono::steady_clock::now().time_since_epoch()).count();
1175 }
1176
GetAllInstancesReleasedTime()1177 int64_t MediaServerManager::GetAllInstancesReleasedTime()
1178 {
1179 std::lock_guard<std::mutex> lock(mutex_);
1180 return allInstancesReleasedTime_;
1181 }
1182
ResetAllInstancesReleasedTime()1183 void MediaServerManager::ResetAllInstancesReleasedTime()
1184 {
1185 std::lock_guard<std::mutex> lock(mutex_);
1186 allInstancesReleasedTime_ = 0;
1187 }
1188
UpdateAllInstancesReleasedTime()1189 void MediaServerManager::UpdateAllInstancesReleasedTime()
1190 {
1191 if (allInstancesReleasedTime_ == 0 && GetInstanceCount() == 0) {
1192 allInstancesReleasedTime_ = GetCurrentSystemClockMs();
1193 }
1194 }
1195 #endif
1196
CanKillMediaService()1197 bool MediaServerManager::CanKillMediaService()
1198 {
1199 std::lock_guard<std::mutex> lock(mutex_);
1200 bool canKillMediaService = !recorderStubMap_.empty() ||
1201 !avMetadataHelperStubMap_.empty() ||
1202 !screenCaptureStubMap_.empty() ||
1203 !recorderProfilesStubMap_.empty() ||
1204 !screenCaptureControllerStubMap_.empty() ||
1205 !transCoderStubMap_.empty();
1206 return !canKillMediaService;
1207 }
1208 } // namespace Media
1209 } // namespace OHOS
1210