• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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