diff options
| -rw-r--r-- | drm/libmediadrm/DrmHal.cpp | 72 | ||||
| -rw-r--r-- | drm/libmediadrm/IDrm.cpp | 14 | ||||
| -rw-r--r-- | media/libmedia/include/media/DrmHal.h | 16 | ||||
| -rw-r--r-- | media/libmedia/include/media/IDrm.h | 7 | ||||
| -rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp | 7 | ||||
| -rw-r--r-- | media/ndk/NdkMediaDrm.cpp | 5 |
6 files changed, 70 insertions, 51 deletions
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp index 480c7cda0a..84713c1509 100644 --- a/drm/libmediadrm/DrmHal.cpp +++ b/drm/libmediadrm/DrmHal.cpp @@ -586,51 +586,57 @@ Return<void> DrmHal::sendSessionLostState( return Void(); } -bool DrmHal::matchMimeTypeAndSecurityLevel(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; +status_t DrmHal::matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, + const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel level, + bool *isSupported) { + *isSupported = false; + + // handle default value cases + if (level == DrmPlugin::kSecurityLevelUnknown) { + if (mimeType == "") { + // isCryptoSchemeSupported(uuid) + *isSupported = true; + } else { + // isCryptoSchemeSupported(uuid, mimeType) + *isSupported = factory->isContentTypeSupported(mimeType.string()); + } + return OK; + } else if (mimeType == "") { + return BAD_VALUE; } - if (level == DrmPlugin::kSecurityLevelUnknown) { - return true; + sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory); + if (factoryV1_2 == NULL) { + return ERROR_UNSUPPORTED; } else { - 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; - } + *isSupported = factoryV1_2->isCryptoSchemeSupported_1_2(uuid, + mimeType.string(), toHidlSecurityLevel(level)); + return OK; } - return false; } -bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel level) { +status_t DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], + const String8 &mimeType, + 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) { @@ -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; @@ -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)); @@ -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; diff --git a/drm/libmediadrm/IDrm.cpp b/drm/libmediadrm/IDrm.cpp index 0f343151c8..51274d16c1 100644 --- a/drm/libmediadrm/IDrm.cpp +++ b/drm/libmediadrm/IDrm.cpp @@ -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); @@ -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], @@ -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; } diff --git a/media/libmedia/include/media/DrmHal.h b/media/libmedia/include/media/DrmHal.h index 7be5cf2515..a630bfd431 100644 --- a/media/libmedia/include/media/DrmHal.h +++ b/media/libmedia/include/media/DrmHal.h @@ -63,9 +63,10 @@ struct DrmHal : public BnDrm, virtual status_t initCheck() const; - 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); virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName); @@ -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, - const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel level); + status_t matchMimeTypeAndSecurityLevel(const sp<IDrmFactory> &factory, + const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel level, + bool *isSupported); DISALLOW_EVIL_CONSTRUCTORS(DrmHal); }; diff --git a/media/libmedia/include/media/IDrm.h b/media/libmedia/include/media/IDrm.h index a32756fd27..fbe80c6635 100644 --- a/media/libmedia/include/media/IDrm.h +++ b/media/libmedia/include/media/IDrm.h @@ -34,9 +34,10 @@ struct IDrm : public IInterface { virtual status_t initCheck() const = 0; - virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel securityLevel) = 0; + virtual status_t isCryptoSchemeSupported(const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel securityLevel, + bool *result) = 0; virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName) = 0; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp index 67a0f1e611..2d0c9e0e14 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDrm.cpp @@ -159,9 +159,12 @@ 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(); diff --git a/media/ndk/NdkMediaDrm.cpp b/media/ndk/NdkMediaDrm.cpp index 9082f620f3..2deb1a49bb 100644 --- a/media/ndk/NdkMediaDrm.cpp +++ b/media/ndk/NdkMediaDrm.cpp @@ -274,7 +274,10 @@ bool AMediaDrm_isCryptoSchemeSupported(const AMediaUUID uuid, const char *mimeTy } String8 mimeStr = mimeType ? String8(mimeType) : String8(""); - return drm->isCryptoSchemeSupported(uuid, mimeStr, DrmPlugin::kSecurityLevelUnknown); + bool isSupported = false; + status_t status = drm->isCryptoSchemeSupported(uuid, mimeStr, + DrmPlugin::kSecurityLevelUnknown, &isSupported); + return (status == OK) && isSupported; } EXPORT |
