diff options
author | Ronghua Wu <ronghuawu@google.com> | 2015-03-13 10:47:08 -0700 |
---|---|---|
committer | Ronghua Wu <ronghuawu@google.com> | 2015-04-14 14:16:12 -0700 |
commit | 67e7f543c7f1c4fe4ee1989ceb0aebe44a63b49e (patch) | |
tree | 7de894fc9626b36de6eed70812962380ca217f22 /services/mediaresourcemanager/ResourceManagerService.cpp | |
parent | 9e6955a19bf77ebf27b770e910efbe1ebf1ceac0 (diff) | |
download | frameworks_av-67e7f543c7f1c4fe4ee1989ceb0aebe44a63b49e.zip frameworks_av-67e7f543c7f1c4fe4ee1989ceb0aebe44a63b49e.tar.gz frameworks_av-67e7f543c7f1c4fe4ee1989ceb0aebe44a63b49e.tar.bz2 |
media: use ResourceManagerService with MediaCodec
Bug: 19620911
Change-Id: I235a97e5195b28645b7834dda0dd77307d93f4a8
Diffstat (limited to 'services/mediaresourcemanager/ResourceManagerService.cpp')
-rw-r--r-- | services/mediaresourcemanager/ResourceManagerService.cpp | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/services/mediaresourcemanager/ResourceManagerService.cpp b/services/mediaresourcemanager/ResourceManagerService.cpp index 7296d47..75a69ed 100644 --- a/services/mediaresourcemanager/ResourceManagerService.cpp +++ b/services/mediaresourcemanager/ResourceManagerService.cpp @@ -126,6 +126,7 @@ void ResourceManagerService::addResource( Mutex::Autolock lock(mLock); ResourceInfos& infos = getResourceInfosForEdit(pid, mMap); ResourceInfo& info = getResourceInfoForEdit(clientId, client, infos); + // TODO: do the merge instead of append. info.resources.appendVector(resources); } @@ -197,19 +198,58 @@ bool ResourceManagerService::reclaimResource( } } } + + if (clients.size() == 0) { + // if we are here, run the third pass to free one codec with the same type. + for (size_t i = 0; i < resources.size(); ++i) { + String8 type = resources[i].mType; + if (type == kResourceSecureCodec || type == kResourceNonSecureCodec) { + sp<IResourceManagerClient> client; + if (!getLowestPriorityBiggestClient_l(callingPid, type, &client)) { + return false; + } + clients.push_back(client); + } + } + } } if (clients.size() == 0) { return false; } + sp<IResourceManagerClient> failedClient; for (size_t i = 0; i < clients.size(); ++i) { ALOGV("reclaimResource from client %p", clients[i].get()); if (!clients[i]->reclaimResource()) { - return false; + failedClient = clients[i]; + break; } } - return true; + + { + Mutex::Autolock lock(mLock); + bool found = false; + for (size_t i = 0; i < mMap.size(); ++i) { + ResourceInfos &infos = mMap.editValueAt(i); + for (size_t j = 0; j < infos.size();) { + if (infos[j].client == failedClient) { + j = infos.removeAt(j); + found = true; + } else { + ++j; + } + } + if (found) { + break; + } + } + if (!found) { + ALOGV("didn't find failed client"); + } + } + + return (failedClient == NULL); } bool ResourceManagerService::getAllClients_l( |