From 0f3a8a0d989240412deab149e7383fb5277f3804 Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Thu, 14 Nov 2019 15:43:39 -0800 Subject: [PATCH] DrmSessionManager: use ndk resourcemanager Bug: 134787536 Bug: 144588885 Test: DrmSessionManagerTest Test: DrmSessionManager_test Test: MediaDrmClearkeyTest.testGetNumberOfSessions Test: WidevineGenericOpsTests.testL1 Change-Id: I2d0bf13d41b32fb5f17e097c0097c1c596c7ab2f --- drm/libmediadrm/Android.bp | 6 +- drm/libmediadrm/DrmHal.cpp | 39 ++++----- drm/libmediadrm/DrmSessionManager.cpp | 84 ++++++++++--------- drm/libmediadrm/include/mediadrm/DrmHal.h | 2 +- .../include/mediadrm/DrmSessionManager.h | 26 +++--- 5 files changed, 83 insertions(+), 74 deletions(-) diff --git a/drm/libmediadrm/Android.bp b/drm/libmediadrm/Android.bp index 26e147b988..cea9c93263 100644 --- a/drm/libmediadrm/Android.bp +++ b/drm/libmediadrm/Android.bp @@ -39,6 +39,7 @@ cc_library_shared { shared_libs: [ "libbinder", + "libbinder_ndk", "libcutils", "libdl", "liblog", @@ -46,7 +47,6 @@ cc_library_shared { "libmediadrmmetrics_lite", "libmediametrics", "libmediautils", - "libresourcemanagerservice", "libstagefright_foundation", "libutils", "android.hardware.drm@1.0", @@ -56,6 +56,10 @@ cc_library_shared { "libhidlbase", ], + static_libs: [ + "resourcemanager_aidl_interface-ndk_platform", + ], + export_shared_lib_headers: [ "android.hardware.drm@1.0", "android.hardware.drm@1.1", diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp index 53a7446b69..2dc94fee4c 100644 --- a/drm/libmediadrm/DrmHal.cpp +++ b/drm/libmediadrm/DrmHal.cpp @@ -23,9 +23,9 @@ #include #include +#include #include #include -#include #include #include #include @@ -298,17 +298,16 @@ static status_t toStatusT_1_2(Status_V1_2 status) { Mutex DrmHal::mLock; -struct DrmHal::DrmSessionClient : public android::media::BnResourceManagerClient { +struct DrmHal::DrmSessionClient : public aidl::android::media::BnResourceManagerClient { explicit DrmSessionClient(DrmHal* drm, const Vector& sessionId) : mSessionId(sessionId), mDrm(drm) {} - ::android::binder::Status reclaimResource(bool* _aidl_return) override; - ::android::binder::Status getName(::std::string* _aidl_return) override; + ::ndk::ScopedAStatus reclaimResource(bool* _aidl_return) override; + ::ndk::ScopedAStatus getName(::std::string* _aidl_return) override; const Vector mSessionId; -protected: virtual ~DrmSessionClient(); private: @@ -317,24 +316,25 @@ private: DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); }; -::android::binder::Status DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) { +::ndk::ScopedAStatus DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) { + auto sessionId = mSessionId; sp drm = mDrm.promote(); if (drm == NULL) { *_aidl_return = true; - return ::android::binder::Status::ok(); + return ::ndk::ScopedAStatus::ok(); } - status_t err = drm->closeSession(mSessionId); + status_t err = drm->closeSession(sessionId); if (err != OK) { *_aidl_return = false; - return ::android::binder::Status::ok(); + return ::ndk::ScopedAStatus::ok(); } drm->sendEvent(EventType::SESSION_RECLAIMED, - toHidlVec(mSessionId), hidl_vec()); + toHidlVec(sessionId), hidl_vec()); *_aidl_return = true; - return ::android::binder::Status::ok(); + return ::ndk::ScopedAStatus::ok(); } -::android::binder::Status DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) { +::ndk::ScopedAStatus DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) { String8 name; sp drm = mDrm.promote(); if (drm == NULL) { @@ -349,7 +349,7 @@ private: } name.append("]"); *_aidl_return = name; - return ::android::binder::Status::ok(); + return ::ndk::ScopedAStatus::ok(); } DrmHal::DrmSessionClient::~DrmSessionClient() { @@ -757,9 +757,10 @@ status_t DrmHal::openSession(DrmPlugin::SecurityLevel level, } while (retry); if (err == OK) { - sp client(new DrmSessionClient(this, sessionId)); - DrmSessionManager::Instance()->addSession(getCallingPid(), client, sessionId); - mOpenSessions.push(client); + std::shared_ptr client(new DrmSessionClient(this, sessionId)); + DrmSessionManager::Instance()->addSession(getCallingPid(), + std::static_pointer_cast(client), sessionId); + mOpenSessions.push_back(client); mMetrics.SetSessionStart(sessionId); } @@ -775,9 +776,9 @@ status_t DrmHal::closeSession(Vector const &sessionId) { if (status.isOk()) { if (status == Status::OK) { DrmSessionManager::Instance()->removeSession(sessionId); - for (size_t i = 0; i < mOpenSessions.size(); i++) { - if (isEqualSessionId(mOpenSessions[i]->mSessionId, sessionId)) { - mOpenSessions.removeAt(i); + for (auto i = mOpenSessions.begin(); i != mOpenSessions.end(); i++) { + if (isEqualSessionId((*i)->mSessionId, sessionId)) { + mOpenSessions.erase(i); break; } } diff --git a/drm/libmediadrm/DrmSessionManager.cpp b/drm/libmediadrm/DrmSessionManager.cpp index 165a4d6916..7a4e1aee90 100644 --- a/drm/libmediadrm/DrmSessionManager.cpp +++ b/drm/libmediadrm/DrmSessionManager.cpp @@ -18,13 +18,12 @@ #define LOG_TAG "DrmSessionManager" #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -#include #include #include #include @@ -32,10 +31,18 @@ #include -#include "ResourceManagerService.h" - namespace android { -using android::binder::Status; + +using aidl::android::media::MediaResourceParcel; + +namespace { +void ResourceManagerServiceDied(void* cookie) { + auto thiz = static_cast(cookie); + thiz->binderDied(); +} +} + +using ::ndk::ScopedAStatus; static String8 GetSessionIdString(const Vector &sessionId) { String8 sessionIdStr; @@ -45,34 +52,28 @@ static String8 GetSessionIdString(const Vector &sessionId) { return sessionIdStr; } -static std::vector toStdVec(const Vector &vector) { - const uint8_t *v = vector.array(); - std::vector vec(v, v + vector.size()); +template +static std::vector toStdVec(const Vector &vector) { + auto v = reinterpret_cast(vector.array()); + std::vector vec(v, v + vector.size()); return vec; } -static uint64_t toClientId(const sp& drm) { - return reinterpret_cast(drm.get()); -} - static std::vector toResourceVec( const Vector &sessionId, int64_t value) { + using Type = aidl::android::media::MediaResourceType; + using SubType = aidl::android::media::MediaResourceSubType; std::vector resources; - resources.push_back(MediaResource::DrmSessionResource(toStdVec(sessionId), value)); + MediaResourceParcel resource{ + Type::kDrmSession, SubType::kUnspecifiedSubType, + toStdVec(sessionId), value}; + resources.push_back(resource); return resources; } -static sp getResourceManagerService() { - if (DrmUtils::UseDrmService()) { - // Create ResourceManagerService object in mediadrmserver process - return new android::media::ResourceManagerService(); - } - sp sm = defaultServiceManager(); - if (sm == NULL) { - return NULL; - } - sp binder = sm->getService(String16("media.resource_manager")); - return interface_cast(binder); +static std::shared_ptr getResourceManagerService() { + ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager")); + return IResourceManagerService::fromBinder(binder); } bool isEqualSessionId(const Vector &sessionId1, const Vector &sessionId2) { @@ -88,7 +89,7 @@ bool isEqualSessionId(const Vector &sessionId1, const Vector & } sp DrmSessionManager::Instance() { - static sp drmSessionManager = new DrmSessionManager(); + auto drmSessionManager = new DrmSessionManager(); drmSessionManager->init(); return drmSessionManager; } @@ -97,9 +98,10 @@ DrmSessionManager::DrmSessionManager() : DrmSessionManager(getResourceManagerService()) { } -DrmSessionManager::DrmSessionManager(const sp &service) +DrmSessionManager::DrmSessionManager(const std::shared_ptr &service) : mService(service), - mInitialized(false) { + mInitialized(false), + mDeathRecipient(AIBinder_DeathRecipient_new(ResourceManagerServiceDied)) { if (mService == NULL) { ALOGE("Failed to init ResourceManagerService"); } @@ -107,7 +109,7 @@ DrmSessionManager::DrmSessionManager(const sp &service) DrmSessionManager::~DrmSessionManager() { if (mService != NULL) { - IInterface::asBinder(mService)->unlinkToDeath(this); + AIBinder_unlinkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); } } @@ -118,13 +120,13 @@ void DrmSessionManager::init() { } mInitialized = true; if (mService != NULL) { - IInterface::asBinder(mService)->linkToDeath(this); + AIBinder_linkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); } } void DrmSessionManager::addSession(int pid, - const sp& drm, const Vector &sessionId) { - uid_t uid = IPCThreadState::self()->getCallingUid(); + const std::shared_ptr& drm, const Vector &sessionId) { + uid_t uid = AIBinder_getCallingUid(); ALOGV("addSession(pid %d, uid %d, drm %p, sessionId %s)", pid, uid, drm.get(), GetSessionIdString(sessionId).string()); @@ -133,9 +135,9 @@ void DrmSessionManager::addSession(int pid, return; } - int64_t clientId = toClientId(drm); + static int64_t clientId = 0; mSessionMap[toStdVec(sessionId)] = (SessionInfo){pid, uid, clientId}; - mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId, INT64_MAX)); + mService->addResource(pid, uid, clientId++, drm, toResourceVec(sessionId, INT64_MAX)); } void DrmSessionManager::useSession(const Vector &sessionId) { @@ -170,7 +172,7 @@ bool DrmSessionManager::reclaimSession(int callingPid) { // unlock early because reclaimResource might callback into removeSession mLock.lock(); - sp service(mService); + std::shared_ptr service(mService); mLock.unlock(); if (service == NULL) { @@ -181,7 +183,7 @@ bool DrmSessionManager::reclaimSession(int callingPid) { // we rely on IResourceManagerClient to removeSession in reclaimResource Vector dummy; bool success; - Status status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success); + ScopedAStatus status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success); return status.isOk() && success; } @@ -195,10 +197,10 @@ bool DrmSessionManager::containsSession(const Vector& sessionId) const return mSessionMap.count(toStdVec(sessionId)); } -void DrmSessionManager::binderDied(const wp& /*who*/) { +void DrmSessionManager::binderDied() { ALOGW("ResourceManagerService died."); Mutex::Autolock lock(mLock); - mService.clear(); + mService.reset(); } } // namespace android diff --git a/drm/libmediadrm/include/mediadrm/DrmHal.h b/drm/libmediadrm/include/mediadrm/DrmHal.h index 97dd920d43..30fcbddeee 100644 --- a/drm/libmediadrm/include/mediadrm/DrmHal.h +++ b/drm/libmediadrm/include/mediadrm/DrmHal.h @@ -207,7 +207,7 @@ private: // Mutable to allow modification within GetPropertyByteArray. mutable MediaDrmMetrics mMetrics; - Vector> mOpenSessions; + std::vector> mOpenSessions; void closeOpenSessions(); void cleanup(); diff --git a/drm/libmediadrm/include/mediadrm/DrmSessionManager.h b/drm/libmediadrm/include/mediadrm/DrmSessionManager.h index 3258f7a76f..9e43504de0 100644 --- a/drm/libmediadrm/include/mediadrm/DrmSessionManager.h +++ b/drm/libmediadrm/include/mediadrm/DrmSessionManager.h @@ -18,7 +18,9 @@ #define DRM_SESSION_MANAGER_H_ -#include +#include +#include +#include #include #include #include @@ -26,6 +28,7 @@ #include #include +#include #include #include @@ -33,12 +36,8 @@ namespace android { class DrmSessionManagerTest; -namespace media { -class IResourceManagerClient; -class IResourceManagerService; -} -using android::media::IResourceManagerClient; -using android::media::IResourceManagerService; +using aidl::android::media::IResourceManagerClient; +using aidl::android::media::IResourceManagerService; bool isEqualSessionId(const Vector &sessionId1, const Vector &sessionId2); @@ -50,13 +49,15 @@ struct SessionInfo { typedef std::map, SessionInfo> SessionInfoMap; -struct DrmSessionManager : public IBinder::DeathRecipient { +struct DrmSessionManager : public RefBase { static sp Instance(); DrmSessionManager(); - explicit DrmSessionManager(const sp &service); + explicit DrmSessionManager(const std::shared_ptr &service); - void addSession(int pid, const sp& drm, const Vector& sessionId); + void addSession(int pid, + const std::shared_ptr& drm, + const Vector& sessionId); void useSession(const Vector& sessionId); void removeSession(const Vector& sessionId); bool reclaimSession(int callingPid); @@ -66,7 +67,7 @@ struct DrmSessionManager : public IBinder::DeathRecipient { bool containsSession(const Vector& sessionId) const; // implements DeathRecipient - virtual void binderDied(const wp& /*who*/); + void binderDied(); protected: virtual ~DrmSessionManager(); @@ -74,10 +75,11 @@ protected: private: void init(); - sp mService; + std::shared_ptr mService; mutable Mutex mLock; SessionInfoMap mSessionMap; bool mInitialized; + ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient; DISALLOW_EVIL_CONSTRUCTORS(DrmSessionManager); };