MediaTranscodingService: Implement service's add/remove client APIs.
Bug: 145233472
Test: Unit test.
Change-Id: Ice22f86942bf3838c80b100c71af46ff6e217744
diff --git a/media/libmediatranscoding/TranscodingClientManager.cpp b/media/libmediatranscoding/TranscodingClientManager.cpp
index 5013a51..e26dbaa 100644
--- a/media/libmediatranscoding/TranscodingClientManager.cpp
+++ b/media/libmediatranscoding/TranscodingClientManager.cpp
@@ -17,12 +17,12 @@
// #define LOG_NDEBUG 0
#define LOG_TAG "TranscodingClientManager"
+#include <inttypes.h>
#include <media/TranscodingClientManager.h>
#include <utils/Log.h>
namespace android {
-class DeathNotifier;
using Status = ::ndk::ScopedAStatus;
// static
@@ -31,9 +31,17 @@
return sInstance;
}
+// static
+void TranscodingClientManager::BinderDiedCallback(void* cookie) {
+ int32_t clientId = static_cast<int32_t>(reinterpret_cast<intptr_t>(cookie));
+ ALOGD("Client %" PRId32 " is dead", clientId);
+ // Don't check for pid validity since we know it's already dead.
+ sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance();
+ manager->removeClient(clientId);
+}
+
TranscodingClientManager::TranscodingClientManager()
- : mDeathRecipient(AIBinder_DeathRecipient_new(
- TranscodingClientManager::DeathNotifier::BinderDiedCallback)) {
+ : mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)) {
ALOGD("TranscodingClientManager started");
}
@@ -77,14 +85,13 @@
status_t TranscodingClientManager::addClient(std::unique_ptr<ClientInfo> client) {
// Validate the client.
- if (client == nullptr || client->mClientId <= 0 || client->mClientPid <= 0 ||
- client->mClientUid <= 0 || client->mClientOpPackageName.empty() ||
+ if (client == nullptr || client->mClientId < 0 || client->mClientPid < 0 ||
+ client->mClientUid < 0 || client->mClientOpPackageName.empty() ||
client->mClientOpPackageName == "") {
ALOGE("Invalid client");
return BAD_VALUE;
}
- ALOGD("Adding client id %d %s", client->mClientId, client->mClientOpPackageName.c_str());
std::scoped_lock lock{mLock};
// Check if the client already exists.
@@ -93,10 +100,11 @@
return ALREADY_EXISTS;
}
- // Listen to the death of the client.
- client->mDeathNotifier = new DeathNotifier();
+ ALOGD("Adding client id %d pid: %d uid: %d %s", client->mClientId, client->mClientPid,
+ client->mClientUid, client->mClientOpPackageName.c_str());
+
AIBinder_linkToDeath(client->mClient->asBinder().get(), mDeathRecipient.get(),
- client->mDeathNotifier.get());
+ reinterpret_cast<void*>(client->mClientId));
// Adds the new client to the map.
mClientIdToClientInfoMap[client->mClientId] = std::move(client);
@@ -120,7 +128,7 @@
// Check if the client still live. If alive, unlink the death.
if (client) {
AIBinder_unlinkToDeath(client->asBinder().get(), mDeathRecipient.get(),
- it->second->mDeathNotifier.get());
+ reinterpret_cast<void*>(clientId));
}
// Erase the entry.
@@ -134,13 +142,4 @@
return mClientIdToClientInfoMap.size();
}
-// static
-void TranscodingClientManager::DeathNotifier::BinderDiedCallback(void* cookie) {
- int32_t* pClientId = static_cast<int32_t*>(cookie);
- ALOGD("Client %d is dead", *pClientId);
- // Don't check for pid validity since we know it's already dead.
- sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance();
- manager->removeClient(*pClientId);
-}
-
} // namespace android
diff --git a/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl b/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
index 798300a..07b6c1a 100644
--- a/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
+++ b/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
@@ -75,6 +75,11 @@
boolean unregisterClient(in int clientId);
/**
+ * Returns the number of clients. This is used for debugging.
+ */
+ int getNumOfClients();
+
+ /**
* Submits a transcoding request to MediaTranscodingService.
*
* @param clientId assigned Id of the client.
diff --git a/media/libmediatranscoding/include/media/TranscodingClientManager.h b/media/libmediatranscoding/include/media/TranscodingClientManager.h
index dbf837c..74a000f 100644
--- a/media/libmediatranscoding/include/media/TranscodingClientManager.h
+++ b/media/libmediatranscoding/include/media/TranscodingClientManager.h
@@ -46,10 +46,6 @@
* TODO(hkuang): Hook up with MediaMetrics to log all the transactions.
*/
class TranscodingClientManager : public RefBase {
- private:
- // Forward declare it as it will be used in ClientInfo below.
- class DeathNotifier;
-
public:
virtual ~TranscodingClientManager();
@@ -67,8 +63,6 @@
int32_t mClientUid;
/* Package name of the client. */
std::string mClientOpPackageName;
- /* Listener for the death of the client. */
- sp<DeathNotifier> mDeathNotifier;
ClientInfo(const std::shared_ptr<ITranscodingServiceClient>& client, int64_t clientId,
int32_t pid, int32_t uid, const std::string& opPackageName)
@@ -76,8 +70,7 @@
mClientId(clientId),
mClientPid(pid),
mClientUid(uid),
- mClientOpPackageName(opPackageName),
- mDeathNotifier(nullptr) {}
+ mClientOpPackageName(opPackageName) {}
};
/**
@@ -121,26 +114,17 @@
friend class MediaTranscodingService;
friend class TranscodingClientManagerTest;
- class DeathNotifier : public RefBase {
- public:
- DeathNotifier() = default;
-
- ~DeathNotifier() = default;
-
- // Implement death recipient
- static void BinderDiedCallback(void* cookie);
- };
-
/** Get the singleton instance of the TranscodingClientManager. */
static sp<TranscodingClientManager> getInstance();
TranscodingClientManager();
+ static void BinderDiedCallback(void* cookie);
+
mutable std::mutex mLock;
std::unordered_map<int32_t, std::unique_ptr<ClientInfo>> mClientIdToClientInfoMap
GUARDED_BY(mLock);
- std::vector<sp<DeathNotifier>> mDeathNotifiers GUARDED_BY(mLock);
::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
};