diff options
author | Jeff Tinker <jtinker@google.com> | 2017-01-24 06:58:26 -0800 |
---|---|---|
committer | Jeff Tinker <jtinker@google.com> | 2017-01-26 14:20:24 -0800 |
commit | fbf365037014e81711611384aeee9469590210f6 (patch) | |
tree | 52dbda84e5cfc6b03fdd9c47267e8dd4a6c92c0c /drm | |
parent | da002fe6415cee1e37cc3131aafb79ddb53f01e5 (diff) | |
download | android_hardware_interfaces-fbf365037014e81711611384aeee9469590210f6.tar.gz android_hardware_interfaces-fbf365037014e81711611384aeee9469590210f6.tar.bz2 android_hardware_interfaces-fbf365037014e81711611384aeee9469590210f6.zip |
Enable loading of treble-based plugins
Test: gtests passing
bug: 34507158
Change-Id: I712dea8e211e83b36cb103d913405521d55123f5
Diffstat (limited to 'drm')
-rw-r--r-- | drm/1.0/default/CryptoFactory.cpp | 83 | ||||
-rw-r--r-- | drm/1.0/default/CryptoFactory.h | 25 | ||||
-rw-r--r-- | drm/1.0/default/DrmFactory.cpp | 94 | ||||
-rw-r--r-- | drm/1.0/default/DrmFactory.h | 35 |
4 files changed, 155 insertions, 82 deletions
diff --git a/drm/1.0/default/CryptoFactory.cpp b/drm/1.0/default/CryptoFactory.cpp index 02084e7bb..37471ba7f 100644 --- a/drm/1.0/default/CryptoFactory.cpp +++ b/drm/1.0/default/CryptoFactory.cpp @@ -14,10 +14,11 @@ * limitations under the License. */ +#include <utils/Log.h> + #include "CryptoFactory.h" #include "CryptoPlugin.h" #include "TypeConvert.h" -#include <utils/Log.h> namespace android { namespace hardware { @@ -25,45 +26,63 @@ namespace drm { namespace V1_0 { namespace implementation { - CryptoFactory::CryptoFactory() : - loader("/vendor/lib/mediadrm", "createCryptoFactory") { - } +CryptoFactory::CryptoFactory() : + trebleLoader("/vendor/lib/hw", "createCryptoFactory"), + legacyLoader("/vendor/lib/mediadrm", "createCryptoFactory") { +} - // Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow. - Return<bool> CryptoFactory::isCryptoSchemeSupported( - const hidl_array<uint8_t, 16>& uuid) { - for (size_t i = 0; i < loader.factoryCount(); i++) { - if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { - return true; - } - } - return false; +// Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow. +Return<bool> CryptoFactory::isCryptoSchemeSupported( + const hidl_array<uint8_t, 16>& uuid) { + return isCryptoSchemeSupported(trebleLoader, uuid) || + isCryptoSchemeSupported(legacyLoader, uuid); +} + +Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid, + const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) { + sp<ICryptoPlugin> plugin = createTreblePlugin(uuid, initData); + if (plugin == nullptr) { + plugin = createLegacyPlugin(uuid, initData); } + _hidl_cb(plugin != nullptr ? Status::OK : Status::ERROR_DRM_CANNOT_HANDLE, plugin); + return Void(); +} - Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid, - const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) { - for (size_t i = 0; i < loader.factoryCount(); i++) { - if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { - android::CryptoPlugin *legacyPlugin = NULL; - status_t status = loader.getFactory(i)->createPlugin(uuid.data(), - initData.data(), initData.size(), &legacyPlugin); - CryptoPlugin *newPlugin = NULL; - if (legacyPlugin == NULL) { - ALOGE("Crypto legacy HAL: failed to create crypto plugin"); - } else { - newPlugin = new CryptoPlugin(legacyPlugin); +sp<ICryptoPlugin> CryptoFactory::createTreblePlugin(const hidl_array<uint8_t, 16>& uuid, + const hidl_vec<uint8_t>& initData) { + sp<ICryptoPlugin> plugin; + for (size_t i = 0; i < trebleLoader.factoryCount(); i++) { + Return<void> hResult = trebleLoader.getFactory(i)->createPlugin(uuid, initData, + [&](Status status, const sp<ICryptoPlugin>& hPlugin) { + if (status == Status::OK) { + plugin = hPlugin; + } } - _hidl_cb(toStatus(status), newPlugin); - return Void(); - } + ); + if (plugin != nullptr) { + return plugin; } - _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL); - return Void(); } + return nullptr; +} - ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* /* name */) { - return new CryptoFactory(); +sp<ICryptoPlugin> CryptoFactory::createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid, + const hidl_vec<uint8_t>& initData) { + android::CryptoPlugin *legacyPlugin = nullptr; + for (size_t i = 0; i < legacyLoader.factoryCount(); i++) { + legacyLoader.getFactory(i)->createPlugin(uuid.data(), + initData.data(), initData.size(), &legacyPlugin); + if (legacyPlugin) { + return new CryptoPlugin(legacyPlugin); + } } + return nullptr; +} + + +ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* /* name */) { + return new CryptoFactory(); +} } // namespace implementation } // namespace V1_0 diff --git a/drm/1.0/default/CryptoFactory.h b/drm/1.0/default/CryptoFactory.h index 412b5576c..d774406ef 100644 --- a/drm/1.0/default/CryptoFactory.h +++ b/drm/1.0/default/CryptoFactory.h @@ -41,8 +41,7 @@ struct CryptoFactory : public ICryptoFactory { CryptoFactory(); virtual ~CryptoFactory() {} - // Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow. - + // Methods from ::android::hardware::drmn::V1_0::ICryptoFactory follow. Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid) override; @@ -51,7 +50,27 @@ struct CryptoFactory : public ICryptoFactory { override; private: - android::PluginLoader<android::CryptoFactory> loader; + template <typename L> Return<bool> isCryptoSchemeSupported( + const L& loader, const hidl_array<uint8_t, 16>& uuid) { + for (size_t i = 0; i < loader.factoryCount(); i++) { + if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { + return true; + } + } + return false; + } + + sp<ICryptoPlugin> createTreblePlugin(const hidl_array<uint8_t, 16>& uuid, + const hidl_vec<uint8_t>& initData); + + sp<ICryptoPlugin> createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid, + const hidl_vec<uint8_t>& initData); + + typedef android::PluginLoader<ICryptoFactory> PluginLoader; + PluginLoader trebleLoader; + + typedef android::PluginLoader<android::CryptoFactory> LegacyLoader; + LegacyLoader legacyLoader; CryptoFactory(const CryptoFactory &) = delete; void operator=(const CryptoFactory &) = delete; diff --git a/drm/1.0/default/DrmFactory.cpp b/drm/1.0/default/DrmFactory.cpp index cba2c99f7..a72c9cca4 100644 --- a/drm/1.0/default/DrmFactory.cpp +++ b/drm/1.0/default/DrmFactory.cpp @@ -14,10 +14,11 @@ * limitations under the License. */ +#include <utils/Log.h> + #include "DrmFactory.h" #include "DrmPlugin.h" #include "TypeConvert.h" -#include <utils/Log.h> namespace android { namespace hardware { @@ -25,56 +26,65 @@ namespace drm { namespace V1_0 { namespace implementation { - DrmFactory::DrmFactory() : - loader("/vendor/lib/mediadrm", "createDrmFactory") { - } +DrmFactory::DrmFactory() : + trebleLoader("/vendor/lib/hw", "createDrmFactory"), + legacyLoader("/vendor/lib/mediadrm", "createDrmFactory") { +} - // Methods from ::android::hardware::drm::V1_0::IDrmFactory follow. - Return<bool> DrmFactory::isCryptoSchemeSupported ( - const hidl_array<uint8_t, 16>& uuid) { - for (size_t i = 0; i < loader.factoryCount(); i++) { - if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { - return true; - } - } - return false; - } +// Methods from ::android::hardware::drm::V1_0::IDrmFactory follow. +Return<bool> DrmFactory::isCryptoSchemeSupported( + const hidl_array<uint8_t, 16>& uuid) { + return isCryptoSchemeSupported(trebleLoader, uuid) || + isCryptoSchemeSupported(legacyLoader, uuid); +} - Return<bool> DrmFactory::isContentTypeSupported ( - const hidl_string& mimeType) { - for (size_t i = 0; i < loader.factoryCount(); i++) { - if (loader.getFactory(i)->isContentTypeSupported(String8(mimeType.c_str()))) { - return true; - } - } - return false; - } +Return<bool> DrmFactory::isContentTypeSupported ( + const hidl_string& mimeType) { + return isContentTypeSupported<PluginLoader, hidl_string>(trebleLoader, mimeType) || + isContentTypeSupported<LegacyLoader, String8>(legacyLoader, mimeType); +} - Return<void> DrmFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid, - createPlugin_cb _hidl_cb) { +Return<void> DrmFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid, + createPlugin_cb _hidl_cb) { + sp<IDrmPlugin> plugin = createTreblePlugin(uuid); + if (plugin == nullptr) { + plugin = createLegacyPlugin(uuid); + } + _hidl_cb(plugin != nullptr ? Status::OK : Status::ERROR_DRM_CANNOT_HANDLE, plugin); + return Void(); +} - for (size_t i = 0; i < loader.factoryCount(); i++) { - if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { - android::DrmPlugin *legacyPlugin = NULL; - status_t status = loader.getFactory(i)->createDrmPlugin( - uuid.data(), &legacyPlugin); - DrmPlugin *newPlugin = NULL; - if (legacyPlugin == NULL) { - ALOGE("Drm legacy HAL: failed to create drm plugin"); - } else { - newPlugin = new DrmPlugin(legacyPlugin); +sp<IDrmPlugin> DrmFactory::createTreblePlugin(const hidl_array<uint8_t, 16>& uuid) { + sp<IDrmPlugin> plugin; + for (size_t i = 0; i < trebleLoader.factoryCount(); i++) { + Return<void> hResult = trebleLoader.getFactory(i)->createPlugin(uuid, + [&](Status status, const sp<IDrmPlugin>& hPlugin) { + if (status == Status::OK) { + plugin = hPlugin; + } } - _hidl_cb(toStatus(status), newPlugin); - return Void(); - } + ); + if (plugin != nullptr) { + return plugin; } - _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL); - return Void(); } + return nullptr; +} - IDrmFactory* HIDL_FETCH_IDrmFactory(const char* /* name */) { - return new DrmFactory(); +sp<IDrmPlugin> DrmFactory::createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid) { + android::DrmPlugin *legacyPlugin = nullptr; + for (size_t i = 0; i < legacyLoader.factoryCount(); i++) { + legacyLoader.getFactory(i)->createDrmPlugin(uuid.data(), &legacyPlugin); + if (legacyPlugin) { + return new DrmPlugin(legacyPlugin); + } } + return nullptr; +} + +IDrmFactory* HIDL_FETCH_IDrmFactory(const char* /* name */) { + return new DrmFactory(); +} } // namespace implementation } // namespace V1_0 diff --git a/drm/1.0/default/DrmFactory.h b/drm/1.0/default/DrmFactory.h index 78b7f6e31..3291ea26a 100644 --- a/drm/1.0/default/DrmFactory.h +++ b/drm/1.0/default/DrmFactory.h @@ -42,18 +42,43 @@ struct DrmFactory : public IDrmFactory { virtual ~DrmFactory() {} // Methods from ::android::hardware::drm::V1_0::IDrmFactory follow. - Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid) override; - Return<bool> isContentTypeSupported(const hidl_string &mimeType) + Return<bool> isContentTypeSupported(const hidl_string& mimeType) override; Return<void> createPlugin(const hidl_array<uint8_t, 16>& uuid, - createPlugin_cb _hidl_cb) override; - + createPlugin_cb _hidl_cb) override; private: - android::PluginLoader<android::DrmFactory> loader; + template <typename L> Return<bool> isCryptoSchemeSupported( + const L& loader, const hidl_array<uint8_t, 16>& uuid) { + for (size_t i = 0; i < loader.factoryCount(); i++) { + if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { + return true; + } + } + return false; + } + + template <typename L, typename S> Return<bool> isContentTypeSupported( + const L& loader, const hidl_string& mimeType) { + for (size_t i = 0; i < loader.factoryCount(); i++) { + if (loader.getFactory(i)->isContentTypeSupported(S(mimeType))) { + return true; + } + } + return false; + } + + sp<IDrmPlugin> createTreblePlugin(const hidl_array<uint8_t, 16>& uuid); + sp<IDrmPlugin> createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid); + + typedef android::PluginLoader<IDrmFactory> PluginLoader; + PluginLoader trebleLoader; + + typedef android::PluginLoader<android::DrmFactory> LegacyLoader; + LegacyLoader legacyLoader; DrmFactory(const DrmFactory &) = delete; void operator=(const DrmFactory &) = delete; |