Drm framework change based on new aidl interface cleanup
Test: atest CtsMediaDrmTestCases
Bug: 214410088
Change-Id: Ib80d8f86b069cd9569d71efc2eee94093581e845
diff --git a/drm/libmediadrm/DrmHalAidl.cpp b/drm/libmediadrm/DrmHalAidl.cpp
index 1dba6e1..dc6d23e 100644
--- a/drm/libmediadrm/DrmHalAidl.cpp
+++ b/drm/libmediadrm/DrmHalAidl.cpp
@@ -17,6 +17,8 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "DrmHalAidl"
+#include <array>
+#include <algorithm>
#include <android/binder_auto_utils.h>
#include <android/binder_manager.h>
#include <media/PluginMetricsReporting.h>
@@ -29,7 +31,7 @@
#include <mediadrm/DrmUtils.h>
using ::android::DrmUtils::statusAidlToStatusT;
-
+using ::aidl::android::hardware::drm::CryptoSchemes;
using ::aidl::android::hardware::drm::DrmMetricNamedValue;
using ::aidl::android::hardware::drm::DrmMetricValue;
using ::aidl::android::hardware::drm::HdcpLevel;
@@ -94,12 +96,6 @@
if (mInitCheck != OK) return mInitCheck; \
}
-static Uuid toAidlUuid(const uint8_t* uuid) {
- Uuid uuidAidl;
- uuidAidl.uuid = std::vector<uint8_t>(uuid, uuid + 16);
- return uuidAidl;
-}
-
template <typename Byte = uint8_t>
static std::vector<Byte> toStdVec(const Vector<uint8_t>& vector) {
auto v = reinterpret_cast<const Byte*>(vector.array());
@@ -395,7 +391,7 @@
// DrmHalAidl methods
DrmHalAidl::DrmHalAidl()
: mListener(::ndk::SharedRefBase::make<DrmHalListener>(&mMetrics)),
- mFactories(makeDrmFactories()),
+ mFactories(DrmUtils::makeDrmFactoriesAidl()),
mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {}
status_t DrmHalAidl::initCheck() const {
@@ -404,27 +400,6 @@
DrmHalAidl::~DrmHalAidl() {}
-std::vector<std::shared_ptr<IDrmFactoryAidl>> DrmHalAidl::makeDrmFactories() {
- std::vector<std::shared_ptr<IDrmFactoryAidl>> factories;
- AServiceManager_forEachDeclaredInstance(
- IDrmFactoryAidl::descriptor, static_cast<void*>(&factories),
- [](const char* instance, void* context) {
- auto fullName = std::string(IDrmFactoryAidl::descriptor) + "/" + std::string(instance);
- auto factory = IDrmFactoryAidl::fromBinder(
- ::ndk::SpAIBinder(AServiceManager_getService(fullName.c_str())));
- if (factory == nullptr) {
- ALOGE("not found IDrmFactory. Instance name:[%s]", fullName.c_str());
- return;
- }
-
- ALOGI("found IDrmFactory. Instance name:[%s]", fullName.c_str());
- static_cast<std::vector<std::shared_ptr<IDrmFactoryAidl>>*>(context)->emplace_back(
- factory);
- });
-
- return factories;
-}
-
status_t DrmHalAidl::setListener(const sp<IDrmClient>& listener) {
mListener->setListener(listener);
return NO_ERROR;
@@ -434,16 +409,31 @@
DrmPlugin::SecurityLevel level, bool* isSupported) {
Mutex::Autolock autoLock(mLock);
*isSupported = false;
- Uuid uuidAidl = toAidlUuid(uuid);
+ Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
SecurityLevel levelAidl = toAidlSecurityLevel(level);
std::string mimeTypeStr = mimeType.string();
for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
- if (mFactories[i]
- ->isCryptoSchemeSupported(uuidAidl, mimeTypeStr, levelAidl, isSupported)
- .isOk()) {
- if (*isSupported) break;
+ CryptoSchemes schemes{};
+ auto err = mFactories[i]->getSupportedCryptoSchemes(&schemes);
+ if (!err.isOk() || !std::count(schemes.uuids.begin(), schemes.uuids.end(), uuidAidl)) {
+ continue;
}
+
+ if (levelAidl != SecurityLevel::DEFAULT && levelAidl != SecurityLevel::UNKNOWN) {
+ if (levelAidl > schemes.maxLevel || levelAidl < schemes.minLevel) {
+ continue;
+ }
+ }
+
+ if (!mimeTypeStr.empty()) {
+ if (!std::count(schemes.mimeTypes.begin(), schemes.mimeTypes.end(), mimeTypeStr)) {
+ continue;
+ }
+ }
+
+ *isSupported = true;
+ break;
}
return OK;
@@ -452,14 +442,14 @@
status_t DrmHalAidl::createPlugin(const uint8_t uuid[16], const String8& appPackageName) {
Mutex::Autolock autoLock(mLock);
- Uuid uuidAidl = toAidlUuid(uuid);
+ Uuid uuidAidl = DrmUtils::toAidlUuid(uuid);
std::string appPackageNameAidl = toStdString(appPackageName);
std::shared_ptr<IDrmPluginAidl> pluginAidl;
mMetrics.SetAppPackageName(appPackageName);
mMetrics.SetAppUid(AIBinder_getCallingUid());
for (ssize_t i = mFactories.size() - 1; i >= 0; i--) {
::ndk::ScopedAStatus status =
- mFactories[i]->createPlugin(uuidAidl, appPackageNameAidl, &pluginAidl);
+ mFactories[i]->createDrmPlugin(uuidAidl, appPackageNameAidl, &pluginAidl);
if (status.isOk()) {
if (pluginAidl != NULL) {
mPlugin = pluginAidl;
@@ -1076,7 +1066,8 @@
INIT_CHECK();
std::string mimeAidl(mime);
- ::ndk::ScopedAStatus status = mPlugin->requiresSecureDecoderDefault(mimeAidl, required);
+ ::ndk::ScopedAStatus status =
+ mPlugin->requiresSecureDecoder(mimeAidl, SecurityLevel::DEFAULT, required);
if (!status.isOk()) {
DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %d", status.getServiceSpecificError());
return DEAD_OBJECT;