Loading media/libmedia/MediaResource.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -43,11 +43,11 @@ MediaResource::MediaResource(Type type, const std::vector<uint8_t> &id, int64_t } //static MediaResource MediaResource::CodecResource(bool secure, bool video) { MediaResource MediaResource::CodecResource(bool secure, bool video, int64_t instanceCount) { return MediaResource( secure ? Type::kSecureCodec : Type::kNonSecureCodec, video ? SubType::kVideoCodec : SubType::kAudioCodec, 1); instanceCount); } //static Loading media/libmedia/include/media/MediaResource.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public: MediaResource(Type type, SubType subType, int64_t value); MediaResource(Type type, const std::vector<uint8_t> &id, int64_t value); static MediaResource CodecResource(bool secure, bool video); static MediaResource CodecResource(bool secure, bool video, int64_t instanceCount = 1); static MediaResource GraphicMemoryResource(int64_t value); static MediaResource CpuBoostResource(); static MediaResource VideoBatteryResource(); Loading services/mediaresourcemanager/Android.bp +24 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,19 @@ filegroup { path: "aidl", } filegroup { name: "resourceobserver_aidl", srcs: [ "aidl/android/media/IResourceObserver.aidl", "aidl/android/media/IResourceObserverService.aidl", "aidl/android/media/MediaObservableEvent.aidl", "aidl/android/media/MediaObservableFilter.aidl", "aidl/android/media/MediaObservableType.aidl", "aidl/android/media/MediaObservableParcel.aidl", ], path: "aidl", } aidl_interface { name: "resourcemanager_aidl_interface", unstable: true, Loading @@ -20,11 +33,21 @@ aidl_interface { ], } aidl_interface { name: "resourceobserver_aidl_interface", unstable: true, local_include_dir: "aidl", srcs: [ ":resourceobserver_aidl", ], } cc_library { name: "libresourcemanagerservice", srcs: [ "ResourceManagerService.cpp", "ResourceObserverService.cpp", "ServiceLog.cpp", ], Loading @@ -35,6 +58,7 @@ cc_library { "libbinder_ndk", "libutils", "liblog", "resourceobserver_aidl_interface-ndk_platform", ], include_dirs: ["frameworks/av/include"], Loading services/mediaresourcemanager/ResourceManagerService.cpp +42 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ #include <unistd.h> #include "ResourceManagerService.h" #include "ResourceObserverService.h" #include "ServiceLog.h" namespace android { Loading Loading @@ -267,6 +268,13 @@ void ResourceManagerService::instantiate() { if (status != STATUS_OK) { return; } std::shared_ptr<ResourceObserverService> observerService = ResourceObserverService::instantiate(); if (observerService != nullptr) { service->setObserverService(observerService); } // TODO: mediaserver main() is already starting the thread pool, // move this to mediaserver main() when other services in mediaserver // are converted to ndk-platform aidl. Loading @@ -275,6 +283,11 @@ void ResourceManagerService::instantiate() { ResourceManagerService::~ResourceManagerService() {} void ResourceManagerService::setObserverService( const std::shared_ptr<ResourceObserverService>& observerService) { mObserverService = observerService; } Status ResourceManagerService::config(const std::vector<MediaResourcePolicyParcel>& policies) { String8 log = String8::format("config(%s)", getString(policies).string()); mServiceLog->add(log); Loading Loading @@ -358,6 +371,7 @@ Status ResourceManagerService::addResource( } ResourceInfos& infos = getResourceInfosForEdit(pid, mMap); ResourceInfo& info = getResourceInfoForEdit(uid, clientId, client, infos); ResourceList resourceAdded; for (size_t i = 0; i < resources.size(); ++i) { const auto &res = resources[i]; Loading @@ -379,12 +393,22 @@ Status ResourceManagerService::addResource( } else { mergeResources(info.resources[resType], res); } // Add it to the list of added resources for observers. auto it = resourceAdded.find(resType); if (it == resourceAdded.end()) { resourceAdded[resType] = res; } else { mergeResources(it->second, res); } } if (info.deathNotifier == nullptr && client != nullptr) { info.deathNotifier = new DeathNotifier(ref<ResourceManagerService>(), pid, clientId); AIBinder_linkToDeath(client->asBinder().get(), mDeathRecipient.get(), info.deathNotifier.get()); } if (mObserverService != nullptr && !resourceAdded.empty()) { mObserverService->onResourceAdded(uid, pid, resourceAdded); } notifyResourceGranted(pid, resources); return Status::ok(); } Loading Loading @@ -415,7 +439,7 @@ Status ResourceManagerService::removeResource( } ResourceInfo &info = infos.editValueAt(index); ResourceList resourceRemoved; for (size_t i = 0; i < resources.size(); ++i) { const auto &res = resources[i]; const auto resType = std::tuple(res.type, res.subType, res.id); Loading @@ -427,14 +451,27 @@ Status ResourceManagerService::removeResource( // ignore if we don't have it if (info.resources.find(resType) != info.resources.end()) { MediaResourceParcel &resource = info.resources[resType]; MediaResourceParcel actualRemoved = res; if (resource.value > res.value) { resource.value -= res.value; } else { onLastRemoved(res, info); info.resources.erase(resType); actualRemoved.value = resource.value; } // Add it to the list of removed resources for observers. auto it = resourceRemoved.find(resType); if (it == resourceRemoved.end()) { resourceRemoved[resType] = actualRemoved; } else { mergeResources(it->second, actualRemoved); } } } if (mObserverService != nullptr && !resourceRemoved.empty()) { mObserverService->onResourceRemoved(info.uid, pid, resourceRemoved); } return Status::ok(); } Loading Loading @@ -475,6 +512,10 @@ Status ResourceManagerService::removeResource(int pid, int64_t clientId, bool ch AIBinder_unlinkToDeath(info.client->asBinder().get(), mDeathRecipient.get(), info.deathNotifier.get()); if (mObserverService != nullptr && !info.resources.empty()) { mObserverService->onResourceRemoved(info.uid, pid, info.resources); } infos.removeItemsAt(index); return Status::ok(); } Loading services/mediaresourcemanager/ResourceManagerService.h +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ namespace android { class DeathNotifier; class ResourceManagerService; class ResourceObserverService; class ServiceLog; struct ProcessInfoInterface; Loading Loading @@ -95,6 +96,8 @@ public: const sp<ProcessInfoInterface> &processInfo, const sp<SystemCallbackInterface> &systemResource); virtual ~ResourceManagerService(); void setObserverService( const std::shared_ptr<ResourceObserverService>& observerService); // IResourceManagerService interface Status config(const std::vector<MediaResourcePolicyParcel>& policies) override; Loading Loading @@ -180,6 +183,7 @@ private: int32_t mCpuBoostCount; ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient; std::map<int, int> mOverridePidMap; std::shared_ptr<ResourceObserverService> mObserverService; }; // ---------------------------------------------------------------------------- Loading Loading
media/libmedia/MediaResource.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -43,11 +43,11 @@ MediaResource::MediaResource(Type type, const std::vector<uint8_t> &id, int64_t } //static MediaResource MediaResource::CodecResource(bool secure, bool video) { MediaResource MediaResource::CodecResource(bool secure, bool video, int64_t instanceCount) { return MediaResource( secure ? Type::kSecureCodec : Type::kNonSecureCodec, video ? SubType::kVideoCodec : SubType::kAudioCodec, 1); instanceCount); } //static Loading
media/libmedia/include/media/MediaResource.h +1 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public: MediaResource(Type type, SubType subType, int64_t value); MediaResource(Type type, const std::vector<uint8_t> &id, int64_t value); static MediaResource CodecResource(bool secure, bool video); static MediaResource CodecResource(bool secure, bool video, int64_t instanceCount = 1); static MediaResource GraphicMemoryResource(int64_t value); static MediaResource CpuBoostResource(); static MediaResource VideoBatteryResource(); Loading
services/mediaresourcemanager/Android.bp +24 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,19 @@ filegroup { path: "aidl", } filegroup { name: "resourceobserver_aidl", srcs: [ "aidl/android/media/IResourceObserver.aidl", "aidl/android/media/IResourceObserverService.aidl", "aidl/android/media/MediaObservableEvent.aidl", "aidl/android/media/MediaObservableFilter.aidl", "aidl/android/media/MediaObservableType.aidl", "aidl/android/media/MediaObservableParcel.aidl", ], path: "aidl", } aidl_interface { name: "resourcemanager_aidl_interface", unstable: true, Loading @@ -20,11 +33,21 @@ aidl_interface { ], } aidl_interface { name: "resourceobserver_aidl_interface", unstable: true, local_include_dir: "aidl", srcs: [ ":resourceobserver_aidl", ], } cc_library { name: "libresourcemanagerservice", srcs: [ "ResourceManagerService.cpp", "ResourceObserverService.cpp", "ServiceLog.cpp", ], Loading @@ -35,6 +58,7 @@ cc_library { "libbinder_ndk", "libutils", "liblog", "resourceobserver_aidl_interface-ndk_platform", ], include_dirs: ["frameworks/av/include"], Loading
services/mediaresourcemanager/ResourceManagerService.cpp +42 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ #include <unistd.h> #include "ResourceManagerService.h" #include "ResourceObserverService.h" #include "ServiceLog.h" namespace android { Loading Loading @@ -267,6 +268,13 @@ void ResourceManagerService::instantiate() { if (status != STATUS_OK) { return; } std::shared_ptr<ResourceObserverService> observerService = ResourceObserverService::instantiate(); if (observerService != nullptr) { service->setObserverService(observerService); } // TODO: mediaserver main() is already starting the thread pool, // move this to mediaserver main() when other services in mediaserver // are converted to ndk-platform aidl. Loading @@ -275,6 +283,11 @@ void ResourceManagerService::instantiate() { ResourceManagerService::~ResourceManagerService() {} void ResourceManagerService::setObserverService( const std::shared_ptr<ResourceObserverService>& observerService) { mObserverService = observerService; } Status ResourceManagerService::config(const std::vector<MediaResourcePolicyParcel>& policies) { String8 log = String8::format("config(%s)", getString(policies).string()); mServiceLog->add(log); Loading Loading @@ -358,6 +371,7 @@ Status ResourceManagerService::addResource( } ResourceInfos& infos = getResourceInfosForEdit(pid, mMap); ResourceInfo& info = getResourceInfoForEdit(uid, clientId, client, infos); ResourceList resourceAdded; for (size_t i = 0; i < resources.size(); ++i) { const auto &res = resources[i]; Loading @@ -379,12 +393,22 @@ Status ResourceManagerService::addResource( } else { mergeResources(info.resources[resType], res); } // Add it to the list of added resources for observers. auto it = resourceAdded.find(resType); if (it == resourceAdded.end()) { resourceAdded[resType] = res; } else { mergeResources(it->second, res); } } if (info.deathNotifier == nullptr && client != nullptr) { info.deathNotifier = new DeathNotifier(ref<ResourceManagerService>(), pid, clientId); AIBinder_linkToDeath(client->asBinder().get(), mDeathRecipient.get(), info.deathNotifier.get()); } if (mObserverService != nullptr && !resourceAdded.empty()) { mObserverService->onResourceAdded(uid, pid, resourceAdded); } notifyResourceGranted(pid, resources); return Status::ok(); } Loading Loading @@ -415,7 +439,7 @@ Status ResourceManagerService::removeResource( } ResourceInfo &info = infos.editValueAt(index); ResourceList resourceRemoved; for (size_t i = 0; i < resources.size(); ++i) { const auto &res = resources[i]; const auto resType = std::tuple(res.type, res.subType, res.id); Loading @@ -427,14 +451,27 @@ Status ResourceManagerService::removeResource( // ignore if we don't have it if (info.resources.find(resType) != info.resources.end()) { MediaResourceParcel &resource = info.resources[resType]; MediaResourceParcel actualRemoved = res; if (resource.value > res.value) { resource.value -= res.value; } else { onLastRemoved(res, info); info.resources.erase(resType); actualRemoved.value = resource.value; } // Add it to the list of removed resources for observers. auto it = resourceRemoved.find(resType); if (it == resourceRemoved.end()) { resourceRemoved[resType] = actualRemoved; } else { mergeResources(it->second, actualRemoved); } } } if (mObserverService != nullptr && !resourceRemoved.empty()) { mObserverService->onResourceRemoved(info.uid, pid, resourceRemoved); } return Status::ok(); } Loading Loading @@ -475,6 +512,10 @@ Status ResourceManagerService::removeResource(int pid, int64_t clientId, bool ch AIBinder_unlinkToDeath(info.client->asBinder().get(), mDeathRecipient.get(), info.deathNotifier.get()); if (mObserverService != nullptr && !info.resources.empty()) { mObserverService->onResourceRemoved(info.uid, pid, info.resources); } infos.removeItemsAt(index); return Status::ok(); } Loading
services/mediaresourcemanager/ResourceManagerService.h +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ namespace android { class DeathNotifier; class ResourceManagerService; class ResourceObserverService; class ServiceLog; struct ProcessInfoInterface; Loading Loading @@ -95,6 +96,8 @@ public: const sp<ProcessInfoInterface> &processInfo, const sp<SystemCallbackInterface> &systemResource); virtual ~ResourceManagerService(); void setObserverService( const std::shared_ptr<ResourceObserverService>& observerService); // IResourceManagerService interface Status config(const std::vector<MediaResourcePolicyParcel>& policies) override; Loading Loading @@ -180,6 +183,7 @@ private: int32_t mCpuBoostCount; ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient; std::map<int, int> mOverridePidMap; std::shared_ptr<ResourceObserverService> mObserverService; }; // ---------------------------------------------------------------------------- Loading