Loading drm/libmediadrm/DrmHal.cpp +30 −6 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <android/hardware/drm/1.2/types.h> #include <android/hidl/manager/1.2/IServiceManager.h> #include <android/media/BnResourceManagerClient.h> #include <hidl/ServiceManagement.h> #include <media/EventMetric.h> #include <media/PluginMetricsReporting.h> Loading Loading @@ -295,21 +296,43 @@ static status_t toStatusT_1_2(Status_V1_2 status) { Mutex DrmHal::mLock; bool DrmHal::DrmSessionClient::reclaimResource() { struct DrmHal::DrmSessionClient : public android::media::BnResourceManagerClient { explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId) : mSessionId(sessionId), mDrm(drm) {} ::android::binder::Status reclaimResource(bool* _aidl_return) override; ::android::binder::Status getName(::std::string* _aidl_return) override; const Vector<uint8_t> mSessionId; protected: virtual ~DrmSessionClient(); private: wp<DrmHal> mDrm; DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); }; ::android::binder::Status DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) { sp<DrmHal> drm = mDrm.promote(); if (drm == NULL) { return true; *_aidl_return = true; return ::android::binder::Status::ok(); } status_t err = drm->closeSession(mSessionId); if (err != OK) { return false; *_aidl_return = false; return ::android::binder::Status::ok(); } drm->sendEvent(EventType::SESSION_RECLAIMED, toHidlVec(mSessionId), hidl_vec<uint8_t>()); return true; *_aidl_return = true; return ::android::binder::Status::ok(); } String8 DrmHal::DrmSessionClient::getName() { ::android::binder::Status DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) { String8 name; sp<DrmHal> drm = mDrm.promote(); if (drm == NULL) { Loading @@ -323,7 +346,8 @@ String8 DrmHal::DrmSessionClient::getName() { name.appendFormat("%02x", mSessionId[i]); } name.append("]"); return name; *_aidl_return = name; return ::android::binder::Status::ok(); } DrmHal::DrmSessionClient::~DrmSessionClient() { Loading drm/libmediadrm/DrmSessionManager.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -18,11 +18,12 @@ #define LOG_TAG "DrmSessionManager" #include <utils/Log.h> #include <android/media/IResourceManagerClient.h> #include <android/media/IResourceManagerService.h> #include <binder/IPCThreadState.h> #include <binder/IProcessInfoService.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <media/IResourceManagerClient.h> #include <media/MediaResource.h> #include <mediadrm/DrmSessionManager.h> #include <unistd.h> Loading @@ -33,6 +34,7 @@ #include "ResourceManagerService.h" namespace android { using android::binder::Status; static String8 GetSessionIdString(const Vector<uint8_t> &sessionId) { String8 sessionIdStr; Loading @@ -52,16 +54,16 @@ static uint64_t toClientId(const sp<IResourceManagerClient>& drm) { return reinterpret_cast<int64_t>(drm.get()); } static Vector<MediaResource> toResourceVec(const Vector<uint8_t> &sessionId) { Vector<MediaResource> resources; // use UINT64_MAX to decrement through addition overflow resources.push_back(MediaResource(MediaResource::kDrmSession, toStdVec(sessionId), UINT64_MAX)); static std::vector<MediaResourceParcel> toResourceVec( const Vector<uint8_t> &sessionId, int64_t value) { std::vector<MediaResourceParcel> resources; resources.push_back(MediaResource::DrmSessionResource(toStdVec(sessionId), value)); return resources; } static sp<IResourceManagerService> getResourceManagerService() { if (property_get_bool("persist.device_config.media_native.mediadrmserver", 1)) { return new ResourceManagerService(); return new android::media::ResourceManagerService(); } sp<IServiceManager> sm = defaultServiceManager(); if (sm == NULL) { Loading Loading @@ -131,7 +133,7 @@ void DrmSessionManager::addSession(int pid, int64_t clientId = toClientId(drm); mSessionMap[toStdVec(sessionId)] = (SessionInfo){pid, uid, clientId}; mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId)); mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId, INT64_MAX)); } void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) { Loading @@ -144,7 +146,7 @@ void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) { } auto info = it->second; mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId)); mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId, -1)); } void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) { Loading @@ -157,7 +159,7 @@ void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) { } auto info = it->second; mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId)); mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId, INT64_MAX)); mSessionMap.erase(it); } Loading @@ -176,7 +178,9 @@ bool DrmSessionManager::reclaimSession(int callingPid) { // cannot update mSessionMap because we do not know which sessionId is reclaimed; // we rely on IResourceManagerClient to removeSession in reclaimResource Vector<uint8_t> dummy; return service->reclaimResource(callingPid, toResourceVec(dummy)); bool success; Status status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success); return status.isOk() && success; } size_t DrmSessionManager::getSessionCount() const { Loading drm/libmediadrm/include/mediadrm/DrmHal.h +1 −19 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ #include <android/hardware/drm/1.2/IDrmPlugin.h> #include <android/hardware/drm/1.2/IDrmPluginListener.h> #include <media/IResourceManagerService.h> #include <media/MediaAnalyticsItem.h> #include <mediadrm/DrmMetrics.h> #include <mediadrm/DrmSessionManager.h> Loading Loading @@ -62,24 +61,7 @@ struct DrmHal : public BnDrm, public IBinder::DeathRecipient, public IDrmPluginListener_V1_2 { struct DrmSessionClient : public BnResourceManagerClient { explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId) : mSessionId(sessionId), mDrm(drm) {} virtual bool reclaimResource(); virtual String8 getName(); const Vector<uint8_t> mSessionId; protected: virtual ~DrmSessionClient(); private: wp<DrmHal> mDrm; DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); }; struct DrmSessionClient; DrmHal(); virtual ~DrmHal(); Loading drm/libmediadrm/include/mediadrm/DrmSessionManager.h +6 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #define DRM_SESSION_MANAGER_H_ #include <binder/IBinder.h> #include <media/IResourceManagerService.h> #include <media/stagefright/foundation/ABase.h> #include <utils/RefBase.h> #include <utils/KeyedVector.h> Loading @@ -33,7 +32,13 @@ namespace android { class DrmSessionManagerTest; namespace media { class IResourceManagerClient; class IResourceManagerService; } using android::media::IResourceManagerClient; using android::media::IResourceManagerService; bool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2); Loading media/libmedia/Android.bp +30 −7 Original line number Diff line number Diff line Loading @@ -22,13 +22,19 @@ cc_library { enabled: true, }, double_loadable: true, srcs: ["AudioParameter.cpp", "TypeConverter.cpp"], srcs: [ "AudioParameter.cpp", "TypeConverter.cpp", ], cflags: [ "-Werror", "-Wno-error=deprecated-declarations", "-Wall", ], shared_libs: ["libutils", "liblog"], shared_libs: [ "libutils", "liblog", ], header_libs: [ "libmedia_headers", "libaudioclient_headers", Loading @@ -49,6 +55,21 @@ filegroup { path: "aidl", } aidl_interface { name: "resourcemanager_aidl_interface", local_include_dir: "aidl", srcs: [ "aidl/android/media/IResourceManagerClient.aidl", "aidl/android/media/IResourceManagerService.aidl", "aidl/android/media/MediaResourceType.aidl", "aidl/android/media/MediaResourceSubType.aidl", "aidl/android/media/MediaResourceParcel.aidl", "aidl/android/media/MediaResourcePolicyParcel.aidl", ], api_dir: "api/resourcemanager", versions: ["1"], } cc_library_shared { name: "libmedia_omx", vendor_available: true, Loading Loading @@ -127,7 +148,6 @@ cc_library_shared { }, } cc_library_shared { name: "libmedia_omx_client", Loading Loading @@ -277,8 +297,6 @@ cc_library { "IMediaSource.cpp", "IRemoteDisplay.cpp", "IRemoteDisplayClient.cpp", "IResourceManagerClient.cpp", "IResourceManagerService.cpp", "IStreamSource.cpp", "MediaUtils.cpp", "Metadata.cpp", Loading Loading @@ -345,6 +363,11 @@ cc_library { static_libs: [ "libc_malloc_debug_backtrace", // for memory heap analysis "resourcemanager_aidl_interface-cpp", ], export_static_lib_headers: [ "resourcemanager_aidl_interface-cpp", ], export_include_dirs: [ Loading Loading
drm/libmediadrm/DrmHal.cpp +30 −6 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <android/hardware/drm/1.2/types.h> #include <android/hidl/manager/1.2/IServiceManager.h> #include <android/media/BnResourceManagerClient.h> #include <hidl/ServiceManagement.h> #include <media/EventMetric.h> #include <media/PluginMetricsReporting.h> Loading Loading @@ -295,21 +296,43 @@ static status_t toStatusT_1_2(Status_V1_2 status) { Mutex DrmHal::mLock; bool DrmHal::DrmSessionClient::reclaimResource() { struct DrmHal::DrmSessionClient : public android::media::BnResourceManagerClient { explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId) : mSessionId(sessionId), mDrm(drm) {} ::android::binder::Status reclaimResource(bool* _aidl_return) override; ::android::binder::Status getName(::std::string* _aidl_return) override; const Vector<uint8_t> mSessionId; protected: virtual ~DrmSessionClient(); private: wp<DrmHal> mDrm; DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); }; ::android::binder::Status DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) { sp<DrmHal> drm = mDrm.promote(); if (drm == NULL) { return true; *_aidl_return = true; return ::android::binder::Status::ok(); } status_t err = drm->closeSession(mSessionId); if (err != OK) { return false; *_aidl_return = false; return ::android::binder::Status::ok(); } drm->sendEvent(EventType::SESSION_RECLAIMED, toHidlVec(mSessionId), hidl_vec<uint8_t>()); return true; *_aidl_return = true; return ::android::binder::Status::ok(); } String8 DrmHal::DrmSessionClient::getName() { ::android::binder::Status DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) { String8 name; sp<DrmHal> drm = mDrm.promote(); if (drm == NULL) { Loading @@ -323,7 +346,8 @@ String8 DrmHal::DrmSessionClient::getName() { name.appendFormat("%02x", mSessionId[i]); } name.append("]"); return name; *_aidl_return = name; return ::android::binder::Status::ok(); } DrmHal::DrmSessionClient::~DrmSessionClient() { Loading
drm/libmediadrm/DrmSessionManager.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -18,11 +18,12 @@ #define LOG_TAG "DrmSessionManager" #include <utils/Log.h> #include <android/media/IResourceManagerClient.h> #include <android/media/IResourceManagerService.h> #include <binder/IPCThreadState.h> #include <binder/IProcessInfoService.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <media/IResourceManagerClient.h> #include <media/MediaResource.h> #include <mediadrm/DrmSessionManager.h> #include <unistd.h> Loading @@ -33,6 +34,7 @@ #include "ResourceManagerService.h" namespace android { using android::binder::Status; static String8 GetSessionIdString(const Vector<uint8_t> &sessionId) { String8 sessionIdStr; Loading @@ -52,16 +54,16 @@ static uint64_t toClientId(const sp<IResourceManagerClient>& drm) { return reinterpret_cast<int64_t>(drm.get()); } static Vector<MediaResource> toResourceVec(const Vector<uint8_t> &sessionId) { Vector<MediaResource> resources; // use UINT64_MAX to decrement through addition overflow resources.push_back(MediaResource(MediaResource::kDrmSession, toStdVec(sessionId), UINT64_MAX)); static std::vector<MediaResourceParcel> toResourceVec( const Vector<uint8_t> &sessionId, int64_t value) { std::vector<MediaResourceParcel> resources; resources.push_back(MediaResource::DrmSessionResource(toStdVec(sessionId), value)); return resources; } static sp<IResourceManagerService> getResourceManagerService() { if (property_get_bool("persist.device_config.media_native.mediadrmserver", 1)) { return new ResourceManagerService(); return new android::media::ResourceManagerService(); } sp<IServiceManager> sm = defaultServiceManager(); if (sm == NULL) { Loading Loading @@ -131,7 +133,7 @@ void DrmSessionManager::addSession(int pid, int64_t clientId = toClientId(drm); mSessionMap[toStdVec(sessionId)] = (SessionInfo){pid, uid, clientId}; mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId)); mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId, INT64_MAX)); } void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) { Loading @@ -144,7 +146,7 @@ void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) { } auto info = it->second; mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId)); mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId, -1)); } void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) { Loading @@ -157,7 +159,7 @@ void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) { } auto info = it->second; mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId)); mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId, INT64_MAX)); mSessionMap.erase(it); } Loading @@ -176,7 +178,9 @@ bool DrmSessionManager::reclaimSession(int callingPid) { // cannot update mSessionMap because we do not know which sessionId is reclaimed; // we rely on IResourceManagerClient to removeSession in reclaimResource Vector<uint8_t> dummy; return service->reclaimResource(callingPid, toResourceVec(dummy)); bool success; Status status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success); return status.isOk() && success; } size_t DrmSessionManager::getSessionCount() const { Loading
drm/libmediadrm/include/mediadrm/DrmHal.h +1 −19 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ #include <android/hardware/drm/1.2/IDrmPlugin.h> #include <android/hardware/drm/1.2/IDrmPluginListener.h> #include <media/IResourceManagerService.h> #include <media/MediaAnalyticsItem.h> #include <mediadrm/DrmMetrics.h> #include <mediadrm/DrmSessionManager.h> Loading Loading @@ -62,24 +61,7 @@ struct DrmHal : public BnDrm, public IBinder::DeathRecipient, public IDrmPluginListener_V1_2 { struct DrmSessionClient : public BnResourceManagerClient { explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId) : mSessionId(sessionId), mDrm(drm) {} virtual bool reclaimResource(); virtual String8 getName(); const Vector<uint8_t> mSessionId; protected: virtual ~DrmSessionClient(); private: wp<DrmHal> mDrm; DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); }; struct DrmSessionClient; DrmHal(); virtual ~DrmHal(); Loading
drm/libmediadrm/include/mediadrm/DrmSessionManager.h +6 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #define DRM_SESSION_MANAGER_H_ #include <binder/IBinder.h> #include <media/IResourceManagerService.h> #include <media/stagefright/foundation/ABase.h> #include <utils/RefBase.h> #include <utils/KeyedVector.h> Loading @@ -33,7 +32,13 @@ namespace android { class DrmSessionManagerTest; namespace media { class IResourceManagerClient; class IResourceManagerService; } using android::media::IResourceManagerClient; using android::media::IResourceManagerService; bool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2); Loading
media/libmedia/Android.bp +30 −7 Original line number Diff line number Diff line Loading @@ -22,13 +22,19 @@ cc_library { enabled: true, }, double_loadable: true, srcs: ["AudioParameter.cpp", "TypeConverter.cpp"], srcs: [ "AudioParameter.cpp", "TypeConverter.cpp", ], cflags: [ "-Werror", "-Wno-error=deprecated-declarations", "-Wall", ], shared_libs: ["libutils", "liblog"], shared_libs: [ "libutils", "liblog", ], header_libs: [ "libmedia_headers", "libaudioclient_headers", Loading @@ -49,6 +55,21 @@ filegroup { path: "aidl", } aidl_interface { name: "resourcemanager_aidl_interface", local_include_dir: "aidl", srcs: [ "aidl/android/media/IResourceManagerClient.aidl", "aidl/android/media/IResourceManagerService.aidl", "aidl/android/media/MediaResourceType.aidl", "aidl/android/media/MediaResourceSubType.aidl", "aidl/android/media/MediaResourceParcel.aidl", "aidl/android/media/MediaResourcePolicyParcel.aidl", ], api_dir: "api/resourcemanager", versions: ["1"], } cc_library_shared { name: "libmedia_omx", vendor_available: true, Loading Loading @@ -127,7 +148,6 @@ cc_library_shared { }, } cc_library_shared { name: "libmedia_omx_client", Loading Loading @@ -277,8 +297,6 @@ cc_library { "IMediaSource.cpp", "IRemoteDisplay.cpp", "IRemoteDisplayClient.cpp", "IResourceManagerClient.cpp", "IResourceManagerService.cpp", "IStreamSource.cpp", "MediaUtils.cpp", "Metadata.cpp", Loading Loading @@ -345,6 +363,11 @@ cc_library { static_libs: [ "libc_malloc_debug_backtrace", // for memory heap analysis "resourcemanager_aidl_interface-cpp", ], export_static_lib_headers: [ "resourcemanager_aidl_interface-cpp", ], export_include_dirs: [ Loading