Loading drm/libmediadrm/DrmHal.cpp +39 −33 Original line number Diff line number Diff line Loading @@ -586,51 +586,57 @@ Return<void> DrmHal::sendSessionLostState( return Void(); } bool DrmHal::matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory, status_t DrmHal::matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { if (mimeType == "") { return true; } else if (!factory->isContentTypeSupported(mimeType.string())) { return false; } DrmPlugin::SecurityLevel level, bool *isSupported) { *isSupported = false; // handle default value cases if (level == DrmPlugin::kSecurityLevelUnknown) { return true; if (mimeType == "") { // isCryptoSchemeSupported(uuid) *isSupported = true; } else { // isCryptoSchemeSupported(uuid, mimeType) *isSupported = factory->isContentTypeSupported(mimeType.string()); } return OK; } else if (mimeType == "") { return BAD_VALUE; } sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory); if (factoryV1_2 == NULL) { return true; } else if (factoryV1_2->isCryptoSchemeSupported_1_2(uuid, mimeType.string(), toHidlSecurityLevel(level))) { return true; } return ERROR_UNSUPPORTED; } else { *isSupported = factoryV1_2->isCryptoSchemeSupported_1_2(uuid, mimeType.string(), toHidlSecurityLevel(level)); return OK; } return false; } bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { DrmPlugin::SecurityLevel level, bool *isSupported) { Mutex::Autolock autoLock(mLock); for (size_t i = 0; i < mFactories.size(); i++) { sp<IDrmFactory> factory = mFactories[i]; if (factory->isCryptoSchemeSupported(uuid)) { if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) { return true; } *isSupported = false; for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { if (mFactories[i]->isCryptoSchemeSupported(uuid)) { return matchMimeTypeAndSecurityLevel(mFactories[i], uuid, mimeType, level, isSupported); } } return false; return OK; } status_t DrmHal::createPlugin(const uint8_t uuid[16], const String8& appPackageName) { Mutex::Autolock autoLock(mLock); for (size_t i = mFactories.size() - 1; i >= 0; i--) { for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { if (mFactories[i]->isCryptoSchemeSupported(uuid)) { auto plugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); if (plugin != NULL) { Loading Loading @@ -1213,7 +1219,7 @@ status_t DrmHal::getOfflineLicenseKeySetIds(List<Vector<uint8_t>> &keySetIds) co } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } status_t err = UNKNOWN_ERROR; Loading @@ -1238,7 +1244,7 @@ status_t DrmHal::removeOfflineLicense(Vector<uint8_t> const &keySetId) { } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } Return<Status> status = mPluginV1_2->removeOfflineLicense(toHidlVec(keySetId)); Loading @@ -1254,7 +1260,7 @@ status_t DrmHal::getOfflineLicenseState(Vector<uint8_t> const &keySetId, } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } *licenseState = DrmPlugin::kOfflineLicenseStateUnknown; Loading drm/libmediadrm/IDrm.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -83,8 +83,8 @@ struct BpDrm : public BpInterface<IDrm> { return reply.readInt32(); } virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level, bool *isSupported) { Parcel data, reply; data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); data.write(uuid, 16); Loading @@ -94,10 +94,11 @@ struct BpDrm : public BpInterface<IDrm> { status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); if (status != OK) { ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); return false; return status; } *isSupported = static_cast<bool>(reply.readInt32()); return reply.readInt32() != 0; return reply.readInt32(); } virtual status_t createPlugin(const uint8_t uuid[16], Loading Loading @@ -773,7 +774,10 @@ status_t BnDrm::onTransact( String8 mimeType = data.readString8(); DrmPlugin::SecurityLevel level = static_cast<DrmPlugin::SecurityLevel>(data.readInt32()); reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType, level)); bool isSupported = false; status_t result = isCryptoSchemeSupported(uuid, mimeType, level, &isSupported); reply->writeInt32(isSupported); reply->writeInt32(result); return OK; } Loading media/libmedia/include/media/DrmHal.h +9 −7 Original line number Diff line number Diff line Loading @@ -63,9 +63,10 @@ struct DrmHal : public BnDrm, virtual status_t initCheck() const; virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType, DrmPlugin::SecurityLevel level); DrmPlugin::SecurityLevel level, bool *isSupported); virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName); Loading Loading @@ -226,10 +227,11 @@ private: status_t getPropertyStringInternal(String8 const &name, String8 &value) const; status_t getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value) const; bool matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory, status_t matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level); DrmPlugin::SecurityLevel level, bool *isSupported); DISALLOW_EVIL_CONSTRUCTORS(DrmHal); }; Loading media/libmedia/include/media/IDrm.h +4 −3 Original line number Diff line number Diff line Loading @@ -34,9 +34,10 @@ struct IDrm : public IInterface { virtual status_t initCheck() const = 0; virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel securityLevel) = 0; DrmPlugin::SecurityLevel securityLevel, bool *result) = 0; virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName) = 0; Loading media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -159,10 +159,13 @@ Vector<DrmUUID> NuPlayerDrm::getSupportedDrmSchemes(const void *pssh, size_t pss if (drm != NULL) { for (size_t i = 0; i < psshDRMs.size(); i++) { DrmUUID uuid = psshDRMs[i]; if (drm->isCryptoSchemeSupported(uuid.ptr(), String8(), DrmPlugin::kSecurityLevelUnknown)) bool isSupported = false; status = drm->isCryptoSchemeSupported(uuid.ptr(), String8(), DrmPlugin::kSecurityLevelUnknown, &isSupported); if (status == OK && isSupported) { supportedDRMs.add(uuid); } } drm.clear(); } else { Loading Loading
drm/libmediadrm/DrmHal.cpp +39 −33 Original line number Diff line number Diff line Loading @@ -586,51 +586,57 @@ Return<void> DrmHal::sendSessionLostState( return Void(); } bool DrmHal::matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory, status_t DrmHal::matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { if (mimeType == "") { return true; } else if (!factory->isContentTypeSupported(mimeType.string())) { return false; } DrmPlugin::SecurityLevel level, bool *isSupported) { *isSupported = false; // handle default value cases if (level == DrmPlugin::kSecurityLevelUnknown) { return true; if (mimeType == "") { // isCryptoSchemeSupported(uuid) *isSupported = true; } else { // isCryptoSchemeSupported(uuid, mimeType) *isSupported = factory->isContentTypeSupported(mimeType.string()); } return OK; } else if (mimeType == "") { return BAD_VALUE; } sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory); if (factoryV1_2 == NULL) { return true; } else if (factoryV1_2->isCryptoSchemeSupported_1_2(uuid, mimeType.string(), toHidlSecurityLevel(level))) { return true; } return ERROR_UNSUPPORTED; } else { *isSupported = factoryV1_2->isCryptoSchemeSupported_1_2(uuid, mimeType.string(), toHidlSecurityLevel(level)); return OK; } return false; } bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { DrmPlugin::SecurityLevel level, bool *isSupported) { Mutex::Autolock autoLock(mLock); for (size_t i = 0; i < mFactories.size(); i++) { sp<IDrmFactory> factory = mFactories[i]; if (factory->isCryptoSchemeSupported(uuid)) { if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) { return true; } *isSupported = false; for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { if (mFactories[i]->isCryptoSchemeSupported(uuid)) { return matchMimeTypeAndSecurityLevel(mFactories[i], uuid, mimeType, level, isSupported); } } return false; return OK; } status_t DrmHal::createPlugin(const uint8_t uuid[16], const String8& appPackageName) { Mutex::Autolock autoLock(mLock); for (size_t i = mFactories.size() - 1; i >= 0; i--) { for (ssize_t i = mFactories.size() - 1; i >= 0; i--) { if (mFactories[i]->isCryptoSchemeSupported(uuid)) { auto plugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); if (plugin != NULL) { Loading Loading @@ -1213,7 +1219,7 @@ status_t DrmHal::getOfflineLicenseKeySetIds(List<Vector<uint8_t>> &keySetIds) co } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } status_t err = UNKNOWN_ERROR; Loading @@ -1238,7 +1244,7 @@ status_t DrmHal::removeOfflineLicense(Vector<uint8_t> const &keySetId) { } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } Return<Status> status = mPluginV1_2->removeOfflineLicense(toHidlVec(keySetId)); Loading @@ -1254,7 +1260,7 @@ status_t DrmHal::getOfflineLicenseState(Vector<uint8_t> const &keySetId, } if (mPluginV1_2 == NULL) { return ERROR_DRM_CANNOT_HANDLE; return ERROR_UNSUPPORTED; } *licenseState = DrmPlugin::kOfflineLicenseStateUnknown; Loading
drm/libmediadrm/IDrm.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -83,8 +83,8 @@ struct BpDrm : public BpInterface<IDrm> { return reply.readInt32(); } virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level) { virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level, bool *isSupported) { Parcel data, reply; data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); data.write(uuid, 16); Loading @@ -94,10 +94,11 @@ struct BpDrm : public BpInterface<IDrm> { status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); if (status != OK) { ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); return false; return status; } *isSupported = static_cast<bool>(reply.readInt32()); return reply.readInt32() != 0; return reply.readInt32(); } virtual status_t createPlugin(const uint8_t uuid[16], Loading Loading @@ -773,7 +774,10 @@ status_t BnDrm::onTransact( String8 mimeType = data.readString8(); DrmPlugin::SecurityLevel level = static_cast<DrmPlugin::SecurityLevel>(data.readInt32()); reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType, level)); bool isSupported = false; status_t result = isCryptoSchemeSupported(uuid, mimeType, level, &isSupported); reply->writeInt32(isSupported); reply->writeInt32(result); return OK; } Loading
media/libmedia/include/media/DrmHal.h +9 −7 Original line number Diff line number Diff line Loading @@ -63,9 +63,10 @@ struct DrmHal : public BnDrm, virtual status_t initCheck() const; virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType, DrmPlugin::SecurityLevel level); DrmPlugin::SecurityLevel level, bool *isSupported); virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName); Loading Loading @@ -226,10 +227,11 @@ private: status_t getPropertyStringInternal(String8 const &name, String8 &value) const; status_t getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value) const; bool matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory, status_t matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel level); DrmPlugin::SecurityLevel level, bool *isSupported); DISALLOW_EVIL_CONSTRUCTORS(DrmHal); }; Loading
media/libmedia/include/media/IDrm.h +4 −3 Original line number Diff line number Diff line Loading @@ -34,9 +34,10 @@ struct IDrm : public IInterface { virtual status_t initCheck() const = 0; virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, DrmPlugin::SecurityLevel securityLevel) = 0; DrmPlugin::SecurityLevel securityLevel, bool *result) = 0; virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName) = 0; Loading
media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -159,10 +159,13 @@ Vector<DrmUUID> NuPlayerDrm::getSupportedDrmSchemes(const void *pssh, size_t pss if (drm != NULL) { for (size_t i = 0; i < psshDRMs.size(); i++) { DrmUUID uuid = psshDRMs[i]; if (drm->isCryptoSchemeSupported(uuid.ptr(), String8(), DrmPlugin::kSecurityLevelUnknown)) bool isSupported = false; status = drm->isCryptoSchemeSupported(uuid.ptr(), String8(), DrmPlugin::kSecurityLevelUnknown, &isSupported); if (status == OK && isSupported) { supportedDRMs.add(uuid); } } drm.clear(); } else { Loading